From 8a6cc168153171a4ae26bedfb47a2e7b43b29398 Mon Sep 17 00:00:00 2001 From: erjosito <9462396+erjosito@users.noreply.github.com> Date: Thu, 8 Aug 2024 08:27:29 +0000 Subject: [PATCH] [create-pull-request] automated change --- checklists-ext/fullwaf_checklist.en.json | 12244 ++-- checklists/checklist.en.master.json | 50182 ++++++++-------- .../network_appdelivery_checklist.en.json | 4 +- .../network_appdelivery_checklist.es.json | 194 +- .../network_appdelivery_checklist.ja.json | 244 +- .../network_appdelivery_checklist.ko.json | 190 +- .../network_appdelivery_checklist.pt.json | 364 +- ...network_appdelivery_checklist.zh-Hant.json | 150 +- checklists/waf_checklist.en.json | 12276 ++-- checklists/waf_checklist.es.json | 12620 ++-- checklists/waf_checklist.ja.json | 12272 ++-- checklists/waf_checklist.ko.json | 11488 ++-- checklists/waf_checklist.pt.json | 12922 ++-- checklists/waf_checklist.zh-Hant.json | 11424 ++-- .../macrofree/checklist.en.master.xlsx | Bin 471385 -> 439831 bytes .../network_appdelivery_checklist.en.xlsx | Bin 26378 -> 26477 bytes .../network_appdelivery_checklist.es.xlsx | Bin 27102 -> 27209 bytes .../network_appdelivery_checklist.ja.xlsx | Bin 28495 -> 28696 bytes .../network_appdelivery_checklist.ko.xlsx | Bin 28135 -> 28185 bytes .../network_appdelivery_checklist.pt.xlsx | Bin 27077 -> 27150 bytes ...network_appdelivery_checklist.zh-Hant.xlsx | Bin 27553 -> 27663 bytes spreadsheet/macrofree/waf_checklist.en.xlsx | Bin 176840 -> 176673 bytes spreadsheet/macrofree/waf_checklist.es.xlsx | Bin 188073 -> 187767 bytes spreadsheet/macrofree/waf_checklist.ja.xlsx | Bin 204120 -> 204812 bytes spreadsheet/macrofree/waf_checklist.ko.xlsx | Bin 198792 -> 198519 bytes spreadsheet/macrofree/waf_checklist.pt.xlsx | Bin 187847 -> 187869 bytes .../macrofree/waf_checklist.zh-Hant.xlsx | Bin 192972 -> 193318 bytes ...hecklist.en_network_counters_workbook.json | 220 +- ...en_network_counters_workbook_template.json | 2 +- ...elivery_checklist.en_network_workbook.json | 200 +- ...hecklist.en_network_workbook_template.json | 2 +- ...livery_checklist.en_counters_workbook.json | 6 +- ...ecklist.en_counters_workbook_template.json | 2 +- ...ork_appdelivery_checklist.en_workbook.json | 6 +- ...livery_checklist.en_workbook_template.json | 2 +- 35 files changed, 67295 insertions(+), 69719 deletions(-) diff --git a/checklists-ext/fullwaf_checklist.en.json b/checklists-ext/fullwaf_checklist.en.json index 299248760..c9bd293fb 100644 --- a/checklists-ext/fullwaf_checklist.en.json +++ b/checklists-ext/fullwaf_checklist.en.json @@ -1,4378 +1,4389 @@ { "items": [ { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", - "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", - "service": "IoT Hub DPS", - "severity": "High", - "text": "Select the right Logic App hosting plan based on your business & SLO requirements", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "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", - "severity": "High", - "text": "Protect logic apps from region failures with zone redundancy and availability zones", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "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", - "severity": "High", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", + "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", + "service": "APIM", + "severity": "Medium", + "text": "Implement an error handling policy at the global level", + "waf": "Operations" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "IoT Hub DPS", - "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "Medium", + "text": "Ensure all APIs policies include a element.", + "waf": "Operations" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "IoT Hub DPS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", + "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", + "service": "APIM", "severity": "Medium", - "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", + "text": "Use Policy Fragments to avoid repeating same policies definitions across multiple APIs", "waf": "Operations" }, { - "arm-service": "Microsoft.Devices/deviceUpdateServices", - "checklist": "Device Update Review", - "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", - "severity": "High", - "text": "Leverage Availability Zones if regionally applicable (this is automatically enabled).", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", + "link": "https://learn.microsoft.com/azure/api-management/monetization-support", + "service": "APIM", + "severity": "Medium", + "text": "If you are planning to monetize your APIs, review the 'monetization support' article for best practices", + "waf": "Operations" }, { - "arm-service": "Microsoft.Devices/deviceUpdateServices", - "checklist": "Device Update Review", - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "a7d0840a-c8c4-4e83-adec-5ca578eb4049", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", + "service": "APIM", "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" + "text": "Enable Diagnostics Settings to export logs to Azure Monitor", + "waf": "Operations" }, { - "arm-service": "Microsoft.Devices/deviceUpdateServices", - "checklist": "Device Update Review", - "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", - "severity": "High", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", + "service": "APIM", + "severity": "Medium", + "text": "Enable Application Insights for more detailed telemetry", + "waf": "Operations" }, { - "arm-service": "Microsoft.Devices/deviceUpdateServices", - "checklist": "Device Update Review", - "guid": "bd91245c-fe32-4e98-a085-794a40f4bfe1", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "Device Update for IoT Hub", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", + "service": "APIM", "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" + "text": "Configure alerts on the most critical metrics", + "waf": "Operations" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", - "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", - "service": "Logic Apps", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "High", - "text": "Select the right Logic App hosting plan based on your business & SLO requirements", + "text": "Ensure that custom SSL certificates are stored an Azure Key Vault so they can be securely accessed and updated", "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "High", - "text": "Protect logic apps from region failures with zone redundancy and availability zones", + "text": "Protect incoming requests to APIs (data plane) with Azure AD", "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps 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", - "severity": "High", - "text": "Consider a Cross-Region DR strategy for critical workloads", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", + "service": "APIM", + "severity": "Medium", + "text": "Use Microsoft Entra ID to authenticate users in the Developer Portal", "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", - "link": "https://learn.microsoft.com/azure/app-service/environment/intro", - "service": "Logic Apps", - "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", + "service": "APIM", + "severity": "Medium", + "text": "Create appropriate groups to control the visibility of the products", "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", - "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", - "service": "Logic Apps", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "06862505-2d9a-4874-9491-2837b00a3475", + "link": "https://learn.microsoft.com/azure/api-management/backends", + "service": "APIM", "severity": "Medium", - "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", + "text": "Use Backends feature to eliminate redundant API backend configurations", "waf": "Operations" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", - "service": "Bot service", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", + "service": "APIM", "severity": "Medium", - "text": "Follow reliability support recommendations in Azure Bot Service", - "waf": "Reliability" + "text": "Use Named Values to store common values that can be used in policies", + "waf": "Operations" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", - "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", - "service": "Bot service", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", + "service": "APIM", "severity": "Medium", - "text": "Deploying bots with local data residency and regional compliance", + "text": "For DR, leverage the premium tier with deployments scaled across two or more regions for 99.99% SLA", "waf": "Reliability" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", + "link": "https://learn.microsoft.com/azure/api-management/high-availability", + "service": "APIM", "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.", + "text": "Deploy at least one unit in two or more availability zones for an increased SLA of 99.99%", "waf": "Reliability" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review Checklist", - "guid": "43e52f47-22d9-428c-8b1c-d521e54a29a9", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/pass-foundations-playbooks-CosmosDB_v1.docx", - "service": "CosmosDB", - "severity": "Medium", - "text": "FTA Resiliency Playbook", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "High", + "text": "Ensure there is an automated backup routine", "waf": "Reliability" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review Checklist", - "guid": "de39ac0e-7c28-4dc9-9565-7202bff4564b", - "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#slas", - "service": "CosmosDB", - "severity": "High", - "text": "Leverage Availablity Zones where regionally applicable and ofcourse if the service offers it", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", + "link": "https://learn.microsoft.com/azure/api-management/retry-policy", + "service": "APIM", + "severity": "Medium", + "text": "Use Policies to add a fail-over backend URL and caching to reduce failing calls.", "waf": "Reliability" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review Checklist", - "guid": "0d934a34-8b26-43e7-bd60-513a3649906e", - "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#replica-outages", - "service": "CosmosDB", - "severity": "Medium", - "text": "Run multiple replicas of the database (>1 ) in Prod", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", + "service": "APIM", + "severity": "Low", + "text": "If you need to log at high performance levels, consider Event Hubs policy", + "waf": "Operations" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", + "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", + "service": "APIM", "severity": "Medium", - "text": "Leverage Multi-Region Writes", - "waf": "Reliability" + "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.documentdb/databaseAccounts", - "checklist": "CosmosDB Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", + "service": "APIM", "severity": "Medium", - "text": "Distribute your data globally", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review 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", - "severity": "High", - "text": "Choose from several well-defined consistency models", - "waf": "Reliability" + "text": "Configure autoscaling to scale out the number of instances when the load increases", + "waf": "Performance" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", + "service": "APIM", "severity": "Medium", - "text": "Enable Service managed failover", - "waf": "Reliability" + "text": "Deploy self-hosted gateways where Azure doesn't have a region close to the backend APIs.", + "waf": "Performance" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", + "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", + "service": "APIM", "severity": "Medium", - "text": "Enable Automatic Backups", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "text": "Use the premium tier for production workloads.", "waf": "Reliability" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Medium", - "text": "Perform Periodic Backups", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "text": "In multi-region model, use Policies to route the requests to regional backends based on availability or latency.", "waf": "Reliability" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review 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", - "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/", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "High", + "text": "Be aware of APIM's limits", "waf": "Reliability" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", + "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", + "service": "APIM", "severity": "High", - "text": "Enable 2 replicas to have 99.9% availability for read operations", + "text": "Ensure that the self-hosted gateway deployments are resilient.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "7519e385-a88b-4d34-966b-6269d686e890", + "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", + "service": "APIM", "severity": "Medium", - "text": "Enable 3 replicas to have 99.9% availability for read/write operations", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", - "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", - "service": "Cognitive Search", - "severity": "High", - "text": "Leverage Availability Zones by enabling read and/or write replicas", - "waf": "Reliability" + "text": "Use Azure Front Door in front of APIM for multi-region deployment", + "waf": "Performance" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "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", + "text": "Deploy the service within a Virtual Network (VNet)", "waf": "Reliability" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", - "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", - "service": "Cognitive Search", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "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", + "text": "Deploy network security groups (NSG) to your subnets to restrict or monitor traffic to/from APIM.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Medium", - "text": "Use Azure Traffic Manager to coordinate requests", + "text": "Deploy Private Endpoints to filter incoming traffic when APIM is not deployed to a VNet.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", - "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", - "service": "Cognitive Search", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "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", + "text": "Disable Public Network Access", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Cognitive Services Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", + "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", + "service": "APIM", "severity": "Medium", - "text": "Leverage FTA HandBook for Cognitive Services", - "waf": "Reliability" + "text": "Simplify management with PowerShell automation scripts", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Cognitive Services Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Medium", - "text": "Backup Your Prompts", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Cognitive Services Review 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", - "severity": "High", - "text": "Business Continuity and Disaster Recovery (BCDR) considerations with Azure OpenAI Service", - "waf": "Reliability" + "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.CognitiveServices/accounts", - "checklist": "Cognitive Services Review Checklist", - "guid": "325af625-ca44-4e46-a5e2-223ace8bb123", - "link": "https://github.com/abacaj/chatgpt-backup#backup-your-chatgpt-conversations", - "service": "Cognitive Services", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", + "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", + "service": "APIM", "severity": "Medium", - "text": "Backup Your ChatGPT conversations", - "waf": "Reliability" + "text": "Promote usage of Visual Studio Code APIM extension for faster API development", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Cognitive Services Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "354f1c03-8112-4965-85ad-c0074bddf231", + "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", + "service": "APIM", "severity": "Medium", - "text": "CI/CD for custom speech", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Cognitive Services Review Checklist", - "guid": "3687a046-7a1f-4893-9bda-43324f248116", - "link": "https://learn.microsoft.com/azure/ai-services/qnamaker/tutorials/export-knowledge-base", - "service": "Cognitive Services", - "severity": "Low", - "text": "Move a knowledge base using export-import", - "waf": "Reliability" + "text": "Implement DevOps and CI/CD in your workflow", + "waf": "Operations" }, { - "arm-service": "Microsoft.App/containerApps", - "checklist": "Container Apps Review", - "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", - "severity": "High", - "text": "Leverage Availability Zones if regionally applicable", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "b6439493-426a-45f3-9697-cf65baee208d", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", + "service": "APIM", + "severity": "Medium", + "text": "Secure APIs using client certificate authentication", "waf": "Reliability" }, { - "arm-service": "Microsoft.App/containerApps", - "checklist": "Container Apps Review", - "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", - "severity": "High", - "text": "Use more than one replica and enable Zone Redundancy.", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "2a67d143-1033-4c0a-8732-680896478f08", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", + "service": "APIM", + "severity": "Medium", + "text": "Secure backend services using client certificate authentication", "waf": "Reliability" }, { - "arm-service": "Microsoft.App/containerApps", - "checklist": "Container Apps Review", - "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", - "severity": "High", - "text": "For cross-region DR, deploy container apps in multiple regions and follow active/active or active/passive application guidance.", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", + "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", + "service": "APIM", + "severity": "Medium", + "text": "Review 'Recommendations to mitigate OWASP API Security Top 10 threats' article and check what is applicable to your APIs", "waf": "Reliability" }, { - "arm-service": "Microsoft.App/containerApps", - "checklist": "Container Apps Review", - "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", - "severity": "High", - "text": "Use Front Door or Traffic Manager to route traffic to the closest region", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", + "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", + "service": "APIM", + "severity": "Medium", + "text": "Use Authorizations feature to simplify management of OAuth 2.0 token for your backend APIs", "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Functions", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", + "service": "APIM", "severity": "High", - "text": "Select the right Function hosting plan based on your business & SLO requirements", + "text": "Use the latest TLS version when encrypting information in transit. Disable outdated and unnecessary protocols and ciphers when possible.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Functions", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "High", - "text": "Leverage Availability Zones where regionally applicable (not available for Consumption tier)", + "text": "Ensure that secrets (Named values) are stored an Azure Key Vault so they can be securely accessed and updated", "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "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": "Functions", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Medium", - "text": "Consider a Cross-Region DR strategy for critical workloads", + "text": "Use managed identities to authenticate to other Azure resources whenever possible", "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "Functions", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "text": "Use web application firewall (WAF) by deploying Application Gateway in front of APIM", "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "Functions", - "severity": "High", - "text": "Ensure 'Always On' is enabled for all Function Apps running on App Service Plan", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", + "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", + "service": "Spring Apps", + "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.Web/sites", - "checklist": "Azure Function Review", - "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": "Functions", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "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", "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", + "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.Web/sites", - "checklist": "Azure Function Review", - "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "Functions", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", + "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", + "service": "Spring Apps", "severity": "Medium", - "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Function App code", - "waf": "Operations" + "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" }, { - "checklist": "SAP Checklist", - "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", - "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", - "service": "SAP", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", + "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", + "service": "Spring Apps", "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" + "text": "Use more than 1 app instance for your apps", + "waf": "Reliability" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "7504c230-6035-4183-95a5-85762acc6075", + "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", + "service": "Spring Apps", "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" + "text": "Monitor Azure Spring Apps with logs, metrics and tracing. Integrate ASA with application insights and track failures and create workbooks.", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", - "service": "SAP", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", + "service": "Spring Apps", "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", + "text": "Set up autoscaling in Spring Cloud Gateway", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", - "service": "SAP", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "97411607-b6fd-4335-99d1-9885faf4e392", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", + "service": "Spring Apps", + "severity": "Low", + "text": "Enable autoscale for the apps with Standard consumption & dedicated plan.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", + "link": "https://learn.microsoft.com/azure/spring-apps/overview", + "service": "Spring Apps", "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.", + "text": "Use Enterprise plan for commercial support of spring boot for mission critical apps. With other tiers you get OSS support.", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "b651423c-8552-42db-a545-5cb50c05527a", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", + "service": "AVS", "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/", + "text": "Ensure ADDS domain controller(s) are deployed in the identity subscription in native Azure", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "75089c20-990d-4927-b105-885576f76fc2", + "service": "AVS", "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", + "text": "Ensure ADDS sites and services is configured to keep authentication requests from Azure-based resources (including Azure VMware Solution) local to Azure", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", - "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", + "service": "AVS", "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", + "text": "Ensure that vCenter is connected to ADDS to enable authentication based on 'named user accounts'", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "SAP", - "severity": "Low", - "text": "Replicate key vault contents like certificates, secrets, or keys across regions so you can decrypt data in the DR region.", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", + "service": "AVS", + "severity": "Medium", + "text": "Ensure that the connection from vCenter to ADDS is using a secure protocol (LDAPS)", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", + "service": "AVS", "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.", + "text": "CloudAdmin account in vCenter IdP is used only as an emergency account (break-glass)", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", + "service": "AVS", + "severity": "High", + "text": "Ensure that NSX-Manager is integrated with an external Identity provider (LDAPS)", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", + "service": "AVS", + "severity": "Medium", + "text": "Has an RBAC model been created for use within VMware vSphere", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", - "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", + "service": "AVS", + "severity": "Medium", + "text": "RBAC permissions should be granted on ADDS groups and not on specific users", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", + "service": "AVS", "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/", + "text": "RBAC permissions on the Azure VMware Solution resource in Azure are 'locked down' to a limited set of owners only", "waf": "Reliability" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", + "service": "AVS", "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", + "text": "Ensure all custom roles are scoped with CloudAdmin permitted authorizations", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", + "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", + "service": "AVS", "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" + "text": "Is the correct Azure VMware Solution connectivity model selected for the customer use case at hand", + "waf": "Performance" }, { - "checklist": "SAP Checklist", - "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", + "service": "AVS", "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" + "text": "Ensure ExpressRoute or VPN connections from on-premises to Azure are monitored using 'connection monitor'", + "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", - "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", - "service": "SAP", - "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", - "waf": "Reliability" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", - "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", - "service": "SAP", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", + "service": "AVS", + "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" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", + "service": "AVS", "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" + "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" }, { - "checklist": "SAP Checklist", - "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", + "service": "AVS", "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", + "text": "Is Privileged Identity Management implemented for roles managing the Azure VMware Solution resource in the Azure Portal (no standing permissions allowed)", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", + "service": "AVS", "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", + "text": "Privileged Identity Management audit reporting should be implemented for the Azure VMware Solution PIM roles", "waf": "Reliability" }, { - "checklist": "SAP 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", - "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.", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", + "service": "AVS", + "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": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "cbe05bbe-209d-4490-ba47-778424d11678", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", + "service": "AVS", "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", + "text": "Limit use of CloudAdmin account to emergency access only", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", - "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", + "service": "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", + "text": "Create custom RBAC roles in vCenter to implement a least-privilege model inside vCenter", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "9674e7c7-7796-4181-8920-09f4429543ba", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", + "service": "AVS", + "severity": "Medium", + "text": "Is a process defined to regularly rotate cloudadmin (vCenter) and admin (NSX) credentials", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", + "service": "AVS", "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.", + "text": "Use a centralized identity provider to be used for workloads (VM's) running on Azure VMware Solution", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", - "severity": "High", - "text": "Use one proximity placement group per SAP SID. Groups don't span across Availability Zones or Azure regions", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", + "service": "AVS", + "severity": "Medium", + "text": "Is East-West traffic filtering implemented within NSX-T", "waf": "Reliability" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", + "service": "AVS", "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", + "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": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "ed46b937-913e-4018-9c62-8393ab037e53", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", + "service": "AVS", + "severity": "High", + "text": "Auditing and logging is implemented for inbound internet requests to Azure VMware Solution and Azure VMware Solution based workloads", "waf": "Reliability" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", + "service": "AVS", "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.", + "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": "Reliability" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "334fdf91-c234-4182-a652-75269440b4be", + "service": "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", + "text": "Is DDoS standard protection enabled on ExR/VPN Gateway subnet in Azure", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", + "service": "AVS", + "severity": "Medium", + "text": "Use a dedicated privileged access workstation (PAW) to manage Azure VMware Solution, vCenter, NSX manager and HCX manager", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", + "service": "AVS", + "severity": "Medium", + "text": "Enable Advanced Threat Detection (Microsoft Defender for Cloud aka ASC) for workloads running on Azure VMware Solution", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", + "service": "AVS", + "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": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", - "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", - "service": "SAP", - "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.", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", + "service": "AVS", + "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": "Reliability" }, { - "checklist": "SAP 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", - "severity": "Medium", - "text": "Automate SAP System Start-Stop to manage costs.", - "waf": "Cost" - }, - { - "checklist": "SAP Checklist", - "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a3592718-e6e2-4051-9267-6ae46691e883", + "service": "AVS", "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" + "text": "When in-guest encryption is used, store encryption keys in Azure Key vault when possible", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "9877f353-2591-4e8b-8381-e9043fed1010", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5ac94222-3e13-4810-9230-81a941741583", + "service": "AVS", + "severity": "Medium", + "text": "Consider using extended security update support for workloads running on Azure VMware Solution (Azure VMware Solution is eligible for ESU)", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", + "service": "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": "Ensure that the appropriate vSAN Data redundancy method is used (RAID specification)", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "45911475-e39e-4530-accc-d979366bcda2", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d88408f3-7273-44c8-96ba-280214590146", + "service": "AVS", + "severity": "High", + "text": "Ensure that the Failure-to-tolerate policy is in place to meet your vSAN storage needs", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", - "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.", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", + "service": "AVS", + "severity": "High", + "text": "Ensure that you have requested enough quota, ensuring you have considered growth and Disaster Recovery requirement", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", + "service": "AVS", "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", - "waf": "Reliability" + "text": "Ensure that access constraints to ESXi are understood, there are access limits which might affect 3rd party solutions.", + "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", + "service": "AVS", "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", - "waf": "Reliability" + "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" }, { - "checklist": "SAP Checklist", - "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", + "service": "AVS", "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": "Reliability" + "text": "Ensure a good cost management process is in place for Azure VMware Solution - Azure Cost Management can be used", + "waf": "Cost" }, { - "checklist": "SAP Checklist", - "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", - "service": "SAP", - "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": "Reliability" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", + "service": "AVS", + "severity": "Low", + "text": "Are Azure reserved instances used to optimize cost for using Azure VMware Solution", + "waf": "Cost" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6691e883-5ac9-4422-83e1-3810523081a9", + "service": "AVS", "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.", + "text": "Consider the use of Azure Private-Link when using other Azure Native Services", "waf": "Reliability" }, { - "checklist": "SAP 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", - "severity": "Medium", - "text": "Implement SSO by using OAuth for SAP NetWeaver to allow third-party or custom applications to access SAP NetWeaver OData services.", - "waf": "Reliability" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", + "service": "AVS", + "severity": "High", + "text": "Ensure all required resource reside within the same Azure availability zone(s)", + "waf": "Performance" }, { - "checklist": "SAP Checklist", - "guid": "a747c350-8d4c-449c-93af-393dbca77c48", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", + "service": "AVS", "severity": "Medium", - "text": "Implement SSO to SAP HANA", + "text": "Enable Microsoft Defender for Cloud for Azure VMware Solution guest VM workloads", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", + "service": "AVS", "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": "Use Azure Arc enabled servers to manage your Azure VMware Solution guest VM workloads", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", - "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", - "service": "SAP", - "severity": "Medium", - "text": "For applications that access SAP, you might want to use principal propagation to establish SSO.", - "waf": "Reliability" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", + "service": "AVS", + "severity": "High", + "text": "Enable Diagnostic and metric logging on Azure VMware Solution", + "waf": "Operations" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", + "service": "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.", - "waf": "Reliability" + "text": "Deploy the Log Analytics Agents to Azure VMware Solution guest VM workloads", + "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "589d457a-927c-4397-9d11-02cad6aae11e", + "service": "AVS", "severity": "Medium", - "text": "Implement SSO to SAP BTP", - "waf": "Reliability" + "text": "Ensure you have a documented and implemented backup policy and solution for Azure VMware Solution VM workloads", + "waf": "Operations" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ee29711b-d352-4caa-ab79-b198dab81932", + "service": "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.", + "text": "Use Microsoft Defender for Cloud for compliance monitoring of workloads running on Azure VMware Solution", "waf": "Reliability" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", + "service": "AVS", "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" + "text": "Are the applicable compliance baselines added to Microsoft Defender for Cloud", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", + "service": "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" + "text": "Was data residency evaluated when selecting Azure regions to use for Azure VMware Solution deployment", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", + "service": "AVS", "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": "Are data processing implications (service provider / service consumer model) clear and documented", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", - "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "547c1747-dc56-4068-a714-435cd19dd244", + "service": "AVS", + "severity": "Medium", + "text": "Consider using CMK (Customer Managed Key) for vSAN only if needed for compliance reason(s).", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", + "service": "AVS", "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", + "text": "Create dashboards to enable core Azure VMware Solution monitoring insights", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", - "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", - "service": "SAP", - "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.", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", - "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9659e396-80e7-4828-ac93-5657d02bff45", + "service": "AVS", "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.", + "text": "Ensure critical alert is created to monitor if vSAN consumption is below 75% as this is a support threshold from VMware", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "e6e20617-3686-4af4-9791-f8935ada4332", - "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", + "service": "AVS", "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", + "text": "Ensure alerts are configured for Azure Service Health alerts and notifications", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", + "service": "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/", + "text": "Configure Azure VMware Solution logging to be send to an Azure Storage account or Azure EventHub for processing", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", - "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" - }, - { - "checklist": "SAP Checklist", - "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", - "service": "SAP", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", + "service": "AVS", "severity": "High", - "text": "Ensure time-zone matches between the operating system and the SAP system.", + "text": "Ensure the vSAN storage policy for VM's is NOT the default storage policy as this policy applies thick provisioning", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "c3c7abc0-716c-4486-893c-40e181d65539", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", + "service": "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": "Ensure vSphere content libraries are not placed on vSAN as vSAN is a finite resource", + "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "a491dfc4-9353-4213-9217-eef0949f9467", - "link": "https://azure.microsoft.com/pricing/offers/dev-test/", - "service": "SAP", - "severity": "Low", - "text": "Consider running dev/test systems in a snooze model to save and optimize Azure run costs.", - "waf": "Cost" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", - "link": "https://learn.microsoft.com/azure/lighthouse/overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", + "service": "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.", + "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" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", + "service": "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": "Ensure workloads running on Azure VMware Solution are monitored using Azure Log Analytics and Azure Monitor", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", - "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", + "service": "AVS", + "severity": "Medium", + "text": "Include workloads running on Azure VMware Solution in existing update management tooling or in Azure Update Management", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "14591147-5e39-4e53-89cc-cd979366bcda", - "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", + "service": "AVS", "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", + "text": "Use Azure Policy to onboard Azure VMware Solution workloads in the Azure Management, Monitoring and Security solutions", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", - "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", - "service": "SAP", - "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" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", + "service": "AVS", + "severity": "Medium", + "text": "Ensure workloads running on Azure VMware Solution are onboarded to Microsoft Defender for Cloud", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", + "service": "AVS", "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": "Ensure backups are not stored on vSAN as vSAN is a finite resource", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", - "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", + "service": "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", - "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" }, { - "checklist": "SAP Checklist", - "guid": "73686af4-6791-4f89-95ad-a43324e13811", - "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", + "service": "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.", - "waf": "Operations" + "text": "Use Azure Site Recovery when the Disaster Recovery technology is native Azure IaaS", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "616785d6-fa96-4c96-ad88-518f482734c8", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", + "service": "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": "Use Automated recovery plans with either of the Disaster solutions, avoid manual tasks as much as possible", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", - "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "8255461e-2aee-4345-9aec-8339248b262d", + "service": "AVS", "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/", + "text": "Use the geopolitical region pair as the secondary disaster recovery environment", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", - "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", - "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", + "service": "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", - "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" }, { - "checklist": "SAP Checklist", - "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", - "service": "SAP", - "severity": "Low", - "text": "Use inter-VM latency monitoring for latency-sensitive applications.", - "waf": "Performance" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", + "service": "AVS", "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", + "text": "Deploy your backup solution in the same region as your Azure VMware Solution private cloud", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", + "service": "AVS", "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": "Deploy your backup solution outside of vSan, on Azure native components", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "c027f893-f404-41a9-b33d-39d625a14964", - "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", + "service": "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" - }, - { - "checklist": "SAP Checklist", - "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", - "service": "SAP", - "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": "Is a process in place to request a restore of the VMware components managed by the Azure Platform?", + "waf": "Reliability" }, { - "checklist": "SAP 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", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", + "service": "AVS", + "severity": "Low", + "text": "For manual deployments, all configuration and deployments must be documented", + "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", + "service": "AVS", + "severity": "Low", + "text": "For manual deployments, consider implementing resource locks to prevent accidental actions on your Azure VMware Solution Private Cloud", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "SAP", - "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/", - "waf": "Reliability" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", + "service": "AVS", + "severity": "Low", + "text": "For automated deployments, deploy a minimal private cloud and scale as needed", + "waf": "Operations" }, { - "checklist": "SAP 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", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", + "service": "AVS", + "severity": "Low", + "text": "For automated deployments, request or reserve quota prior to starting the deployment", "waf": "Operations" }, { - "checklist": "SAP 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", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "a3592829-e6e2-4061-9368-6af46791f893", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", - "service": "SAP", - "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", - "waf": "Reliability" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", + "service": "AVS", + "severity": "Low", + "text": "Implement human understandable names for ExR authorization keys to allow for easy identification of the keys purpose/use", + "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", - "service": "SAP", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "255461e2-aee3-4553-afc8-339248b262d6", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", - "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", - "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", - "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", + "service": "AVS", "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" - }, - { - "checklist": "SAP 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", - "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": "Reliability" + "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" }, { - "checklist": "SAP 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", - "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" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", + "service": "AVS", + "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" }, { - "checklist": "SAP 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", - "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" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "6e154e3a-a359-4282-ae6e-206173686af4", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", + "service": "AVS", "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" + "text": "Consider and validate scaling operations on 3rd party solutions used in the architecture (supported or not)", + "waf": "Performance" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", + "service": "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": "Reliability" + "text": "Define and enforce scale in/out maximum limits for your environment in the automations", + "waf": "Performance" }, { - "checklist": "SAP Checklist", - "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", - "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", + "service": "AVS", "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": "Reliability" + "text": "Implement monitoring rules to monitor automated scaling operations and monitor success and failure to enable appropriate (automated) responses", + "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", - "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/", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c5972cd4-cd21-4b07-9036-f5e6b4bfd3d5", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "be1f38cf-03a8-422b-b463-cbbbc8ac299e", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "5ada4332-4e13-4811-9231-81aa41742694", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", + "service": "AVS", "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": "Reliability" + "text": "If using a VPN connection for migrations, adjust your MTU size accordingly.", + "waf": "Performance" }, { - "checklist": "SAP Checklist", - "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e614658d-d457-4e92-9139-b821102cad6e", + "service": "AVS", "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", + "text": "For low connectivity regions connecting into Azure (500Mbps or less), considering deploying the HCX WAN optimization appliance", "waf": "Performance" }, { - "checklist": "SAP Checklist", - "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", - "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", + "service": "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", + "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" }, { - "checklist": "SAP Checklist", - "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", - "service": "SAP", - "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" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bff4564b-0d93-44a3-98b2-63e7dd60513a", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", + "service": "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", + "text": "Ensure that a dedicated ExpressRoute Gateway is being used for external data storage solutions", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "6791f893-5ada-4433-84e1-3811523181aa", - "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "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", "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", + "text": "Ensure that FastPath is enabled on the ExpressRoute Gateway that is being used for external data storage solutions", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "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", "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", - "waf": "Performance" + "text": "If using stretched cluster, ensure that your selected Disaster Recovery solution is supported by the vendor", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "fa96c96a-d885-418f-9827-34c886ba2802", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", - "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", - "waf": "Performance" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", + "service": "AVS", + "severity": "High", + "text": "If using stretched cluster, ensure that the SLA provided will meet your requirements", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", + "service": "AVS", "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", - "waf": "Performance" + "text": "If using stretched cluster, ensure that both ExpressRoute circuits are connected to your connectivity hub.", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", + "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", + "service": "AVS", "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" + "text": "If using stretched cluster, ensure that both ExpressRoute circuits have GlobalReach enabled.", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "402a9846-d515-4061-aff8-cd30088693fa", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", + "service": "AVS", "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": "Have site disaster tolerance settings been properly considered and changed for your business if needed.", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "87585797-5551-4d53-bb7d-a94ee415734d", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", - "service": "SAP", - "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", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", + "severity": "High", + "text": "Disable Azure Container Registry image export", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "severity": "High", - "text": "Review SAP HANA database backups for Azure VMs.", - "waf": "Cost" + "text": "Enable Azure Policies for Azure Container Registry", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", + "severity": "High", + "text": "Sign and Verify containers with notation (Notary v2)", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "severity": "Medium", - "text": "Review Site Recovery built-in monitoring, where used for SAP.", - "waf": "Cost" + "text": "Encrypt registry with a customer managed key", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", - "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "severity": "High", - "text": "Review the Monitoring the SAP HANA System Landscape guidance.", - "waf": "Operations" + "text": "Use Managed Identities to connect instead of Service Principals", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", - "service": "SAP", - "severity": "Medium", - "text": "Review Oracle Database in Azure Linux VM backup strategies.", - "waf": "Operations" + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", + "severity": "High", + "text": "Disable local authentication for management plane access", + "waf": "Reliability" }, { - "checklist": "SAP 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", - "severity": "Medium", - "text": "Review the use of Azure Blob Storage with SQL Server 2016.", - "waf": "Operations" + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", + "severity": "High", + "text": "Assign AcrPull & AcrPush RBAC roles rather than granting Administrative access to identity principals", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "severity": "Medium", - "text": "Review the use of Automated Backup v2 for Azure VMs.", - "waf": "Operations" + "text": "Disable Anonymous pull access", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "severity": "High", - "text": "Enabling Write accelerator for M series when using premium disks(V1)", - "waf": "Operations" + "text": "Disable repository-scoped access tokens", + "waf": "Reliability" }, { - "checklist": "SAP 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", - "severity": "Medium", - "text": "Test availability zone latency.", - "waf": "Performance" + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "description": "Deploy container images to an ACR behind a Private endpoint within a trusted network", + "guid": "b3bec3d4-f343-47c1-936d-b55f27a71eee", + "service": "ACR", + "severity": "High", + "text": "Deploy images from a trusted environment", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", - "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "severity": "Medium", - "text": "Activate SAP EarlyWatch Alert for all SAP components.", - "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", - "waf": "Performance" + "text": "Disable Azure ARM audience tokens for authentication", + "waf": "Reliability" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "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" + "text": "Enable diagnostics logging", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "severity": "Medium", - "text": "Review SQL Server performance monitoring using CCMS.", - "waf": "Performance" + "text": "Control inbound network access with Private Link", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", - "link": "https://me.sap.com/notes/500235", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "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" + "text": "Disable Public Network access", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", - "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "severity": "Medium", - "text": "Review SAP HANA studio alerts.", - "waf": "Performance" + "text": "Use an Azure Container Registry SKU that supports Private Link (Premium SKU)", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", - "link": "https://me.sap.com/notes/1969700", - "service": "SAP", - "severity": "Medium", - "text": "Perform SAP HANA health checks using HANA_Configuration_Minichecks.", - "waf": "Performance" - }, - { - "checklist": "SAP Checklist", - "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", - "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", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", + "severity": "Low", + "text": "Enable Defender for Containers to scan Azure Container Registry for vulnerabilities", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "08951710-79a2-492a-adbc-06d7a401545b", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "description": "Deploy trusted code that was validated and scanned for vulnerabilities according to DevSecOps practices.", + "guid": "4451e1a2-d345-4293-a763-9637a551c5c0", + "service": "ACR", "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", + "text": "Deploy validated container images", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", - "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.", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "description": "Use the latest versions of supported platforms, programming languages, protocols, and frameworks.", + "guid": "4e401955-387e-45ce-b126-cd132af5b20c", + "service": "ACR", + "severity": "High", + "text": "Use up-to-date platforms, languages, protocols and frameworks", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", - "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", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", + "service": "Bot service", + "severity": "Medium", + "text": "Follow reliability support recommendations in Azure Bot Service", "waf": "Reliability" }, { - "checklist": "SAP 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", - "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", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", + "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", + "service": "Bot service", + "severity": "Medium", + "text": "Deploying bots with local data residency and regional compliance", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", - "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", - "service": "SAP", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "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", "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", + "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" }, { - "checklist": "SAP Checklist", - "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", - "link": "https://learn.microsoft.com/azure/key-vault/general/overview", - "service": "SAP", - "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", + "arm-service": "Microsoft.ServiceBus/namespaces", + "checklist": "Service Bus Review 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", + "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": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "829e2edb-2173-4676-aff6-691b4935ada4", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "SAP", + "arm-service": "Microsoft.ServiceBus/namespaces", + "checklist": "Service Bus Review 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", "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": "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": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "SAP", + "arm-service": "Microsoft.ServiceBus/namespaces", + "checklist": "Service Bus Review 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", "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": "Avoid using root account when it is not necessary", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", - "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", - "service": "SAP", - "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", + "arm-service": "Microsoft.ServiceBus/namespaces", + "checklist": "Service Bus Review 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", + "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": "Reliability" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.ServiceBus/namespaces", + "checklist": "Service Bus Review 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", "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", + "text": "Use least privilege data plane RBAC", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", "waf": "Reliability" }, { - "checklist": "SAP 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", - "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", + "arm-service": "Microsoft.ServiceBus/namespaces", + "checklist": "Service Bus Review 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", + "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": "Reliability" }, { - "checklist": "SAP 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", - "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", + "arm-service": "Microsoft.ServiceBus/namespaces", + "checklist": "Service Bus Review 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", + "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": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", - "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", - "service": "SAP", + "arm-service": "Microsoft.ServiceBus/namespaces", + "checklist": "Service Bus Review 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", "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": "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": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "4935ada4-2223-4ece-a1b1-23181a541741", - "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", - "service": "SAP", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Functions", "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": "Select the right Function hosting plan based on your business & SLO requirements", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", - "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", - "service": "SAP", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Functions", "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", + "text": "Leverage Availability Zones where regionally applicable (not available for Consumption tier)", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "209d490d-a477-4784-84d1-16785d2fa56c", - "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", - "service": "SAP", - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "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": "Functions", + "severity": "Medium", + "text": "Consider a Cross-Region DR strategy for critical workloads", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", - "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", - "service": "SAP", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "Functions", "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", + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", "waf": "Reliability" }, { - "checklist": "SAP 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", - "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": "Reliability" - }, - { - "checklist": "SAP 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", - "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": "Reliability" - }, - { - "checklist": "SAP Checklist", - "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "Functions", "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", + "text": "Ensure 'Always On' is enabled for all Function Apps running on App Service Plan", "waf": "Reliability" }, { - "checklist": "SAP 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", - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "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": "Functions", + "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" }, { - "checklist": "SAP Checklist", - "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", - "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", - "service": "SAP", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "Functions", "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", - "waf": "Reliability" + "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Function App code", + "waf": "Operations" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", - "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", - "service": "Spring Apps", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Cognitive Services Review 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", "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", + "text": "Leverage FTA HandBook for Cognitive Services", "waf": "Reliability" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Cognitive Services Review 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", "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.", + "text": "Backup Your Prompts", "waf": "Reliability" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", - "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", - "service": "Spring Apps", - "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.", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Cognitive Services Review 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", + "severity": "High", + "text": "Business Continuity and Disaster Recovery (BCDR) considerations with Azure OpenAI Service", "waf": "Reliability" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", - "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", - "service": "Spring Apps", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Cognitive Services Review Checklist", + "guid": "325af625-ca44-4e46-a5e2-223ace8bb123", + "link": "https://github.com/abacaj/chatgpt-backup#backup-your-chatgpt-conversations", + "service": "Cognitive Services", "severity": "Medium", - "text": "Use more than 1 app instance for your apps", + "text": "Backup Your ChatGPT conversations", "waf": "Reliability" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "7504c230-6035-4183-95a5-85762acc6075", - "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", - "service": "Spring Apps", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Cognitive Services Review 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", "severity": "Medium", - "text": "Monitor Azure Spring Apps with logs, metrics and tracing. Integrate ASA with application insights and track failures and create workbooks.", + "text": "CI/CD for custom speech", "waf": "Reliability" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", - "service": "Spring Apps", - "severity": "Medium", - "text": "Set up autoscaling in Spring Cloud Gateway", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Cognitive Services Review Checklist", + "guid": "3687a046-7a1f-4893-9bda-43324f248116", + "link": "https://learn.microsoft.com/azure/ai-services/qnamaker/tutorials/export-knowledge-base", + "service": "Cognitive Services", + "severity": "Low", + "text": "Move a knowledge base using export-import", "waf": "Reliability" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "97411607-b6fd-4335-99d1-9885faf4e392", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", - "service": "Spring Apps", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "Low", - "text": "Enable autoscale for the apps with Standard consumption & dedicated plan.", + "text": "Refer to baseline highly available zone-redundant web application architecture for best practices", "waf": "Reliability" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", - "link": "https://learn.microsoft.com/azure/spring-apps/overview", - "service": "Spring Apps", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", + "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", + "service": "App Service", "severity": "Medium", - "text": "Use Enterprise plan for commercial support of spring boot for mission critical apps. With other tiers you get OSS support.", + "text": "Use Premium and Standard tiers. These tiers support staging slots and automated backups.", "waf": "Reliability" }, { - "checklist": "Identity Review Checklist", - "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", - "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", - "service": "Entra", - "severity": "Medium", - "text": "Use long-live revocable token, cache your token and acquire your silently using Microsoft Identity Library", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", + "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", + "service": "App Service", + "severity": "High", + "text": "Leverage Availability Zones where regionally applicable (requires Premium v2 or v3 tier)", "waf": "Reliability" }, { - "checklist": "Identity Review Checklist", - "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", - "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", - "service": "AAD B2C", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Service", "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": "Implement health checks", "waf": "Reliability" }, { - "checklist": "Identity Review 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", - "severity": "Medium", - "text": "Custom brand assets should be hosted on a CDN", - "waf": "Performance" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", + "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", + "service": "App Service", + "severity": "High", + "text": "Refer to backup and restore best practices for Azure App Service", + "waf": "Reliability" }, { - "checklist": "Identity Review Checklist", - "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", - "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", - "service": "AAD B2C", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "e68cd0ec-afc6-4bd8-a27f-7860ad9a0db2", + "link": "https://learn.microsoft.com/en-us/azure/architecture/framework/services/compute/azure-app-service/reliability", + "service": "App Service", + "severity": "High", + "text": "Implement Azure App Service reliability best practices", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "Low", - "text": "Have multiple identiy providers (i.e., login with your microsoft, google, facebook accounts)", + "text": "Familiarize with how to move an App Service app to another region During a disaster", "waf": "Reliability" }, { - "checklist": "Identity Review 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", - "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)", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", + "service": "App Service", + "severity": "High", + "text": "Familiarize with reliability support in Azure App Service", "waf": "Reliability" }, { - "checklist": "Identity Review 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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "App Service", "severity": "Medium", - "text": "Don't replicate! Replication can create issues with directory synchronization", + "text": "Ensure \"Always On\" is enabled for Function Apps running on a app service plan", "waf": "Reliability" }, { - "checklist": "Identity Review 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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Service", "severity": "Medium", - "text": "Have active-active for multi-regions", + "text": "Monitor App Service instances using Health checks", "waf": "Reliability" }, { - "checklist": "Identity Review Checklist", - "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", + "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", + "service": "App Service", "severity": "Medium", - "text": "Add Azure AD Domain service stamps to additional regions and locations", + "text": "Monitor availability and responsiveness of web app or website using Application Insights availability tests", "waf": "Reliability" }, { - "checklist": "Identity Review Checklist", - "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", - "severity": "Medium", - "text": "Use Replica Sets for DR", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "b4e3f2d5-a5c6-4d7e-8b2f-c5d9e7a8f0ea", + "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", + "service": "App Service", + "severity": "Low", + "text": "Use Application Insights Standard test to monitor availability and responsiveness of web app or website", "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", - "checklist": "Service Bus Review 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", - "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/", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", + "severity": "High", + "text": "Use Key Vault to store secrets", "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", - "checklist": "Service Bus Review 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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", + "severity": "High", + "text": "Use Managed Identity to connect to Key Vault", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", + "severity": "High", + "text": "Use Key Vault to store TLS certificate.", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "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/", + "text": "Isolate systems that process sensitive information", "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", - "checklist": "Service Bus Review 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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "Medium", - "text": "Avoid using root account when it is not necessary", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", + "text": "Do not store sensitive data on local disk", "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", - "checklist": "Service Bus Review 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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "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/", + "text": "Use an established Identity Provider for authentication", "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", - "checklist": "Service Bus Review 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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "High", - "text": "Use least privilege data plane RBAC", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "text": "Deploy from a trusted environment", "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", - "checklist": "Service Bus Review 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", - "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/", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", + "severity": "High", + "text": "Disable basic authentication", "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", - "checklist": "Service Bus Review 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", - "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/", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", + "severity": "High", + "text": "Use Managed Identity to connect to resources", "waf": "Reliability" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", - "checklist": "Service Bus Review 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", - "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/", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", + "severity": "High", + "text": "Pull containers using a Managed Identity", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", - "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", - "service": "APIM", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "Medium", - "text": "Implement an error handling policy at the global level", - "waf": "Operations" + "text": "Send App Service runtime logs to Log Analytics", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "Medium", - "text": "Ensure all APIs policies include a element.", - "waf": "Operations" + "text": "Send App Service activity logs to Log Analytics", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", - "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", - "service": "APIM", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "Medium", - "text": "Use Policy Fragments to avoid repeating same policies definitions across multiple APIs", - "waf": "Operations" + "text": "Outbound network access should be controlled", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", - "link": "https://learn.microsoft.com/azure/api-management/monetization-support", - "service": "APIM", - "severity": "Medium", - "text": "If you are planning to monetize your APIs, review the 'monetization support' article for best practices", - "waf": "Operations" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", + "severity": "Low", + "text": "Ensure a stable IP for outbound communications towards internet addresses", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "a7d0840a-c8c4-4e83-adec-5ca578eb4049", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", - "service": "APIM", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "High", - "text": "Enable Diagnostics Settings to export logs to Azure Monitor", - "waf": "Operations" + "text": "Inbound network access should be controlled", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", - "service": "APIM", - "severity": "Medium", - "text": "Enable Application Insights for more detailed telemetry", - "waf": "Operations" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", + "severity": "High", + "text": "Use a WAF in front of App Service", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", - "service": "APIM", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "High", - "text": "Configure alerts on the most critical metrics", - "waf": "Operations" + "text": "Avoid for WAF to be bypassed", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", + "severity": "Medium", + "text": "Set minimum TLS policy to 1.2", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "High", - "text": "Ensure that custom SSL certificates are stored an Azure Key Vault so they can be securely accessed and updated", + "text": "Use HTTPS only", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "High", - "text": "Protect incoming requests to APIs (data plane) with Azure AD", + "text": "Wildcards must not be used for CORS", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", - "service": "APIM", - "severity": "Medium", - "text": "Use Microsoft Entra ID to authenticate users in the Developer Portal", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", + "severity": "High", + "text": "Turn off remote debugging", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", - "service": "APIM", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "Medium", - "text": "Create appropriate groups to control the visibility of the products", + "text": "Enable Defender for Cloud - Defender for App Service", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "06862505-2d9a-4874-9491-2837b00a3475", - "link": "https://learn.microsoft.com/azure/api-management/backends", - "service": "APIM", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "Medium", - "text": "Use Backends feature to eliminate redundant API backend configurations", - "waf": "Operations" + "text": "Enable DDOS Protection Standard on the WAF VNet", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", - "service": "APIM", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "Medium", - "text": "Use Named Values to store common values that can be used in policies", - "waf": "Operations" + "text": "Pull containers over a Virtual Network", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", - "service": "APIM", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "Medium", - "text": "For DR, leverage the premium tier with deployments scaled across two or more regions for 99.99% SLA", + "text": "Conduct a penetration test", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", - "link": "https://learn.microsoft.com/azure/api-management/high-availability", - "service": "APIM", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "Medium", - "text": "Deploy at least one unit in two or more availability zones for an increased SLA of 99.99%", + "text": "Deploy validated code", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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 Service", "severity": "High", - "text": "Ensure there is an automated backup routine", + "text": "Use up-to-date platforms, languages, protocols and frameworks", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", - "link": "https://learn.microsoft.com/azure/api-management/retry-policy", - "service": "APIM", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "severity": "Medium", - "text": "Use Policies to add a fail-over backend URL and caching to reduce failing calls.", + "text": "Consider the 'Azure security baseline for storage'", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", - "service": "APIM", - "severity": "Low", - "text": "If you need to log at high performance levels, consider Event Hubs policy", - "waf": "Operations" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", + "severity": "High", + "text": "Consider using private endpoints for Azure Storage", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", - "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", - "service": "APIM", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "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": "Ensure older storage accounts are not using 'classic deployment model'", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", - "service": "APIM", - "severity": "Medium", - "text": "Configure autoscaling to scale out the number of instances when the load increases", - "waf": "Performance" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", + "severity": "High", + "text": "Enable Microsoft Defender for all of your storage accounts", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", - "service": "APIM", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "severity": "Medium", - "text": "Deploy self-hosted gateways where Azure doesn't have a region close to the backend APIs.", - "waf": "Performance" + "text": "Enable 'soft delete' for blobs", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", - "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", - "service": "APIM", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "severity": "Medium", - "text": "Use the premium tier for production workloads.", + "text": "Disable 'soft delete' for blobs", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Medium", - "text": "In multi-region model, use Policies to route the requests to regional backends based on availability or latency.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", + "severity": "High", + "text": "Enable 'soft delete' for containers", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "High", - "text": "Be aware of APIM's limits", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", + "severity": "Medium", + "text": "Disable 'soft delete' for containers", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", - "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", - "service": "APIM", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "severity": "High", - "text": "Ensure that the self-hosted gateway deployments are resilient.", + "text": "Enable resource locks on storage accounts", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "7519e385-a88b-4d34-966b-6269d686e890", - "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", - "service": "APIM", - "severity": "Medium", - "text": "Use Azure Front Door in front of APIM for multi-region deployment", - "waf": "Performance" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", + "severity": "High", + "text": "Consider immutable blobs", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Medium", - "text": "Deploy the service within a Virtual Network (VNet)", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", + "severity": "High", + "text": "Require HTTPS, i.e. disable port 80 on the storage account", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Medium", - "text": "Deploy network security groups (NSG) to your subnets to restrict or monitor traffic to/from APIM.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", + "severity": "High", + "text": "When enforcing HTTPS (disabling HTTP), check that you do not use custom domains (CNAME) for the storage account.", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "severity": "Medium", - "text": "Deploy Private Endpoints to filter incoming traffic when APIM is not deployed to a VNet.", + "text": "Limit shared access signature (SAS) tokens to HTTPS connections only", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "severity": "High", - "text": "Disable Public Network Access", + "text": "Use Azure Active Directory (Azure AD) tokens for blob access", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", - "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", - "service": "APIM", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "severity": "Medium", - "text": "Simplify management with PowerShell automation scripts", - "waf": "Operations" + "text": "Least privilege in IaM permissions", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Medium", - "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.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", + "severity": "High", + "text": "When using SAS, prefer 'user delegation SAS' over storage-account-key based SAS.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", - "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", - "service": "APIM", - "severity": "Medium", - "text": "Promote usage of Visual Studio Code APIM extension for faster API development", - "waf": "Operations" + "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. ", + "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.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "354f1c03-8112-4965-85ad-c0074bddf231", - "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", - "service": "APIM", - "severity": "Medium", - "text": "Implement DevOps and CI/CD in your workflow", - "waf": "Operations" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", + "severity": "High", + "text": "Consider using Azure Monitor to audit control plane operations on the storage account", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "b6439493-426a-45f3-9697-cf65baee208d", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", - "service": "APIM", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "severity": "Medium", - "text": "Secure APIs using client certificate authentication", + "text": "When using storage account keys, consider enabling a 'key expiration policy'", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "2a67d143-1033-4c0a-8732-680896478f08", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", - "service": "APIM", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "severity": "Medium", - "text": "Secure backend services using client certificate authentication", + "text": "Consider configuring an SAS expiration policy", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", - "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", - "service": "APIM", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "severity": "Medium", - "text": "Review 'Recommendations to mitigate OWASP API Security Top 10 threats' article and check what is applicable to your APIs", + "text": "Consider linking SAS to a stored access policy", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", - "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", - "service": "APIM", + "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": "Storage", "severity": "Medium", - "text": "Use Authorizations feature to simplify management of OAuth 2.0 token for your backend APIs", + "text": "Consider configuring your application's source code repository to detect checked-in connection strings and storage account keys.", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", - "service": "APIM", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "severity": "High", - "text": "Use the latest TLS version when encrypting information in transit. Disable outdated and unnecessary protocols and ciphers when possible.", + "text": "Consider storing connection strings in Azure KeyVault (in scenarios where managed identities are not possible)", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "severity": "High", - "text": "Ensure that secrets (Named values) are stored an Azure Key Vault so they can be securely accessed and updated", + "text": "Strive for short validity periods for ad-hoc SAS", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "severity": "Medium", - "text": "Use managed identities to authenticate to other Azure resources whenever possible", + "text": "Apply a narrow scope to a SAS", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "High", - "text": "Use web application firewall (WAF) by deploying Application Gateway in front of APIM", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", + "severity": "Medium", + "text": "Consider scoping SAS to a specific client IP address, wherever possible", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "severity": "Low", - "text": "Refer to baseline highly available zone-redundant web application architecture for best practices", + "text": "Consider checking uploaded data, after clients used a SAS to upload a file. ", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", - "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", - "service": "App Service", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", + "severity": "High", + "text": "SFTP: Limit the amount of 'local users' for SFTP access, and audit whether access is needed over time.", + "waf": "Reliability" + }, + { + "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": "Storage", "severity": "Medium", - "text": "Use Premium and Standard tiers. These tiers support staging slots and automated backups.", + "text": "SFTP: The SFTP endpoint does not support POSIX-like ACLs.", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", - "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", - "service": "App Service", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", "severity": "High", - "text": "Leverage Availability Zones where regionally applicable (requires Premium v2 or v3 tier)", + "text": "Avoid overly broad CORS policies", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Service", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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": "Storage", + "severity": "High", + "text": "Determine how data at rest should be encrypted. Understand the thread model for data.", + "waf": "Reliability" + }, + { + "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": "Storage", "severity": "Medium", - "text": "Implement health checks", + "text": "Determine which/if platform encryption should be used.", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", - "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", - "service": "App Service", - "severity": "High", - "text": "Refer to backup and restore best practices for Azure App Service", + "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": "Storage", + "severity": "Medium", + "text": "Determine which/if client-side encryption should be used.", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "e68cd0ec-afc6-4bd8-a27f-7860ad9a0db2", - "link": "https://learn.microsoft.com/en-us/azure/architecture/framework/services/compute/azure-app-service/reliability", - "service": "App Service", + "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.", + "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": "Implement Azure App Service reliability best practices", + "text": "Consider whether public blob access is needed, or whether it can be disabled for certain storage accounts. ", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", - "severity": "Low", - "text": "Familiarize with how to move an App Service app to another region During a disaster", + "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": "Storage", + "severity": "High", + "text": "Leverage a storagev2 account type for better performance and reliability", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", - "service": "App Service", + "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": "Storage", "severity": "High", - "text": "Familiarize with reliability support in Azure App Service", + "text": "Leverage GRS, ZRS or GZRS storage for the highest availability", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "App Service", + "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": "Storage", "severity": "Medium", - "text": "Ensure \"Always On\" is enabled for Function Apps running on a app service plan", + "text": "For write operation after failover, use customer-Managed Failover ", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Service", + "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": "Storage", "severity": "Medium", - "text": "Monitor App Service instances using Health checks", + "text": "Understand Microsoft-Managed Failover details", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", - "service": "App Service", + "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": "Storage", "severity": "Medium", - "text": "Monitor availability and responsiveness of web app or website using Application Insights availability tests", + "text": "Enable Soft Delete", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "b4e3f2d5-a5c6-4d7e-8b2f-c5d9e7a8f0ea", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", - "service": "App Service", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", "severity": "Low", - "text": "Use Application Insights Standard test to monitor availability and responsiveness of web app or website", + "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": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", - "severity": "High", - "text": "Use Key Vault to store secrets", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", + "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": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", - "severity": "High", - "text": "Use Managed Identity to connect to Key Vault", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", + "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": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", - "severity": "High", - "text": "Use Key Vault to store TLS certificate.", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", + "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": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", + "severity": "High", + "text": "Use least privilege data plane RBAC", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", "severity": "Medium", - "text": "Isolate systems that process sensitive information", + "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": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", "severity": "Medium", - "text": "Do not store sensitive data on local disk", + "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": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", "severity": "Medium", - "text": "Use an established Identity Provider for authentication", + "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": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", - "severity": "High", - "text": "Deploy from a trusted environment", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "31d41e36-11c8-417b-8afb-c410d4391898", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-AEH_v1.docx", + "service": "Event Hubs", + "severity": "Medium", + "text": "Leverage FTA Resillency HandBook", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", "severity": "High", - "text": "Disable basic authentication", + "text": "Leverage Availability Zones if regionally applicable", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", - "severity": "High", - "text": "Use Managed Identity to connect to resources", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "20b56c56-ad58-4519-8f82-735c586bb281", + "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", + "service": "Event Hubs", + "severity": "Medium", + "text": "Use the Premium or Dedicated SKUs for predicable performance", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", "severity": "High", - "text": "Pull containers using a Managed Identity", + "text": "Plan for Geo Disaster Recovery using Active Passive configuration", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", "severity": "Medium", - "text": "Send App Service runtime logs to Log Analytics", + "text": "For Business Critical Applications, use Active Active configuration", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", + "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", + "service": "Event Hubs", "severity": "Medium", - "text": "Send App Service activity logs to Log Analytics", + "text": "Design Resilient Event Hubs", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Medium", - "text": "Outbound network access should be controlled", - "waf": "Reliability" + "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.web/sites", - "checklist": "Azure App Service Review", - "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 Service", - "severity": "Low", - "text": "Ensure a stable IP for outbound communications towards internet addresses", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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": "AppGW", + "severity": "Medium", + "text": "Ensure you are using Application Gateway v2 SKU", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", - "severity": "High", - "text": "Inbound network access should be controlled", + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medium", + "text": "Ensure you are using the Standard SKU for your Azure Load Balancers", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", - "severity": "High", - "text": "Use a WAF in front of App Service", + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "guid": "9432621a-8397-4654-a882-5bc856b7ef83", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", + "service": "Load Balancer", + "severity": "Medium", + "text": "Ensure your Load Balancers frontend IP addresses are zone-redundant (unless you require zonal frontends).", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", - "severity": "High", - "text": "Avoid for WAF to be bypassed", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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": "AppGW", + "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": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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": "AppGW", "severity": "Medium", - "text": "Set minimum TLS policy to 1.2", + "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": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", - "severity": "High", - "text": "Use HTTPS only", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "AppGW", + "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": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", - "severity": "High", - "text": "Wildcards must not be used for CORS", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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": "AppGW", + "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" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", - "severity": "High", - "text": "Turn off remote debugging", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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": "AppGW", + "severity": "Medium", + "text": "Deploy Application Gateway across Availability Zones", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Front Door", "severity": "Medium", - "text": "Enable Defender for Cloud - Defender for App Service", + "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": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "3f29812b-2363-4cef-b179-b599de0d5973", "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "App Service", + "service": "Front Door", "severity": "Medium", - "text": "Enable DDOS Protection Standard on the WAF VNet", + "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": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", - "severity": "Medium", - "text": "Pull containers over a Virtual Network", + "ammp": true, + "arm-service": "microsoft.network/trafficManagerProfiles", + "checklist": "Azure Application Delivery Networking", + "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Traffic Manager", + "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.web/sites", - "checklist": "Azure App Service Review", - "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 Service", - "severity": "Medium", - "text": "Conduct a penetration test", + "checklist": "Azure Application Delivery Networking", + "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "Entra", + "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": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", + "checklist": "Azure Application Delivery Networking", + "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "Entra", "severity": "Medium", - "text": "Deploy validated code", + "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": "Reliability" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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 Service", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "High", - "text": "Use up-to-date platforms, languages, protocols and frameworks", + "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": "Reliability" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review Checklist", - "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", - "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", - "service": "Azure MySQL", - "severity": "Medium", - "text": "Leverage Flexible Server", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "High", + "text": "Avoid combining Azure Traffic Manager and Azure Front Door.", "waf": "Reliability" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review 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", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "High", - "text": "Leverage Availability Zones where regionally applicable", + "text": "Use the same domain name on Azure Front Door and your origin. Mismatched host names can cause subtle bugs.", "waf": "Reliability" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review 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", - "severity": "Medium", - "text": "Leverage Data-in replication for cross-region DR scenarios", - "waf": "Reliability" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "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", - "checklist": "Azure Data Explorer Review 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": "Data Explorer", - "text": "Leverage External Tables and Continuous data export overview to reduce costs", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", + "service": "Front Door", + "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", - "checklist": "Azure Data Explorer Review 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": "Data Explorer", - "text": "To share data, explore Leader-follower cluster configuration", - "waf": "Reliability" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "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.Kusto/clusters", - "checklist": "Azure Data Explorer Review 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": "Data Explorer", - "text": "To protect against regional failure, create Multiple independent clusters, preferably in two Azure Paired regions", + "ammp": true, + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "High", + "text": "Use Azure NAT Gateway instead of Load Balancer outbound rules for better SNAT scalability", "waf": "Reliability" }, { - "arm-service": "Microsoft.Kusto/clusters", - "checklist": "Azure Data Explorer Review Checklist", - "guid": "436b0635-cb45-4e57-a603-324ace8cc123", - "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-create-solution#replicate-management-activities", - "service": "Data Explorer", - "text": "Replicate all management activities such as creating new tables or managing user roles on each cluster.", - "waf": "Reliability" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "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.Kusto/clusters", - "checklist": "Azure Data Explorer Review Checklist", - "guid": "18ca6017-0265-4f4b-a46a-393af7f31728", - "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-create-solution", - "service": "Data Explorer", - "text": "Ingest data into each cluster in parallel", - "waf": "Reliability" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "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" }, { - "arm-service": "Microsoft.Kusto/clusters", - "checklist": "Azure Data Explorer Review 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": "Data Explorer", - "text": "For critical application with no tolerance for outages, create Active-Active-Active (always-on) configuration", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", + "service": "Front Door", + "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": "Reliability" }, { - "arm-service": "Microsoft.Kusto/clusters", - "checklist": "Azure Data Explorer Review 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": "Data Explorer", - "text": "For critical applications, create Active-Active configuration in two paired regions", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Kusto/clusters", - "checklist": "Azure Data Explorer Review 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": "Data Explorer", - "text": "For applications, which required only read during failure, create Active-Hot standby configuration", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", + "service": "Front Door", + "severity": "Medium", + "text": "Use HTTP to HTTPS redirection with Azure Front Door. Support older clients by redirecting them to an HTTPS request automatically.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Kusto/clusters", - "checklist": "Azure Data Explorer Review 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": "Data Explorer", - "text": "For applications, where cost is a concern and can withstand some downtime during failure, create on-demand data recovery cluster configuration", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", + "service": "Front Door", + "severity": "High", + "text": "Enable the Azure Front Door WAF. Protect your application from a range of attacks.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Kusto/clusters", - "checklist": "Azure Data Explorer Review 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": "Data Explorer", - "text": "Wrap DevOps and source control around all your code", - "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "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": "Reliability" }, { - "arm-service": "Microsoft.Kusto/clusters", - "checklist": "Azure Data Explorer Review Checklist", - "guid": "1559ab91-53e8-4908-ae28-b84c33b6b780", - "link": "https://learn.microsoft.com/azure/data-explorer/devops", - "service": "Data Explorer", - "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/", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "High", + "text": "Enable request body inspection feature enabled in Azure Front Door WAF policy.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Kusto/clusters", - "checklist": "Azure Data Explorer Review Checklist", - "guid": "8b9fe5c4-1049-4d40-9a82-2c3474d00f18", - "link": "https://learn.microsoft.com/azure/data-explorer/devops", - "service": "Data Explorer", - "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/", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "High", + "text": "Enable the Azure Front Door WAF default rule sets. The default rule sets detect and block common attacks.", "waf": "Reliability" }, { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency checklist", - "guid": "65285269-440b-44be-9d3e-0844276d4bdc", - "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-zone-redundancy", - "service": "Redis", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "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": "Enable the Azure Front Door WAF bot protection rule set. The bot rules detect good and bad bots.", "waf": "Reliability" }, { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency 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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "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.", + "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": "Reliability" }, { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency 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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Medium", - "text": "Use Geo-redundant storage account to persist Azure Cache for Redis data, or zonally redundant where geo-redundancy is not available", + "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": "Reliability" }, { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency checklist", - "guid": "a8c26c9b-32ab-45bd-bc69-98a135e33789", - "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-geo-replication", - "service": "Redis", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "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.", + "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": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "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/", + "text": "If you are not expecting traffic from all geographical regions, use geo-filters to block traffic from non-expected countries.", "waf": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "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/", + "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": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", - "severity": "Medium", - "text": "Avoid using root account when it is not necessary", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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": "AppGW", + "severity": "High", + "text": "Enable the Azure Application Gateway WAF bot protection rule set. The bot rules detect good and bad bots.", "waf": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", - "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/", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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": "AppGW", + "severity": "High", + "text": "Enable request body inspection feature enabled in Azure Application Gateway WAF policy.", "waf": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", + "service": "AppGW", "severity": "High", - "text": "Use least privilege data plane RBAC", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "text": "Tune the Azure Application Gateway WAF in detection mode for your workload. Reduce false positive detections.", "waf": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", - "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/", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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": "AppGW", + "severity": "High", + "text": "Deploy your WAF policy for Application Gateway in 'Prevention' mode.", "waf": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", + "service": "AppGW", "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": "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": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "041e0ad8-7b12-4694-a0b7-a0e25ee2470f", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview#rate-limiting-details", + "service": "AppGW", "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": "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": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "31d41e36-11c8-417b-8afb-c410d4391898", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-AEH_v1.docx", - "service": "Event Hubs", - "severity": "Medium", - "text": "Leverage FTA Resillency HandBook", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "99937189-ff78-492a-b9ca-18d828d82b37", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#geo-filtering-best-practices", + "service": "AppGW", + "severity": "Low", + "text": "If you are not expecting traffic from all geographical regions, use geo-filters to block traffic from non-expected countries.", "waf": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", - "severity": "High", - "text": "Leverage Availability Zones if regionally applicable", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", + "service": "AppGW", + "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.", "waf": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "20b56c56-ad58-4519-8f82-735c586bb281", - "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", - "service": "Event Hubs", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "6c19dfd5-a61c-436c-9001-491b9b3d0228", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#use-the-latest-ruleset-versions", + "service": "AppGW", "severity": "Medium", - "text": "Use the Premium or Dedicated SKUs for predicable performance", + "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": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", - "severity": "High", - "text": "Plan for Geo Disaster Recovery using Active Passive configuration", - "waf": "Reliability" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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": "AppGW", + "severity": "Medium", + "text": "Add diagnostic settings to save your Azure Application Gateway WAF logs.", + "waf": "Operations" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Medium", - "text": "For Business Critical Applications, use Active Active configuration", - "waf": "Reliability" + "text": "Add diagnostic settings to save your Azure Front Door WAF logs.", + "waf": "Operations" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", - "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", - "service": "Event Hubs", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "92664c60-47e3-4591-8b1b-8d557656e686", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#send-logs-to-microsoft-sentinel", + "service": "AppGW", "severity": "Medium", - "text": "Design Resilient Event Hubs", - "waf": "Reliability" + "text": "Send Azure Application Gateway WAF logs to Microsoft Sentinel.", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", - "service": "AVS", - "severity": "High", - "text": "Ensure ADDS domain controller(s) are deployed in the identity subscription in native Azure", - "waf": "Reliability" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medium", + "text": "Send Azure Front Door WAF logs to Microsoft Sentinel.", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "75089c20-990d-4927-b105-885576f76fc2", - "service": "AVS", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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": "AppGW", "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", - "waf": "Reliability" + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", - "service": "AVS", - "severity": "High", - "text": "Ensure that vCenter is connected to ADDS to enable authentication based on 'named user accounts'", - "waf": "Reliability" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", + "service": "AppGW", + "severity": "Medium", + "text": "Use WAF Policies instead of the legacy WAF configuration.", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", - "service": "AVS", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", + "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", + "service": "AppGW", "severity": "Medium", - "text": "Ensure that the connection from vCenter to ADDS is using a secure protocol (LDAPS)", + "text": "Filter inbound traffic in the backends so that they only accept connections from the Application Gateway subnet, for example with NSGs.", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", - "service": "AVS", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", + "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", + "service": "Front Door", "severity": "Medium", - "text": "CloudAdmin account in vCenter IdP is used only as an emergency account (break-glass)", + "text": "Make sure your origins only take traffic from your Azure Front Door instance.", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", - "service": "AVS", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", + "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", + "service": "AppGW", "severity": "High", - "text": "Ensure that NSX-Manager is integrated with an external Identity provider (LDAPS)", + "text": "You should encrypt traffic to the backend servers.", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", - "service": "AVS", - "severity": "Medium", - "text": "Has an RBAC model been created for use within VMware vSphere", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", + "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", + "service": "AppGW", + "severity": "High", + "text": "You should use a Web Application Firewall.", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", - "service": "AVS", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", + "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", + "service": "AppGW", "severity": "Medium", - "text": "RBAC permissions should be granted on ADDS groups and not on specific users", + "text": "Redirect HTTP to HTTPS", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", - "service": "AVS", - "severity": "High", - "text": "RBAC permissions on the Azure VMware Solution resource in Azure are 'locked down' to a limited set of owners only", - "waf": "Reliability" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "bb697864-1b4c-43af-8667-90cc69aaed5f", + "link": "https://learn.microsoft.com/azure/application-gateway/how-application-gateway-works#modifications-to-the-request", + "service": "AppGW", + "severity": "Medium", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", - "service": "AVS", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", + "service": "AppGW", "severity": "High", - "text": "Ensure all custom roles are scoped with CloudAdmin permitted authorizations", + "text": "Enable connection draining during planned service updates to prevent connection loss to existing members of the backend pool", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", - "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", - "service": "AVS", - "severity": "High", - "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": "Azure VMware Solution Design Review", - "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", - "service": "AVS", - "severity": "High", - "text": "Ensure ExpressRoute or VPN connections from on-premises to Azure are monitored using 'connection monitor'", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", + "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", + "service": "AppGW", + "severity": "Low", + "text": "Create custom error pages to display a personalized user experience", "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", - "service": "AVS", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", + "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", + "service": "AppGW", "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": "Edit HTTP requests and response headers for easier routing and information exchange between the client and server", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", - "service": "AVS", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "AppGW", "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": "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.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", - "service": "AVS", - "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.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "29dcc19f-a8fa-4c35-8281-290577538793", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "AppGW", + "severity": "Medium", + "text": "Use transport layer load balancing", + "waf": "Performance" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", - "service": "AVS", - "severity": "High", - "text": "Is Privileged Identity Management implemented for roles managing the Azure VMware Solution resource in the Azure Portal (no standing permissions allowed)", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", + "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", + "service": "AppGW", + "severity": "Medium", + "text": "Configure routing based on host or domain name for multiple web applications on a single gateway", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", - "service": "AVS", - "severity": "High", - "text": "Privileged Identity Management audit reporting should be implemented for the Azure VMware Solution PIM roles", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", + "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", + "service": "AppGW", + "severity": "Medium", + "text": "Centralize SSL certificate management to reduce encryption and decryption overhead from a backend server farm", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", - "service": "AVS", - "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)", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", + "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", + "service": "AppGW", + "severity": "Low", + "text": "Use Application Gateway for native support for WebSocket and HTTP/2 protocols", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", + "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", + "service": "Logic Apps", "severity": "High", - "text": "Limit use of CloudAdmin account to emergency access only", + "text": "Select the right Logic App hosting plan based on your business & SLO requirements", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", - "service": "AVS", - "severity": "Medium", - "text": "Create custom RBAC roles in vCenter to implement a least-privilege model inside vCenter", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps 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", + "severity": "High", + "text": "Protect logic apps from region failures with zone redundancy and availability zones", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", - "service": "AVS", - "severity": "Medium", - "text": "Is a process defined to regularly rotate cloudadmin (vCenter) and admin (NSX) credentials", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps 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", + "severity": "High", + "text": "Consider a Cross-Region DR strategy for critical workloads", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", + "link": "https://learn.microsoft.com/azure/app-service/environment/intro", + "service": "Logic Apps", "severity": "High", - "text": "Use a centralized identity provider to be used for workloads (VM's) running on Azure VMware Solution", + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", + "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", + "service": "Logic Apps", "severity": "Medium", - "text": "Is East-West traffic filtering implemented within NSX-T", - "waf": "Reliability" + "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", "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": "Reliability" + "text": "Follow Metaprompting guardrails for resonsible AI", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", + "link": "https://github.com/Azure-Samples/AI-Gateway", + "service": "OpenAI", "severity": "High", - "text": "Auditing and logging is implemented for inbound internet requests to Azure VMware Solution and Azure VMware Solution based workloads", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", - "service": "AVS", - "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": "Reliability" + "text": "Consider Gateway patterns with APIM or solutions like AI central for better rate limiting, load balancing, authentication and logging", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "334fdf91-c234-4182-a652-75269440b4be", - "service": "AVS", - "severity": "Medium", - "text": "Is DDoS standard protection enabled on ExR/VPN Gateway subnet in Azure", - "waf": "Reliability" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", + "severity": "High", + "text": "Enable monitoring for your AOAI instances", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", - "service": "AVS", - "severity": "Medium", - "text": "Use a dedicated privileged access workstation (PAW) to manage Azure VMware Solution, vCenter, NSX manager and HCX manager", - "waf": "Reliability" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "697cb391-ed16-4b2d-886f-0a0241addde6", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", + "service": "OpenAI", + "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": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", - "service": "AVS", - "severity": "Medium", - "text": "Enable Advanced Threat Detection (Microsoft Defender for Cloud aka ASC) for workloads running on Azure VMware Solution", - "waf": "Reliability" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "OpenAI", + "severity": "High", + "text": "Monitor token usage to prevent service disruptions due to capacity", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "OpenAI", "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": "Reliability" + "text": "observe metrics like processed inference tokens, generated completion tokens monitor for rate limit", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", "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": "Reliability" + "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": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "a3592718-e6e2-4051-9267-6ae46691e883", - "service": "AVS", - "severity": "Low", - "text": "When in-guest encryption is used, store encryption keys in Azure Key vault when possible", - "waf": "Reliability" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", + "link": "https://github.com/Azure-Samples/openai-enterprise-iac", + "service": "OpenAI", + "severity": "High", + "text": "Use Infrastructure as code to deploy the Azure OpenAI Service, model deployments, and all related resources", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "5ac94222-3e13-4810-9230-81a941741583", - "service": "AVS", - "severity": "Medium", - "text": "Consider using extended security update support for workloads running on Azure VMware Solution (Azure VMware Solution is eligible for ESU)", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "4350d092-d234-4292-a752-8537a551c5bf", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", + "service": "OpenAI", + "severity": "High", + "text": "Use Microsoft Entra Authentication with Managed Identity instead of API Key", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", "severity": "High", - "text": "Ensure that the appropriate vSAN Data redundancy method is used (RAID specification)", - "waf": "Reliability" + "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": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d88408f3-7273-44c8-96ba-280214590146", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", "severity": "High", - "text": "Ensure that the Failure-to-tolerate policy is in place to meet your vSAN storage needs", - "waf": "Reliability" + "text": "Evaluate usage of Provisioned throughput model ", + "waf": "Performance" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", + "service": "OpenAI", "severity": "High", - "text": "Ensure that you have requested enough quota, ensuring you have considered growth and Disaster Recovery requirement", - "waf": "Reliability" + "text": "Review and implement Azure AI content safety", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1193846d-697c-4b39-8ed1-6b2d186f0a02", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#system-level-throughput", + "service": "OpenAI", + "severity": "High", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", + "service": "OpenAI", "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" + "text": "Improve latency of the system by limiting token sizes, streaming options", + "waf": "Performance" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "service": "OpenAI", "severity": "Medium", - "text": "Ensure a good cost management process is in place for Azure VMware Solution - Azure Cost Management can be used", - "waf": "Cost" + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", - "service": "AVS", - "severity": "Low", - "text": "Are Azure reserved instances used to optimize cost for using Azure VMware Solution", - "waf": "Cost" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "5bda4332-4f24-4811-9331-82ba51752694", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "OpenAI", + "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" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6691e883-5ac9-4422-83e1-3810523081a9", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", "severity": "Medium", - "text": "Consider the use of Azure Private-Link when using other Azure Native Services", - "waf": "Reliability" + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", + "service": "OpenAI", "severity": "High", - "text": "Ensure all required resource reside within the same Azure availability zone(s)", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e9951904-8384-45c9-a6cb-2912156a1147", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "OpenAI", "severity": "Medium", - "text": "Enable Microsoft Defender for Cloud for Azure VMware Solution guest VM workloads", - "waf": "Reliability" + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", - "service": "AVS", - "severity": "Medium", - "text": "Use Azure Arc enabled servers to manage your Azure VMware Solution guest VM workloads", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "5e39f541-accc-4d97-a376-bcdb3750ab2a", + "link": "https://learn.microsoft.com/azure/architecture/ai-ml/architecture/baseline-openai-e2e-chat#azure-openai---reliability", + "service": "OpenAI", + "severity": "Low", + "text": "Deploy multiple OAI instances across regions", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "b039da6d-55d7-4c89-8adb-107d5325af62", + "link": "https://learn.microsoft.com/azure/architecture/ai-ml/architecture/baseline-openai-e2e-chat#azure-openai---reliability", + "service": "OpenAI", "severity": "High", - "text": "Enable Diagnostic and metric logging on Azure VMware Solution", - "waf": "Operations" + "text": "Implement retry & healthchecks with Gateway pattern like APIM", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "5ca44e46-85e2-4223-ace8-bb12308ca5f1", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/quota?tabs=rest#introduction-to-quota", + "service": "OpenAI", "severity": "Medium", - "text": "Deploy the Log Analytics Agents to Azure VMware Solution guest VM workloads", - "waf": "Operations" + "text": "Ensure having adequate quotas of TPM & RPM for the workload", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "589d457a-927c-4397-9d11-02cad6aae11e", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", + "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", + "service": "OpenAI", "severity": "Medium", - "text": "Ensure you have a documented and implemented backup policy and solution for Azure VMware Solution VM workloads", + "text": "Review the considerations in HAI toolkit guidance and apply those interaction practices for the slution", "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ee29711b-d352-4caa-ab79-b198dab81932", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7f154e3a-a369-4282-ae7e-316183687a04", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", + "service": "OpenAI", "severity": "Medium", - "text": "Use Microsoft Defender for Cloud for compliance monitoring of workloads running on Azure VMware Solution", + "text": "Deploy separate fine tuned models across regions if finetuning is employed", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "77a1f893-5bda-4433-84f2-4811633182ba", + "link": "https://learn.microsoft.com/azure/backup/backup-overview", + "service": "OpenAI", "severity": "Medium", - "text": "Are the applicable compliance baselines added to Microsoft Defender for Cloud", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "95b96ad8-844c-4e3b-8b38-b876ba2cf204", + "link": "https://www.microsoft.com/licensing/docs/view/Service-Level-Agreements-SLA-for-Online-Services?lang=1", + "service": "OpenAI", "severity": "High", - "text": "Was data residency evaluated when selecting Azure regions to use for Azure VMware Solution deployment", + "text": "Azure AI search service tiers should be choosen to have a SLA ", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", - "service": "AVS", - "severity": "High", - "text": "Are data processing implications (service provider / service consumer model) clear and documented", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", + "link": "https://learn.microsoft.com/purview/purview", + "service": "OpenAI", + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "547c1747-dc56-4068-a714-435cd19dd244", - "service": "AVS", - "severity": "Medium", - "text": "Consider using CMK (Customer Managed Key) for vSAN only if needed for compliance reason(s).", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "4fda1dbf-3dd9-45d4-ac7c-891dca1f6d56", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/use-your-data-securely", + "service": "OpenAI", + "severity": "High", + "text": "Encrypt data used for RAG with SSE/Disk encryption with optional BYOK", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", + "link": "https://learn.microsoft.com/azure/search/search-security-overview", + "service": "OpenAI", "severity": "High", - "text": "Create dashboards to enable core Azure VMware Solution monitoring insights", - "waf": "Operations" + "text": "Ensure TLS is enforced for data in transit across data sources, AI search used for Retrieval-Augmented Generation (RAG) and LLM communication", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", - "service": "AVS", - "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": "Azure VMware Solution Design Review", - "guid": "9659e396-80e7-4828-ac93-5657d02bff45", - "service": "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7b94ef6e-047d-42ea-8992-b1cd6e2054b2", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", + "service": "OpenAI", "severity": "High", - "text": "Ensure alerts are configured for Azure Service Health alerts and notifications", - "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", + "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", + "service": "OpenAI", "severity": "Medium", - "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": "Azure VMware Solution Design Review", - "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", - "service": "AVS", - "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" + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", + "service": "OpenAI", "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": "Azure VMware Solution Design Review", - "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", - "service": "AVS", - "severity": "Medium", - "text": "Ensure vSphere content libraries are not placed on vSAN as vSAN is a finite resource", - "waf": "Operations" + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", "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" + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", - "service": "AVS", - "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)", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", + "service": "OpenAI", + "severity": "High", + "text": "Implement Prompt shields and groundedness detection using Content Safety ", "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", - "service": "AVS", - "severity": "Medium", - "text": "Ensure workloads running on Azure VMware Solution are monitored using Azure Log Analytics and Azure Monitor", - "waf": "Operations" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", + "link": "https://learn.microsoft.com/azure/compliance/", + "service": "OpenAI", + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", + "service": "OpenAI", "severity": "Medium", - "text": "Include workloads running on Azure VMware Solution in existing update management tooling or in Azure Update Management", - "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", + "service": "OpenAI", + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", + "service": "OpenAI", "severity": "Medium", - "text": "Ensure workloads running on Azure VMware Solution are onboarded to Microsoft Defender for Cloud", + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", + "service": "OpenAI", "severity": "Medium", - "text": "Ensure backups are not stored on vSAN as vSAN is a finite resource", + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", - "service": "AVS", - "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/...]", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", + "service": "OpenAI", + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", - "service": "AVS", - "severity": "Medium", - "text": "Use Azure Site Recovery when the Disaster Recovery technology is native Azure IaaS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3571449a-b805-43d8-af89-dc7b33be2a1a", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", + "service": "OpenAI", + "severity": "High", + "text": "Apply RBAC to th data stores having embeddings and vectors and scope access based on role's access requirements", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", "severity": "High", - "text": "Use Automated recovery plans with either of the Disaster solutions, avoid manual tasks as much as possible", + "text": "Configure private endpoint for AI services to restrict service access within your network", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "8255461e-2aee-4345-9aec-8339248b262d", - "service": "AVS", - "severity": "Medium", - "text": "Use the geopolitical region pair as the secondary disaster recovery environment", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", + "service": "OpenAI", + "severity": "High", + "text": "Enforce strict inbound and outbound traffic control with Azure Firewall and UDRs and limit the external integration points", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", + "service": "OpenAI", "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", + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", + "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", + "service": "OpenAI", "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?", + "text": "Use prompt compression tools like LLMLingua or gprtrim", + "waf": "Cost" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", + "service": "OpenAI", + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", "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/�. ]", + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "93555620-2bfe-4456-9b0d-834a348b263e", + "service": "OpenAI", "severity": "Medium", - "text": "Deploy your backup solution in the same region as your Azure VMware Solution private cloud", + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", + "service": "OpenAI", "severity": "Medium", - "text": "Deploy your backup solution outside of vSan, on Azure native components", + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", + "service": "OpenAI", "severity": "Low", - "text": "Is a process in place to request a restore of the VMware components managed by the Azure Platform?", - "waf": "Reliability" + "text": "Azure AI Services are properly tagged for better management", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", + "service": "OpenAI", "severity": "Low", - "text": "For manual deployments, all configuration and deployments must be documented", + "text": "Azure AI Service accounts follows organizational naming conventions", "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", - "service": "AVS", - "severity": "Low", - "text": "For manual deployments, consider implementing resource locks to prevent accidental actions on your Azure VMware Solution Private Cloud", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", + "service": "OpenAI", + "severity": "High", + "text": "Diagnostic logs in Azure AI services resources should be enabled", "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", - "service": "AVS", - "severity": "Low", - "text": "For automated deployments, deploy a minimal private cloud and scale as needed", - "waf": "Operations" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "link": "https://learn.microsoft.com/azure/ai-services/authentication", + "service": "OpenAI", + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", - "service": "AVS", - "severity": "Low", - "text": "For automated deployments, request or reserve quota prior to starting the deployment", - "waf": "Operations" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "OpenAI", + "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": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "OpenAI", + "severity": "High", + "text": "Regularly rotate and expire keys stored in Azure Key Vault to minimize the risk of unauthorized access.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "adfe27be-e297-401a-a352-baaab79b088d", + "link": "https://github.com/openai/tiktoken", + "service": "OpenAI", + "severity": "High", + "text": "Use tiktoken to understand token sizes for token optimizations in conversational mode", + "waf": "Cost" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "255461e2-aee3-4553-afc8-339248b262d6", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", + "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", + "service": "OpenAI", + "severity": "High", + "text": "Follow secure coding practices to prevent common vulnerabilities such as injection attacks, cross-site scripting (XSS), or security misconfigurations", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "78c06a73-a22a-4495-9e6a-8dc4a20e27c3", + "link": "https://learn.microsoft.com/azure/devops/repos/security/github-advanced-security-dependency-scanning?view=azure-devops", + "service": "OpenAI", + "severity": "High", + "text": "Setup a process to regularly update and patch the LLM libraries and other system components", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", - "service": "AVS", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e29711b1-352b-4eee-879b-588defc4972c", + "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", + "service": "OpenAI", + "severity": "High", + "text": "Adhere to Azure OpenAI or other LLMs terms of use, policies and guidance and allowed use cases", "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", "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" + "text": "Understand difference in cost of base models and fine tuned models and token step sizes", + "waf": "Cost" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "service": "OpenAI", + "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" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", + "service": "OpenAI", "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" + "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" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "166cd072-af9b-4141-a898-a535e737897e", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/quota?tabs=rest#understanding-rate-limits", + "service": "OpenAI", "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": "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" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", + "link": "https://learn.microsoft.com/azure/search/search-reliability", + "service": "OpenAI", "severity": "Medium", - "text": "Consider and validate scaling operations on 3rd party solutions used in the architecture (supported or not)", - "waf": "Performance" + "text": "Review the guidance provided on setting up AI search for Reliability", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3266b225-86f4-4a16-92bd-ddea8a487cde", + "link": "https://learn.microsoft.com/azure/search/vector-search-index-size?tabs=portal-vector-quota", + "service": "OpenAI", "severity": "Medium", - "text": "Define and enforce scale in/out maximum limits for your environment in the automations", - "waf": "Performance" + "text": "Plan and manage AI Search Vector storage", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", "severity": "Medium", - "text": "Implement monitoring rules to monitor automated scaling operations and monitor success and failure to enable appropriate (automated) responses", + "text": "Apply LLMOps practices to automate the lifecycle management of your GenAI applications", "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c5972cd4-cd21-4b07-9036-f5e6b4bfd3d5", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", "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" + "text": "Evaluate usage of billing models - PAYG vs PTU", + "waf": "Cost" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "be1f38cf-03a8-422b-b463-cbbbc8ac299e", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", - "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": "Azure VMware Solution Design Review", - "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", "severity": "Medium", - "text": "If using a VPN connection for migrations, adjust your MTU size accordingly.", - "waf": "Performance" + "text": "Evaluate the quality of prompts and applications when switching between model versions", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e614658d-d457-4e92-9139-b821102cad6e", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", "severity": "Medium", - "text": "For low connectivity regions connecting into Azure (500Mbps or less), considering deploying the HCX WAN optimization appliance", - "waf": "Performance" + "text": "Evaluate, monitor and refine your GenAI apps for features like groundedness, relevance, accuracy, coherence, fluency, �", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "294798b1-578b-4219-a46c-eb5443513592", + "service": "OpenAI", "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 your Azure AI Search results based on different search parameters", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "2744293b-b628-4537-a551-19b08e8f5854", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", + "service": "OpenAI", "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": "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": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bff4564b-0d93-44a3-98b2-63e7dd60513a", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", "severity": "Medium", - "text": "Ensure that a dedicated ExpressRoute Gateway is being used for external data storage solutions", - "waf": "Reliability" + "text": "Use prompt engineering techniques to improve the accuracy of LLM responses", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e737897e-71ca-47da-acfa-962a1594946d", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", + "service": "OpenAI", "severity": "Medium", - "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": "Azure VMware Solution Design Review", - "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", - "severity": "High", - "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": "Azure VMware Solution Design Review", - "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "AVS", - "severity": "High", - "text": "If using stretched cluster, ensure that the SLA provided will meet your requirements", + "text": "Red team your GenAI applications", "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", - "service": "AVS", - "severity": "High", - "text": "If using stretched cluster, ensure that both ExpressRoute circuits are connected to your connectivity hub.", - "waf": "Reliability" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", + "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", + "service": "OpenAI", + "severity": "Medium", + "text": "Provide end users with scoring options for LLM responses and track these scores. ", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", - "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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": "OpenAI", "severity": "High", - "text": "If using stretched cluster, ensure that both ExpressRoute circuits have GlobalReach enabled.", - "waf": "Reliability" + "text": "Consider Quota management practices", + "waf": "Cost" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", - "service": "AVS", - "severity": "High", - "text": "Have site disaster tolerance settings been properly considered and changed for your business if needed.", - "waf": "Reliability" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", + "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", + "service": "OpenAI", + "severity": "Medium", + "text": "Use Load balancer solutions like APIM based gateway for balancing load and capacity across services and regions", + "waf": "Operations" }, { "arm-service": "Microsoft.Devices/IotHubs", @@ -4425,4292 +4436,4281 @@ "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", + "arm-service": "Microsoft.App/containerApps", + "checklist": "Container Apps Review", + "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", "severity": "High", - "text": "Follow Metaprompting guardrails for resonsible AI", - "waf": "Operations" + "text": "Leverage Availability Zones if regionally applicable", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", - "link": "https://github.com/Azure-Samples/AI-Gateway", - "service": "OpenAI", + "arm-service": "Microsoft.App/containerApps", + "checklist": "Container Apps Review", + "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", "severity": "High", - "text": "Consider Gateway patterns with APIM or solutions like AI central for better rate limiting, load balancing, authentication and logging", - "waf": "Operations" + "text": "Use more than one replica and enable Zone Redundancy.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", + "arm-service": "Microsoft.App/containerApps", + "checklist": "Container Apps Review", + "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", "severity": "High", - "text": "Enable monitoring for your AOAI instances", - "waf": "Operations" + "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", - "checklist": "Azure OpenAI Review", - "guid": "697cb391-ed16-4b2d-886f-0a0241addde6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", - "service": "OpenAI", + "arm-service": "Microsoft.App/containerApps", + "checklist": "Container Apps Review", + "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", "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": "Operations" + "text": "Use Front Door or Traffic Manager to route traffic to the closest region", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "OpenAI", + "arm-service": "Microsoft.DBforPostgreSQL/servers", + "checklist": "PostgreSQL Review Checklist", + "guid": "65285269-441c-44bf-9d3e-0844276d4bdc", + "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview", + "service": "PostgreSQL", + "severity": "Medium", + "text": "Leverage Flexible Server", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.DBforPostgreSQL/servers", + "checklist": "PostgreSQL Review Checklist", + "guid": "016ccf31-ae5a-41eb-9888-9535e227896d", + "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview#architecture-and-high-availability", + "service": "PostgreSQL", "severity": "High", - "text": "Monitor token usage to prevent service disruptions due to capacity", - "waf": "Operations" + "text": "Leverage Availability Zones where regionally applicable", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "OpenAI", + "arm-service": "Microsoft.DBforPostgreSQL/servers", + "checklist": "PostgreSQL Review 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", "severity": "Medium", - "text": "observe metrics like processed inference tokens, generated completion tokens monitor for rate limit", - "waf": "Operations" + "text": "Leverage cross-region read replicas for BCDR", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", + "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", + "service": "AKS", "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": "Operations" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", - "link": "https://github.com/Azure-Samples/openai-enterprise-iac", - "service": "OpenAI", - "severity": "High", - "text": "Use Infrastructure as code to deploy the Azure OpenAI Service, model deployments, and all related resources", - "waf": "Operations" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "4350d092-d234-4292-a752-8537a551c5bf", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "OpenAI", - "severity": "High", - "text": "Use Microsoft Entra Authentication with Managed Identity instead of API Key", + "text": "If required for AKS Windows workloads HostProcess containers can be used", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", - "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": "Operations" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", - "severity": "High", - "text": "Evaluate usage of Provisioned throughput model ", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", + "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", + "service": "AKS", + "severity": "Low", + "text": "Use KEDA if running event-driven workloads", "waf": "Performance" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", - "service": "OpenAI", - "severity": "High", - "text": "Review and implement Azure AI content safety", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", + "link": "https://dapr.io/", + "service": "AKS", + "severity": "Low", + "text": "Use Dapr to ease microservice development", "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1193846d-697c-4b39-8ed1-6b2d186f0a02", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#system-level-throughput", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "High", - "text": "Define and evaluate the throughput of the system based on tokens & response per minute and align with requirements", - "waf": "Performance" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", - "service": "OpenAI", - "severity": "Medium", - "text": "Improve latency of the system by limiting token sizes, streaming options", - "waf": "Performance" + "text": "Use the SLA-backed AKS offering", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", - "service": "OpenAI", - "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" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", + "severity": "Low", + "text": "Use Disruption Budgets in your pod and deployment definitions", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "5bda4332-4f24-4811-9331-82ba51752694", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "OpenAI", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure AKS Review", + "guid": "3c763963-7a55-42d5-a15e-401955387e5c", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", + "service": "ACR", "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" + "text": "If using a private registry, configure region replication to store images in multiple regions", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", - "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" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", + "service": "AKS", + "severity": "Low", + "text": "Use an external application such as kubecost to allocate costs to different users", + "waf": "Cost" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", - "service": "OpenAI", - "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.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", + "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", + "service": "AKS", + "severity": "Low", + "text": "Use scale down mode to delete/deallocate nodes", + "waf": "Cost" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e9951904-8384-45c9-a6cb-2912156a1147", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", + "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", + "service": "AKS", "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": "When required use multi-instance partitioning GPU on AKS Clusters", + "waf": "Cost" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "5e39f541-accc-4d97-a376-bcdb3750ab2a", - "link": "https://learn.microsoft.com/azure/architecture/ai-ml/architecture/baseline-openai-e2e-chat#azure-openai---reliability", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", + "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", + "service": "AKS", "severity": "Low", - "text": "Deploy multiple OAI instances across regions", - "waf": "Reliability" + "text": "If running a Dev/Test cluster use NodePool Start/Stop", + "waf": "Cost" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "b039da6d-55d7-4c89-8adb-107d5325af62", - "link": "https://learn.microsoft.com/azure/architecture/ai-ml/architecture/baseline-openai-e2e-chat#azure-openai---reliability", - "service": "OpenAI", - "severity": "High", - "text": "Implement retry & healthchecks with Gateway pattern like APIM", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Medium", + "text": "Use Azure Policy for Kubernetes to ensure cluster compliance", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "5ca44e46-85e2-4223-ace8-bb12308ca5f1", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/quota?tabs=rest#introduction-to-quota", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Medium", - "text": "Ensure having adequate quotas of TPM & RPM for the workload", + "text": "Separate applications from the control plane with user/system node pools", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", - "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", - "service": "OpenAI", - "severity": "Medium", - "text": "Review the considerations in HAI toolkit guidance and apply those interaction practices for the slution", - "waf": "Operations" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", + "link": "https://learn.microsoft.com/azure/aks/use-system-pools", + "service": "AKS", + "severity": "Low", + "text": "Add taint to your system nodepool to make it dedicated", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7f154e3a-a369-4282-ae7e-316183687a04", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", + "link": "https://learn.microsoft.com/azure/container-registry/", + "service": "AKS", "severity": "Medium", - "text": "Deploy separate fine tuned models across regions if finetuning is employed", + "text": "Use a private registry for your images, such as ACR", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "77a1f893-5bda-4433-84f2-4811633182ba", - "link": "https://learn.microsoft.com/azure/backup/backup-overview", - "service": "OpenAI", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure AKS Review", + "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", + "link": "https://learn.microsoft.com/azure/security-center/container-security", + "service": "ACR", "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.", + "text": "Scan your images for vulnerabilities", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "95b96ad8-844c-4e3b-8b38-b876ba2cf204", - "link": "https://www.microsoft.com/licensing/docs/view/Service-Level-Agreements-SLA-for-Online-Services?lang=1", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", + "service": "AKS", "severity": "High", - "text": "Azure AI search service tiers should be choosen to have a SLA ", + "text": "Define app separation requirements (namespace/nodepool/cluster)", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", - "link": "https://learn.microsoft.com/purview/purview", - "service": "OpenAI", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", + "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", + "service": "AKS", + "severity": "Medium", + "text": "Store your secrets in Azure Key Vault with the CSI Secrets Store driver", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "4fda1dbf-3dd9-45d4-ac7c-891dca1f6d56", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/use-your-data-securely", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", + "link": "https://learn.microsoft.com/azure/aks/update-credentials", + "service": "AKS", "severity": "High", - "text": "Encrypt data used for RAG with SSE/Disk encryption with optional BYOK", + "text": "If using Service Principals for the cluster, refresh credentials periodically (like quarterly)", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", - "link": "https://learn.microsoft.com/azure/search/search-security-overview", - "service": "OpenAI", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", + "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", + "service": "AKS", + "severity": "Medium", + "text": "If required add Key Management Service etcd encryption", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7b94ef6e-047d-42ea-8992-b1cd6e2054b2", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "OpenAI", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", + "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", + "service": "AKS", + "severity": "Low", + "text": "If required consider using Confidential Compute for AKS", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", - "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", + "service": "AKS", "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": "Consider using Defender for Containers", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "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", + "text": "Use managed identities instead of Service Principals", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "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 authentication with AAD (using the managed integration)", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", - "service": "OpenAI", - "severity": "High", - "text": "Implement Prompt shields and groundedness detection using Content Safety ", - "waf": "Operations" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", - "link": "https://learn.microsoft.com/azure/compliance/", - "service": "OpenAI", - "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.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", + "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", + "service": "AKS", + "severity": "Medium", + "text": "Limit access to admin kubeconfig (get-credentials --admin)", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", + "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", + "service": "AKS", "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": "Integrate authorization with AAD RBAC", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", + "service": "AKS", "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.", + "text": "Use namespaces for restricting RBAC privilege in Kubernetes", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", + "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", + "service": "AKS", "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": "For Pod Identity Access Management use Azure AD Workload Identity (preview)", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", + "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", + "service": "AKS", "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", + "text": "For AKS non-interactive logins use kubelogin (preview)", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", - "service": "OpenAI", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Medium", + "text": "Disable AKS local accounts", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3571449a-b805-43d8-af89-dc7b33be2a1a", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "OpenAI", - "severity": "High", - "text": "Apply RBAC to th data stores having embeddings and vectors and scope access based on role's access requirements", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Low", + "text": "Configure if required Just-in-time cluster access", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", - "severity": "High", - "text": "Configure private endpoint for AI services to restrict service access within your network", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Low", + "text": "Configure if required AAD conditional access for AKS", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", - "service": "OpenAI", - "severity": "High", - "text": "Enforce strict inbound and outbound traffic control with Azure Firewall and UDRs and limit the external integration points", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", + "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", + "service": "AKS", + "severity": "Low", + "text": "If required for Windows AKS workloads configure gMSA ", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", - "service": "OpenAI", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Medium", + "text": "For finer control consider using a managed Kubelet Identity", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", - "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", + "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", + "service": "AKS", "severity": "Medium", - "text": "Use prompt compression tools like LLMLingua or gprtrim", - "waf": "Cost" + "text": "If using AGIC, do not share an AppGW across clusters", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "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.", + "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", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", + "service": "AKS", "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": "For Windows workloads use Accelerated Networking", + "waf": "Performance" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "High", + "text": "Use the standard ALB (as opposed to the basic one)", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "93555620-2bfe-4456-9b0d-834a348b263e", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "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": "If using Azure CNI, consider using different Subnets for NodePools", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", + "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", + "service": "AKS", "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", + "text": "Use Private Endpoints (preferred) or Virtual Network Service Endpoints to access PaaS services from the cluster", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", - "service": "OpenAI", - "severity": "Low", - "text": "Azure AI Services are properly tagged for better management", - "waf": "Operations" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "High", + "text": "Choose the best CNI network plugin for your requirements (Azure CNI recommended)", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", - "service": "OpenAI", - "severity": "Low", - "text": "Azure AI Service accounts follows organizational naming conventions", - "waf": "Operations" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", + "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", - "checklist": "Azure OpenAI Review", - "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", - "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "severity": "High", - "text": "Diagnostic logs in Azure AI services resources should be enabled", - "waf": "Operations" + "text": "If using Azure CNI, check the maximum pods/node (default 30)", + "waf": "Performance" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", - "link": "https://learn.microsoft.com/azure/ai-services/authentication", - "service": "OpenAI", - "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. ", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Low", + "text": "If using private-IP LoadBalancer services, use a dedicated subnet (not the AKS subnet)", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "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", + "text": "Size the service IP address range accordingly (it is going to limit the cluster scalability)", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "OpenAI", - "severity": "High", - "text": "Regularly rotate and expire keys stored in Azure Key Vault to minimize the risk of unauthorized access.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", + "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", + "service": "AKS", + "severity": "Low", + "text": "If required add your own CNI plugin", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "adfe27be-e297-401a-a352-baaab79b088d", - "link": "https://github.com/openai/tiktoken", - "service": "OpenAI", - "severity": "High", - "text": "Use tiktoken to understand token sizes for token optimizations in conversational mode", - "waf": "Cost" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Low", + "text": "If required configure Public IP per node in AKS", + "waf": "Performance" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", - "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", - "service": "OpenAI", - "severity": "High", - "text": "Follow secure coding practices to prevent common vulnerabilities such as injection attacks, cross-site scripting (XSS), or security misconfigurations", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", + "link": "https://learn.microsoft.com/azure/aks/concepts-network", + "service": "AKS", + "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", - "checklist": "Azure OpenAI Review", - "guid": "78c06a73-a22a-4495-9e6a-8dc4a20e27c3", - "link": "https://learn.microsoft.com/azure/devops/repos/security/github-advanced-security-dependency-scanning?view=azure-devops", - "service": "OpenAI", - "severity": "High", - "text": "Setup a process to regularly update and patch the LLM libraries and other system components", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", + "link": "https://learn.microsoft.com/azure/aks/nat-gateway", + "service": "AKS", + "severity": "Low", + "text": "Use Azure NAT Gateway as outboundType for scaling egress traffic", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e29711b1-352b-4eee-879b-588defc4972c", - "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", - "service": "OpenAI", - "severity": "High", - "text": "Adhere to Azure OpenAI or other LLMs terms of use, policies and guidance and allowed use cases", - "waf": "Operations" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Medium", - "text": "Understand difference in cost of base models and fine tuned models and token step sizes", - "waf": "Cost" + "text": "Use Dynamic allocations of IPs in order to avoid Azure CNI IP exhaustion", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "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" + "text": "Filter egress traffic with AzFW/NVA if your security requirements mandate it", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "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" + "text": "If using a public API endpoint, restrict the IP addresses that can access it", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "166cd072-af9b-4141-a898-a535e737897e", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/quota?tabs=rest#understanding-rate-limits", - "service": "OpenAI", - "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" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "High", + "text": "Use private clusters if your requirements mandate it", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", - "link": "https://learn.microsoft.com/azure/search/search-reliability", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Medium", - "text": "Review the guidance provided on setting up AI search for Reliability", - "waf": "Operations" + "text": "For Windows 2019 and 2022 AKS nodes Calico Network Policies can be used ", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3266b225-86f4-4a16-92bd-ddea8a487cde", - "link": "https://learn.microsoft.com/azure/search/vector-search-index-size?tabs=portal-vector-quota", - "service": "OpenAI", - "severity": "Medium", - "text": "Plan and manage AI Search Vector storage", - "waf": "Operations" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "High", + "text": "Enable a Kubernetes Network Policy option (Calico/Azure)", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", - "severity": "Medium", - "text": "Apply LLMOps practices to automate the lifecycle management of your GenAI applications", - "waf": "Operations" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", + "severity": "High", + "text": "Use Kubernetes network policies to increase intra-cluster security", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", "severity": "High", - "text": "Evaluate usage of billing models - PAYG vs PTU", - "waf": "Cost" + "text": "Use a WAF for web workloads (UIs or APIs)", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Medium", - "text": "Evaluate the quality of prompts and applications when switching between model versions", - "waf": "Operations" + "text": "Use DDoS Standard in the AKS Virtual Network", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", - "severity": "Medium", - "text": "Evaluate, monitor and refine your GenAI apps for features like groundedness, relevance, accuracy, coherence, fluency, �", - "waf": "Operations" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Low", + "text": "If required add company HTTP Proxy", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "294798b1-578b-4219-a46c-eb5443513592", - "service": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", + "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", + "service": "AKS", "severity": "Medium", - "text": "Evaluate your Azure AI Search results based on different search parameters", - "waf": "Operations" + "text": "Consider using a service mesh for advanced microservice communication management", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "2744293b-b628-4537-a551-19b08e8f5854", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", - "service": "OpenAI", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", + "service": "AKS", + "severity": "High", + "text": "Configure alerts on the most critical metrics (see Container Insights for recommendations)", "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", - "severity": "Medium", - "text": "Use prompt engineering techniques to improve the accuracy of LLM responses", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "337453a3-cc63-4963-9a65-22ac19e80696", + "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", + "service": "AKS", + "severity": "Low", + "text": "Check regularly Azure Advisor for recommendations on your cluster", "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e737897e-71ca-47da-acfa-962a1594946d", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", - "service": "OpenAI", - "severity": "Medium", - "text": "Red team your GenAI applications", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", + "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", + "service": "AKS", + "severity": "Low", + "text": "Enable AKS auto-certificate rotation", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", - "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", - "service": "OpenAI", - "severity": "Medium", - "text": "Provide end users with scoring options for LLM responses and track these scores. ", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", + "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", + "service": "AKS", + "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", - "checklist": "Azure OpenAI Review", - "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": "OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", + "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", + "service": "AKS", "severity": "High", - "text": "Consider Quota management practices", - "waf": "Cost" + "text": "Use kured for Linux node upgrades in case you are not using node-image upgrade", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", - "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", - "service": "OpenAI", - "severity": "Medium", - "text": "Use Load balancer solutions like APIM based gateway for balancing load and capacity across services and regions", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", + "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", + "service": "AKS", + "severity": "High", + "text": "Have a regular process to upgrade the cluster node images periodically (weekly, for example)", "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "1fc2fc14-eea6-4e69-b8d9-a3edc218e687", - "link": "https://polite-sea-0995b240f.2.azurestaticapps.net/technical-delivery-playbook/azure-services/analytics/purview/", - "service": "Purview", - "severity": "Medium", - "text": "Leverage FTA Resillency Handbook", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", + "service": "AKS", + "severity": "Low", + "text": "Consider gitops to deploy applications or cluster configuration to multiple clusters", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "ab067acb-49e5-4b96-8332-4ecf8cc13318", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", - "severity": "High", - "text": "Plan for Data Center level outage", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d7672c26-7602-4482-85a4-14527fbe855c", + "link": "https://learn.microsoft.com/azure/aks/command-invoke", + "service": "AKS", + "severity": "Low", + "text": "Consider using AKS command invoke on private clusters", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review 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", - "severity": "Medium", - "text": "Practice Failover for BCDR", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", + "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", + "service": "AKS", + "severity": "Low", + "text": "For planned events consider using Node Auto Drain", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "97b15b8a-219a-44ab-bb57-879024d22678", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", + "link": "https://learn.microsoft.com/azure/aks/faq", + "service": "AKS", "severity": "High", - "text": "Plan a backup strategy and take regular backups", - "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", - "checklist": "Microsoft Purview Review Checklist", - "guid": "6d20b56c-56a9-4581-89bf-8d8e5c586b7d", - "link": "https://learn.microsoft.com/purview/manage-kafka-dotnet", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Low", - "text": "Use Microsoft Purview's Event Hubs to subscribe and create entities to another account", - "waf": "Reliability" + "text": "Use custom Node RG (aka 'Infra RG') name", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "8cdc15ac-c075-4ee9-a130-a8889579e76b", - "link": "https://learn.microsoft.com/purview/deployment-best-practices", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", + "link": "https://kubernetes.io/docs/setup/release/notes/", + "service": "AKS", "severity": "Medium", - "text": "Follow Purview accounts architectures and deployment best practices", - "waf": "Reliability" + "text": "Do not use deprecated Kubernetes APIs in your YAML manifests", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "896e710a-7da7-4be9-a56d-14d3c49d997c", - "link": "https://learn.microsoft.com/purview/concept-best-practices-collections", - "service": "Purview", - "severity": "Medium", - "text": "Follow Collection Architectures and best practices", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", + "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", + "service": "AKS", + "severity": "Low", + "text": "Taint Windows nodes", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "b3d1325a-a225-4c6f-9e06-85edddea8a4b", - "link": "https://learn.microsoft.com/purview/concept-best-practices-asset-lifecycle", - "service": "Purview", - "severity": "Medium", - "text": "Follow Assest lifecycle best practices", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Low", + "text": "Keep windows containers patch level in sync with host patch level", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "7cdeb3c6-1fc2-4fc1-9eea-6e69d8d9a3ed", - "link": "https://learn.microsoft.com/purview/concept-best-practices-automation", - "service": "Purview", - "severity": "Medium", - "text": "Follow automation best practices", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "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", - "checklist": "Microsoft Purview Review Checklist", - "guid": "c218e687-ab06-47ac-a49e-5b9603324ecf", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", - "severity": "Medium", - "text": "Follow Backup and Migration Best practices", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", + "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", + "service": "AKS", + "severity": "Low", + "text": "If required use nodePool snapshots", + "waf": "Cost" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "8cc13318-da61-4170-869f-4fb4aa3d3ef7", - "link": "https://learn.microsoft.com/purview/concept-best-practices-glossary", - "service": "Purview", - "severity": "Medium", - "text": "Follow Purview Glossary Best Practices", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", + "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", + "service": "AKS", + "severity": "Low", + "text": "Consider spot node pools for non time-sensitive workloads", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "f3176c4b-97b1-45b8-a219-a4abeb578790", - "link": "https://learn.microsoft.com/purview/concept-workflow", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Low", - "text": "Leverage Workflows ", - "waf": "Reliability" + "text": "Consider AKS virtual node for quick bursting", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "24d22678-6d20-4b56-a56a-958119bf8d8e", - "link": "https://learn.microsoft.com/purview/concept-best-practices-security", - "service": "Purview", - "severity": "Medium", - "text": "Follow Purview Security Best Practices", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", + "service": "AKS", + "severity": "High", + "text": "Monitor your cluster metrics with Container Insights (or other tools like Prometheus)", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "5c586b7d-8cdc-415a-ac07-5ee9b130a888", - "link": "https://learn.microsoft.com/purview/concept-best-practices-lineage-azure-data-factory", - "service": "Purview", - "severity": "Medium", - "text": "Follow Purview Data Lineage Best Practices", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "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", - "checklist": "Microsoft Purview Review Checklist", - "guid": "9579e76b-896e-4710-a7da-7be9956d14d3", - "link": "https://learn.microsoft.com/purview/concept-best-practices-scanning", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", + "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", + "service": "AKS", "severity": "Medium", - "text": "Follow Best Practices for Scanning Registered Sources", - "waf": "Reliability" + "text": "Monitor CPU and memory utilization of the nodes", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "c49d997c-b3d1-4325-aa22-5c6f4e0685ed", - "link": "https://learn.microsoft.com/purview/concept-best-practices-classification", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "1a4835ac-9422-423e-ae80-b123081a5417", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "severity": "Medium", - "text": "Follow Classification Best Practices in Governance Portal", - "waf": "Reliability" + "text": "If using Azure CNI, monitor % of pod IPs consumed per node", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "ddea8a4b-7cde-4b3c-91fc-2fc14eea6e69", - "link": "https://learn.microsoft.com/purview/sensitivity-labels-frequently-asked-questions", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Medium", - "text": "Perform Sensitivity Labelling in the Purview Data Map", - "waf": "Reliability" + "text": "Monitor OS disk queue depth in nodes", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "d8d9a3ed-c218-4e68-9ab0-67acb49e5b96", - "link": "https://learn.microsoft.com/purview/concept-data-share", - "service": "Purview", - "severity": "Low", - "text": "Leverage Azure Storage in-place data sharing with Microsoft Purview", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "be209d39-fda4-4777-a424-d116785c2fa5", + "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", + "service": "AKS", + "severity": "Medium", + "text": "If not using egress filtering with AzFW/NVA, monitor standard ALB allocated SNAT ports", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "03324ecf-8cc1-4331-ada6-1170269f4fb4", - "link": "https://learn.microsoft.com/purview/concept-insights", - "service": "Purview", - "severity": "Low", - "text": "Leverage Data Estate Insights", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", + "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", + "service": "AKS", + "severity": "Medium", + "text": "Subscribe to resource health notifications for your AKS cluster", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "aa3d3ef7-f317-46c4-a97b-15b8a219a4ab", - "link": "https://learn.microsoft.com/purview/catalog-adoption-insights", - "service": "Purview", - "severity": "Low", - "text": "Use Data stewardship and Catalog adoption", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", + "severity": "High", + "text": "Configure requests and limits in your pod specs", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "eb578790-24d2-4267-a6d2-0b56c56a9581", - "link": "https://learn.microsoft.com/purview/concept-insights", - "service": "Purview", - "severity": "Low", - "text": "Use Inventory and Ownership", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "769ef669-1a48-435a-a942-223ece80b123", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", + "severity": "Medium", + "text": "Enforce resource quotas for namespaces", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "19bf8d8e-5c58-46b7-b8cd-c15acc075ee9", - "link": "https://learn.microsoft.com/purview/glossary-insights", - "service": "Purview", - "severity": "Low", - "text": "Leverage Insights for Glossary, Classifications, Sensitivity Labels", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "b130a888-9579-4e76-a896-e710a7da7be9", - "link": "https://learn.microsoft.com/purview/compliance-manager", - "service": "Purview", - "severity": "Medium", - "text": "Generate assessment scores", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "956d14d3-c49d-4997-ab3d-1325aa225c6f", - "link": "https://learn.microsoft.com/purview/compliance-manager-scoring", - "service": "Purview", - "severity": "Medium", - "text": "Profiling- get summaries of data content", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "4e0685ed-ddea-48a4-a7cd-eb3c61fc2fc1", - "link": "https://learn.microsoft.com/purview/concept-policies-data-owner#microsoft-purview-policy-concepts", - "service": "Purview", - "severity": "Low", - "text": "Follow Microsoft Purview Data Owner access policies", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "4eea6e69-d8d9-4a3e-bc21-8e687ab067ac", - "link": "https://learn.microsoft.com/purview/concept-self-service-data-access-policy", - "service": "Purview", - "severity": "Low", - "text": "Follow Self-service access policies", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "b49e5b96-0332-44ec-b8cc-13318da61170", - "link": "https://learn.microsoft.com/purview/concept-policies-devops", - "service": "Purview", - "severity": "Low", - "text": "Follow DevOps policies", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "081a5417-4158-433e-a3ad-3c2de733165c", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", + "service": "AKS", + "severity": "High", + "text": "Ensure your subscription has enough quota to scale out your nodepools", + "waf": "Operations" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", - "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", + "guid": "f4fd0602-7ab5-46f1-b66a-e9dea9654a65", + "link": "https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/", "service": "AKS", - "severity": "Low", - "text": "If required for AKS Windows workloads HostProcess containers can be used", - "waf": "Reliability" + "severity": "High", + "text": "Configure Liveness and Readiness probes for all deployments", + "waf": "Operations" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", - "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", + "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", - "severity": "Low", - "text": "Use KEDA if running event-driven workloads", + "severity": "Medium", + "text": "Use the Cluster Autoscaler", "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", - "link": "https://dapr.io/", + "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", "severity": "Low", - "text": "Use Dapr to ease microservice development", - "waf": "Operations" + "text": "Customize node configuration for AKS node pools", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", + "link": "https://learn.microsoft.com/azure/aks/concepts-scale", "service": "AKS", - "severity": "High", - "text": "Use the SLA-backed AKS offering", - "waf": "Reliability" + "severity": "Medium", + "text": "Use the Horizontal Pod Autoscaler when required", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "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", - "severity": "Low", - "text": "Use Disruption Budgets in your pod and deployment definitions", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure AKS Review", - "guid": "3c763963-7a55-42d5-a15e-401955387e5c", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", - "service": "ACR", "severity": "High", - "text": "If using a private registry, configure region replication to store images in multiple regions", - "waf": "Reliability" + "text": "Consider an appropriate node size, not too large or too small", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", + "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", + "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", "service": "AKS", "severity": "Low", - "text": "Use an external application such as kubecost to allocate costs to different users", - "waf": "Cost" + "text": "If more than 5000 nodes are required for scalability then consider using an additional AKS cluster", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", - "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", + "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", + "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", "service": "AKS", "severity": "Low", - "text": "Use scale down mode to delete/deallocate nodes", - "waf": "Cost" + "text": "Consider subscribing to EventGrid Events for AKS automation", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", - "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", + "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", + "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", "service": "AKS", - "severity": "Medium", - "text": "When required use multi-instance partitioning GPU on AKS Clusters", - "waf": "Cost" + "severity": "Low", + "text": "For long running operation on an AKS cluster consider event termination", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", - "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", + "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", + "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", "service": "AKS", "severity": "Low", - "text": "If running a Dev/Test cluster use NodePool Start/Stop", - "waf": "Cost" + "text": "If required consider using Azure Dedicated Hosts for AKS nodes", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "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", - "severity": "Medium", - "text": "Use Azure Policy for Kubernetes to ensure cluster compliance", - "waf": "Reliability" + "severity": "High", + "text": "Use ephemeral OS disks", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", + "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", "service": "AKS", - "severity": "Medium", - "text": "Separate applications from the control plane with user/system node pools", - "waf": "Reliability" + "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" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", - "link": "https://learn.microsoft.com/azure/aks/use-system-pools", + "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", + "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", "service": "AKS", "severity": "Low", - "text": "Add taint to your system nodepool to make it dedicated", - "waf": "Reliability" + "text": "For hyper performance storage option use Ultra Disks on AKS", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", - "link": "https://learn.microsoft.com/azure/container-registry/", + "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", "service": "AKS", "severity": "Medium", - "text": "Use a private registry for your images, such as ACR", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure AKS Review", - "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", - "link": "https://learn.microsoft.com/azure/security-center/container-security", - "service": "ACR", - "severity": "Medium", - "text": "Scan your images for vulnerabilities", - "waf": "Reliability" + "text": "Avoid keeping state in the cluster, and store data outside (AzStorage, AzSQL, Cosmos, etc)", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", + "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", "service": "AKS", - "severity": "High", - "text": "Define app separation requirements (namespace/nodepool/cluster)", - "waf": "Reliability" + "severity": "Medium", + "text": "If using AzFiles Standard, consider AzFiles Premium and/or ANF for performance reasons", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", - "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", + "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", + "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", "service": "AKS", "severity": "Medium", - "text": "Store your secrets in Azure Key Vault with the CSI Secrets Store driver", - "waf": "Reliability" + "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", - "checklist": "Azure AKS Review", - "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", - "link": "https://learn.microsoft.com/azure/aks/update-credentials", - "service": "AKS", - "severity": "High", - "text": "If using Service Principals for the cluster, refresh credentials periodically (like quarterly)", - "waf": "Reliability" + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization Checklist", + "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", + "service": "Monitor", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", - "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", - "service": "AKS", + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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": "Backup", "severity": "Medium", - "text": "If required add Key Management Service etcd encryption", - "waf": "Reliability" + "text": "check backup instances with the underlying datasource not found", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", - "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", - "service": "AKS", - "severity": "Low", - "text": "If required consider using Confidential Compute for AKS", - "waf": "Reliability" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "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", + "severity": "Medium", + "text": "Delete or archive unassociated services (disks, nics, ip addresses etc)", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", - "service": "AKS", + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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": "Backup", "severity": "Medium", - "text": "Consider using Defender for Containers", - "waf": "Reliability" + "text": "Consider a good balance between site recovery storage and backup for non mission critical applications", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "High", - "text": "Use managed identities instead of Service Principals", - "waf": "Reliability" + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization Checklist", + "guid": "674b5ed8-5a85-49c7-933b-e2a1a27b765a", + "link": "https://learn.microsoft.com/azure/cost-management-billing/manage/direct-ea-administration#manage-notification-contacts", + "service": "Monitor", + "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", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization 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": "Monitor", "severity": "Medium", - "text": "Integrate authentication with AAD (using the managed integration)", - "waf": "Reliability" + "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.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", - "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", - "service": "AKS", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", "severity": "Medium", - "text": "Limit access to admin kubeconfig (get-credentials --admin)", - "waf": "Reliability" + "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", - "checklist": "Azure AKS Review", - "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", - "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", - "service": "AKS", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization 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", "severity": "Medium", - "text": "Integrate authorization with AAD RBAC", - "waf": "Reliability" + "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", - "checklist": "Azure AKS Review", - "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", - "service": "AKS", - "severity": "High", - "text": "Use namespaces for restricting RBAC privilege in Kubernetes", - "waf": "Reliability" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "VM", + "severity": "Medium", + "text": "Make sure advisor is configured for VM right sizing ", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", - "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", - "service": "AKS", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", "severity": "Medium", - "text": "For Pod Identity Access Management use Azure AD Workload Identity (preview)", - "waf": "Reliability" + "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", - "checklist": "Azure AKS Review", - "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", - "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", - "service": "AKS", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "service": "VM", "severity": "Medium", - "text": "For AKS non-interactive logins use kubelogin (preview)", - "waf": "Reliability" + "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", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", + "service": "VM", "severity": "Medium", - "text": "Disable AKS local accounts", - "waf": "Reliability" + "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", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "Configure if required Just-in-time cluster access", - "waf": "Reliability" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "Configure if required AAD conditional access for AKS", - "waf": "Reliability" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", + "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", + "service": "VM", + "severity": "Medium", + "text": "Only larger disks can be reserved => 1 TiB -", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", - "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", - "service": "AKS", - "severity": "Low", - "text": "If required for Windows AKS workloads configure gMSA ", - "waf": "Reliability" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", + "service": "VM", + "severity": "Medium", + "text": "After the right-sizing optimization", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Sql/servers", + "checklist": "Cost Optimization Checklist", + "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", + "service": "Azure SQL", "severity": "Medium", - "text": "For finer control consider using a managed Kubelet Identity", - "waf": "Reliability" + "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.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", - "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", - "service": "AKS", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", + "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", + "service": "VM", "severity": "Medium", - "text": "If using AGIC, do not share an AppGW across clusters", - "waf": "Reliability" + "text": "The VM + license part discount (ahub + 3YRI) is around 70% discount", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "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" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "severity": "Medium", + "text": "Consider using a VMSS to match demand rather than flat sizing", + "waf": "Cost" }, { "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", + "checklist": "Cost Optimization Checklist", + "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", "service": "AKS", "severity": "Medium", - "text": "For Windows workloads use Accelerated Networking", - "waf": "Performance" + "text": "Use AKS autoscaler to match your clusters usage (make sure the pods requirements match the scaler)", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "High", - "text": "Use the standard ALB (as opposed to the basic one)", - "waf": "Reliability" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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": "Backup", + "severity": "Medium", + "text": "Move recovery points to vault-archive where applicable (Validate)", + "training": "https://azure.microsoft.com/pricing/reservations/", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Databricks/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", + "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", + "service": "Databricks", "severity": "Medium", - "text": "If using Azure CNI, consider using different Subnets for NodePools", - "waf": "Reliability" + "text": "Consider using Spot VMs with fallback where possible. Consider autotermination of clusters.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", - "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", - "service": "AKS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", + "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", + "service": "Functions", "severity": "Medium", - "text": "Use Private Endpoints (preferred) or Virtual Network Service Endpoints to access PaaS services from the cluster", - "waf": "Reliability" + "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", - "checklist": "Azure AKS Review", - "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", - "severity": "High", - "text": "Choose the best CNI network plugin for your requirements (Azure CNI recommended)", - "waf": "Reliability" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", + "link": "https://learn.microsoft.com/azure/automation/update-management/overview", + "service": "Functions", + "severity": "Medium", + "text": "Functions - Cache data locally", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", - "severity": "High", - "text": "If using Azure CNI, size your subnet accordingly considering the maximum number of pods per node", - "waf": "Performance" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", + "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", + "service": "Functions", + "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", - "checklist": "Azure AKS Review", - "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", - "severity": "High", - "text": "If using Azure CNI, check the maximum pods/node (default 30)", - "waf": "Performance" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "Functions", + "severity": "Medium", + "text": "Functions - Keep your functions warm", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "If using private-IP LoadBalancer services, use a dedicated subnet (not the AKS subnet)", - "waf": "Reliability" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Functions", + "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", - "checklist": "Azure AKS Review", - "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", - "severity": "High", - "text": "Size the service IP address range accordingly (it is going to limit the cluster scalability)", - "waf": "Reliability" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", + "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", + "service": "Functions", + "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", - "checklist": "Azure AKS Review", - "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", - "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", - "service": "AKS", - "severity": "Low", - "text": "If required add your own CNI plugin", - "waf": "Reliability" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", + "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", + "service": "Functions", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "If required configure Public IP per node in AKS", - "waf": "Performance" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Cost Optimization Checklist", + "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Front Door", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", - "link": "https://learn.microsoft.com/azure/aks/concepts-network", - "service": "AKS", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Cost Optimization 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", "severity": "Medium", - "text": "Use an ingress controller to expose web-based apps instead of exposing them with LoadBalancer-type services", - "waf": "Reliability" + "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", - "checklist": "Azure AKS Review", - "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", - "link": "https://learn.microsoft.com/azure/aks/nat-gateway", - "service": "AKS", - "severity": "Low", - "text": "Use Azure NAT Gateway as outboundType for scaling egress traffic", - "waf": "Reliability" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", + "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", + "service": "Storage", + "severity": "Medium", + "text": "Consider archiving tiers for less used data", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", + "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", + "service": "VM", "severity": "Medium", - "text": "Use Dynamic allocations of IPs in order to avoid Azure CNI IP exhaustion", - "waf": "Reliability" + "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", - "checklist": "Azure AKS Review", - "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", - "severity": "High", - "text": "Filter egress traffic with AzFW/NVA if your security requirements mandate it", - "waf": "Reliability" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", + "service": "Storage", + "severity": "Medium", + "text": "Consider using standard SSD rather than Premium or Ultra where possible", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization 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", "severity": "Medium", - "text": "If using a public API endpoint, restrict the IP addresses that can access it", - "waf": "Reliability" + "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", - "checklist": "Azure AKS Review", - "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", - "severity": "High", - "text": "Use private clusters if your requirements mandate it", - "waf": "Reliability" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization Checklist", + "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", + "service": "Site Recovery", + "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", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", + "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", + "service": "Storage", "severity": "Medium", - "text": "For Windows 2019 and 2022 AKS nodes Calico Network Policies can be used ", - "waf": "Reliability" + "text": "Storage accounts: check hot tier and/or GRS necessary", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", + "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", + "service": "VM", + "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.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", + "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", + "service": "Synapse", + "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.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "Synapse", + "severity": "Medium", + "text": "Export cost data to a storage account for additional data analysis.", + "waf": "Cost" + }, + { + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "Synapse", + "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.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", + "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", + "service": "Synapse", + "severity": "Medium", + "text": "Enable the serverless Apache Spark automatic pause feature and set your timeout value accordingly.", + "waf": "Cost" + }, + { + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization 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", + "severity": "Medium", + "text": "Create multiple Apache Spark pool definitions of various sizes.", + "waf": "Cost" + }, + { + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization 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", + "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.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", + "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", + "service": "VM", + "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" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "544451e1-92d3-4442-a3c7-628637a551c5", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "VM", + "severity": "Medium", + "text": "Right-sizing all VMs", + "waf": "Cost" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", + "service": "VM", + "severity": "Medium", + "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.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", + "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.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", + "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" + }, + { + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", "severity": "High", - "text": "Enable a Kubernetes Network Policy option (Calico/Azure)", + "text": "Enable 2 replicas to have 99.9% availability for read operations", "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", - "severity": "High", - "text": "Use Kubernetes network policies to increase intra-cluster security", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", + "severity": "Medium", + "text": "Enable 3 replicas to have 99.9% availability for read/write operations", "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", + "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", + "service": "Cognitive Search", "severity": "High", - "text": "Use a WAF for web workloads (UIs or APIs)", + "text": "Leverage Availability Zones by enabling read and/or write replicas", "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review 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", "severity": "Medium", - "text": "Use DDoS Standard in the AKS Virtual Network", + "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", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "If required add company HTTP Proxy", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", + "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", + "service": "Cognitive Search", + "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", - "checklist": "Azure AKS Review", - "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", - "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", - "service": "AKS", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review 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", "severity": "Medium", - "text": "Consider using a service mesh for advanced microservice communication management", + "text": "Use Azure Traffic Manager to coordinate requests", "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", - "service": "AKS", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", + "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", + "service": "Cognitive Search", "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", - "checklist": "Azure AKS Review", - "guid": "337453a3-cc63-4963-9a65-22ac19e80696", - "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", - "service": "AKS", - "severity": "Low", - "text": "Check regularly Azure Advisor for recommendations on your cluster", - "waf": "Operations" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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": "Data Explorer", + "text": "Leverage External Tables and Continuous data export overview to reduce costs", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", - "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", - "service": "AKS", - "severity": "Low", - "text": "Enable AKS auto-certificate rotation", - "waf": "Operations" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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": "Data Explorer", + "text": "To share data, explore Leader-follower cluster configuration", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", - "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", - "service": "AKS", - "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.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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": "Data Explorer", + "text": "To protect against regional failure, create Multiple independent clusters, preferably in two Azure Paired regions", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", - "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", - "service": "AKS", - "severity": "High", - "text": "Use kured for Linux node upgrades in case you are not using node-image upgrade", - "waf": "Operations" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review Checklist", + "guid": "436b0635-cb45-4e57-a603-324ace8cc123", + "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-create-solution#replicate-management-activities", + "service": "Data Explorer", + "text": "Replicate all management activities such as creating new tables or managing user roles on each cluster.", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", - "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", - "service": "AKS", - "severity": "High", - "text": "Have a regular process to upgrade the cluster node images periodically (weekly, for example)", - "waf": "Operations" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review Checklist", + "guid": "18ca6017-0265-4f4b-a46a-393af7f31728", + "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-create-solution", + "service": "Data Explorer", + "text": "Ingest data into each cluster in parallel", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", - "service": "AKS", - "severity": "Low", - "text": "Consider gitops to deploy applications or cluster configuration to multiple clusters", - "waf": "Operations" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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": "Data Explorer", + "text": "For critical application with no tolerance for outages, create Active-Active-Active (always-on) configuration", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d7672c26-7602-4482-85a4-14527fbe855c", - "link": "https://learn.microsoft.com/azure/aks/command-invoke", - "service": "AKS", - "severity": "Low", - "text": "Consider using AKS command invoke on private clusters", - "waf": "Operations" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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": "Data Explorer", + "text": "For critical applications, create Active-Active configuration in two paired regions", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", - "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", - "service": "AKS", - "severity": "Low", - "text": "For planned events consider using Node Auto Drain", - "waf": "Operations" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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": "Data Explorer", + "text": "For applications, which required only read during failure, create Active-Hot standby configuration", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", - "link": "https://learn.microsoft.com/azure/aks/faq", - "service": "AKS", - "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" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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": "Data Explorer", + "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", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "Use custom Node RG (aka 'Infra RG') name", - "waf": "Operations" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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": "Data Explorer", + "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", - "checklist": "Azure AKS Review", - "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", - "link": "https://kubernetes.io/docs/setup/release/notes/", - "service": "AKS", + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review Checklist", + "guid": "1559ab91-53e8-4908-ae28-b84c33b6b780", + "link": "https://learn.microsoft.com/azure/data-explorer/devops", + "service": "Data Explorer", + "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.Kusto/clusters", + "checklist": "Azure Data Explorer Review Checklist", + "guid": "8b9fe5c4-1049-4d40-9a82-2c3474d00f18", + "link": "https://learn.microsoft.com/azure/data-explorer/devops", + "service": "Data Explorer", + "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" + }, + { + "checklist": "Identity Review Checklist", + "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", + "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", + "service": "Entra", "severity": "Medium", - "text": "Do not use deprecated Kubernetes APIs in your YAML manifests", - "waf": "Operations" + "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": "Azure AKS Review", - "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", - "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", - "service": "AKS", + "checklist": "Identity Review Checklist", + "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", + "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", + "service": "AAD B2C", + "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" + }, + { + "checklist": "Identity Review 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", + "severity": "Medium", + "text": "Custom brand assets should be hosted on a CDN", + "waf": "Performance" + }, + { + "checklist": "Identity Review Checklist", + "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", + "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", + "service": "AAD B2C", "severity": "Low", - "text": "Taint Windows nodes", - "waf": "Operations" + "text": "Have multiple identiy providers (i.e., login with your microsoft, google, facebook accounts)", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "Keep windows containers patch level in sync with host patch level", - "waf": "Operations" + "checklist": "Identity Review 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", + "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": "Azure AKS Review", - "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", - "severity": "Low", - "text": "Send master logs (aka API logs) to Azure Monitor or your preferred log management solution", - "waf": "Operations" + "checklist": "Identity Review 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", + "severity": "Medium", + "text": "Don't replicate! Replication can create issues with directory synchronization", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", - "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", - "service": "AKS", - "severity": "Low", - "text": "If required use nodePool snapshots", - "waf": "Cost" + "checklist": "Identity Review 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", + "severity": "Medium", + "text": "Have active-active for multi-regions", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", - "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", - "service": "AKS", - "severity": "Low", - "text": "Consider spot node pools for non time-sensitive workloads", - "waf": "Operations" + "checklist": "Identity Review Checklist", + "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", + "severity": "Medium", + "text": "Add Azure AD Domain service stamps to additional regions and locations", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "Consider AKS virtual node for quick bursting", - "waf": "Operations" + "checklist": "Identity Review Checklist", + "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", + "severity": "Medium", + "text": "Use Replica Sets for DR", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", - "service": "AKS", - "severity": "High", - "text": "Monitor your cluster metrics with Container Insights (or other tools like Prometheus)", - "waf": "Operations" + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review Checklist", + "guid": "43e52f47-22d9-428c-8b1c-d521e54a29a9", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/pass-foundations-playbooks-CosmosDB_v1.docx", + "service": "CosmosDB", + "severity": "Medium", + "text": "FTA Resiliency Playbook", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review Checklist", + "guid": "de39ac0e-7c28-4dc9-9565-7202bff4564b", + "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#slas", + "service": "CosmosDB", "severity": "High", - "text": "Store and analyze your cluster logs with Container Insights (or other tools like Telegraf/ElasticSearch)", - "waf": "Operations" + "text": "Leverage Availablity Zones where regionally applicable and ofcourse if the service offers it", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", - "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", - "service": "AKS", + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review Checklist", + "guid": "0d934a34-8b26-43e7-bd60-513a3649906e", + "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#replica-outages", + "service": "CosmosDB", "severity": "Medium", - "text": "Monitor CPU and memory utilization of the nodes", - "waf": "Operations" + "text": "Run multiple replicas of the database (>1 ) in Prod", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "1a4835ac-9422-423e-ae80-b123081a5417", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review 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", "severity": "Medium", - "text": "If using Azure CNI, monitor % of pod IPs consumed per node", - "waf": "Operations" + "text": "Leverage Multi-Region Writes", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review 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", "severity": "Medium", - "text": "Monitor OS disk queue depth in nodes", - "waf": "Operations" + "text": "Distribute your data globally", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "be209d39-fda4-4777-a424-d116785c2fa5", - "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", - "service": "AKS", + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review 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", + "severity": "High", + "text": "Choose from several well-defined consistency models", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review 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", "severity": "Medium", - "text": "If not using egress filtering with AzFW/NVA, monitor standard ALB allocated SNAT ports", - "waf": "Operations" + "text": "Enable Service managed failover", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", - "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", - "service": "AKS", + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review 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", "severity": "Medium", - "text": "Subscribe to resource health notifications for your AKS cluster", - "waf": "Operations" + "text": "Enable Automatic Backups", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", - "severity": "High", - "text": "Configure requests and limits in your pod specs", - "waf": "Operations" + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review 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", + "severity": "Medium", + "text": "Perform Periodic Backups", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "769ef669-1a48-435a-a942-223ece80b123", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review 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", "severity": "Medium", - "text": "Enforce resource quotas for namespaces", - "waf": "Operations" + "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": "Azure AKS Review", - "guid": "081a5417-4158-433e-a3ad-3c2de733165c", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", - "service": "AKS", - "severity": "High", - "text": "Ensure your subscription has enough quota to scale out your nodepools", + "checklist": "SAP Checklist", + "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", + "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", + "service": "SAP", + "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": "Azure AKS Review", - "guid": "f4fd0602-7ab5-46f1-b66a-e9dea9654a65", - "link": "https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/", - "service": "AKS", - "severity": "High", - "text": "Configure Liveness and Readiness probes for all deployments", + "checklist": "SAP 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", + "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": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", + "service": "SAP", "severity": "Medium", - "text": "Use the Cluster Autoscaler", - "waf": "Performance" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "Customize node configuration for AKS node pools", - "waf": "Performance" + "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": "Azure AKS Review", - "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", - "link": "https://learn.microsoft.com/azure/aks/concepts-scale", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", + "service": "SAP", "severity": "Medium", - "text": "Use the Horizontal Pod Autoscaler when required", - "waf": "Performance" + "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": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "b651423c-8552-42db-a545-5cb50c05527a", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "service": "SAP", "severity": "High", - "text": "Consider an appropriate node size, not too large or too small", - "waf": "Performance" + "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": "Azure AKS Review", - "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", - "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", - "service": "AKS", - "severity": "Low", - "text": "If more than 5000 nodes are required for scalability then consider using an additional AKS cluster", - "waf": "Performance" + "checklist": "SAP Checklist", + "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", + "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": "Azure AKS Review", - "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", - "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", - "service": "AKS", - "severity": "Low", - "text": "Consider subscribing to EventGrid Events for AKS automation", - "waf": "Performance" + "checklist": "SAP Checklist", + "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", + "service": "SAP", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", - "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "SAP", "severity": "Low", - "text": "For long running operation on an AKS cluster consider event termination", - "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": "Azure AKS Review", - "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", - "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", - "service": "AKS", - "severity": "Low", - "text": "If required consider using Azure Dedicated Hosts for AKS nodes", - "waf": "Performance" + "checklist": "SAP Checklist", + "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", + "service": "SAP", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "High", - "text": "Use ephemeral OS disks", - "waf": "Performance" + "checklist": "SAP Checklist", + "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", + "service": "SAP", + "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": "Azure AKS Review", - "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", - "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", "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" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", - "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", - "service": "AKS", - "severity": "Low", - "text": "For hyper performance storage option use Ultra Disks on AKS", - "waf": "Performance" + "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.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", - "service": "AKS", - "severity": "Medium", - "text": "Avoid keeping state in the cluster, and store data outside (AzStorage, AzSQL, Cosmos, etc)", - "waf": "Performance" + "checklist": "SAP Checklist", + "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", + "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", + "service": "SAP", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", - "service": "AKS", - "severity": "Medium", - "text": "If using AzFiles Standard, consider AzFiles Premium and/or ANF for performance reasons", - "waf": "Performance" + "checklist": "SAP Checklist", + "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", + "service": "SAP", + "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.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", - "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", - "service": "AKS", - "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" + "checklist": "SAP 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", + "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": "Azure Key Vault", - "guid": "6d37a33b-531c-4a91-871a-b69d8044f04e", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Key Vault", + "checklist": "SAP Checklist", + "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", + "service": "SAP", "severity": "High", - "text": "Familiarize yourself with the Key Vault's best practices such as isolation recommendations, access control, data protection, backup, and logging.", + "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": "Azure Key Vault", - "guid": "7ba4d380-7b9e-4a8b-a0c3-2d8e49c11872", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "Key Vault", - "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.", + "checklist": "SAP Checklist", + "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", + "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": "Azure Key Vault", - "guid": "17fb86a2-eb45-42a4-9c34-52b92a2a1842", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#data-replication", - "service": "Key Vault", - "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.", + "checklist": "SAP Checklist", + "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", + "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", + "service": "SAP", + "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", "waf": "Reliability" }, { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "Azure Key Vault", - "guid": "614682ca-6e0c-4f34-9f03-c6d3f2b99a32", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#failover-across-regions", - "service": "Key Vault", - "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.", + "checklist": "SAP Checklist", + "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", + "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", + "service": "SAP", + "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": "Azure Key Vault", - "guid": "9ef2b0d2-3206-4c94-b47a-4f07e6a1c509", - "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#design-considerations", - "service": "Key Vault", - "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.", + "checklist": "SAP 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", + "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": "Azure Key Vault", - "guid": "2df045b1-c0f6-47d3-9a9b-99cf6999684e", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "Key Vault", + "checklist": "SAP Checklist", + "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", + "service": "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": "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": "Azure Key Vault", - "guid": "cbfa96b0-5249-4e6f-947c-d0e79509708c", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "Key Vault", - "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.", + "checklist": "SAP Checklist", + "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "SAP", + "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.KeyVault/vaults", - "checklist": "Azure Key Vault", - "guid": "e8659d11-7e02-4db0-848c-c6541dbab68c", - "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", - "service": "Key Vault", - "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.", + "checklist": "SAP 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", + "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.KeyVault/vaults", - "checklist": "Azure Key Vault", - "guid": "45c25e29-d0ef-4f07-aa04-0f8c64cbcc04", - "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", - "service": "Key Vault", - "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.", + "checklist": "SAP Checklist", + "guid": "cbe05bbe-209d-4490-ba47-778424d11678", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", + "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" }, { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "Azure Key Vault", - "guid": "0f15640b-31e5-4de6-85a7-d2c652fa09d3", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview#purge-protection", - "service": "Key Vault", + "checklist": "SAP Checklist", + "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", + "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", + "service": "SAP", "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.", + "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": "Azure Storage Review 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": "Storage", - "severity": "Medium", - "text": "Consider the 'Azure security baseline for storage'", + "checklist": "SAP Checklist", + "guid": "9674e7c7-7796-4181-8920-09f4429543ba", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", + "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" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", + "checklist": "SAP Checklist", + "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "severity": "High", - "text": "Consider using private endpoints for Azure Storage", + "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": "Azure Storage Review 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": "Storage", - "severity": "Medium", - "text": "Ensure older storage accounts are not using 'classic deployment model'", + "checklist": "SAP Checklist", + "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", + "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": "Azure Storage Review 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": "Storage", + "checklist": "SAP 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", "severity": "High", - "text": "Enable Microsoft Defender for all of your storage accounts", + "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": "Azure Storage Review 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": "Storage", + "checklist": "SAP Checklist", + "guid": "ed46b937-913e-4018-9c62-8393ab037e53", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", + "service": "SAP", "severity": "Medium", - "text": "Enable 'soft delete' for blobs", + "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": "Azure Storage Review 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": "Storage", + "checklist": "SAP 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", "severity": "Medium", - "text": "Disable 'soft delete' for blobs", + "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": "Azure Storage Review 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": "Storage", + "checklist": "SAP 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", + "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" + }, + { + "checklist": "SAP Checklist", + "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", "severity": "High", - "text": "Enable 'soft delete' for containers", + "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": "Azure Storage Review 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": "Storage", - "severity": "Medium", - "text": "Disable 'soft delete' for containers", + "checklist": "SAP Checklist", + "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", + "service": "SAP", + "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" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", + "checklist": "SAP Checklist", + "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", + "service": "SAP", "severity": "High", - "text": "Enable resource locks on storage accounts", + "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": "Azure Storage Review 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": "Storage", + "checklist": "SAP Checklist", + "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", + "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", + "service": "SAP", "severity": "High", - "text": "Consider immutable blobs", + "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": "Azure Storage Review 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": "Storage", + "checklist": "SAP 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", + "severity": "Medium", + "text": "Automate SAP System Start-Stop to manage costs.", + "waf": "Cost" + }, + { + "checklist": "SAP Checklist", + "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", + "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" + }, + { + "checklist": "SAP Checklist", + "guid": "9877f353-2591-4e8b-8381-e9043fed1010", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", + "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" + }, + { + "checklist": "SAP Checklist", + "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", + "service": "SAP", "severity": "High", - "text": "Require HTTPS, i.e. disable port 80 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": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", - "severity": "High", - "text": "When enforcing HTTPS (disabling HTTP), check that you do not use custom domains (CNAME) for the storage account.", + "checklist": "SAP Checklist", + "guid": "45911475-e39e-4530-accc-d979366bcda2", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", + "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", "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", + "checklist": "SAP Checklist", + "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", "severity": "Medium", - "text": "Limit shared access signature (SAS) tokens to HTTPS connections only", + "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": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", - "severity": "High", - "text": "Use Azure Active Directory (Azure AD) tokens for blob access", + "checklist": "SAP Checklist", + "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", + "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", "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", + "checklist": "SAP Checklist", + "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", + "service": "SAP", "severity": "Medium", - "text": "Least privilege in IaM permissions", + "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": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", - "severity": "High", - "text": "When using SAS, prefer 'user delegation SAS' over storage-account-key based SAS.", + "checklist": "SAP Checklist", + "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", + "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": "Reliability" }, { - "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. ", - "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.", + "checklist": "SAP Checklist", + "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", + "service": "SAP", + "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": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", - "severity": "High", - "text": "Consider using Azure Monitor to audit control plane operations on the storage account", + "checklist": "SAP 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", + "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.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", + "checklist": "SAP 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", "severity": "Medium", - "text": "When using storage account keys, consider enabling a 'key expiration policy'", + "text": "Implement SSO by using OAuth for SAP NetWeaver to allow third-party or custom applications to access SAP NetWeaver OData services.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", + "checklist": "SAP Checklist", + "guid": "a747c350-8d4c-449c-93af-393dbca77c48", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", + "service": "SAP", "severity": "Medium", - "text": "Consider configuring an SAS expiration policy", + "text": "Implement SSO to SAP HANA", "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", + "checklist": "SAP Checklist", + "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", + "service": "SAP", "severity": "Medium", - "text": "Consider linking SAS to a stored access policy", + "text": "Consider Azure AD an identity provider for SAP systems hosted on RISE. For more information, see Integrating the Service with Azure AD.", "waf": "Reliability" }, { - "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": "Storage", + "checklist": "SAP Checklist", + "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", + "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", + "service": "SAP", "severity": "Medium", - "text": "Consider configuring your application's source code repository to detect checked-in connection strings and storage account keys.", + "text": "For applications that access SAP, you might want to use principal propagation to establish SSO.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", - "severity": "High", - "text": "Consider storing connection strings in Azure KeyVault (in scenarios where managed identities are not possible)", + "checklist": "SAP 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", + "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": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", - "severity": "High", - "text": "Strive for short validity periods for ad-hoc SAS", + "checklist": "SAP Checklist", + "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", + "service": "SAP", + "severity": "Medium", + "text": "Implement SSO to SAP BTP", "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", + "checklist": "SAP 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", "severity": "Medium", - "text": "Apply a narrow scope to a SAS", + "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": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", + "checklist": "SAP 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", "severity": "Medium", - "text": "Consider scoping SAS to a specific client IP address, wherever possible", - "waf": "Reliability" + "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": "Azure Storage Review 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": "Storage", - "severity": "Low", - "text": "Consider checking uploaded data, after clients used a SAS to upload a file. ", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", + "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" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", + "checklist": "SAP Checklist", + "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "severity": "High", - "text": "SFTP: Limit the amount of 'local users' for SFTP access, and audit whether access is needed over time.", - "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": "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": "Storage", - "severity": "Medium", - "text": "SFTP: The SFTP endpoint does not support POSIX-like ACLs.", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", + "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", + "service": "SAP", + "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" + }, + { + "checklist": "SAP Checklist", + "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", + "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", + "service": "SAP", + "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": "Azure Storage Review 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": "Storage", + "checklist": "SAP Checklist", + "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", + "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", + "service": "SAP", "severity": "High", - "text": "Avoid overly broad CORS policies", - "waf": "Reliability" + "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" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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": "Storage", + "checklist": "SAP Checklist", + "guid": "e6e20617-3686-4af4-9791-f8935ada4332", + "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", + "service": "SAP", "severity": "High", - "text": "Determine how data at rest should be encrypted. Understand the thread model for data.", - "waf": "Reliability" - }, - { - "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": "Storage", - "severity": "Medium", - "text": "Determine which/if platform encryption should be used.", - "waf": "Reliability" + "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": "Azure Storage Review Checklist", - "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", - "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", - "service": "Storage", + "checklist": "SAP Checklist", + "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", + "service": "SAP", "severity": "Medium", - "text": "Determine which/if client-side encryption should be used.", - "waf": "Reliability" + "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" }, { - "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.", - "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", + "checklist": "SAP Checklist", + "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", "severity": "High", - "text": "Consider whether public blob access is needed, or whether it can be disabled for certain storage accounts. ", + "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.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": "Storage", - "severity": "High", - "text": "Leverage a storagev2 account type for better performance and reliability", + "checklist": "SAP Checklist", + "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", + "service": "SAP", + "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.Storage/storageAccounts", - "checklist": "Azure Storage Review Checklist", - "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", - "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", - "service": "Storage", + "checklist": "SAP Checklist", + "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", "severity": "High", - "text": "Leverage GRS, ZRS or GZRS storage for the highest availability", - "waf": "Reliability" + "text": "Ensure time-zone matches between the operating system and the SAP system.", + "waf": "Operations" }, { - "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": "Storage", + "checklist": "SAP Checklist", + "guid": "c3c7abc0-716c-4486-893c-40e181d65539", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", + "service": "SAP", "severity": "Medium", - "text": "For write operation after failover, use customer-Managed Failover ", + "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.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": "Storage", + "checklist": "SAP Checklist", + "guid": "a491dfc4-9353-4213-9217-eef0949f9467", + "link": "https://azure.microsoft.com/pricing/offers/dev-test/", + "service": "SAP", + "severity": "Low", + "text": "Consider running dev/test systems in a snooze model to save and optimize Azure run costs.", + "waf": "Cost" + }, + { + "checklist": "SAP Checklist", + "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", + "link": "https://learn.microsoft.com/azure/lighthouse/overview", + "service": "SAP", "severity": "Medium", - "text": "Understand Microsoft-Managed Failover details", - "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.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": "Storage", + "checklist": "SAP 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", "severity": "Medium", - "text": "Enable Soft Delete", - "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/virtualMachineScaleSets", - "checklist": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", + "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", + "service": "SAP", "severity": "Low", - "text": "Enable automatic instance repairs for enhanced VM Scale Sets resiliency", - "waf": "Reliability" + "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": "Resiliency Review", - "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", - "severity": "High", - "text": "Consider Azure Backup to meet your resiliency requirements for Azure VMs", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "14591147-5e39-4e53-89cc-cd979366bcda", + "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", + "service": "SAP", + "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": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", + "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", + "service": "SAP", "severity": "High", - "text": "Use Premium or Ultra disks for production VMs", - "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": "Resiliency Review", - "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", - "severity": "High", - "text": "Ensure Managed Disks are used for all VMs", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "SAP", + "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": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", + "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", + "service": "SAP", "severity": "Medium", - "text": "Do not use the Temp disk for anything that is not acceptable to be lost", - "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": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "73686af4-6791-4f89-95ad-a43324e13811", + "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", + "service": "SAP", "severity": "Medium", - "text": "Leverage Availability Zones for your VMs in regions where they are supported", - "waf": "Reliability" + "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.Compute/virtualMachines", - "checklist": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "616785d6-fa96-4c96-ad88-518f482734c8", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", + "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" + }, + { + "checklist": "SAP Checklist", + "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", + "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", + "service": "SAP", "severity": "Medium", - "text": "For regions that do not support Availability Zones deploy VMs into Availability Sets", + "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.Compute/virtualMachines", - "checklist": "Resiliency Review", - "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", - "severity": "High", - "text": "Avoid running a production workload on a single VM", + "checklist": "SAP Checklist", + "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", + "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", + "service": "SAP", + "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": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Resiliency Review", - "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", - "severity": "High", - "text": "For Azure and on-premises VMs (Hyper-V/Phyiscal/VMware) with low RTO requirements use Azure Site Recovery", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", + "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", + "service": "SAP", + "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.Compute/virtualMachines", - "checklist": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", + "service": "SAP", "severity": "Low", - "text": "Use Capacity Reservations for critical workloads that require guaranteed capacity", - "waf": "Reliability" + "text": "Use inter-VM latency monitoring for latency-sensitive applications.", + "waf": "Performance" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", "severity": "Medium", - "text": "Increase quotas in DR region before testing failover with ASR", + "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.Compute/virtualMachines", - "checklist": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", + "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" + }, + { + "checklist": "SAP Checklist", + "guid": "c027f893-f404-41a9-b33d-39d625a14964", + "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", + "service": "SAP", "severity": "Low", - "text": "Utilize Scheduled Events to prepare for VM maintenance", - "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.Storage/storageAccounts", - "checklist": "Resiliency Review", - "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": "Storage", + "checklist": "SAP Checklist", + "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", + "service": "SAP", "severity": "Medium", - "text": "Choose the most appropriate data redundancy option for Azure Storage based on your requirements", - "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.Storage/storageAccounts", - "checklist": "Resiliency Review", - "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": "Storage", - "severity": "Low", - "text": "Apply a Delete lock to prevent accidental or malicious deletion of storage accounts", - "waf": "Reliability" + "checklist": "SAP 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", + "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.Storage/storageAccounts", - "checklist": "Resiliency Review", - "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": "Storage", - "severity": "Low", - "text": "Enable soft delete for Storage Account Containers", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", + "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.Storage/storageAccounts", - "checklist": "Resiliency Review", - "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": "Storage", - "severity": "Low", - "text": "Enable soft delete for blobs", + "checklist": "SAP Checklist", + "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "SAP", + "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/", "waf": "Reliability" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Resiliency Review", - "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": "Backup", + "checklist": "SAP 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", "severity": "Medium", - "text": "Enable Azure Backup enhanced soft delete for improved data protection and recovery", - "waf": "Reliability" + "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.RecoveryServices/vaults", - "checklist": "Resiliency Review", - "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": "Backup", - "severity": "Low", - "text": "Implement multi-user authorization for Azure Backup to ensure secure and controlled access to backup resources", - "waf": "Reliability" + "checklist": "SAP 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", + "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" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Resiliency Review", - "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": "Backup", - "severity": "Low", - "text": "Implement Immutable Storage for your vaults to protect against ransomware and prevent unauthorized modifications to backups", + "checklist": "SAP Checklist", + "guid": "a3592829-e6e2-4061-9368-6af46791f893", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", + "service": "SAP", + "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", "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/dnsZones", - "checklist": "Resiliency Review", - "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", - "severity": "Low", - "text": "Implement DNS Failover using Azure DNS Private Resolvers", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", + "service": "SAP", + "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.PowerBI/gateways", - "checklist": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", + "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", + "service": "SAP", "severity": "Medium", - "text": "Use on-premises data gateway clusters to ensure high availability for business-critical data", + "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" + }, + { + "checklist": "SAP Checklist", + "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", + "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", + "service": "SAP", + "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" + }, + { + "checklist": "SAP Checklist", + "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", + "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", + "service": "SAP", + "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" + }, + { + "checklist": "SAP 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", + "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": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Resiliency Review", - "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", + "checklist": "SAP 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", "severity": "High", - "text": "Deploy Network Virtual Appliances (NVAs) in a vendor supported configuration for High Availability", - "waf": "Reliability" + "text": "Consider reserving IP address on DR side when configuring ASR", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Operations" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "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", + "checklist": "SAP 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", + "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" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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": "AppGW", + "checklist": "SAP Checklist", + "guid": "6e154e3a-a359-4282-ae6e-206173686af4", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", + "service": "SAP", "severity": "Medium", - "text": "Ensure you are using Application Gateway v2 SKU", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Reliability" + "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" }, { - "arm-service": "Microsoft.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP 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", "severity": "Medium", - "text": "Ensure you are using the Standard SKU for your Azure Load Balancers", + "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": "Reliability" }, { - "arm-service": "Microsoft.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "guid": "9432621a-8397-4654-a882-5bc856b7ef83", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", - "service": "Load Balancer", + "checklist": "SAP Checklist", + "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", + "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", + "service": "SAP", "severity": "Medium", - "text": "Ensure your Load Balancers frontend IP addresses are zone-redundant (unless you require zonal frontends).", + "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": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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": "AppGW", + "checklist": "SAP Checklist", + "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "SAP", "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/", + "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": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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": "AppGW", + "checklist": "SAP Checklist", + "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", + "service": "SAP", "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/", + "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": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", + "checklist": "SAP Checklist", + "guid": "5ada4332-4e13-4811-9231-81aa41742694", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "AppGW", + "service": "SAP", "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/", + "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": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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": "AppGW", + "checklist": "SAP Checklist", + "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "SAP", "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": "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/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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": "AppGW", + "checklist": "SAP Checklist", + "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", + "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", + "service": "SAP", "severity": "Medium", - "text": "Deploy Application Gateway across Availability Zones", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "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": "Reliability" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "Front Door", + "checklist": "SAP Checklist", + "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", + "service": "SAP", + "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" + }, + { + "checklist": "SAP Checklist", + "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", + "service": "SAP", "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/", + "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": "Reliability" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "3f29812b-2363-4cef-b179-b599de0d5973", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "Front Door", + "checklist": "SAP Checklist", + "guid": "6791f893-5ada-4433-84e1-3811523181aa", + "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "service": "SAP", "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/", + "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": "Reliability" }, { - "ammp": true, - "arm-service": "microsoft.network/trafficManagerProfiles", - "checklist": "Azure Application Delivery Networking", - "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "Traffic Manager", + "checklist": "SAP Checklist", + "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "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": "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" }, { - "checklist": "Azure Application Delivery Networking", - "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "Entra", - "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": "Reliability" + "checklist": "SAP Checklist", + "guid": "fa96c96a-d885-418f-9827-34c886ba2802", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", + "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", + "waf": "Performance" }, { - "checklist": "Azure Application Delivery Networking", - "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "Entra", - "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": "Reliability" + "checklist": "SAP Checklist", + "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", + "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", + "waf": "Performance" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "severity": "High", - "text": "Deploy your WAF policy for Front Door in 'Prevention' mode.", - "waf": "Reliability" + "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": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "402a9846-d515-4061-aff8-cd30088693fa", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", + "service": "SAP", "severity": "High", - "text": "Avoid combining Azure Traffic Manager and Azure Front Door.", + "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" + }, + { + "checklist": "SAP Checklist", + "guid": "87585797-5551-4d53-bb7d-a94ee415734d", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", + "service": "SAP", + "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": "Reliability" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", "severity": "High", - "text": "Use the same domain name on Azure Front Door and your origin. Mismatched host names can cause subtle bugs.", - "waf": "Reliability" + "text": "Review SAP HANA database backups for Azure VMs.", + "waf": "Cost" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Low", - "text": "Disable health probes when there is only one origin in an Azure Front Door origin group.", - "waf": "Performance" + "checklist": "SAP Checklist", + "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", + "severity": "Medium", + "text": "Review Site Recovery built-in monitoring, where used for SAP.", + "waf": "Cost" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "Front Door", + "checklist": "SAP Checklist", + "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", + "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", + "service": "SAP", + "severity": "High", + "text": "Review the Monitoring the SAP HANA System Landscape guidance.", + "waf": "Operations" + }, + { + "checklist": "SAP Checklist", + "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", + "service": "SAP", "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": "Review Oracle Database in Azure Linux VM backup strategies.", + "waf": "Operations" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Low", - "text": "Use HEAD health probes with Azure Front Door, to reduce the traffic that Front Door sends to your application.", - "waf": "Performance" + "checklist": "SAP 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", + "severity": "Medium", + "text": "Review the use of Azure Blob Storage with SQL Server 2016.", + "waf": "Operations" }, { - "ammp": true, - "arm-service": "Microsoft.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "High", - "text": "Use Azure NAT Gateway instead of Load Balancer outbound rules for better SNAT scalability", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", + "service": "SAP", + "severity": "Medium", + "text": "Review the use of Automated Backup v2 for Azure VMs.", + "waf": "Operations" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", + "service": "SAP", "severity": "High", - "text": "Use managed TLS certificates with Azure Front Door. Reduce operational cost and risk of outages due to certificate renewals.", + "text": "Enabling Write accelerator for M series when using premium disks(V1)", "waf": "Operations" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP 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", "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": "Test availability zone latency.", + "waf": "Performance" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", - "service": "Front Door", - "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": "Reliability" + "checklist": "SAP Checklist", + "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", + "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", + "service": "SAP", + "severity": "Medium", + "text": "Activate SAP EarlyWatch Alert for all SAP components.", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", + "waf": "Performance" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", - "service": "Front Door", + "checklist": "SAP 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", "severity": "Medium", - "text": "Use HTTP to HTTPS redirection with Azure Front Door. Support older clients by redirecting them to an HTTPS request automatically.", - "waf": "Reliability" + "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/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", - "service": "Front Door", - "severity": "High", - "text": "Enable the Azure Front Door WAF. Protect your application from a range of attacks.", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", + "service": "SAP", + "severity": "Medium", + "text": "Review SQL Server performance monitoring using CCMS.", + "waf": "Performance" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "High", - "text": "Tune the Azure Front Door WAF for your workload. Reduce false positive detections.", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", + "link": "https://me.sap.com/notes/500235", + "service": "SAP", + "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" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "High", - "text": "Enable request body inspection feature enabled in Azure Front Door WAF policy.", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", + "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", + "service": "SAP", + "severity": "Medium", + "text": "Review SAP HANA studio alerts.", + "waf": "Performance" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "High", - "text": "Enable the Azure Front Door WAF default rule sets. The default rule sets detect and block common attacks.", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", + "link": "https://me.sap.com/notes/1969700", + "service": "SAP", + "severity": "Medium", + "text": "Perform SAP HANA health checks using HANA_Configuration_Minichecks.", + "waf": "Performance" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "High", - "text": "Enable the Azure Front Door WAF bot protection rule set. The bot rules detect good and bad bots.", + "checklist": "SAP Checklist", + "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "service": "SAP", + "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": "Reliability" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "08951710-79a2-492a-adbc-06d7a401545b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "service": "SAP", "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.", + "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": "Reliability" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "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.", + "checklist": "SAP Checklist", + "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", + "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": "Reliability" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "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. ", + "checklist": "SAP Checklist", + "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", + "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": "Reliability" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Low", - "text": "If you are not expecting traffic from all geographical regions, use geo-filters to block traffic from non-expected countries.", + "checklist": "SAP 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", + "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": "Reliability" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "SAP", "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.", + "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": "Reliability" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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": "AppGW", + "checklist": "SAP Checklist", + "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview", + "service": "SAP", "severity": "High", - "text": "Enable the Azure Application Gateway WAF bot protection rule set The bot rules detect good and bad bots.", + "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": "Reliability" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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": "AppGW", - "severity": "High", - "text": "Enable request body inspection feature enabled in Azure Application Gateway WAF policy.", + "checklist": "SAP Checklist", + "guid": "829e2edb-2173-4676-aff6-691b4935ada4", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "SAP", + "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", "waf": "Reliability" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", - "service": "AppGW", - "severity": "High", - "text": "Tune the Azure Application Gateway WAF for your workload. Reduce false positive detections.", + "checklist": "SAP Checklist", + "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "SAP", + "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", "waf": "Reliability" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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": "AppGW", + "checklist": "SAP Checklist", + "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", + "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", + "service": "SAP", "severity": "High", - "text": "Deploy your WAF policy for Application Gateway in 'Prevention' mode.", + "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": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", - "service": "AppGW", - "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.", + "checklist": "SAP 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", + "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": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "041e0ad8-7b12-4694-a0b7-a0e25ee2470f", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview#rate-limiting-details", - "service": "AppGW", - "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. ", + "checklist": "SAP 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", + "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", "waf": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "99937189-ff78-492a-b9ca-18d828d82b37", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#geo-filtering-best-practices", - "service": "AppGW", + "checklist": "SAP 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", "severity": "Low", - "text": "If you are not expecting traffic from all geographical regions, use geo-filters to block traffic from non-expected countries.", + "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": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", - "service": "AppGW", + "checklist": "SAP Checklist", + "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", + "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", + "service": "SAP", "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": "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": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "6c19dfd5-a61c-436c-9001-491b9b3d0228", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#use-the-latest-ruleset-versions", - "service": "AppGW", - "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.", + "checklist": "SAP Checklist", + "guid": "4935ada4-2223-4ece-a1b1-23181a541741", + "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", + "service": "SAP", + "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": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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": "AppGW", - "severity": "Medium", - "text": "Add diagnostic settings to save your Azure Application Gateway WAF logs.", - "waf": "Operations" - }, - { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Medium", - "text": "Add diagnostic settings to save your Azure Front Door WAF logs.", - "waf": "Operations" + "checklist": "SAP Checklist", + "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", + "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", + "service": "SAP", + "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": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "92664c60-47e3-4591-8b1b-8d557656e686", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#send-logs-to-microsoft-sentinel", - "service": "AppGW", - "severity": "Medium", - "text": "Send Azure Application Gateway WAF logs to Microsoft Sentinel.", - "waf": "Operations" + "checklist": "SAP Checklist", + "guid": "209d490d-a477-4784-84d1-16785d2fa56c", + "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", + "service": "SAP", + "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": "Reliability" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Medium", - "text": "Send Azure Front Door WAF logs to Microsoft Sentinel.", - "waf": "Operations" + "checklist": "SAP Checklist", + "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", + "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", + "service": "SAP", + "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": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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": "AppGW", - "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" + "checklist": "SAP 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", + "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": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", - "service": "AppGW", - "severity": "Medium", - "text": "Use WAF Policies instead of the legacy WAF configuration.", - "waf": "Operations" + "checklist": "SAP 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", + "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": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", - "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", - "service": "AppGW", - "severity": "Medium", - "text": "Filter inbound traffic in the backends so that they only accept connections from the Application Gateway subnet, for example with NSGs.", + "checklist": "SAP Checklist", + "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", + "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": "Reliability" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", - "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", - "service": "Front Door", - "severity": "Medium", - "text": "Make sure your origins only take traffic from your Azure Front Door instance.", + "checklist": "SAP 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", + "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": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", - "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", - "service": "AppGW", - "severity": "High", - "text": "You should encrypt traffic to the backend servers.", + "checklist": "SAP Checklist", + "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", + "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", + "service": "SAP", + "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", "waf": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", - "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", - "service": "AppGW", + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency checklist", + "guid": "65285269-440b-44be-9d3e-0844276d4bdc", + "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-zone-redundancy", + "service": "Redis", "severity": "High", - "text": "You should use a Web Application Firewall.", + "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.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", - "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", - "service": "AppGW", + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency 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", "severity": "Medium", - "text": "Redirect HTTP to HTTPS", + "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.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "bb697864-1b4c-43af-8667-90cc69aaed5f", - "link": "https://learn.microsoft.com/azure/application-gateway/how-application-gateway-works#modifications-to-the-request", - "service": "AppGW", + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency 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", "severity": "Medium", - "text": "Use gateway-managed cookies to direct traffic from a user session to the same server for processing", - "waf": "Operations" - }, - { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", - "service": "AppGW", - "severity": "High", - "text": "Enable connection draining during planned service updates to prevent connection loss to existing membrs of the backend pool", + "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.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", - "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", - "service": "AppGW", - "severity": "Low", - "text": "Create custom error pages to display a personalized user experience", - "waf": "Operations" + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency checklist", + "guid": "a8c26c9b-32ab-45bd-bc69-98a135e33789", + "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-geo-replication", + "service": "Redis", + "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" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", - "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", - "service": "AppGW", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "ab91932c-9fc9-4d1b-a881-37f5e6c0cb9e", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ADF_v1.docx", + "service": "Data Factory", "severity": "Medium", - "text": "Edit HTTP requests and response headers for easier routing and information exchange between the client and server", + "text": "Leverage FTA Resiliency Playbook for Azure Data Factory", "waf": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "AppGW", - "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.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "e503547c-d447-4e82-9138-a7200f1cac6d", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Data Factory", + "severity": "High", + "text": "Use zone redundant pipelines in regions that support Availability Zones", + "waf": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "29dcc19f-a8fa-4c35-8281-290577538793", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "AppGW", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "9ef1d6e8-32e5-42e3-911c-818b1a0bc511", + "link": "https://learn.microsoft.com/azure/data-factory/source-control", + "service": "Data Factory", "severity": "Medium", - "text": "Use transport layer load balancing", - "waf": "Performance" + "text": "Use DevOps to Backup the ARM templates with Github/Azure DevOps integration ", + "waf": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", - "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", - "service": "AppGW", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "e43a18a9-cd29-49cf-b7b1-7db8255562f2", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Data Factory", "severity": "Medium", - "text": "Configure routing based on host or domain name for multiple web applications on a single gateway", + "text": "Make sure you replicate the Self-Hosted Integration Runtime VMs in another region ", "waf": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", - "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", - "service": "AppGW", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "aee4563a-fd83-4393-98b2-62d6dc5f512a", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Data Factory", "severity": "Medium", - "text": "Centralize SSL certificate management to reduce encryption and decryption overhead from a backend server farm", + "text": "Make sure you replicate or duplicate your network in the sister region. You have to make a copy of your Vnet in another region", "waf": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", - "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", - "service": "AppGW", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "description": "If your ADF Pipelines use Key Vault you don't have to do anything to replicate Key Vault. Key Vault is a managed service and Microsoft takes care of it for you", + "guid": "25498f6d-bad3-47da-a43b-c6ce1d7aa9b2", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "Data Factory", "severity": "Low", - "text": "Use Application Gateway for native support for WebSocket and HTTP/2 protocols", + "text": "If using Keyvault integration, use SLA of Keyvault to understand your availablity", "waf": "Reliability" }, { - "arm-service": "Microsoft.DBforPostgreSQL/servers", - "checklist": "PostgreSQL Review Checklist", - "guid": "65285269-441c-44bf-9d3e-0844276d4bdc", - "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview", - "service": "PostgreSQL", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review Checklist", + "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", + "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", + "service": "Azure MySQL", "severity": "Medium", "text": "Leverage Flexible Server", "waf": "Reliability" }, { - "arm-service": "Microsoft.DBforPostgreSQL/servers", - "checklist": "PostgreSQL Review Checklist", - "guid": "016ccf31-ae5a-41eb-9888-9535e227896d", - "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview#architecture-and-high-availability", - "service": "PostgreSQL", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review 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", "severity": "High", "text": "Leverage Availability Zones where regionally applicable", "waf": "Reliability" }, { - "arm-service": "Microsoft.DBforPostgreSQL/servers", - "checklist": "PostgreSQL Review 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", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review 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", "severity": "Medium", - "text": "Leverage cross-region read replicas for BCDR", + "text": "Leverage Data-in replication for cross-region DR scenarios", "waf": "Reliability" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "ab91932c-9fc9-4d1b-a881-37f5e6c0cb9e", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ADF_v1.docx", - "service": "Data Factory", + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "6d37a33b-531c-4a91-871a-b69d8044f04e", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "High", + "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.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "7ba4d380-7b9e-4a8b-a0c3-2d8e49c11872", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "Key Vault", "severity": "Medium", - "text": "Leverage FTA Resiliency Playbook for Azure Data Factory", + "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.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "e503547c-d447-4e82-9138-a7200f1cac6d", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Data Factory", - "severity": "High", - "text": "Use zone redundant pipelines in regions that support Availability Zones", + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "17fb86a2-eb45-42a4-9c34-52b92a2a1842", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#data-replication", + "service": "Key Vault", + "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.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "9ef1d6e8-32e5-42e3-911c-818b1a0bc511", - "link": "https://learn.microsoft.com/azure/data-factory/source-control", - "service": "Data Factory", + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "614682ca-6e0c-4f34-9f03-c6d3f2b99a32", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#failover-across-regions", + "service": "Key Vault", + "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": "Azure Key Vault", + "guid": "9ef2b0d2-3206-4c94-b47a-4f07e6a1c509", + "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#design-considerations", + "service": "Key Vault", "severity": "Medium", - "text": "Use DevOps to Backup the ARM templates with Github/Azure DevOps integration ", + "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.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "e43a18a9-cd29-49cf-b7b1-7db8255562f2", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Data Factory", - "severity": "Medium", - "text": "Make sure you replicate the Self-Hosted Integration Runtime VMs in another region ", + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "2df045b1-c0f6-47d3-9a9b-99cf6999684e", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "Key Vault", + "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.", "waf": "Reliability" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "aee4563a-fd83-4393-98b2-62d6dc5f512a", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Data Factory", - "severity": "Medium", - "text": "Make sure you replicate or duplicate your network in the sister region. You have to make a copy of your Vnet in another region", + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "cbfa96b0-5249-4e6f-947c-d0e79509708c", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "Key Vault", + "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.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "description": "If your ADF Pipelines use Key Vault you don't have to do anything to replicate Key Vault. Key Vault is a managed service and Microsoft takes care of it for you", - "guid": "25498f6d-bad3-47da-a43b-c6ce1d7aa9b2", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "Data Factory", + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "e8659d11-7e02-4db0-848c-c6541dbab68c", + "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", + "service": "Key Vault", "severity": "Low", - "text": "If using Keyvault integration, use SLA of Keyvault to understand your availablity", + "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", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "High", - "text": "Disable Azure Container Registry image export", + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "45c25e29-d0ef-4f07-aa04-0f8c64cbcc04", + "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", + "service": "Key Vault", + "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", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "High", - "text": "Enable Azure Policies for Azure Container Registry", + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "0f15640b-31e5-4de6-85a7-d2c652fa09d3", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview#purge-protection", + "service": "Key Vault", + "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", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "High", - "text": "Sign and Verify containers with notation (Notary v2)", + "arm-service": "Microsoft.Compute/virtualMachineScaleSets", + "checklist": "Resiliency Review", + "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", + "severity": "Low", + "text": "Enable automatic instance repairs for enhanced VM Scale Sets resiliency", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "Medium", - "text": "Encrypt registry with a customer managed key", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Resiliency Review", + "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", + "severity": "High", + "text": "Consider Azure Backup to meet your resiliency requirements for Azure VMs", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Resiliency Review", + "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", "severity": "High", - "text": "Use Managed Identities to connect instead of Service Principals", + "text": "Use Premium or Ultra disks for production VMs", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Resiliency Review", + "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", "severity": "High", - "text": "Disable local authentication for management plane access", + "text": "Ensure Managed Disks are used for all VMs", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "High", - "text": "Assign AcrPull & AcrPush RBAC roles rather than granting Administrative access to identity principals", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Resiliency Review", + "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", + "severity": "Medium", + "text": "Do not use the Temp disk for anything that is not acceptable to be lost", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Resiliency Review", + "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", "severity": "Medium", - "text": "Disable Anonymous pull access", + "text": "Leverage Availability Zones for your VMs in regions where they are supported", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "High", - "text": "Disable repository-scoped access tokens", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Resiliency Review", + "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", + "severity": "Medium", + "text": "For regions that do not support Availability Zones deploy VMs into Availability Sets", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "description": "Deploy container images to an ACR behind a Private endpoint within a trusted network", - "guid": "b3bec3d4-f343-47c1-936d-b55f27a71eee", - "service": "ACR", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Resiliency Review", + "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", "severity": "High", - "text": "Deploy images from a trusted environment", + "text": "Avoid running a production workload on a single VM", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "Medium", - "text": "Disable Azure ARM audience tokens for authentication", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Resiliency Review", + "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", + "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.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "Medium", - "text": "Enable diagnostics logging", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Resiliency Review", + "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", + "severity": "Low", + "text": "Use Capacity Reservations for critical workloads that require guaranteed capacity", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Resiliency Review", + "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", "severity": "Medium", - "text": "Control inbound network access with Private Link", + "text": "Increase quotas in DR region before testing failover with ASR", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "Medium", - "text": "Disable Public Network access", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Resiliency Review", + "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", + "severity": "Low", + "text": "Utilize Scheduled Events to prepare for VM maintenance", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Resiliency Review", + "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": "Storage", "severity": "Medium", - "text": "Use an Azure Container Registry SKU that supports Private Link (Premium SKU)", + "text": "Choose the most appropriate data redundancy option for Azure Storage based on your requirements", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Resiliency Review", + "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": "Storage", "severity": "Low", - "text": "Enable Defender for Containers to scan Azure Container Registry for vulnerabilities", + "text": "Apply a Delete lock to prevent accidental or malicious deletion of storage accounts", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "description": "Deploy trusted code that was validated and scanned for vulnerabilities according to DevSecOps practices.", - "guid": "4451e1a2-d345-4293-a763-9637a551c5c0", - "service": "ACR", - "severity": "Medium", - "text": "Deploy validated container images", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Resiliency Review", + "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": "Storage", + "severity": "Low", + "text": "Enable soft delete for Storage Account Containers", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "description": "Use the latest versions of supported platforms, programming languages, protocols, and frameworks.", - "guid": "4e401955-387e-45ce-b126-cd132af5b20c", - "service": "ACR", - "severity": "High", - "text": "Use up-to-date platforms, languages, protocols and frameworks", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Resiliency Review", + "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": "Storage", + "severity": "Low", + "text": "Enable soft delete for blobs", "waf": "Reliability" }, - { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization Checklist", - "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", - "service": "Monitor", - "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" - }, { "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization Checklist", - "guid": "45901365-d38e-443f-abcb-d868266abca2", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/automation", + "checklist": "Resiliency Review", + "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": "Backup", "severity": "Medium", - "text": "check backup instances with the underlying datasource not found", - "waf": "Cost" - }, - { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "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", - "severity": "Medium", - "text": "Delete or archive unassociated services (disks, nics, ip addresses etc)", - "waf": "Cost" + "text": "Enable Azure Backup enhanced soft delete for improved data protection and recovery", + "waf": "Reliability" }, { "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", + "checklist": "Resiliency Review", + "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": "Backup", - "severity": "Medium", - "text": "Consider a good balance between site recovery storage and backup for non mission critical applications", - "waf": "Cost" - }, - { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization Checklist", - "guid": "674b5ed8-5a85-49c7-933b-e2a1a27b765a", - "link": "https://learn.microsoft.com/azure/cost-management-billing/manage/direct-ea-administration#manage-notification-contacts", - "service": "Monitor", - "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.Insights/components", - "checklist": "Cost Optimization 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": "Monitor", - "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" - }, - { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "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" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization 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", - "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": "Implement multi-user authorization for Azure Backup to ensure secure and controlled access to backup resources", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "VM", - "severity": "Medium", - "text": "Make sure advisor is configured for VM right sizing ", - "waf": "Cost" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Resiliency Review", + "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": "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.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "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.Network/dnsZones", + "checklist": "Resiliency Review", + "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", + "severity": "Low", + "text": "Implement DNS Failover using Azure DNS Private Resolvers", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", - "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", - "service": "VM", + "arm-service": "Microsoft.PowerBI/gateways", + "checklist": "Resiliency Review", + "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", "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": "Cost Optimization Checklist", - "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", - "service": "VM", - "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" + "checklist": "Resiliency Review", + "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", + "severity": "High", + "text": "Deploy Network Virtual Appliances (NVAs) in a vendor supported configuration for High Availability", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "1fc2fc14-eea6-4e69-b8d9-a3edc218e687", + "link": "https://polite-sea-0995b240f.2.azurestaticapps.net/technical-delivery-playbook/azure-services/analytics/purview/", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", - "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", - "service": "VM", - "severity": "Medium", - "text": "Only larger disks can be reserved => 1 TiB -", - "waf": "Cost" + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "ab067acb-49e5-4b96-8332-4ecf8cc13318", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", + "severity": "High", + "text": "Plan for Data Center level outage", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", - "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", - "service": "VM", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review 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", "severity": "Medium", - "text": "After the right-sizing optimization", - "waf": "Cost" + "text": "Practice Failover for BCDR", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Sql/servers", - "checklist": "Cost Optimization Checklist", - "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", - "service": "Azure SQL", - "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.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "97b15b8a-219a-44ab-bb57-879024d22678", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", + "severity": "High", + "text": "Plan a backup strategy and take regular backups", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", - "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", - "service": "VM", - "severity": "Medium", - "text": "The VM + license part discount (ahub + 3YRI) is around 70% discount", - "waf": "Cost" + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "6d20b56c-56a9-4581-89bf-8d8e5c586b7d", + "link": "https://learn.microsoft.com/purview/manage-kafka-dotnet", + "service": "Purview", + "severity": "Low", + "text": "Use Microsoft Purview's Event Hubs to subscribe and create entities to another account", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "8cdc15ac-c075-4ee9-a130-a8889579e76b", + "link": "https://learn.microsoft.com/purview/deployment-best-practices", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "AKS", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "896e710a-7da7-4be9-a56d-14d3c49d997c", + "link": "https://learn.microsoft.com/purview/concept-best-practices-collections", + "service": "Purview", "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", - "checklist": "Cost Optimization 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": "Backup", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "b3d1325a-a225-4c6f-9e06-85edddea8a4b", + "link": "https://learn.microsoft.com/purview/concept-best-practices-asset-lifecycle", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", - "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", - "service": "Databricks", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "7cdeb3c6-1fc2-4fc1-9eea-6e69d8d9a3ed", + "link": "https://learn.microsoft.com/purview/concept-best-practices-automation", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", - "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", - "service": "Functions", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "c218e687-ab06-47ac-a49e-5b9603324ecf", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", - "link": "https://learn.microsoft.com/azure/automation/update-management/overview", - "service": "Functions", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "8cc13318-da61-4170-869f-4fb4aa3d3ef7", + "link": "https://learn.microsoft.com/purview/concept-best-practices-glossary", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", - "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", - "service": "Functions", - "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.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "f3176c4b-97b1-45b8-a219-a4abeb578790", + "link": "https://learn.microsoft.com/purview/concept-workflow", + "service": "Purview", + "severity": "Low", + "text": "Leverage Workflows ", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "Functions", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "24d22678-6d20-4b56-a56a-958119bf8d8e", + "link": "https://learn.microsoft.com/purview/concept-best-practices-security", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "Functions", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "5c586b7d-8cdc-415a-ac07-5ee9b130a888", + "link": "https://learn.microsoft.com/purview/concept-best-practices-lineage-azure-data-factory", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", - "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", - "service": "Functions", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "9579e76b-896e-4710-a7da-7be9956d14d3", + "link": "https://learn.microsoft.com/purview/concept-best-practices-scanning", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", - "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", - "service": "Functions", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "c49d997c-b3d1-4325-aa22-5c6f4e0685ed", + "link": "https://learn.microsoft.com/purview/concept-best-practices-classification", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "Front Door", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "ddea8a4b-7cde-4b3c-91fc-2fc14eea6e69", + "link": "https://learn.microsoft.com/purview/sensitivity-labels-frequently-asked-questions", + "service": "Purview", "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", - "checklist": "Cost Optimization 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", - "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.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "d8d9a3ed-c218-4e68-9ab0-67acb49e5b96", + "link": "https://learn.microsoft.com/purview/concept-data-share", + "service": "Purview", + "severity": "Low", + "text": "Leverage Azure Storage in-place data sharing with Microsoft Purview", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", - "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", - "service": "Storage", - "severity": "Medium", - "text": "Consider archiving tiers for less used data", - "waf": "Cost" + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "03324ecf-8cc1-4331-ada6-1170269f4fb4", + "link": "https://learn.microsoft.com/purview/concept-insights", + "service": "Purview", + "severity": "Low", + "text": "Leverage Data Estate Insights", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", - "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", - "service": "VM", - "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.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "aa3d3ef7-f317-46c4-a97b-15b8a219a4ab", + "link": "https://learn.microsoft.com/purview/catalog-adoption-insights", + "service": "Purview", + "severity": "Low", + "text": "Use Data stewardship and Catalog adoption", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", - "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", - "service": "Storage", - "severity": "Medium", - "text": "Consider using standard SSD rather than Premium or Ultra where possible", - "waf": "Cost" + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "eb578790-24d2-4267-a6d2-0b56c56a9581", + "link": "https://learn.microsoft.com/purview/concept-insights", + "service": "Purview", + "severity": "Low", + "text": "Use Inventory and Ownership", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization 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", - "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" + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "19bf8d8e-5c58-46b7-b8cd-c15acc075ee9", + "link": "https://learn.microsoft.com/purview/glossary-insights", + "service": "Purview", + "severity": "Low", + "text": "Leverage Insights for Glossary, Classifications, Sensitivity Labels", + "waf": "Reliability" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization Checklist", - "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", - "service": "Site Recovery", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "b130a888-9579-4e76-a896-e710a7da7be9", + "link": "https://learn.microsoft.com/purview/compliance-manager", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", - "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", - "service": "Storage", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "956d14d3-c49d-4997-ab3d-1325aa225c6f", + "link": "https://learn.microsoft.com/purview/compliance-manager-scoring", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", - "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", - "service": "VM", - "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.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "4e0685ed-ddea-48a4-a7cd-eb3c61fc2fc1", + "link": "https://learn.microsoft.com/purview/concept-policies-data-owner#microsoft-purview-policy-concepts", + "service": "Purview", + "severity": "Low", + "text": "Follow Microsoft Purview Data Owner access policies", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", - "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", - "service": "Synapse", - "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.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "4eea6e69-d8d9-4a3e-bc21-8e687ab067ac", + "link": "https://learn.microsoft.com/purview/concept-self-service-data-access-policy", + "service": "Purview", + "severity": "Low", + "text": "Follow Self-service access policies", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "Synapse", - "severity": "Medium", - "text": "Export cost data to a storage account for additional data analysis.", - "waf": "Cost" + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "b49e5b96-0332-44ec-b8cc-13318da61170", + "link": "https://learn.microsoft.com/purview/concept-policies-devops", + "service": "Purview", + "severity": "Low", + "text": "Follow DevOps policies", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "Synapse", - "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.Devices/deviceUpdateServices", + "checklist": "Device Update Review", + "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", + "severity": "High", + "text": "Leverage Availability Zones if regionally applicable (this is automatically enabled).", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", - "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", - "service": "Synapse", - "severity": "Medium", - "text": "Enable the serverless Apache Spark automatic pause feature and set your timeout value accordingly.", - "waf": "Cost" + "arm-service": "Microsoft.Devices/deviceUpdateServices", + "checklist": "Device Update Review", + "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", + "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", - "checklist": "Cost Optimization 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", - "severity": "Medium", - "text": "Create multiple Apache Spark pool definitions of various sizes.", - "waf": "Cost" + "arm-service": "Microsoft.Devices/deviceUpdateServices", + "checklist": "Device Update Review", + "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", + "severity": "High", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization 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", - "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.Devices/deviceUpdateServices", + "checklist": "Device Update Review", + "guid": "bd91245c-fe32-4e98-a085-794a40f4bfe1", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "Device Update for IoT Hub", + "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", - "checklist": "Cost Optimization Checklist", - "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", - "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", - "service": "VM", - "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" + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", + "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", + "service": "IoT Hub DPS", + "severity": "High", + "text": "Select the right Logic App hosting plan based on your business & SLO requirements", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "544451e1-92d3-4442-a3c7-628637a551c5", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "VM", - "severity": "Medium", - "text": "Right-sizing all VMs", - "waf": "Cost" + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "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", + "severity": "High", + "text": "Protect logic apps from region failures with zone redundancy and availability zones", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", - "service": "VM", - "severity": "Medium", - "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.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "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", + "severity": "High", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", - "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.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "IoT Hub DPS", + "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", - "checklist": "Cost Optimization Checklist", - "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "IoT Hub DPS", "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" }, { "aprlGuid": "bb6deb9d-24fa-4ee8-bc23-ac3ebc7fdf8e", @@ -24305,7 +24305,7 @@ ], "metadata": { "name": "WAF checklist", - "timestamp": "August 05, 2024" + "timestamp": "August 08, 2024" }, "severities": [ { diff --git a/checklists/checklist.en.master.json b/checklists/checklist.en.master.json index 6e9043a0d..9c9631f09 100644 --- a/checklists/checklist.en.master.json +++ b/checklists/checklist.en.master.json @@ -1,22617 +1,20264 @@ { "items": [ { - "category": "BC and DR", - "checklist": "Device Provisioning Service Review", - "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": [], - "severity": "High", - "subcategory": "High Availability", - "text": "Select the right Logic App hosting plan based on your business & SLO requirements", - "waf": "Reliability" + "category": "Governance", + "checklist": "Azure API Management Review", + "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", + "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", + "service": "APIM", + "services": [ + "APIM", + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Development best practices", + "text": "Implement an error handling policy at the global level", + "waf": "Operations" }, { - "category": "BC and DR", - "checklist": "Device Provisioning Service Review", - "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": [], - "severity": "High", - "subcategory": "High Availability", - "text": "Protect logic apps from region failures with zone redundancy and availability zones", - "waf": "Reliability" + "category": "Governance", + "checklist": "Azure API Management Review", + "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": [ + "APIM", + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Development best practices", + "text": "Ensure all APIs policies include a element.", + "waf": "Operations" }, { - "category": "BC and DR", - "checklist": "Device Provisioning Service Review", - "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": [], - "severity": "High", - "subcategory": "High Availability", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" + "category": "Governance", + "checklist": "Azure API Management Review", + "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", + "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", + "service": "APIM", + "services": [ + "APIM", + "AzurePolicy", + "ACR" + ], + "severity": "Medium", + "subcategory": "Development best practices", + "text": "Use Policy Fragments to avoid repeating same policies definitions across multiple APIs", + "waf": "Operations" }, { - "category": "BC and DR", - "checklist": "Device Provisioning Service Review", - "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "IoT Hub DPS", + "category": "Governance", + "checklist": "Azure API Management Review", + "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", + "link": "https://learn.microsoft.com/azure/api-management/monetization-support", + "service": "APIM", "services": [ - "AppSvc" + "APIM" + ], + "severity": "Medium", + "subcategory": "Monetization", + "text": "If you are planning to monetize your APIs, review the 'monetization support' article for best practices", + "waf": "Operations" + }, + { + "category": "Governance", + "checklist": "Azure API Management Review", + "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": [ + "APIM", + "Monitor" ], "severity": "High", - "subcategory": "High Availability", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" + "subcategory": "Monitoring", + "text": "Enable Diagnostics Settings to export logs to Azure Monitor", + "waf": "Operations" }, { - "category": "Application Deployment", - "checklist": "Device Provisioning Service Review", - "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "IoT Hub DPS", - "services": [], + "category": "Governance", + "checklist": "Azure API Management Review", + "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", + "service": "APIM", + "services": [ + "APIM", + "Monitor" + ], "severity": "Medium", - "subcategory": "CI/CD", - "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", + "subcategory": "Monitoring", + "text": "Enable Application Insights for more detailed telemetry", "waf": "Operations" }, { - "category": "Operations Management", - "checklist": "DNS Review Checklist", - "guid": "a96b96ad-8840-48f3-9273-4c876ba28021", - "link": "https://learn.microsoft.com/azure/dns/private-dns-resiliency", + "category": "Governance", + "checklist": "Azure API Management Review", + "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", + "service": "APIM", "services": [ - "DNS", - "VNet" + "APIM", + "Monitor" ], "severity": "High", - "subcategory": "Azure Private DNS", - "text": "Verify that Zones are linked to Vnets in multiple regions", - "waf": "Reliability" + "subcategory": "Monitoring", + "text": "Configure alerts on the most critical metrics", + "waf": "Operations" }, { - "category": "Operations Management", - "checklist": "DNS Review Checklist", - "guid": "45901465-d38e-453f-accb-d969266acca2", - "link": "https://learn.microsoft.com/azure/dns/private-dns-resiliency", + "category": "Identity and Access Management", + "checklist": "Azure API Management Review", + "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": [ - "DNS" + "Entra", + "AKV", + "APIM" ], "severity": "High", - "subcategory": "Azure Private DNS", - "text": "If different Zones are used between regions, verify a plan for making sure that Zones are up to date in a DR failover situation", - "waf": "Reliability" + "subcategory": "Data protection", + "text": "Ensure that custom SSL certificates are stored an Azure Key Vault so they can be securely accessed and updated", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "DNS Review Checklist", - "guid": "74faa19b-f39d-495d-94c7-c8919ca1f6d5", - "link": "https://learn.microsoft.com/azure/reliability/reliability-traffic-manager?toc=%2Fazure%2Fdns%2Ftoc.json", + "category": "Identity and Access Management", + "checklist": "Azure API Management Review", + "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": [ - "DNS", - "TrafficManager", - "ASR" + "Entra", + "APIM" ], - "severity": "Medium", - "subcategory": "Azure DNS", - "text": "Plan for disaster recovery with Azure DNS and Traffic Manager", - "waf": "Reliability" + "severity": "High", + "subcategory": "Identity", + "text": "Protect incoming requests to APIs (data plane) with Azure AD", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "DNS Review Checklist", - "guid": "315ae524-ba34-4d45-a5e1-2139bd7bb012", - "link": "https://learn.microsoft.com/azure/dns/private-resolver-reliability#availability-zones", + "category": "Identity and Access Management", + "checklist": "Azure API Management Review", + "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", + "service": "APIM", "services": [ - "DNS" + "Entra", + "APIM" ], "severity": "Medium", - "subcategory": "Azure DNS Resolver", - "text": "Enable availability zones with Private Resolver", - "waf": "Reliability" + "subcategory": "Identity", + "text": "Use Microsoft Entra ID to authenticate users in the Developer Portal", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "DNS Review Checklist", - "guid": "f7b95e06-e154-4e2a-a359-2828e6e20517", - "link": "https://learn.microsoft.com/azure/dns/tutorial-dns-private-resolver-failover", + "category": "Identity and Access Management", + "checklist": "Azure API Management Review", + "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", + "service": "APIM", "services": [ - "DNS", - "ASR" + "Entra", + "APIM" ], "severity": "Medium", - "subcategory": "Azure DNS Resolver", - "text": "Plan for failover with Private Resolvers in a Disaster Recovery", - "waf": "Reliability" + "subcategory": "Privileged access", + "text": "Create appropriate groups to control the visibility of the products", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "DNS Review Checklist", - "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", + "category": "Management", + "checklist": "Azure API Management Review", + "guid": "06862505-2d9a-4874-9491-2837b00a3475", + "link": "https://learn.microsoft.com/azure/api-management/backends", + "service": "APIM", "services": [ - "DNS", - "VM" + "APIM" ], "severity": "Medium", - "subcategory": "VM Based DNS Service", - "text": "Follow VM Guidance for resillency of VM", - "waf": "Reliability" + "subcategory": "Best practices", + "text": "Use Backends feature to eliminate redundant API backend configurations", + "waf": "Operations" }, { - "category": "Operations Management", - "checklist": "DNS Review Checklist", - "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", + "category": "Management", + "checklist": "Azure API Management Review", + "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", + "service": "APIM", "services": [ - "DNS", - "VM", - "Entra" + "APIM", + "AzurePolicy" ], "severity": "Medium", - "subcategory": "VM Based DNS Service", - "text": "IF AD based DNS, follow the Identity -> Windows Server AD path", - "waf": "Reliability" - }, - { - "category": "BC and DR", - "checklist": "Device Update Review", - "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": [], - "severity": "High", - "subcategory": "High Availability", - "text": "Leverage Availability Zones if regionally applicable (this is automatically enabled).", - "waf": "Reliability" - }, - { - "category": "BC and DR", - "checklist": "Device Update Review", - "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": [], - "severity": "High", - "subcategory": "High Availability", - "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" + "subcategory": "Best practices", + "text": "Use Named Values to store common values that can be used in policies", + "waf": "Operations" }, { - "category": "BC and DR", - "checklist": "Device Update Review", - "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": [], - "severity": "High", - "subcategory": "High Availability", - "text": "Consider a Cross-Region DR strategy for critical workloads", + "category": "Management", + "checklist": "Azure API Management Review", + "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", + "service": "APIM", + "services": [ + "ASR", + "APIM", + "ACR" + ], + "severity": "Medium", + "subcategory": "Business continuity and disaster recovery", + "text": "For DR, leverage the premium tier with deployments scaled across two or more regions for 99.99% SLA", "waf": "Reliability" }, { - "category": "BC and DR", - "checklist": "Device Update Review", - "guid": "bd91245c-fe32-4e98-a085-794a40f4bfe1", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "Device Update for IoT Hub", + "category": "Management", + "checklist": "Azure API Management Review", + "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", + "link": "https://learn.microsoft.com/azure/api-management/high-availability", + "service": "APIM", "services": [ - "AppSvc" + "ASR", + "APIM" ], - "severity": "High", - "subcategory": "High Availability", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "severity": "Medium", + "subcategory": "Business continuity and disaster recovery", + "text": "Deploy at least one unit in two or more availability zones for an increased SLA of 99.99%", "waf": "Reliability" }, { - "category": "BC and DR", - "checklist": "Logic Apps checklist", - "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", - "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", - "service": "Logic Apps", - "services": [], + "category": "Management", + "checklist": "Azure API Management Review", + "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": [ + "Backup", + "APIM", + "ASR" + ], "severity": "High", - "subcategory": "High Availability", - "text": "Select the right Logic App hosting plan based on your business & SLO requirements", + "subcategory": "Business continuity and disaster recovery", + "text": "Ensure there is an automated backup routine", "waf": "Reliability" }, { - "category": "BC and DR", - "checklist": "Logic Apps 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": [], - "severity": "High", - "subcategory": "High Availability", - "text": "Protect logic apps from region failures with zone redundancy and availability zones", + "category": "Management", + "checklist": "Azure API Management Review", + "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", + "link": "https://learn.microsoft.com/azure/api-management/retry-policy", + "service": "APIM", + "services": [ + "APIM", + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Failover and Caching", + "text": "Use Policies to add a fail-over backend URL and caching to reduce failing calls.", "waf": "Reliability" }, { - "category": "BC and DR", - "checklist": "Logic Apps 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": [], - "severity": "High", - "subcategory": "High Availability", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" + "category": "Management", + "checklist": "Azure API Management Review", + "guid": "f96ddac5-77ec-4fa9-8833-4327f052059e", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-cache-external", + "services": [ + "APIM", + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Performance and scalability", + "text": "Consider using a external cache policy for APIs that can benefit from caching", + "training": "https://learn.microsoft.com/training/modules/improve-api-performance-with-apim-caching-policy/" }, { - "category": "BC and DR", - "checklist": "Logic Apps checklist", - "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", - "link": "https://learn.microsoft.com/azure/app-service/environment/intro", - "service": "Logic Apps", + "category": "Management", + "checklist": "Azure API Management Review", + "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", + "service": "APIM", "services": [ - "AppSvc" + "EventHubs", + "APIM", + "AzurePolicy" ], - "severity": "High", - "subcategory": "High Availability", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" + "severity": "Low", + "subcategory": "Performance and scalability", + "text": "If you need to log at high performance levels, consider Event Hubs policy", + "waf": "Operations" }, { - "category": "Application Deployment", - "checklist": "Logic Apps checklist", - "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", - "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", - "service": "Logic Apps", - "services": [], + "category": "Management", + "checklist": "Azure API Management Review", + "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", + "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", + "service": "APIM", + "services": [ + "APIM", + "AzurePolicy" + ], "severity": "Medium", - "subcategory": "CI/CD", - "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", - "waf": "Operations" + "subcategory": "Performance and scalability", + "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" }, { - "category": "Operations management", - "checklist": "Azure Bot Service", - "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", - "service": "Bot service", - "services": [], + "category": "Management", + "checklist": "Azure API Management Review", + "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", + "service": "APIM", + "services": [ + "APIM" + ], "severity": "Medium", - "subcategory": "High Availablity", - "text": "Follow reliability support recommendations in Azure Bot Service", - "waf": "Reliability" + "subcategory": "Performance and scalability", + "text": "Configure autoscaling to scale out the number of instances when the load increases", + "waf": "Performance" }, { - "category": "Operations management", - "checklist": "Azure Bot Service", - "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", - "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", - "service": "Bot service", - "services": [], + "category": "Management", + "checklist": "Azure API Management Review", + "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", + "service": "APIM", + "services": [ + "APIM" + ], "severity": "Medium", - "subcategory": "High Availablity", - "text": "Deploying bots with local data residency and regional compliance", - "waf": "Reliability" + "subcategory": "Performance and scalability", + "text": "Deploy self-hosted gateways where Azure doesn't have a region close to the backend APIs.", + "waf": "Performance" }, { - "category": "Operations management", - "checklist": "Azure Bot Service", - "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": [], + "category": "Management", + "checklist": "Azure API Management Review", + "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", + "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", + "service": "APIM", + "services": [ + "APIM" + ], "severity": "Medium", - "subcategory": "High Availablity", - "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.", + "subcategory": "Premium Tier", + "text": "Use the premium tier for production workloads.", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "CosmosDB Review Checklist", - "guid": "43e52f47-22d9-428c-8b1c-d521e54a29a9", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/pass-foundations-playbooks-CosmosDB_v1.docx", - "service": "CosmosDB", + "category": "Management", + "checklist": "Azure API Management Review", + "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": [ - "CosmosDB" + "APIM", + "AzurePolicy" ], "severity": "Medium", - "subcategory": "Best Practices", - "text": "FTA Resiliency Playbook", + "subcategory": "Request Routing", + "text": "In multi-region model, use Policies to route the requests to regional backends based on availability or latency.", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "CosmosDB Review Checklist", - "guid": "de39ac0e-7c28-4dc9-9565-7202bff4564b", - "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#slas", - "service": "CosmosDB", - "services": [ - "CosmosDB" - ], + "category": "Management", + "checklist": "Azure API Management Review", + "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": [ + "Entra", + "APIM" + ], "severity": "High", - "subcategory": "High Availability", - "text": "Leverage Availablity Zones where regionally applicable and ofcourse if the service offers it", + "subcategory": "Resource Limits", + "text": "Be aware of APIM's limits", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "CosmosDB Review Checklist", - "guid": "0d934a34-8b26-43e7-bd60-513a3649906e", - "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#replica-outages", - "service": "CosmosDB", + "category": "Management", + "checklist": "Azure API Management Review", + "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", + "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", + "service": "APIM", "services": [ - "CosmosDB" + "APIM" ], - "severity": "Medium", - "subcategory": "High Availability", - "text": "Run multiple replicas of the database (>1 ) in Prod", + "severity": "High", + "subcategory": "Self-Hosted", + "text": "Ensure that the self-hosted gateway deployments are resilient.", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "CosmosDB Review 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", + "category": "Network Topology and Connectivity", + "checklist": "Azure API Management Review", + "guid": "7519e385-a88b-4d34-966b-6269d686e890", + "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", + "service": "APIM", "services": [ - "ACR", - "CosmosDB" + "Entra", + "APIM", + "FrontDoor" ], "severity": "Medium", - "subcategory": "High Availability", - "text": "Leverage Multi-Region Writes", - "waf": "Reliability" + "subcategory": "Connectivity", + "text": "Use Azure Front Door in front of APIM for multi-region deployment", + "waf": "Performance" }, { - "category": "Operations Management", - "checklist": "CosmosDB Review 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", + "category": "Network Topology and Connectivity", + "checklist": "Azure API Management Review", + "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": [ - "ACR", - "CosmosDB" + "VNet", + "APIM" ], "severity": "Medium", - "subcategory": "High Availability", - "text": "Distribute your data globally", - "waf": "Reliability" + "subcategory": "Security", + "text": "Deploy the service within a Virtual Network (VNet)", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "CosmosDB Review 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", + "category": "Network Topology and Connectivity", + "checklist": "Azure API Management Review", + "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": [ - "CosmosDB" + "Entra", + "APIM", + "VNet", + "Monitor" ], - "severity": "High", - "subcategory": "High Availability", - "text": "Choose from several well-defined consistency models", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Security", + "text": "Deploy network security groups (NSG) to your subnets to restrict or monitor traffic to/from APIM.", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "CosmosDB Review 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", + "category": "Network Topology and Connectivity", + "checklist": "Azure API Management Review", + "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": [ - "CosmosDB" + "Entra", + "APIM", + "PrivateLink", + "VNet" ], "severity": "Medium", - "subcategory": "High Availability", - "text": "Enable Service managed failover", - "waf": "Reliability" + "subcategory": "Security", + "text": "Deploy Private Endpoints to filter incoming traffic when APIM is not deployed to a VNet.", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "CosmosDB Review 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", + "category": "Network Topology and Connectivity", + "checklist": "Azure API Management Review", + "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": [ - "Storage", - "Backup", - "CosmosDB" + "APIM" ], - "severity": "Medium", - "subcategory": "Backup Strategy", - "text": "Enable Automatic Backups", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", - "waf": "Reliability" + "severity": "High", + "subcategory": "Security", + "text": "Disable Public Network Access", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "CosmosDB Review 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", + "category": "Platform automation and DevOps", + "checklist": "Azure API Management Review", + "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", + "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", + "service": "APIM", "services": [ - "Backup", - "CosmosDB" + "APIM" ], "severity": "Medium", - "subcategory": "Backup Strategy", - "text": "Perform Periodic Backups", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", - "waf": "Reliability" + "subcategory": "Automation", + "text": "Simplify management with PowerShell automation scripts", + "waf": "Operations" }, { - "category": "Operations Management", - "checklist": "CosmosDB Review 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", + "category": "Platform automation and DevOps", + "checklist": "Azure API Management Review", + "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": [ - "Backup", - "CosmosDB" + "Entra", + "APIM" ], "severity": "Medium", - "subcategory": "Backup Strategy", - "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" + "subcategory": "Best practices", + "text": "Configure APIM via Infrastructure-as-code. Review DevOps best practices from the Cloud Adaption Framework APIM Landing Zone Accelerator", + "waf": "Operations" }, { - "category": "Version Control", - "checklist": "Azure DevOps", - "description": "Implement branching policy in Azure DevOps", - "guid": "eda1dae2-cc85-4c47-a6b7-81cca0e6c465", - "link": "https://learn.microsoft.com/azure/devops/repos/git/branch-policies-overview?view=azure-devops", + "category": "Platform automation and DevOps", + "checklist": "Azure API Management Review", + "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", + "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", + "service": "APIM", "services": [ - "AzurePolicy" + "Entra", + "APIM" ], - "severity": "High", - "subcategory": "Branching Policy", - "text": "Branch Policies", + "severity": "Medium", + "subcategory": "Best practices", + "text": "Promote usage of Visual Studio Code APIM extension for faster API development", "waf": "Operations" }, { - "category": "Version Control", - "checklist": "Azure DevOps", - "description": "Understand branch strategy such as GitFlow or GitHub Flow", - "guid": "bc288bec-6a16-4ca7-8444-51e1add34529", - "link": "https://learn.microsoft.com/azure/devops/repos/git/git-branching-guidance?view=azure-devops", + "category": "Platform automation and DevOps", + "checklist": "Azure API Management Review", + "guid": "354f1c03-8112-4965-85ad-c0074bddf231", + "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", + "service": "APIM", "services": [ - "AzurePolicy" + "APIM" ], - "severity": "High", - "subcategory": "Branching Policy", - "text": "Branching strategy", + "severity": "Medium", + "subcategory": "DevOps", + "text": "Implement DevOps and CI/CD in your workflow", "waf": "Operations" }, { - "category": "Version Control", - "checklist": "Azure DevOps", - "description": "Understand how teams work with git", - "guid": "ec723823-7a15-41c5-ab4e-401914387e5c", - "link": "https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow", + "category": "Security", + "checklist": "Azure API Management Review", + "guid": "b6439493-426a-45f3-9697-cf65baee208d", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", + "service": "APIM", "services": [ - "AzurePolicy" + "APIM" ], - "severity": "High", - "subcategory": "Branching Policy", - "text": "Understand GitFlow Branch Strategy", - "waf": "Operations" + "severity": "Medium", + "subcategory": "APIs", + "text": "Secure APIs using client certificate authentication", + "waf": "Security" }, { - "category": "Version Control", - "checklist": "Azure DevOps", - "description": "Merge into higher branches after two or more reviewers in a PR", - "guid": "a9c26c9c-32ab-45bd-8c69-98a246e33899", - "link": "https://learn.microsoft.com/azure/devops/repos/git/review-pull-requests?view=azure-devops&tabs=browser", + "category": "Security", + "checklist": "Azure API Management Review", + "guid": "2a67d143-1033-4c0a-8732-680896478f08", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", + "service": "APIM", "services": [ - "AzurePolicy" + "APIM" ], - "severity": "High", - "subcategory": "Branching Policy", - "text": "Pull Request Review", - "waf": "Operations" + "severity": "Medium", + "subcategory": "APIs", + "text": "Secure backend services using client certificate authentication", + "waf": "Security" }, { - "category": "Version Control", - "checklist": "Azure DevOps", - "description": "Implement access control to the branches", - "guid": "7e41c77d-68cb-46a2-8ac1-9f916d697d8e", - "link": "https://learn.microsoft.com/azure/devops/repos/git/branch-permissions?view=azure-devops", + "category": "Security", + "checklist": "Azure API Management Review", + "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", + "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", + "service": "APIM", "services": [ - "AzurePolicy" + "APIM" ], "severity": "Medium", - "subcategory": "Branching Policy", - "text": "Access Control to the Branch", - "waf": "Operations" - }, - { - "category": "Version Control", - "checklist": "Azure DevOps", - "description": "Perform SAST code scan", - "guid": "adfd27bd-e187-401a-a252-baa9b68a088c", - "link": "https://devblogs.microsoft.com/devops/integrate-security-into-your-developer-workflow-with-github-advanced-security-for-azure-devops/", - "services": [], - "severity": "High", - "subcategory": "Security", - "text": "Code Scan", + "subcategory": "APIs", + "text": "Review 'Recommendations to mitigate OWASP API Security Top 10 threats' article and check what is applicable to your APIs", "waf": "Security" }, { - "category": "Version Control", - "checklist": "Azure DevOps", - "description": "Understand TFVC as Code Repo", - "guid": "9a8f822b-8eb9-4d1b-a77f-26e5e6beba8e", - "link": "https://learn.microsoft.com/azure/devops/repos/tfvc/what-is-tfvc?view=azure-devops", - "services": [], - "severity": "Low", - "subcategory": "Practice", - "text": "TFVC as Code Repository", - "waf": "Operations" + "category": "Security", + "checklist": "Azure API Management Review", + "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", + "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", + "service": "APIM", + "services": [ + "APIM" + ], + "severity": "Medium", + "subcategory": "APIs", + "text": "Use Authorizations feature to simplify management of OAuth 2.0 token for your backend APIs", + "waf": "Security" }, { - "category": "Version Control", - "checklist": "Azure DevOps", - "description": "Compare Git vs TFVC for your project", - "guid": "d4f3437b-c336-4d71-9f27-a71eee0b9b5d", - "link": "https://learn.microsoft.com/azure/devops/repos/tfvc/comparison-git-tfvc?view=azure-devops", - "services": [], - "severity": "Low", - "subcategory": "Practice", - "text": "Choose Right version control", - "waf": "Operations" + "category": "Security", + "checklist": "Azure API Management Review", + "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", + "service": "APIM", + "services": [ + "APIM" + ], + "severity": "High", + "subcategory": "Ciphers", + "text": "Use the latest TLS version when encrypting information in transit. Disable outdated and unnecessary protocols and ciphers when possible.", + "waf": "Security" }, { - "category": "Azure Boards", - "checklist": "Azure DevOps", - "description": "Set up your team management", - "guid": "8defd5d7-21d4-41d2-900c-807bf9eab40f", - "link": "https://learn.microsoft.com/azure/devops/organizations/settings/manage-teams?view=azure-devops", - "services": [], + "category": "Security", + "checklist": "Azure API Management Review", + "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": [ + "AKV", + "APIM" + ], "severity": "High", - "subcategory": "Team Planning", - "text": "Configure your teams", - "waf": "Operations" + "subcategory": "Data protection", + "text": "Ensure that secrets (Named values) are stored an Azure Key Vault so they can be securely accessed and updated", + "waf": "Security" }, { - "category": "Azure Boards", - "checklist": "Azure DevOps", - "description": "Start scheduling sprints", - "guid": "9ed5b354-78d4-447a-a26c-2863c00f1cac", - "link": "https://learn.microsoft.com/azure/devops/boards/sprints/define-sprints?view=azure-devops", - "services": [], + "category": "Security", + "checklist": "Azure API Management Review", + "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", + "APIM" + ], "severity": "Medium", - "subcategory": "Team Planning", - "text": "Configure your sprints", - "waf": "Operations" - }, - { - "category": "Azure Boards", - "checklist": "Azure DevOps", - "description": "Set up your work item heirarchy", - "guid": "699ef1d5-a83d-4e5d-b36c-1c81870a0bc5", - "link": "https://learn.microsoft.com/azure/devops/organizations/settings/work/customize-process-work-item-type?view=azure-devops", - "services": [], - "severity": "Low", - "subcategory": "Team Planning", - "text": "Choose Work Item types", - "waf": "Operations" + "subcategory": "Identities", + "text": "Use managed identities to authenticate to other Azure resources whenever possible", + "waf": "Security" }, { - "category": "Azure Boards", - "checklist": "Azure DevOps", - "description": "WIT Processes available in Azure DevOps", - "guid": "c1e43a18-658d-4285-aed6-7179b825546d", - "link": "https://learn.microsoft.com/azure/devops/boards/work-items/guidance/choose-process?view=azure-devops&tabs=agile-process", - "services": [], + "category": "Security", + "checklist": "Azure API Management Review", + "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": [ + "Entra", + "APIM", + "AppGW", + "WAF" + ], "severity": "High", - "subcategory": "Team Planning", - "text": "Select a WIT Process", - "waf": "Operations" + "subcategory": "Network", + "text": "Use web application firewall (WAF) by deploying Application Gateway in front of APIM", + "waf": "Security" }, { - "category": "Azure Boards", - "checklist": "Azure DevOps", - "description": "Use Azure Boards with GitHub", - "guid": "f2aee455-3afc-4833-a248-726dd68c5b5c", - "link": "https://learn.microsoft.com/azure/devops/cross-service/github-integration?view=azure-devops", + "category": "Application Deployment", + "checklist": "Azure Spring Apps Review", + "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", + "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", + "service": "Spring Apps", "services": [], - "severity": "Low", - "subcategory": "Tool Integration", - "text": "GitHub Integration", - "waf": "Operations" + "severity": "Medium", + "subcategory": "DevOps", + "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" }, { - "category": "Azure Boards", - "checklist": "Azure DevOps", - "description": "Understand the methologies", - "guid": "2925394b-69b9-4d37-aac4-3bc68d1d7665", - "link": "https://www.atlassian.com/agile/scrum/agile-vs-scrum", - "services": [], + "category": "BC and DR", + "checklist": "Azure Spring Apps Review", + "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": [ + "TrafficManager", + "ASR", + "FrontDoor" + ], "severity": "Medium", - "subcategory": "Process Planning", - "text": "Understand Agile Vs Scrum", - "waf": "Operations" + "subcategory": "Disaster Recovery", + "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" }, { - "category": "Azure Boards", - "checklist": "Azure DevOps", - "description": "Create Dashboard and PowerBI reports", - "guid": "7246b448-564b-44dd-94a7-59c7633bd2a1", - "link": "https://learn.microsoft.com/azure/devops/report/dashboards/overview?view=azure-devops", - "services": [], + "category": "BC and DR", + "checklist": "Azure Spring Apps Review", + "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", + "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", + "service": "Spring Apps", + "services": [ + "ACR" + ], "severity": "Medium", - "subcategory": "Reporting", - "text": "Dashboard", - "waf": "Operations" + "subcategory": "High Availability", + "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" }, { - "category": "Azure Boards", - "checklist": "Azure DevOps", - "description": "Set up backlog", - "guid": "a27a764a-90be-40e3-98ee-293c1bd363ca", - "link": "https://learn.microsoft.com/azure/devops/boards/backlogs/set-up-your-backlog?view=azure-devops", + "category": "BC and DR", + "checklist": "Azure Spring Apps Review", + "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", + "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", + "service": "Spring Apps", "services": [], "severity": "Medium", - "subcategory": "Reporting", - "text": "Refine your backlog", - "waf": "Operations" + "subcategory": "High Availability", + "text": "Use more than 1 app instance for your apps", + "waf": "Reliability" }, { - "category": "Azure Boards", - "checklist": "Azure DevOps", - "description": "Link your work items", - "guid": "aab75719-49ab-4919-9dc9-fc9d1bb84b37", - "link": "https://learn.microsoft.com/azure/devops/boards/queries/link-work-items-support-traceability?view=azure-devops&tabs=browser", - "services": [], + "category": "Operations", + "checklist": "Azure Spring Apps Review", + "guid": "7504c230-6035-4183-95a5-85762acc6075", + "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", + "service": "Spring Apps", + "services": [ + "Monitor" + ], "severity": "Medium", - "subcategory": "Reporting", - "text": "Visualize Relationships", - "waf": "Operations" + "subcategory": "Monitoring", + "text": "Monitor Azure Spring Apps with logs, metrics and tracing. Integrate ASA with application insights and track failures and create workbooks.", + "waf": "Reliability" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "View the velocity report", - "guid": "b5a67fcb-9ed5-4b35-978d-447a826c2863", - "link": "https://learn.microsoft.com/azure/devops/report/dashboards/team-velocity?view=azure-devops&tabs=in-context", - "services": [], - "severity": "Low", - "subcategory": "Reporting", - "text": "Review Team Velocity", - "waf": "Operations" - }, - { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Create your first pipeline", - "guid": "c00f1cac-699e-4f1d-9a83-de5de36c1c81", - "link": "https://learn.microsoft.com/azure/devops/pipelines/create-first-pipeline?view=azure-devops&tabs=java%2Ctfs-2018-2%2Cbrowser", - "services": [], - "severity": "High", - "subcategory": "Continuous Integration", - "text": "Set up pipeline", - "waf": "Operations" - }, - { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Specify events that trigger pipelines", - "guid": "870a0bc5-c1e4-43a1-a658-d2858ed67179", - "link": "https://learn.microsoft.com/azure/devops/pipelines/build/triggers?view=azure-devops", + "category": "Operations", + "checklist": "Azure Spring Apps Review", + "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": [], - "severity": "High", - "subcategory": "Continuous Integration", - "text": "Set Build triggers", - "waf": "Operations" + "severity": "Medium", + "subcategory": "Scalability", + "text": "Set up autoscaling in Spring Cloud Gateway", + "waf": "Reliability" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Use YAML to create build pipeline", - "guid": "b825546d-f2ae-4e45-93af-c8339248726d", - "link": "https://learn.microsoft.com/azure/devops/pipelines/customize-pipeline?view=azure-devops", + "category": "Operations", + "checklist": "Azure Spring Apps Review", + "guid": "97411607-b6fd-4335-99d1-9885faf4e392", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", + "service": "Spring Apps", "services": [], "severity": "Low", - "subcategory": "Continuous Integration", - "text": "Customize YAML Pipeline", - "waf": "Operations" + "subcategory": "Scalability", + "text": "Enable autoscale for the apps with Standard consumption & dedicated plan.", + "waf": "Reliability" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Use classic GUI editor to set up pipeline", - "guid": "d68c5b5c-2925-4394-a69b-9d379ac43bc6", - "link": "https://learn.microsoft.com/azure/devops/pipelines/get-started/pipelines-get-started?view=azure-devops&source=recommendations#define-pipelines-using-the-classic-interface", + "category": "Operations", + "checklist": "Azure Spring Apps Review", + "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", + "link": "https://learn.microsoft.com/azure/spring-apps/overview", + "service": "Spring Apps", "services": [], "severity": "Medium", - "subcategory": "Continuous Integration", - "text": "Use GUI for pipeline", - "waf": "Operations" + "subcategory": "Support", + "text": "Use Enterprise plan for commercial support of spring boot for mission critical apps. With other tiers you get OSS support.", + "waf": "Reliability" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Set up templates, parameters and expressions", - "guid": "8d1d7665-7246-4b44-a564-b4dd74a759c7", - "link": "https://learn.microsoft.com/azure/devops/pipelines/process/templates?view=azure-devops&pivots=templates-includes", - "services": [], + "category": "Identity", + "checklist": "Azure VMware Solution Design Review", + "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", + "service": "AVS", + "services": [ + "Entra", + "AVS", + "Subscriptions" + ], + "severity": "High", + "subcategory": "Identity", + "text": "Ensure ADDS domain controller(s) are deployed in the identity subscription in native Azure", + "waf": "Security" + }, + { + "category": "Identity", + "checklist": "Azure VMware Solution Design Review", + "guid": "75089c20-990d-4927-b105-885576f76fc2", + "service": "AVS", + "services": [ + "Entra", + "AVS" + ], "severity": "Medium", - "subcategory": "Continuous Integration", - "text": "Configure Templates", - "waf": "Operations" + "subcategory": "Identity", + "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" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Set up jobs, stages and dependencies", - "guid": "633bd2a1-a27a-4764-a90b-e0e378ee293c", - "link": "https://learn.microsoft.com/azure/devops/pipelines/process/stages?view=azure-devops&tabs=yaml", - "services": [], + "category": "Identity", + "checklist": "Azure VMware Solution Design Review", + "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", + "service": "AVS", + "services": [ + "Entra", + "AVS" + ], "severity": "High", - "subcategory": "Continuous Integration", - "text": "Jobs", - "waf": "Operations" + "subcategory": "Identity", + "text": "Ensure that vCenter is connected to ADDS to enable authentication based on 'named user accounts'", + "waf": "Security" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Set up conditions and Demands", - "guid": "1bd363ca-aab7-4571-a49a-b9193dc9fc9d", - "link": "https://learn.microsoft.com/azure/devops/pipelines/process/conditions?view=azure-devops&tabs=yaml%2Cstages", - "services": [], + "category": "Identity", + "checklist": "Azure VMware Solution Design Review", + "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", + "service": "AVS", + "services": [ + "Entra", + "AVS" + ], "severity": "Medium", - "subcategory": "Continuous Integration", - "text": "Conditions and Demands", - "waf": "Operations" + "subcategory": "Identity", + "text": "Ensure that the connection from vCenter to ADDS is using a secure protocol (LDAPS)", + "waf": "Security" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Define Variables", - "guid": "1bb84b37-b5a6-47fc-a9ed-5b35478d447a", - "link": "https://learn.microsoft.com/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch", - "services": [], - "severity": "High", - "subcategory": "Continuous Integration", - "text": "Variables", - "waf": "Operations" + "category": "Identity", + "checklist": "Azure VMware Solution Design Review", + "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", + "service": "AVS", + "services": [ + "Entra", + "AVS" + ], + "severity": "Medium", + "subcategory": "Identity", + "text": "CloudAdmin account in vCenter IdP is used only as an emergency account (break-glass)", + "waf": "Security" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Set up your deployment pipeline", - "guid": "826c2863-c00f-41ca-a699-ef1d5a83de5d", - "link": "https://learn.microsoft.com/azure/devops/pipelines/process/create-multistage-pipeline?view=azure-devops", - "services": [], + "category": "Identity", + "checklist": "Azure VMware Solution Design Review", + "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", + "service": "AVS", + "services": [ + "Entra", + "AVS" + ], "severity": "High", - "subcategory": "Continuous Deployment", - "text": "Deployment Pipeline", - "waf": "Operations" + "subcategory": "Identity", + "text": "Ensure that NSX-Manager is integrated with an external Identity provider (LDAPS)", + "waf": "Security" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Select correct branches to deploy from", - "guid": "e36c1c81-870a-40bc-9c1e-43a18658d285", - "link": "https://learn.microsoft.com/azure/devops/pipelines/release/deploy-multiple-branches?view=azure-devops", - "services": [], + "category": "Identity", + "checklist": "Azure VMware Solution Design Review", + "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", + "service": "AVS", + "services": [ + "Entra", + "RBAC", + "AVS" + ], "severity": "Medium", - "subcategory": "Continuous Deployment", - "text": "Release branch", - "training": "https://learn.microsoft.com/azure/active-directory/managed-identities-azure-resources/overview", - "waf": "Operations" + "subcategory": "Identity", + "text": "Has an RBAC model been created for use within VMware vSphere", + "waf": "Security" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "use relevant template to deploy to azure", - "guid": "8ed67179-b825-4546-bf2a-ee4553afc833", - "link": "https://learn.microsoft.com/azure/devops/pipelines/overview-azure?view=azure-devops", - "services": [], + "category": "Identity", + "checklist": "Azure VMware Solution Design Review", + "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", + "service": "AVS", + "services": [ + "Entra", + "RBAC", + "AVS" + ], "severity": "Medium", - "subcategory": "Continuous Deployment", - "text": "Deploy to Azure", - "waf": "Operations" + "subcategory": "Identity", + "text": "RBAC permissions should be granted on ADDS groups and not on specific users", + "waf": "Security" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Define Release Approvals and pre deployment checks", - "guid": "9248726d-d68c-45b5-a292-5394b69b9d37", - "link": "https://learn.microsoft.com/azure/devops/pipelines/process/approvals?view=azure-devops&tabs=check-pass", - "services": [], - "severity": "Medium", - "subcategory": "Continuous Deployment", - "text": "Approvals and Checks", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", - "waf": "Operations" + "category": "Identity", + "checklist": "Azure VMware Solution Design Review", + "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", + "service": "AVS", + "services": [ + "Entra", + "RBAC", + "AVS" + ], + "severity": "High", + "subcategory": "Identity", + "text": "RBAC permissions on the Azure VMware Solution resource in Azure are 'locked down' to a limited set of owners only", + "waf": "Security" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Define Gates and post deployment checks", - "guid": "9ac43bc6-8d1d-4766-9724-6b448564b4dd", - "link": "https://learn.microsoft.com/azure/devops/pipelines/release/approvals/?view=azure-devops&tabs=yaml", - "services": [], - "severity": "Medium", - "subcategory": "Continuous Deployment", - "text": "Gates", - "waf": "Operations" + "category": "Identity", + "checklist": "Azure VMware Solution Design Review", + "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", + "service": "AVS", + "services": [ + "Entra", + "RBAC", + "AVS" + ], + "severity": "High", + "subcategory": "Identity", + "text": "Ensure all custom roles are scoped with CloudAdmin permitted authorizations", + "waf": "Security" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Define Azure Function and REST API Checks", - "guid": "74a759c7-633b-4d2a-8a27-a764a90be0e3", - "link": "https://learn.microsoft.com/azure/devops/pipelines/process/invoke-checks?view=azure-devops", - "services": [], - "severity": "Low", - "subcategory": "Continuous Deployment", - "text": "Azure Function Checks", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "Operations" + "category": "Networking", + "checklist": "Azure VMware Solution Design Review", + "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", + "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", + "service": "AVS", + "services": [ + "AVS" + ], + "severity": "High", + "subcategory": "Architecture", + "text": "Is the correct Azure VMware Solution connectivity model selected for the customer use case at hand", + "waf": "Performance" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Review pipeline reports", - "guid": "78ee293c-1bd3-463c-aaab-7571949ab919", - "link": "https://learn.microsoft.com/azure/devops/pipelines/reports/pipelinereport?view=azure-devops", - "services": [], + "category": "Networking", + "checklist": "Azure VMware Solution Design Review", + "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", + "service": "AVS", + "services": [ + "NetworkWatcher", + "AVS", + "VPN", + "Monitor", + "ExpressRoute" + ], "severity": "High", - "subcategory": "Continuous Deployment", - "text": "Pipline Reports", - "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "subcategory": "Monitoring", + "text": "Ensure ExpressRoute or VPN connections from on-premises to Azure are monitored using 'connection monitor'", "waf": "Operations" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "configure Trend Result widget", - "guid": "3dc9fc9d-1bb8-44b3-9b5a-67fcb9ed5b35", - "link": "https://learn.microsoft.com/azure/devops/report/dashboards/analytics-widgets?toc=%2Fazure%2Fdevops%2Fpipelines%2Ftoc.json&view=azure-devops#test-results-trend-advanced", - "services": [], + "category": "Networking", + "checklist": "Azure VMware Solution Design Review", + "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", + "service": "AVS", + "services": [ + "NetworkWatcher", + "AVS", + "VM", + "Monitor", + "ExpressRoute" + ], "severity": "Medium", - "subcategory": "Analytics", - "text": "Pipeline Result Trend", - "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "subcategory": "Monitoring", + "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" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Connect with WIT to visualize work", - "guid": "478d447a-826c-4286-9c00-f1cac699ef1d", - "link": "https://learn.microsoft.com/azure/devops/pipelines/integrations/configure-pipelines-work-tracking?view=azure-devops&tabs=yaml", - "services": [], + "category": "Networking", + "checklist": "Azure VMware Solution Design Review", + "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", + "service": "AVS", + "services": [ + "Monitor", + "AVS", + "VM", + "NetworkWatcher" + ], "severity": "Medium", - "subcategory": "Analytics", - "text": "Work Tracking with Pipeline", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", + "subcategory": "Monitoring", + "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" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Understand agent pools", - "guid": "5a83de5d-e36c-41c8-8870-a0bc5c1e43a1", - "link": "https://learn.microsoft.com/azure/devops/pipelines/agents/agents?view=azure-devops&tabs=yaml%2Cbrowser", - "services": [], - "severity": "Medium", - "subcategory": "Continuous Deployment", - "text": " Agents and agent pools", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "category": "Networking", + "checklist": "Azure VMware Solution Design Review", + "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", + "service": "AVS", + "services": [ + "ARS", + "AVS" + ], + "severity": "High", + "subcategory": "Routing", + "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" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Understand and provision Deployment Groups when required", - "guid": "8658d285-8ed6-4717-ab82-5546df2aee45", - "link": "https://learn.microsoft.com/azure/devops/pipelines/release/deployment-groups/?view=azure-devops", - "services": [], - "severity": "Low", - "subcategory": "Continuous Deployment", - "text": "Deployment Groups", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", - "waf": "Operations" + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", + "service": "AVS", + "services": [ + "Entra", + "RBAC", + "AVS" + ], + "severity": "High", + "subcategory": "Security (identity)", + "text": "Is Privileged Identity Management implemented for roles managing the Azure VMware Solution resource in the Azure Portal (no standing permissions allowed)", + "waf": "Security" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Understand Kubernetes Deployment", - "guid": "53afc833-9248-4726-bd68-c5b5c2925394", - "link": "https://learn.microsoft.com/azure/devops/pipelines/ecosystems/kubernetes/deploy?view=azure-devops", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", + "service": "AVS", "services": [ - "AKS" + "Entra", + "RBAC", + "AVS" ], - "severity": "Low", - "subcategory": "Continuous Deployment", - "text": "Deploy to Kubernetes", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", - "waf": "Operations" + "severity": "High", + "subcategory": "Security (identity)", + "text": "Privileged Identity Management audit reporting should be implemented for the Azure VMware Solution PIM roles", + "waf": "Security" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Perform Dynamic Security Testing", - "guid": "b69b9d37-9ac4-43bc-98d1-d76657246b44", - "link": "https://devblogs.microsoft.com/premier-developer/azure-devops-pipelines-leveraging-owasp-zap-in-the-release-pipeline/", - "services": [], + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", + "service": "AVS", + "services": [ + "Entra", + "AVS" + ], "severity": "Medium", - "subcategory": "Security", - "text": "DAST Scan", - "training": "https://learn.microsoft.com/learn/modules/create-custom-azure-roles-with-rbac/", + "subcategory": "Security (identity)", + "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" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Manage Service Connections", - "guid": "8564b4dd-74a7-459c-9633-bd2a1a27a764", - "link": "https://learn.microsoft.com/azure/devops/pipelines/library/service-endpoints?view=azure-devops&tabs=yaml", - "services": [], + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", + "service": "AVS", + "services": [ + "Entra", + "AVS" + ], + "severity": "High", + "subcategory": "Security (identity)", + "text": "Limit use of CloudAdmin account to emergency access only", + "waf": "Security" + }, + { + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", + "service": "AVS", + "services": [ + "Entra", + "RBAC", + "AVS" + ], "severity": "Medium", - "subcategory": "Security", - "text": "Service Connections", - "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "subcategory": "Security (identity)", + "text": "Create custom RBAC roles in vCenter to implement a least-privilege model inside vCenter", "waf": "Security" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Set data retention policies for CI and CD", - "guid": "a90be0e3-78ee-4293-a1bd-363caaab7571", - "link": "https://learn.microsoft.com/azure/devops/pipelines/policies/retention?view=azure-devops&tabs=yaml", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", + "service": "AVS", "services": [ - "AzurePolicy" + "Entra", + "AVS" ], "severity": "Medium", - "subcategory": "Security", - "text": "Retention Policies", - "training": "https://learn.microsoft.com/learn/modules/azure-active-directory/", + "subcategory": "Security (identity)", + "text": "Is a process defined to regularly rotate cloudadmin (vCenter) and admin (NSX) credentials", "waf": "Security" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Set up and pay for concurrent pipelines", - "guid": "949ab919-3dc9-4fc9-b1bb-84b37b5a67fc", - "link": "https://learn.microsoft.com/azure/devops/pipelines/licensing/concurrent-jobs?view=azure-devops&tabs=ms-hosted", - "services": [], - "severity": "Low", - "subcategory": "Administration", - "text": "Parallel Pipelines", - "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", - "waf": "Operations" + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", + "service": "AVS", + "services": [ + "Entra", + "AVS", + "VM" + ], + "severity": "High", + "subcategory": "Security (identity)", + "text": "Use a centralized identity provider to be used for workloads (VM's) running on Azure VMware Solution", + "waf": "Security" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Set pipeline permissions", - "guid": "b9ed5b35-478d-4447-a826-c2863c00f1ca", - "link": "https://learn.microsoft.com/azure/devops/pipelines/policies/permissions?view=azure-devops", - "services": [], + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", + "service": "AVS", + "services": [ + "AVS" + ], "severity": "Medium", - "subcategory": "Security", - "text": "Pipeline Permissions", - "training": "https://learn.microsoft.com/learn/paths/implement-windows-server-iaas-virtual-machine-identity/", + "subcategory": "Security (network)", + "text": "Is East-West traffic filtering implemented within NSX-T", "waf": "Security" }, { - "category": "Azure Pipelines", - "checklist": "Azure DevOps", - "description": "Add users to pipeline", - "guid": "c699ef1d-5a83-4de5-be36-c1c81870a0bc", - "link": "https://learn.microsoft.com/azure/devops/pipelines/policies/set-permissions?view=azure-devops", - "services": [], - "severity": "Low", - "subcategory": "Security", - "text": "Pipeline Users", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", + "service": "AVS", + "services": [ + "AVS", + "AppGW", + "Firewall" + ], + "severity": "High", + "subcategory": "Security (network)", + "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" }, { - "category": "Azure Artifact", - "checklist": "Azure DevOps", - "description": "Configure Artifacts", - "guid": "5c1e43a1-8658-4d28-98ed-67179b825546", - "link": "https://learn.microsoft.com/azure/devops/pipelines/artifacts/artifacts-overview?view=azure-devops&tabs=nuget", - "services": [], - "severity": "Medium", - "subcategory": "Configuration", - "text": "Artifact In Pipeline", - "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", - "waf": "Operations" + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", + "service": "AVS", + "services": [ + "AVS" + ], + "severity": "High", + "subcategory": "Security (network)", + "text": "Auditing and logging is implemented for inbound internet requests to Azure VMware Solution and Azure VMware Solution based workloads", + "waf": "Security" }, { - "category": "Azure Artifact", - "checklist": "Azure DevOps", - "description": "Publish and consume artifact in pipeline", - "guid": "df2aee45-53af-4c83-9924-8726dd68c5b5", - "link": "https://learn.microsoft.com/azure/devops/pipelines/artifacts/pipeline-artifacts?view=azure-devops&tabs=yaml", - "services": [], + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", + "service": "AVS", + "services": [ + "AVS", + "Monitor" + ], "severity": "Medium", - "subcategory": "Configuration", - "text": "Publish and download Artifact", - "training": "https://learn.microsoft.com/azure/architecture/example-scenario/identity/adds-extend-domain", - "waf": "Operations" - }, - { - "category": "Azure Artifact", - "checklist": "Azure DevOps", - "description": "Publish NuGet packages with artifacts", - "guid": "c2925394-b69b-49d3-99ac-43bc68d1d766", - "link": "https://learn.microsoft.com/azure/devops/pipelines/artifacts/nuget?view=azure-devops&tabs=yaml", - "services": [], - "severity": "Low", - "subcategory": "Configuration", - "text": "NuGet", - "training": "https://learn.microsoft.com/azure/role-based-access-control/overview", - "waf": "Operations" - }, - { - "category": "Azure Artifact", - "checklist": "Azure DevOps", - "description": "Publish Maven packages with artifacts", - "guid": "57246b44-8564-4b4d-b74a-759c7633bd2a", - "link": "https://learn.microsoft.com/azure/devops/pipelines/artifacts/publish-maven-artifacts?view=azure-devops", - "services": [], - "severity": "Low", - "subcategory": "Configuration", - "text": "Maven", - "waf": "Operations" - }, - { - "category": "Azure Artifact", - "checklist": "Azure DevOps", - "description": "Publish NPM packages with artifacts", - "guid": "1a27a764-a90b-4e0e-978e-e293c1bd363c", - "link": "https://learn.microsoft.com/azure/devops/pipelines/artifacts/npm?view=azure-devops&tabs=yaml", - "services": [], - "severity": "Low", - "subcategory": "Configuration", - "text": "NPM", - "waf": "Operations" + "subcategory": "Security (network)", + "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" }, { - "category": "Azure Artifact", - "checklist": "Azure DevOps", - "description": "Best Practices to work with Azure Artifact", - "guid": "aaab7571-949a-4b91-a3dc-9fc9d1bb84b3", - "link": "https://learn.microsoft.com/azure/devops/artifacts/concepts/best-practices?view=azure-devops", - "services": [], + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "334fdf91-c234-4182-a652-75269440b4be", + "service": "AVS", + "services": [ + "DDoS", + "AVS", + "VPN", + "ExpressRoute", + "VNet" + ], "severity": "Medium", - "subcategory": "Configuration", - "text": "Best Practices", - "waf": "Operations" + "subcategory": "Security (network)", + "text": "Is DDoS standard protection enabled on ExR/VPN Gateway subnet in Azure", + "waf": "Security" }, { - "category": "DevOps Practice", - "checklist": "Azure DevOps", - "description": "What is monitoring?", - "guid": "7b5a67fc-b9ed-45b3-9478-d447a826c286", - "link": "https://learn.microsoft.com/devops/operate/what-is-monitoring", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", + "service": "AVS", "services": [ - "Monitor" + "AVS" ], - "severity": "High", - "subcategory": "Practice", - "text": "What to monitor?", - "waf": "Operations" - }, - { - "category": "DevOps Practice", - "checklist": "Azure DevOps", - "description": "Progressive Exposure Strategy", - "guid": "3c00f1ca-c699-4ef1-b5a8-3de5de36c1c8", - "link": "https://learn.microsoft.com/devops/operate/safe-deployment-practices", - "services": [], "severity": "Medium", - "subcategory": "Practice", - "text": "Safe Deployment Practices", - "waf": "Operations" + "subcategory": "Security (network)", + "text": "Use a dedicated privileged access workstation (PAW) to manage Azure VMware Solution, vCenter, NSX manager and HCX manager", + "waf": "Security" }, { - "category": "DevOps Practice", - "checklist": "Azure DevOps", - "description": "Microsoft runs reliable systems with DevOps", - "guid": "1870a0bc-5c1e-443a-8865-8d2858ed6717", - "link": "https://learn.microsoft.com/devops/operate/how-microsoft-operates-devops", - "services": [], - "severity": "Low", - "subcategory": "Practice", - "text": "Case Study", - "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "waf": "Operations" + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", + "service": "AVS", + "services": [ + "AVS", + "Defender" + ], + "severity": "Medium", + "subcategory": "Security (guest/VM)", + "text": "Enable Advanced Threat Detection (Microsoft Defender for Cloud aka ASC) for workloads running on Azure VMware Solution", + "waf": "Security" }, { - "category": "DevOps Practice", - "checklist": "Azure DevOps", - "description": "Security in DevOps", - "guid": "9b825546-df2a-4ee4-953a-fc8339248726", - "link": "https://learn.microsoft.com/devops/operate/security-in-devops", - "services": [], + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", + "service": "AVS", + "services": [ + "AVS", + "Arc" + ], "severity": "Medium", - "subcategory": "Practice", - "text": "DevSecOps", + "subcategory": "Security (guest/VM)", + "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" }, { - "category": "DevOps Practice", - "checklist": "Azure DevOps", - "description": "Enable DevSecops with Azure And GitHub", - "guid": "dd68c5b5-c292-4539-9b69-b9d379ac43bc", - "link": "https://learn.microsoft.com/devops/devsecops/enable-devsecops-azure-github", - "services": [], + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", + "service": "AVS", + "services": [ + "AVS", + "SQL" + ], "severity": "Low", - "subcategory": "Practice", - "text": "DevSecops", - "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "subcategory": "Security (guest/VM)", + "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" }, { - "category": "DevOps Practice", - "checklist": "Azure DevOps", - "description": "Mirror RBAC in DevOps", - "guid": "68d1d766-5724-46b4-9856-4b4dd74a759c", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/secure/best-practices/end-to-end-governance", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "a3592718-e6e2-4051-9267-6ae46691e883", + "service": "AVS", "services": [ - "RBAC" + "AKV", + "AVS" ], "severity": "Low", - "subcategory": "Practice", - "text": "Secure DevOps Govenance", - "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "subcategory": "Security (guest/VM)", + "text": "When in-guest encryption is used, store encryption keys in Azure Key vault when possible", "waf": "Security" }, { - "category": "DevOps Practice", - "checklist": "Azure DevOps", - "description": "Governance when using CI/CD", - "guid": "7633bd2a-1a27-4a76-9a90-be0e378ee293", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/governance/end-to-end-governance-in-azure", - "services": [], + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "5ac94222-3e13-4810-9230-81a941741583", + "service": "AVS", + "services": [ + "AVS" + ], "severity": "Medium", - "subcategory": "Practice", - "text": "Azure DevOps Governance", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "subcategory": "Security (guest/VM)", + "text": "Consider using extended security update support for workloads running on Azure VMware Solution (Azure VMware Solution is eligible for ESU)", "waf": "Security" }, { - "category": "Operations Management", - "checklist": "Cognitive Search Review Checklist", - "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", - "services": [], + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", + "service": "AVS", + "services": [ + "AVS" + ], "severity": "High", - "subcategory": "High Availablity", - "text": "Enable 2 replicas to have 99.9% availability for read operations", + "subcategory": "Governance (platform)", + "text": "Ensure that the appropriate vSAN Data redundancy method is used (RAID specification)", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "Cognitive Search Review Checklist", - "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", - "services": [], - "severity": "Medium", - "subcategory": "High Availablity", - "text": "Enable 3 replicas to have 99.9% availability for read/write operations", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "d88408f3-7273-44c8-96ba-280214590146", + "service": "AVS", + "services": [ + "AVS", + "AzurePolicy", + "Storage" + ], + "severity": "High", + "subcategory": "Governance (platform)", + "text": "Ensure that the Failure-to-tolerate policy is in place to meet your vSAN storage needs", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "Cognitive Search Review Checklist", - "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", - "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", - "service": "Cognitive Search", - "services": [], + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", + "service": "AVS", + "services": [ + "AVS", + "ASR" + ], "severity": "High", - "subcategory": "High Availablity", - "text": "Leverage Availability Zones by enabling read and/or write replicas", + "subcategory": "Governance (platform)", + "text": "Ensure that you have requested enough quota, ensuring you have considered growth and Disaster Recovery requirement", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "Cognitive Search Review 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", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", + "service": "AVS", "services": [ - "ACR" + "AVS" ], "severity": "Medium", - "subcategory": "Georeplication", - "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" + "subcategory": "Governance (platform)", + "text": "Ensure that access constraints to ESXi are understood, there are access limits which might affect 3rd party solutions.", + "waf": "Operations" }, { - "category": "Operations Management", - "checklist": "Cognitive Search Review Checklist", - "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", - "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", - "service": "Cognitive Search", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", + "service": "AVS", "services": [ - "ACR" + "AVS", + "AzurePolicy" ], "severity": "Medium", - "subcategory": "Georeplication", - "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" + "subcategory": "Governance (platform)", + "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" }, { - "category": "Operations Management", - "checklist": "Cognitive Search Review 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", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", + "service": "AVS", "services": [ - "TrafficManager" + "AVS", + "Cost" ], "severity": "Medium", - "subcategory": "Georeplication", - "text": "Use Azure Traffic Manager to coordinate requests", - "waf": "Reliability" + "subcategory": "Governance (platform)", + "text": "Ensure a good cost management process is in place for Azure VMware Solution - Azure Cost Management can be used", + "waf": "Cost" }, { - "category": "Operations Management", - "checklist": "Cognitive Search Review Checklist", - "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", - "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", - "service": "Cognitive Search", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", + "service": "AVS", "services": [ - "Storage", - "Backup", - "ASR" + "AVS", + "Cost" ], - "severity": "High", - "subcategory": "Disaster Recovery", - "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" - }, - { - "category": "Operations Management", - "checklist": "Cognitive Services Review 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", - "services": [], - "severity": "Medium", - "subcategory": "Best Practice", - "text": "Leverage FTA HandBook for Cognitive Services", - "waf": "Reliability" + "severity": "Low", + "subcategory": "Governance (platform)", + "text": "Are Azure reserved instances used to optimize cost for using Azure VMware Solution", + "waf": "Cost" }, { - "category": "Operations Management", - "checklist": "Cognitive Services Review 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", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "6691e883-5ac9-4422-83e1-3810523081a9", + "service": "AVS", "services": [ - "Backup" + "AVS" ], "severity": "Medium", - "subcategory": "Backup", - "text": "Backup Your Prompts", - "waf": "Reliability" + "subcategory": "Governance (platform)", + "text": "Consider the use of Azure Private-Link when using other Azure Native Services", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "Cognitive Services Review 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", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", + "service": "AVS", "services": [ - "Backup", - "ASR" + "AVS" ], "severity": "High", - "subcategory": "Backup", - "text": "Business Continuity and Disaster Recovery (BCDR) considerations with Azure OpenAI Service", - "waf": "Reliability" + "subcategory": "Governance (platform)", + "text": "Ensure all required resource reside within the same Azure availability zone(s)", + "waf": "Performance" }, { - "category": "Operations Management", - "checklist": "Cognitive Services Review Checklist", - "guid": "325af625-ca44-4e46-a5e2-223ace8bb123", - "link": "https://github.com/abacaj/chatgpt-backup#backup-your-chatgpt-conversations", - "service": "Cognitive Services", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", + "service": "AVS", "services": [ - "Backup" + "AVS", + "VM", + "Defender" ], "severity": "Medium", - "subcategory": "Backup", - "text": "Backup Your ChatGPT conversations", - "waf": "Reliability" + "subcategory": "Governance (guest/VM)", + "text": "Enable Microsoft Defender for Cloud for Azure VMware Solution guest VM workloads", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "Cognitive Services Review 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", - "services": [], + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", + "service": "AVS", + "services": [ + "AVS", + "VM", + "Arc" + ], "severity": "Medium", - "subcategory": "DevOps", - "text": "CI/CD for custom speech", - "waf": "Reliability" - }, - { - "category": "Operations Management", - "checklist": "Cognitive Services Review Checklist", - "guid": "3687a046-7a1f-4893-9bda-43324f248116", - "link": "https://learn.microsoft.com/azure/ai-services/qnamaker/tutorials/export-knowledge-base", - "service": "Cognitive Services", - "services": [], - "severity": "Low", - "subcategory": "QnA Service", - "text": "Move a knowledge base using export-import", - "waf": "Reliability" + "subcategory": "Governance (guest/VM)", + "text": "Use Azure Arc enabled servers to manage your Azure VMware Solution guest VM workloads", + "waf": "Security" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "Azure Virtual Desktop Review", - "description": "AVD control plane does not offer a financially backed service level agreement. We strive to attain at least 99.9% availability for the Azure Virtual Desktop service URLs. The availability of the session host virtual machines in your subscription is covered by the Virtual Machines SLA. Dependent resources/services and infrastructure availability must be also considered to properly satisfy global high-availability requirements.", - "guid": "56c57ba5-9119-4bf8-b8f5-c586c7d9cdc1", - "link": "https://azure.microsoft.com/support/legal/sla/virtual-desktop/v1_0/", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", + "service": "AVS", "services": [ - "Subscriptions", - "AVD", - "VM", - "ASR" + "AVS" ], "severity": "High", - "subcategory": "Compute", - "text": "Determine the expected High Availability SLA for applications/desktops published through AVD", - "waf": "Reliability" + "subcategory": "Governance (guest/VM)", + "text": "Enable Diagnostic and metric logging on Azure VMware Solution", + "waf": "Operations" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "Azure Virtual Desktop Review", - "description": "'Active-Active' model can be achieved with multiple host pools in different regions. A single Host Pool with VMs from different regions is not recommended. If multiple pools for same users will be used, the problem of how to synchronize/replicate user profiles must be solved. FSLogix Cloud Cache could be used, but need to be carefully reviewed and planned, or customers can decide to do not synchronize/replicate at all. 'Active-Passive' can be achieved using Azure Site Recovery (ASR) or on-demand Pool deployment with automated mechanism. For a detailed discussion on multi-region BCDR, please read the companion article in the 'More Info' column and this FSLogix related page: https://learn.microsoft.com/fslogix/concepts-container-recovery-business-continuity.", - "guid": "6acc076e-f9b1-441a-a989-579e76b897e7", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/wvd/azure-virtual-desktop-multi-region-bcdr", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", + "service": "AVS", "services": [ - "Storage", - "AVD", + "AVS", "VM", - "ASR" + "Monitor" ], "severity": "Medium", - "subcategory": "Compute", - "text": "Assess Geo Disaster Recovery requirements for AVD Host Pools", - "waf": "Reliability" - }, - { - "category": "Business Continuity and Disaster Recovery", - "checklist": "Azure Virtual Desktop Review", - "description": "Before approaching Azure Virtual Desktop BCDR planning and design, it is important to initially consider which applications consumed through AVD are critical. You may want to separate them from non-critical apps and use a separate Host Pool with a different disaster recovery approach and capabilities.", - "guid": "10a7da7b-e996-46e1-9d3c-4ada97cc3d13", - "link": "https://docs.microsoft.com/azure/virtual-desktop/disaster-recovery", - "services": [ - "AVD", - "ASR" - ], - "severity": "Low", - "subcategory": "Compute", - "text": "Separate critical applications in different AVD Host Pools", - "waf": "Reliability" - }, - { - "category": "Business Continuity and Disaster Recovery", - "checklist": "Azure Virtual Desktop Review", - "description": "Each Host Pool can be deployed using Availability Zones (AZ) or Availability Set (AS). To maximize resiliency, usage of AZ is recommended: at Host Pool creation time you can decide to spread Host Pool Session Hosts across all available AZ. Usage of AS will not protect from single datacenter failure, then should be used only in regions where AZ are not available. More details on AZ and AVD in the companion article. For a comparison between AZ and AS you can read here: https://learn.microsoft.com/azure/virtual-machines/availability.", - "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": [ - "ACR", - "AVD", - "ASR" - ], - "severity": "High", - "subcategory": "Compute", - "text": "Plan the best resiliency option for AVD Host Pool deployment", - "waf": "Reliability" + "subcategory": "Governance (guest/VM)", + "text": "Deploy the Log Analytics Agents to Azure VMware Solution guest VM workloads", + "waf": "Operations" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "Azure Virtual Desktop Review", - "description": "Azure Backup can be used to protect Host Pool VMs. For Pooled Pools, this is not necessary since should be stateless. Instead, this option can be considered for Personal Host Pools.", - "guid": "4c61fc3f-c14e-4ea6-b69e-8d9a3eec218e", - "link": "https://docs.microsoft.com/azure/virtual-desktop/disaster-recovery", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "589d457a-927c-4397-9d11-02cad6aae11e", + "service": "AVS", "services": [ "VM", - "AVD", + "AVS", "Backup", - "ASR" + "AzurePolicy" ], "severity": "Medium", - "subcategory": "Compute", - "text": "Assess the requirement to backup AVD Session Host VMs", - "waf": "Reliability" + "subcategory": "Governance (guest/VM)", + "text": "Ensure you have a documented and implemented backup policy and solution for Azure VMware Solution VM workloads", + "waf": "Operations" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "Azure Virtual Desktop Review", - "description": "Even for Personal Pools, usage of Availability Zones, when available, is recommended. Three possible in-region DR strategies are possible, it is recommended to select the best one based on cost, RTO/RPO, and if it is really necessary to save the entire VM OS disk: (1) create each session host in a specific zone (AZ) and then use Azure Site Recovery (ASR) to replicate to a different zone. (2) Use Azure Backup to backup and restore the specific session host in a different AZ. (3) Create a new session host in a different AZ and rely on FSLogix and/or OneDrive to make data and settings available on the new machine. All options require administrator intervention for DR and direct user assignment at Host Pool level, then must be planned and configured in advance.", - "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", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "ee29711b-d352-4caa-ab79-b198dab81932", + "service": "AVS", "services": [ - "VM", - "ASR", - "AVD", - "Cost", - "Backup" + "AVS", + "Defender", + "Monitor" ], "severity": "Medium", - "subcategory": "Compute", - "text": "Prepare a local DR strategy for Personal Host Pool Session Hosts", - "waf": "Reliability" - }, - { - "category": "Business Continuity and Disaster Recovery", - "checklist": "Azure Virtual Desktop Review", - "description": "If custom images are used to deploy AVD Host Pool VMs, it is important to ensure those artifacts are available in all regions where AVD is deployed. Azure Compute Gallery service can be used to replicate images across all regions where a Host Pool is deployed, with redundant storage and in multiple copies. Please be aware that the Azure Compute Gallery service isn't a global resource. For disaster recovery scenarios, the best practice is to have at least two galleries, in different regions.", - "guid": "dd2e0d5d-771d-441e-9610-cc57b4a4a141", - "link": "https://learn.microsoft.com/azure/virtual-machines/azure-compute-gallery", - "services": [ - "Storage", - "VM", - "ASR", - "ACR", - "AVD" - ], - "severity": "Low", - "subcategory": "Dependencies", - "text": "Plan for Golden Image cross-region availability", - "waf": "Reliability" + "subcategory": "Compliance", + "text": "Use Microsoft Defender for Cloud for compliance monitoring of workloads running on Azure VMware Solution", + "waf": "Security" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "Azure Virtual Desktop Review", - "description": "If users of the AVD infrastructure need on-premises resource access, high availability of network infrastructure required to connect is also critical and should be considered. Resiliency of authentication infrastructure needs to be assessed and evaluated. BCDR aspects for dependent applications and other resources need to be considered to ensure availability in the secondary DR location.", - "guid": "fd339489-8c12-488b-9c6a-57cfb644451e", - "link": "https://docs.microsoft.com/azure/virtual-desktop/disaster-recovery", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", + "service": "AVS", "services": [ - "AVD", - "ASR" + "AVS", + "Defender" ], "severity": "Medium", - "subcategory": "Dependencies", - "text": "Assess Infrastructure & Application dependencies ", - "waf": "Reliability" + "subcategory": "Compliance", + "text": "Are the applicable compliance baselines added to Microsoft Defender for Cloud", + "waf": "Security" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "Azure Virtual Desktop Review", - "description": "Not all data inside FSLogix user profiles may deserve protection from disaster. Additionally, if external storage is used, for example OneDrive or File Servers/Shares, what is remaining in the FSLogix profile is minimal and could be lost in some extreme circumstances. In other cases, data inside the profile can be rebuilt from other storages (for example Outlook Inbox in cached mode).", - "guid": "687ab077-adb5-49e5-a960-3334fdf8cc23", - "link": "https://docs.microsoft.com/fslogix/manage-profile-content-cncpt", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", + "service": "AVS", "services": [ - "Storage", - "AVD", - "ASR" + "AVS" ], - "severity": "Medium", - "subcategory": "Storage", - "text": "Assess which data need to be protected in the Profile and Office Containers", - "waf": "Reliability" + "severity": "High", + "subcategory": "Compliance", + "text": "Was data residency evaluated when selecting Azure regions to use for Azure VMware Solution deployment", + "waf": "Security" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "Azure Virtual Desktop Review", - "description": "Preventing data loss for critical user data is important, first step is to assess which data need to be saved and protected. If using OneDrive or other external storage, saving user Profile and/or Office Containers data maybe not necessary. Appropriate mechanism must be considered to provide protection for critical user data. Azure Backup service can be used to protect Profile and Office Containers data when stored on Azure Files Standard and Premium tiers. Azure NetApp Files Snapshots and Policies can be used for Azure NetApp Files (all tiers).", - "guid": "fc4972cc-3cd2-45bf-a707-6e9eab4bed32", - "link": "https://docs.microsoft.com/azure/virtual-desktop/disaster-recovery", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", + "service": "AVS", "services": [ - "AzurePolicy", - "Storage", - "ASR", - "AVD", - "Backup" + "AVS" ], - "severity": "Medium", - "subcategory": "Storage", - "text": "Build a backup protection strategy for Profile and Office Containers", - "waf": "Reliability" + "severity": "High", + "subcategory": "Compliance", + "text": "Are data processing implications (service provider / service consumer model) clear and documented", + "waf": "Security" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "Azure Virtual Desktop Review", - "description": "In AVD, multiple replication mechanisms and strategies can be used for user data residing in FSLogix containers: [Profile Pattern #1]: Native Azure storage replication mechanisms, for example Azure Files Standard GRS replication, Azure NetApp Files Cross Region Replication. Use Zone Replicated Storage (ZRS) or Geo replicated storage (GRS) for Azure Files is recommended. LRS with local-only resiliency can be used if no zone/region protection is required. NOTE: Azure Files Share Standard is LRS/ZRS/GRS, but with 100TB large support enabled only LRS/ZRS are supported. [Profile Pattern #2]: FSLogix Cloud Cache is built in automatic mechanism to replicate containers between different (up to 4) storage accounts. Cloud Cache should be used only when:(1) User Profile or Office containers data availability required high-availability SLA is critical and need to be resilient to region failure. (2) Selected storage option is not able to satisfy BCDR requirements. For example, with Azure File Share Premium tier, or Azure File Share Standard with Large File Support enabled, GRS is not available. (3) When replication between disparate storage is required. [Profile Pattern #3]: Only set up geo disaster recovery for application data and not for user data/profile containers: store important application data in separate storages, like OneDrive or other external storage with its own built-in DR mechanism.", - "guid": "9f7547c1-746d-4c56-868a-714435bd09dd", - "link": "https://docs.microsoft.com/azure/virtual-desktop/disaster-recovery", + "category": "Governance", + "checklist": "Azure VMware Solution Design Review", + "guid": "547c1747-dc56-4068-a714-435cd19dd244", + "service": "AVS", "services": [ - "Storage", - "AVD", - "ASR" + "AVS" ], "severity": "Medium", - "subcategory": "Storage", - "text": "Assess Profile Container storage replication requirements and resiliency for BCDR purpose", - "waf": "Reliability" + "subcategory": "Compliance", + "text": "Consider using CMK (Customer Managed Key) for vSAN only if needed for compliance reason(s).", + "waf": "Security" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "Azure Virtual Desktop Review", - "description": "For local disaster recovery, Azure Backup for Azure Files can be used. For cross-region geo disaster recovery: GRS for Azure Files is only available with standard SKU and no large share support, then not suitable in most customer scenarios. If geo-replication is required with Azure File Share Premium, replication with FSLogix Cloud Cache can be evaluated, or 'in-region' Availability Zone (AZ) only resiliency should be considered.", - "guid": "3d4f3537-c134-46dc-9602-7a71efe1bd05", - "link": "https://docs.microsoft.com/azure/backup/backup-afs", + "category": "Management", + "checklist": "Azure VMware Solution Design Review", + "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", + "service": "AVS", "services": [ - "Storage", - "AVD", - "Backup", - "ASR" + "AVS", + "Monitor" ], - "severity": "Medium", - "subcategory": "Storage", - "text": "Review Azure Files disaster recovery strategy", - "waf": "Reliability" + "severity": "High", + "subcategory": "Monitoring", + "text": "Create dashboards to enable core Azure VMware Solution monitoring insights", + "waf": "Operations" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "Azure Virtual Desktop Review", - "description": "Zone Redundant Storage will maximize in-region resiliency for the user profile data. ZRS is supported for premium file shares through the 'FileStorage' storage account kind. ZRS is supported in standard general-purpose v2 storage accounts. Usage of zone redundant storage must be paired with zone redundant deployment of Session Hosts in each Host Pool. ", - "guid": "10d4e875-d502-4142-a795-f2b6eff34f88", - "link": "https://learn.microsoft.com/azure/storage/files/files-redundancy#zone-redundant-storage", + "category": "Management", + "checklist": "Azure VMware Solution Design Review", + "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", + "service": "AVS", "services": [ - "Storage", - "AVD", - "ASR" + "AVS", + "Monitor" ], "severity": "High", - "subcategory": "Storage", - "text": "Use Zone Redundant Storage (ZRS) for Azure Files to maximize resiliency", - "waf": "Reliability" + "subcategory": "Monitoring", + "text": "Create warning alerts for critical thresholds for automatic alerting on Azure VMware Solution performance (CPU >80%, Avg Memory >80%, vSAN >70%)", + "waf": "Operations" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "Azure Virtual Desktop Review", - "description": "For local disaster recovery, Azure NetApp Files (ANF) native backup is available. ANF is essentially locally redundant, then for cross-region geo disaster recovery it is necessary to use an additional mechanism that is Cross-Region Replication (CRR) https://learn.microsoft.com/azure/azure-netapp-files/cross-region-replication-create-peering. Currently, ANF does not provide replication nor redundancy across different Availability Zones (AZ), only the possibility to select in which single AZ to place the ANF volume: https://learn.microsoft.com/azure/azure-netapp-files/manage-availability-zone-volume-placement.", - "guid": "23429db7-2281-4376-85cc-57b4a4b18142", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/cross-region-replication-create-peering", + "category": "Management", + "checklist": "Azure VMware Solution Design Review", + "guid": "9659e396-80e7-4828-ac93-5657d02bff45", + "service": "AVS", "services": [ - "Storage", - "ASR", - "ACR", - "AVD", - "Backup" + "AVS", + "Monitor" ], - "severity": "Medium", - "subcategory": "Storage", - "text": "Review Azure NetApp Files disaster recovery strategy", - "waf": "Reliability" + "severity": "High", + "subcategory": "Monitoring", + "text": "Ensure critical alert is created to monitor if vSAN consumption is below 75% as this is a support threshold from VMware", + "waf": "Operations" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "Applications can be preinstalled in the golden image/s, can be attached using MSIX & AppAttach feature or distributed to the session hosts after host pool deployment using traditional software distribution methods.", - "guid": "86ba2802-1459-4014-95d3-8e5309ccbd97", - "link": "https://learn.microsoft.com/azure/virtual-desktop/set-up-golden-image", + "category": "Management", + "checklist": "Azure VMware Solution Design Review", + "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", + "service": "AVS", "services": [ - "AVD" + "AVS", + "Monitor" ], "severity": "High", - "subcategory": "Golden Images", - "text": "Determine how applications will be deployed in AVD Host Pools", + "subcategory": "Monitoring", + "text": "Ensure alerts are configured for Azure Service Health alerts and notifications", "waf": "Operations" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "Multiple golden images can be required to support different OS versions and/or settings, different groups of applications that must be separated and cannot be included in a single image.", - "guid": "9266bcca-274f-4aa1-abf3-9d95d44c7c89", - "link": "https://learn.microsoft.com/azure/virtual-desktop/set-up-golden-image", + "category": "Management", + "checklist": "Azure VMware Solution Design Review", + "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", + "service": "AVS", "services": [ - "AVD" + "Monitor", + "AVS", + "Storage" ], "severity": "Medium", - "subcategory": "Golden Images", - "text": "Estimate the number of golden images that will be required", + "subcategory": "Monitoring", + "text": "Configure Azure VMware Solution logging to be send to an Azure Storage account or Azure EventHub for processing", "waf": "Operations" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "Determine which Guest OS will be used to deploy each Host Pool: Windows 10 vs. Windows Server, Marketplace vs. Custom images", - "guid": "19ca1f6d-5315-4ae5-84ba-34d4585e2213", - "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#operating-systems-and-licenses", + "category": "Management", + "checklist": "Azure VMware Solution Design Review", + "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", + "service": "AVS", "services": [ - "AVD" + "AVS", + "Monitor" ], - "severity": "Medium", - "subcategory": "Golden Images", - "text": "Determine which OS image/s you will use for Host Pool deployment", - "waf": "Reliability" + "severity": "Low", + "subcategory": "Monitoring", + "text": "If deep insight in VMware vSphere is required: Is vRealize Operations and/or vRealize Network Insights used in the solution?", + "waf": "Operations" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "Azure VM custom images can be created and stored in different ways: in an Azure Compute Gallery, as a managed image object or as a managed disk in the storage. The recommended way is to use Azure Compute Gallery.", - "guid": "5a2adb2c-3e23-426b-b225-ca44e1696fdd", - "link": "https://learn.microsoft.com/azure/virtual-machines/shared-image-galleries", + "category": "Management", + "checklist": "Azure VMware Solution Design Review", + "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", + "service": "AVS", "services": [ - "Storage", - "AVD", - "VM" + "AVS", + "VM", + "AzurePolicy", + "Storage" ], - "severity": "Low", - "subcategory": "Golden Images", - "text": "Select the proper store for custom images", - "waf": "Reliability" + "severity": "High", + "subcategory": "Operations", + "text": "Ensure the vSAN storage policy for VM's is NOT the default storage policy as this policy applies thick provisioning", + "waf": "Operations" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "If custom images will be used, plan for an automated build process. If no pre-existing software factory exists, consider using Custom Image Templates and/or Azure Image Builder to automate the build process.", - "guid": "9bd7bb01-2f7b-495e-86e1-54e2aa359282", - "link": "https://learn.microsoft.com/azure/virtual-desktop/create-custom-image-templates", + "category": "Management", + "checklist": "Azure VMware Solution Design Review", + "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", + "service": "AVS", "services": [ - "AVD" + "AVS" ], - "severity": "Low", - "subcategory": "Golden Images", - "text": "Design your build process for custom images", + "severity": "Medium", + "subcategory": "Operations", + "text": "Ensure vSphere content libraries are not placed on vSAN as vSAN is a finite resource", "waf": "Operations" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "There are some known best practices and recommendations for the golden image customization, be sure to check the referenced article.", - "guid": "deace4cb-1dec-44c6-90c3-fc14eebb36a3", - "link": "https://learn.microsoft.com/azure/virtual-desktop/set-up-golden-image", + "category": "Management", + "checklist": "Azure VMware Solution Design Review", + "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", + "service": "AVS", "services": [ - "AVD" + "AVS", + "Backup", + "Storage" ], "severity": "Medium", - "subcategory": "Golden Images", - "text": "If custom image will be used, check recommended best practices for AVD on how to build custom image", + "subcategory": "Operations", + "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" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "FSLogix stack installed in AVD session hosts does not provide auto-update capability. For this reason, it is recommended to download the latest version of FSLogix and include in the golden image update process.", - "guid": "ed5c9027-dd1a-4343-86ca-52b199223186", - "link": "https://learn.microsoft.com/fslogix/how-to-install-fslogix", + "category": "Management", + "checklist": "Azure VMware Solution Design Review", + "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", + "service": "AVS", "services": [ - "AVD" + "AVS", + "Arc" ], - "severity": "High", - "subcategory": "Golden Images", - "text": "Include the latest version of FSLogix in the golden image update process", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Operations", + "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" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "This tool-set has been created to automatically apply setting referenced in white paper 'Optimizing Windows 10, version 2004 for a Virtual Desktop Infrastructure (VDI) role': https://docs.microsoft.com/windows-server/remote/remote-desktop-services/rds-vdi-recommendations-2004. Usage of the tool and/or optimizations mentioned in the white-paper should be considered. ", - "guid": "829e3fec-2183-4687-a017-7a2b5945bda4", - "link": "https://github.com/The-Virtual-Desktop-Team/Virtual-Desktop-Optimization-Tool", + "category": "Management", + "checklist": "Azure VMware Solution Design Review", + "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", + "service": "AVS", "services": [ - "RBAC", - "AVD" + "AVS", + "Monitor" ], - "severity": "Low", - "subcategory": "Golden Images", - "text": "Evaluate the usage of Virtual-Desktop-Optimization-Tool", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Operations", + "text": "Ensure workloads running on Azure VMware Solution are monitored using Azure Log Analytics and Azure Monitor", + "waf": "Operations" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "If OneDrive is used and included in a golden image, be sure to follow the configuration procedure reported in the companion article in the 'More Info' section. Not in scope in this AVD checklist, but OneDrive optimizations like 'Known Folder Redirection' and 'Files On-Demand' should be evaluated used to reduce the space used in FSLogix profiles and provide a better user experience. OneDrive today is not supported for Remote Apps.", - "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", + "category": "Management", + "checklist": "Azure VMware Solution Design Review", + "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", + "service": "AVS", "services": [ - "Storage", - "AVD" + "AVS" ], - "severity": "Low", - "subcategory": "Golden Images", - "text": "Determine if Microsoft OneDrive will be part of AVD deployment", + "severity": "Medium", + "subcategory": "Operations", + "text": "Include workloads running on Azure VMware Solution in existing update management tooling or in Azure Update Management", "waf": "Operations" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "Be sure to review the requirements and configuration procedure contained in the companion article in the 'More Info' column. Since Teams automatic updates will be disabled, it is recommended to check and include Teams latest version in the golden image update process.", - "guid": "b5887953-5d22-4788-9d30-b66c67be5951", - "link": "https://learn.microsoft.com/azure/virtual-desktop/teams-on-AVD", + "category": "Management", + "checklist": "Azure VMware Solution Design Review", + "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", + "service": "AVS", "services": [ - "AVD" + "AVS", + "AzurePolicy", + "Monitor" ], - "severity": "Low", - "subcategory": "Golden Images", - "text": "Determine if Microsoft Teams will be part of AVD deployment", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Operations", + "text": "Use Azure Policy to onboard Azure VMware Solution workloads in the Azure Management, Monitoring and Security solutions", + "waf": "Operations" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "AVD can support users with different language and localization requirements in the same host pool. This can be done customizing golden images to ensure users can select whichever language they need. The procedure to configure additional language packs in Windows 11 is documented in the reference article.", - "guid": "7c336f3b-822a-498e-8cd1-667d1150df4a", - "link": "https://learn.microsoft.com/azure/virtual-desktop/windows-11-language-packs", + "category": "Management", + "checklist": "Azure VMware Solution Design Review", + "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", + "service": "AVS", "services": [ - "AVD" + "AVS", + "Defender" ], - "severity": "Low", - "subcategory": "Golden Images", - "text": "Assess the requirement to support multiple languages", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Security", + "text": "Ensure workloads running on Azure VMware Solution are onboarded to Microsoft Defender for Cloud", + "waf": "Security" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "It is highly recommended to use separate storage accounts/shares to store MSIX packages. If necessary, storage can scale out independently and not being impacted by profile I/O activities. Azure offers multiple storage options that can be used for MISX app attach. We recommend using Azure Files or Azure NetApp Files as those options offer the best value between cost and management overhead. ", - "guid": "90083845-c587-4cb3-a1ec-16a1d076ef9f", - "link": "https://docs.microsoft.com/azure/virtual-desktop/app-attach-file-share", + "category": "BCDR", + "checklist": "Azure VMware Solution Design Review", + "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", + "service": "AVS", "services": [ - "Cost", - "Storage", - "AVD" + "AVS", + "Backup" ], "severity": "Medium", - "subcategory": "MSIX & AppAttach", - "text": "Do not use the same storage account/share as FSLogix profiles", - "waf": "Performance" + "subcategory": "Backup", + "text": "Ensure backups are not stored on vSAN as vSAN is a finite resource", + "waf": "Reliability" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "In the referenced article, we reported few but important performance considerations for MSIX usage in AVD context, be sure to carefully review.", - "guid": "241addce-5793-477b-adb3-751ab2ac1fad", - "link": "https://docs.microsoft.com/azure/virtual-desktop/app-attach-file-share", + "category": "BCDR", + "checklist": "Azure VMware Solution Design Review", + "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", + "service": "AVS", "services": [ - "AVD" + "AVS", + "ASR" ], "severity": "Medium", - "subcategory": "MSIX & AppAttach", - "text": "Review performance considerations for MSIX", - "waf": "Performance" + "subcategory": "Disaster Recovery", + "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" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "MSIX app attach requires read-only permissions to access the file share. If you're storing your MSIX applications in Azure Files, then for your session hosts, you'll need to assign all session host VMs both storage account role-based access control (RBAC) and file share New Technology File System (NTFS) permissions on the share.", - "guid": "66e15d4d-5a2a-4db2-a3e2-326bf225ca41", - "link": "https://docs.microsoft.com/azure/virtual-desktop/app-attach-file-share", + "category": "BCDR", + "checklist": "Azure VMware Solution Design Review", + "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", + "service": "AVS", "services": [ - "RBAC", - "Storage", - "AVD", - "VM" + "AVS", + "ASR" ], "severity": "Medium", - "subcategory": "MSIX & AppAttach", - "text": "Check proper session host permissions for MSIX share", - "waf": "Security" + "subcategory": "Disaster Recovery", + "text": "Use Azure Site Recovery when the Disaster Recovery technology is native Azure IaaS", + "waf": "Reliability" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "3rd-party software vendor must provide a MSIX package, it is not recommended for customer to attempt the conversion procedure without proper support from the application owner.", - "guid": "bd362caa-ab79-4b19-adab-81932c9fc9d1", - "link": "https://docs.microsoft.com/azure/virtual-desktop/app-attach-faq", + "category": "BCDR", + "checklist": "Azure VMware Solution Design Review", + "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", + "service": "AVS", "services": [ - "AVD" + "AVS", + "ASR" ], - "severity": "Low", - "subcategory": "MSIX & AppAttach", - "text": "MSIX packages for 3rd-party applications", - "waf": "Cost" + "severity": "High", + "subcategory": "Disaster Recovery", + "text": "Use Automated recovery plans with either of the Disaster solutions, avoid manual tasks as much as possible", + "waf": "Reliability" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "MSIX app attach doesn't support auto-update for MSIX applications, so they should be disabled.", - "guid": "bb88037f-5e6b-4fbb-aed5-03547cc447e8", - "link": "https://docs.microsoft.com/azure/virtual-desktop/app-attach-faq", + "category": "BCDR", + "checklist": "Azure VMware Solution Design Review", + "guid": "8255461e-2aee-4345-9aec-8339248b262d", + "service": "AVS", "services": [ - "AVD" + "AVS", + "ASR" ], - "severity": "Low", - "subcategory": "MSIX & AppAttach", - "text": "Disable auto-update for MSIX packages", - "waf": "Operations" + "severity": "Medium", + "subcategory": "Disaster Recovery", + "text": "Use the geopolitical region pair as the secondary disaster recovery environment", + "waf": "Reliability" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "In order to leverage MSIX & App Attach, guest OS image for AVD Host pool must be Windows 10/11 Enterprise or Windows 10/11 Enterprise Multi-session, version 2004 or later.", - "guid": "26128a71-f0f1-4cac-9d9e-f1d5e832e42e", - "link": "https://docs.microsoft.com/azure/virtual-desktop/app-attach-faq", + "category": "BCDR", + "checklist": "Azure VMware Solution Design Review", + "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", + "service": "AVS", "services": [ - "AVD" + "AVS", + "ASR" ], - "severity": "Medium", - "subcategory": "MSIX & AppAttach", - "text": "Review operating systems support", + "severity": "High", + "subcategory": "Disaster Recovery", + "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" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "Once selected the VM SKU that will be used for Host Pool deployment, it is recommended to use Gen2 type of the SKU for higher security and improved capabilities.", - "guid": "e4633254-3185-40a1-b120-bd563a1c8e9d", - "link": "https://docs.microsoft.com/azure/virtual-machines/generation-2", + "category": "BCDR", + "checklist": "Azure VMware Solution Design Review", + "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", + "service": "AVS", "services": [ - "AVD", - "VM" + "AVS", + "ASR", + "NVA", + "ExpressRoute" ], "severity": "Medium", - "subcategory": "Session Host", - "text": "Evaluate the usage of Gen2 VM for Host Pool deployment", - "waf": "Performance" + "subcategory": "Disaster Recovery", + "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" }, { - "category": "Compute", - "checklist": "Azure Virtual Desktop Review", - "description": "MMR redirects the media content from Session Host to your local machine for faster processing and rendering. It only works when you play media content on Microsoft Edge or Google Chrome. See linked URL for more details.", - "guid": "adecb27f-dc40-40f5-aca2-0090f633b1c9", - "link": "https://learn.microsoft.com/azure/virtual-desktop/multimedia-redirection", + "category": "BCDR", + "checklist": "Azure VMware Solution Design Review", + "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", + "service": "AVS", "services": [ - "AVD" + "AVS", + "Backup" ], - "severity": "Low", - "subcategory": "Session Host", - "text": "Consider using MMR (MultiMedia Redirection) to get better video performance on browser", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Business Continuity", + "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" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "A host pool is a collection of Azure virtual machines that register to Azure Virtual Desktop as session hosts. A host pool can be one of two types: Personal and Pooled. Which type to use, and how many, is a key design decision that must be documented and validated. See companion article in 'More Info' column for more details.", - "guid": "8468c55a-775c-46ee-a5b8-6ad8844ce3b2", - "link": "https://learn.microsoft.com/azure/virtual-desktop/terminology#host-pools", + "category": "BCDR", + "checklist": "Azure VMware Solution Design Review", + "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", + "service": "AVS", "services": [ - "AVD", - "VM" + "AVS", + "Backup" ], - "severity": "High", - "subcategory": "Capacity Planning", - "text": "Determine the Host Pool type to use", - "waf": "Cost" + "severity": "Medium", + "subcategory": "Business Continuity", + "text": "Deploy your backup solution in the same region as your Azure VMware Solution private cloud", + "waf": "Reliability" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "Use your design criteria to determine the number of Host Pools to deploy. This will be based on factors such as different OS images, multi-region support, guest VM hardware differences (such as GPU support or no), different user expectations and uptime requirements (examples might be 'Executives', 'Office Workers', 'Developers', etc.), and Host Pool RDP settings (such as drive redirection support). These will determine the number of host pools as well as how many hosts will be in each pool.", - "guid": "4e98495f-d3c0-4af2-aa59-a793395a32a7", - "link": "https://learn.microsoft.com/azure/virtual-desktop/terminology?WT.mc_id=Portal-fx#host-pools", + "category": "BCDR", + "checklist": "Azure VMware Solution Design Review", + "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", + "service": "AVS", "services": [ - "AVD", - "VM" + "AVS", + "Backup" ], - "severity": "High", - "subcategory": "Capacity Planning", - "text": "Estimate the number of different Host Pools to deploy ", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Business Continuity", + "text": "Deploy your backup solution outside of vSan, on Azure native components", + "waf": "Reliability" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "Confirm that the difference between automatic and direct assignment is well understood and the selected option is appropriate for the scenario in question. Automatic is the default setting.", - "guid": "b38b875b-a1cf-4204-a901-3a5d3ce474db", - "link": "https://docs.microsoft.com/azure/virtual-desktop/configure-host-pool-personal-desktop-assignment-type", + "category": "BCDR", + "checklist": "Azure VMware Solution Design Review", + "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", + "service": "AVS", "services": [ - "AVD" + "AVS" ], "severity": "Low", - "subcategory": "Capacity Planning", - "text": "For Personal Host Pool type, select the proper assignment type", - "waf": "Operations" + "subcategory": "Business Continuity", + "text": "Is a process in place to request a restore of the VMware components managed by the Azure Platform?", + "waf": "Reliability" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "Check which one to use and available options, autoscale ignores existing load-balancing algorithms.", - "guid": "cbd8682a-6abc-4a2a-9fda-1dbf3dc95d48", - "link": "https://docs.microsoft.com/azure/virtual-desktop/host-pool-load-balancing", + "category": "Platform Automation", + "checklist": "Azure VMware Solution Design Review", + "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", + "service": "AVS", "services": [ - "AVD" + "AVS" ], "severity": "Low", - "subcategory": "Capacity Planning", - "text": "For Pooled Host Pool type, select the best load balancing method", - "waf": "Performance" + "subcategory": "Deployment strategy", + "text": "For manual deployments, all configuration and deployments must be documented", + "waf": "Operations" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "The number of cores increase, the system's synchronization overhead also increases. Especially for multiple user's sign-in simultaneously. Make sure not to use a VM that is too large for the session host", - "guid": "b3724959-4943-4577-a3a9-e10ff6345f24", - "link": "https://learn.microsoft.com/windows-server/remote/remote-desktop-services/virtual-machine-recs", + "category": "Platform Automation", + "checklist": "Azure VMware Solution Design Review", + "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", + "service": "AVS", "services": [ - "AVD", - "VM" + "AVS" ], - "severity": "Medium", - "subcategory": "Capacity Planning", - "text": "For Pooled Host Pool type, VMs shouldn't have more than 32 cores", - "waf": "Performance" + "severity": "Low", + "subcategory": "Deployment strategy", + "text": "For manual deployments, consider implementing resource locks to prevent accidental actions on your Azure VMware Solution Private Cloud", + "waf": "Operations" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "AVD does not support assigning both the RemoteApp and Desktop Application Group (DAG) in a single host pool to the same set of users. Doing so will cause a single user to have two user sessions in a single host pool. Users aren't supposed to have two active sessions at the same time in the same host pool using the same profile.", - "guid": "b384b7ed-1cdd-457e-a2cd-c8d4d55bc144", - "link": "https://learn.microsoft.com/azure/virtual-desktop/terminology?WT.mc_id=Portal-fx#application-groups", + "category": "Platform Automation", + "checklist": "Azure VMware Solution Design Review", + "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", + "service": "AVS", "services": [ - "Storage", - "AVD" + "AVS" ], - "severity": "High", - "subcategory": "Capacity Planning", - "text": "Do not use the same Host Pool to offer both full desktops (DAG) and Remote Apps to the same set of users", - "waf": "Security" + "severity": "Low", + "subcategory": "Automated Deployment", + "text": "For automated deployments, deploy a minimal private cloud and scale as needed", + "waf": "Operations" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "There is a limit of 500 Application Groups that can be created in AVD for each Microsoft Entra ID (former Azure AD) tenant. The limit can be increased (see the companion link for details) but it is not recommended.", - "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", + "category": "Platform Automation", + "checklist": "Azure VMware Solution Design Review", + "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", + "service": "AVS", "services": [ - "ACR", - "AVD", - "Entra" + "AVS" ], - "severity": "Medium", - "subcategory": "Capacity Planning", - "text": "Estimate the number of Application Groups required across all Host Pools in the Microsoft Entra ID tenant", - "waf": "Reliability" + "severity": "Low", + "subcategory": "Automated Deployment", + "text": "For automated deployments, request or reserve quota prior to starting the deployment", + "waf": "Operations" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "Applications are grouped under Application Groups as containers for publishing and assigning permissions: we recommend that you do not publish more than 50 applications per application group.", - "guid": "fa9f2895-473d-439b-ab8e-5a5cf92c7f32", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/wvd/windows-virtual-desktop#considerations", + "category": "Platform Automation", + "checklist": "Azure VMware Solution Design Review", + "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", + "service": "AVS", "services": [ - "AVD" + "AVS", + "AzurePolicy" ], "severity": "Low", - "subcategory": "Capacity Planning", - "text": "Estimate the number of Applications for each Application Group", - "waf": "Reliability" + "subcategory": "Automated Deployment", + "text": "For automated deployment, ensure that relevant resource locks are created through the automation or through Azure Policy for proper governance", + "waf": "Operations" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "FSLogix is not required for Personal Host Pools since each VM is statically assigned to a single user, then no immediate needs for a roaming profile solution. In some usage scenarios FSLogix can help. For example, a VM can be re-assigned, or user moved to another desktop, or roaming profile can be used to save user profile in a different location for DR purposes.", - "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", + "category": "Platform Automation", + "checklist": "Azure VMware Solution Design Review", + "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", + "service": "AVS", "services": [ - "Storage", - "AVD", - "VM" + "AKV", + "AVS" ], "severity": "Low", - "subcategory": "Capacity Planning", - "text": "Evaluate the usage of FSLogix for Personal Host Pools", - "waf": "Reliability" + "subcategory": "Automated Connectivity", + "text": "Implement human understandable names for ExR authorization keys to allow for easy identification of the keys purpose/use", + "waf": "Operations" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "Use the link provided to set a starting point for SKU decision, then validate using a performance test. Ensure a minimum of four cores for Production is selected per Session Host (multi-session)", - "guid": "e1112dbd-7ba0-412e-9b94-ef6e047d2ea2", - "link": "https://docs.microsoft.com/windows-server/remote/remote-desktop-services/virtual-machine-recs", + "category": "Platform Automation", + "checklist": "Azure VMware Solution Design Review", + "guid": "255461e2-aee3-4553-afc8-339248b262d6", + "service": "AVS", "services": [ - "AVD", - "VM" + "AKV", + "AVS", + "ExpressRoute" ], - "severity": "High", - "subcategory": "Capacity Planning", - "text": "Run workload performance test to determine the best Azure VM SKU and size to use", - "waf": "Performance" + "severity": "Low", + "subcategory": "Automated Connectivity", + "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" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "It is critical to check AVD capacity and limits reported in the referenced article. Additional limits and thresholds apply for network, compute, storage and service management. ", - "guid": "992b1cd6-d2f5-44b2-a769-e3a691e8838a", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/wvd/windows-virtual-desktop#considerations", + "category": "Platform Automation", + "checklist": "Azure VMware Solution Design Review", + "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", + "service": "AVS", "services": [ - "Storage", - "AVD" + "AVS" ], - "severity": "High", - "subcategory": "Capacity Planning", - "text": "Verify AVD scalability limits for the environment", - "waf": "Reliability" + "severity": "Low", + "subcategory": "Automated Connectivity", + "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" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "Host Pools with GPU require special configuration, please be sure to review the referenced article.", - "guid": "c936667e-13c0-4056-94b1-e945a459837e", - "link": "https://docs.microsoft.com/azure/virtual-desktop/configure-vm-gpu", + "category": "Platform Automation", + "checklist": "Azure VMware Solution Design Review", + "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", + "service": "AVS", "services": [ - "AVD" + "AVS" ], "severity": "Low", - "subcategory": "Capacity Planning", - "text": "Determine if Session Hosts will require GPU", - "waf": "Performance" + "subcategory": "Automated Connectivity", + "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" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "Whenever is possible, it is recommended to leverage VM SKUs with Accelerated Networking feature. This feature does require specific VM SKU/size and OS versions, please see the list and requirement in the companion article.", - "guid": "b47a393a-0803-4272-a479-8b1578b219a4", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", + "category": "Platform Automation", + "checklist": "Azure VMware Solution Design Review", + "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", + "service": "AVS", "services": [ - "AVD", - "VM" + "AVS", + "Subscriptions" ], - "severity": "Low", - "subcategory": "Capacity Planning", - "text": "Use Azure VM SKUs able to leverage Accelerated Networking", + "severity": "Medium", + "subcategory": "Automated Scale", + "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" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "For proper planning and deployment, it is important to assess the maximum number of concurrent and total users for each Host Pool. Additionally, users from different regions may require different Host Pools to ensure the best user experience.", - "guid": "bb91a33d-90ca-4e2c-a881-3706f7c0cb9f", - "link": "https://learn.microsoft.com/azure/virtual-desktop/overview", + "category": "Platform Automation", + "checklist": "Azure VMware Solution Design Review", + "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", + "service": "AVS", "services": [ - "AVD" + "AVS", + "AzurePolicy", + "Storage" ], "severity": "Medium", - "subcategory": "Clients & Users", - "text": "Assess how many users will connect to AVD and from which regions", + "subcategory": "Automated Scale", + "text": "When intending to use automated scale-in, be sure to take storage policy requirements into account before performing such action", "waf": "Performance" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "The dependencies on resources external to the AVD pool should be assessed and reviewed, for example Active Directory, external file shares or other storage, on-premises services and resources, network infrastructure components like VPN and or ExpressRoute, external services and 3rd-party components. For all these resources, latency from the AVD Host Pool needs to be evaluated and connectivity considered. Additionally, BCDR considerations need to be applied to these dependencies as well.", - "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", + "category": "Platform Automation", + "checklist": "Azure VMware Solution Design Review", + "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", + "service": "AVS", "services": [ - "ExpressRoute", - "VPN", - "AVD", - "Storage" + "AVS" ], "severity": "Medium", - "subcategory": "Clients & Users", - "text": "Assess external dependencies for each Host Pool", + "subcategory": "Automated Scale", + "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" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "AVD offers a variety of client types (fat, thin, web) to connect over different platforms (Windows, MacOS, iOS, Android). Review limitations of each client and compare multiple options when possible.", - "guid": "a1f6d565-99e5-458b-a37d-4985e1112dbd", - "link": "https://learn.microsoft.com/azure/virtual-desktop/users/connect-windows", + "category": "Platform Automation", + "checklist": "Azure VMware Solution Design Review", + "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", + "service": "AVS", "services": [ - "AVD" + "AVS" ], - "severity": "Low", - "subcategory": "Clients & Users", - "text": "Review user client OS used and AVD client type", + "severity": "Medium", + "subcategory": "Automated Scale", + "text": "Consider and validate scaling operations on 3rd party solutions used in the architecture (supported or not)", "waf": "Performance" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "Depending on the user locations, and AVD region deployment, users may have a non-optimal experience, hence is important to test as soon as possible in a small PoC environment. Run the 'Azure Virtual Desktop Experience Estimator' tool to select the best Azure region to deploy Host Pools. Beyond 150ms latency, user experience may be not optimal.", - "guid": "d2f54b29-769e-43a6-a1e8-838ac936667e", - "link": "https://azure.microsoft.com/services/virtual-desktop/assessment/", + "category": "Platform Automation", + "checklist": "Azure VMware Solution Design Review", + "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", + "service": "AVS", "services": [ - "AVD" + "AVS" ], - "severity": "High", - "subcategory": "Clients & Users", - "text": "Run a PoC to validate end-to-end user experience and impact of network latency", + "severity": "Medium", + "subcategory": "Automated Scale", + "text": "Define and enforce scale in/out maximum limits for your environment in the automations", "waf": "Performance" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "RDP settings can currently only be configured at the host pool level, not per user/group. If different settings are required for different set of users, it is recommended to create multiple Host Pools.", - "guid": "3b365a5c-7acb-4e48-abe5-4cd79f2e8776", - "link": "https://docs.microsoft.com/azure/virtual-desktop/customize-rdp-properties", + "category": "Platform Automation", + "checklist": "Azure VMware Solution Design Review", + "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", + "service": "AVS", "services": [ - "AVD" + "AVS", + "Monitor" ], - "severity": "Low", - "subcategory": "Clients & Users", - "text": "Assess and document RDP settings for all user groups", - "waf": "Security" + "severity": "Medium", + "subcategory": "Automated Scale", + "text": "Implement monitoring rules to monitor automated scaling operations and monitor success and failure to enable appropriate (automated) responses", + "waf": "Operations" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "AVD is a non-regional service, Host Pools can be created in any region, automatic redirection from closest front-end will happen automatically.", - "guid": "42e52f47-21d9-428c-8b1b-d521e44a29a9", - "link": "https://azure.microsoft.com/global-infrastructure/services/?products=virtual-desktop", + "category": "Migration", + "checklist": "Azure VMware Solution Design Review", + "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": [ - "AVD" + "AVS", + "VM" ], "severity": "High", - "subcategory": "General", - "text": "Determine in which Azure regions AVD Host Pools will be deployed.", - "waf": "Performance" + "subcategory": "Architecture", + "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" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "AVD must store metadata to support the service; this is stored in the specified geography. However, this is independent of the regions where Host Pools are located.", - "guid": "bad37ead-53cc-47ce-8d7a-aab3571449ab", - "link": "https://docs.microsoft.com/azure/virtual-desktop/data-locations", + "category": "Migration", + "checklist": "Azure VMware Solution Design Review", + "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": [ - "AVD" + "AVS" ], - "severity": "Medium", - "subcategory": "General", - "text": "Determine metadata location for AVD service", + "severity": "High", + "subcategory": "Architecture", + "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" }, { - "category": "Foundation", - "checklist": "Azure Virtual Desktop Review", - "description": "Check for specific VM SKUs, especially if you need GPU or high-specs SKUs, and eventually Azure NetApp Files if used.", - "guid": "8053d89e-89dc-47b3-9be2-a1a27f7a9e91", - "link": "https://docs.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", + "category": "Migration", + "checklist": "Azure VMware Solution Design Review", + "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", + "service": "AVS", "services": [ - "Storage", - "AVD", - "VM" + "VPN", + "AVS" ], - "severity": "Low", - "subcategory": "General", - "text": "Check Azure quotas and availability for specific VM sizes and types in the selected regions", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Networking", + "text": "If using a VPN connection for migrations, adjust your MTU size accordingly.", + "waf": "Performance" }, { - "category": "Identity", - "checklist": "Azure Virtual Desktop Review", - "description": "AD DCs in Azure are recommended (at least two in different AZ) to reduce latency for users logging into AVD session hosts, and eventually for Azure NetApp Files and AD integration. A DC need to be able to talk to DCs for ALL child domains. As alternative, on-premise connectivity must be used to reach AD DCs.", - "guid": "c14aea7e-65e8-4d9a-9aec-218e6436b073", - "link": "https://docs.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", + "category": "Migration", + "checklist": "Azure VMware Solution Design Review", + "guid": "e614658d-d457-4e92-9139-b821102cad6e", + "service": "AVS", "services": [ - "Storage", - "Entra", - "AVD", - "VNet" + "AVS" ], "severity": "Medium", - "subcategory": "Active Directory", - "text": "Create at least two Active Directory Domain Controllers (DCs) in Azure VNet environment close to AVD Host Pool", - "waf": "Reliability" + "subcategory": "Networking", + "text": "For low connectivity regions connecting into Azure (500Mbps or less), considering deploying the HCX WAN optimization appliance", + "waf": "Performance" }, { - "category": "Identity", - "checklist": "Azure Virtual Desktop Review", - "description": "Recommended to create a separate OU per Host Pool under a separate OU hierarchy. These OUs will contain machine accounts of AVD Session Hosts. ", - "guid": "6db55f57-9603-4334-adf9-cc23418db612", - "link": "https://docs.microsoft.com/azure/virtual-desktop/create-host-pools-azure-marketplace", + "category": "Migration", + "checklist": "Azure VMware Solution Design Review", + "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", + "service": "AVS", "services": [ - "AVD", - "Entra" + "AVS" ], "severity": "Medium", - "subcategory": "Active Directory", - "text": "Create a specific OU in Active Directory for each Host Pool", - "waf": "Operations" + "subcategory": "Process", + "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" }, { - "category": "Identity", - "checklist": "Azure Virtual Desktop Review", - "description": "Carefully review, and potentially block/filter inheritance of GPOs to the OUs containing AVD Host Pools. ", - "guid": "7126504b-b47a-4393-a080-327294798b15", - "link": "https://docs.microsoft.com/previous-versions/windows/desktop/Policy/group-policy-hierarchy", + "category": "Data Storage", + "checklist": "Azure VMware Solution Design Review", + "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", + "service": "AVS", "services": [ - "AVD", - "Entra" + "AVS", + "VM", + "Storage" ], "severity": "Medium", - "subcategory": "Active Directory", - "text": "Review Domain GPOs that will be applied to OU and impacting Host Pool Session Hosts functionalities", - "waf": "Operations" + "subcategory": "Architecture", + "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" }, { - "category": "Identity", - "checklist": "Azure Virtual Desktop Review", - "description": "If Active Directory Domain GPOs are used, it is recommended to configure FSLogix using the built-in provided GPO ADMX template referenced in the companion article in the 'More Info' column", - "guid": "2226a8e3-50a4-4ac3-8bd6-ee150553051f", - "link": "https://learn.microsoft.com/fslogix/how-to-use-group-policy-templates", + "category": "Data Storage", + "checklist": "Azure VMware Solution Design Review", + "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": [ - "AVD", - "Entra" + "AVS", + "ExpressRoute", + "Storage" ], "severity": "Medium", - "subcategory": "Active Directory", - "text": "Configure FSLogix settings using the built-in provided GPO ADMX template", - "waf": "Operations" + "subcategory": "Architecture", + "text": "Ensure that a dedicated ExpressRoute Gateway is being used for external data storage solutions", + "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure Virtual Desktop Review", - "description": "It is recommended to have a specific dedicated account with minimal permissions, and without the default 10 joins limitation. Review the companion article for more details.", - "guid": "347dc560-28a7-41ff-b1cd-15dd2f0d5e77", - "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#session-hosts", + "category": "Data Storage", + "checklist": "Azure VMware Solution Design Review", + "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": [ - "AVD", - "VM", - "Entra" + "AVS", + "ExpressRoute", + "Storage" ], "severity": "Medium", - "subcategory": "Active Directory", - "text": "Create a dedicated user account with only permissions to join VM to the domain", - "waf": "Security" + "subcategory": "Architecture", + "text": "Ensure that FastPath is enabled on the ExpressRoute Gateway that is being used for external data storage solutions", + "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure Virtual Desktop Review", - "description": "Avoid granting access per user, instead use AD groups and replicate them using Active Directory Connector (ADC) in Microsoft Entra ID (former Azure AD). ", - "guid": "2d41e361-1cc5-47b4-a4b1-410d43958a8c", - "link": "https://docs.microsoft.com/azure/virtual-desktop/manage-app-groups", + "category": "Stretched Cluster", + "checklist": "Azure VMware Solution Design Review", + "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": [ - "AVD", - "Entra" + "AVS", + "ASR" ], - "severity": "Medium", - "subcategory": "Active Directory", - "text": "Create a domain user group for each set of users that will be granted access to each Host Pool Application Group (DAG or RAG)", - "waf": "Security" + "severity": "High", + "subcategory": "Architecture", + "text": "If using stretched cluster, ensure that your selected Disaster Recovery solution is supported by the vendor", + "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure Virtual Desktop Review", - "description": "If Azure Files Active Directory (AD) integration is used, as part of the configuration procedure, an AD account to represent the storage account (file share) will be created. You can choose to register as a computer account or service logon account, see FAQ for details. For computer accounts, there is a default password expiration age set in AD at 30 days. Similarly, the service logon account may have a default password expiration age set on the AD domain or Organizational Unit (OU). For both account types, we recommend you check the password expiration age configured in your AD environment and plan to update the password of your storage account identity of the AD account before the maximum password age. You can consider creating a new AD Organizational Unit (OU) in AD and disabling password expiration policy on computer accounts or service logon accounts accordingly.", - "guid": "2289b3d6-b57c-4fc6-9546-1e1a3e3453a3", - "link": "https://docs.microsoft.com/azure/storage/files/storage-files-identity-ad-ds-enable", + "category": "Stretched Cluster", + "checklist": "Azure VMware Solution Design Review", + "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", + "service": "AVS", "services": [ - "Storage", - "AzurePolicy", - "AVD", - "Entra" + "AVS" ], "severity": "High", - "subcategory": "Active Directory", - "text": "Review your organization password expiration policy for accounts used by Azure Files AD integration", - "waf": "Security" + "subcategory": "Architecture", + "text": "If using stretched cluster, ensure that the SLA provided will meet your requirements", + "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure Virtual Desktop Review", - "description": "You can configure this using Active Directory Connect (ADC) or Azure AD Domain Services (for hybrid or cloud organizations). Microsoft Entra ID is the new name for Azure Active Directory (Azure AD).", - "guid": "5119bf8e-8f58-4542-a7d9-cec166cd072a", - "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#identity", + "category": "Stretched Cluster", + "checklist": "Azure VMware Solution Design Review", + "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", + "service": "AVS", "services": [ - "AVD", - "Entra" + "AVS", + "ExpressRoute" ], "severity": "High", - "subcategory": "Active Directory", - "text": "A Windows Server Active Directory forest/domain must be in sync with Microsoft Entra ID", + "subcategory": "Architecture", + "text": "If using stretched cluster, ensure that both ExpressRoute circuits are connected to your connectivity hub.", "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure Virtual Desktop Review", - "description": "If Azure Files is used and pre-requisites can be satisfied, it is recommended to configure (Microsoft Entra ID) Kerberos authentication. This configuration will allow to store FSLogix profiles that can be accessed by hybrid user identities from Azure AD-joined session hosts without requiring network line-of-sight to domain controllers.", - "guid": "e777fd5e-c5f1-4d6e-8fa9-fc210b88e338", - "link": "https://learn.microsoft.com/azure/storage/files/storage-files-identity-auth-hybrid-identities-enable", + "category": "Stretched Cluster", + "checklist": "Azure VMware Solution Design Review", + "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", + "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", + "service": "AVS", "services": [ - "Storage", - "AVD", - "Entra" + "AVS", + "ExpressRoute" ], - "severity": "Medium", - "subcategory": "Microsoft Entra ID", - "text": "Configure Azure Files share for Microsoft Entra ID (former Azure AD) Kerberos authentication on Microsoft Entra ID Joined scenario", - "waf": "Security" + "severity": "High", + "subcategory": "Architecture", + "text": "If using stretched cluster, ensure that both ExpressRoute circuits have GlobalReach enabled.", + "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure Virtual Desktop Review", - "description": "An Azure subscription must be parented to the same Microsoft Entra ID (former Azure AD) tenant, that contains a virtual network that either contains or is connected to the Windows Server Active Directory Domain Services or Microsoft Entra ID Domain Services instance.", - "guid": "6ceb5443-5125-4922-9442-93bb628537a5", - "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#identity", + "category": "Stretched Cluster", + "checklist": "Azure VMware Solution Design Review", + "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", + "service": "AVS", "services": [ - "VNet", - "Entra", - "AVD", - "Subscriptions" + "AVS" ], "severity": "High", - "subcategory": "Requirements", - "text": "A Microsoft Entra ID tenant must be available with at least one subscription linked", + "subcategory": "Architecture", + "text": "Have site disaster tolerance settings been properly considered and changed for your business if needed.", "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure Virtual Desktop Review", - "description": "Azure Virtual Desktop supports different types of identities depending on which configuration you choose. Please review the supported scenarios mentioned in the 'More Info' article and document the design decision accordingly in the 'Comment' column. Critically, external identities (B2B or B2C) are not supported. Be sure to review also the list of supported scenarios in https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#supported-identity-scenarios.", - "guid": "b4ce4781-7557-4a1f-8043-332ae199d44c", - "link": "https://learn.microsoft.com/azure/virtual-desktop/authentication", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "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": [ - "AVD", - "Entra" + "ACR" ], "severity": "High", - "subcategory": "Requirements", - "text": "Review and document your identity scenario", + "subcategory": "Data Protection", + "text": "Disable Azure Container Registry image export", "waf": "Security" }, { - "category": "Identity", - "checklist": "Azure Virtual Desktop Review", - "description": "Users need accounts that are in Microsoft Entra ID (former Azure AD). If you're also using AD DS or Azure AD Domain Services in your deployment of Azure Virtual Desktop, these accounts will need to be hybrid identities, which means the user accounts are synchronized. If you're using Microsoft Entra ID with AD DS, you'll need to configure Azure AD Connect to synchronize user identity data between AD DS and Microsoft Entra ID. If you're using Microsoft Entra ID with Azure AD Domain Services, user accounts are synchronized one way from Microsoft Entra ID to Azure AD Domain Services. This synchronization process is automatic. AVD also supports Microsoft Entra ID native accounts with some restrictions. External identities (B2B or B2C) are not supported.", - "guid": "f9b141a8-98a5-435e-9378-97e71ca7da7b", - "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#supported-identity-scenarios", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "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": [ - "AVD", - "Entra" + "AzurePolicy", + "ACR" ], - "severity": "Medium", - "subcategory": "Requirements", - "text": "Assess User Account types and requirements", + "severity": "High", + "subcategory": "Data Protection", + "text": "Enable Azure Policies for Azure Container Registry", "waf": "Security" }, { - "category": "Identity", - "checklist": "Azure Virtual Desktop Review", - "description": "AVD supports SSO using either Active Directory Federation Services (AD FS) or Microsoft Entra ID (former Azure AD) authentication. The latter is recommended, please check the requirements and limitation in the 'More Info' article. Using AD FS could be a viable choice if already present in the customer environment, it is not recommended to deploy a brand new ADFS infrastructure just for AVD SSO implementation.", - "guid": "5f9f680a-ba07-4429-bbf7-93d7071561f4", - "link": "https://learn.microsoft.com/azure/virtual-desktop/authentication#single-sign-on-sso", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "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": [ - "AVD", - "Entra" + "AKV", + "ACR" ], - "severity": "Medium", - "subcategory": "Requirements", - "text": "If Single-Sign On (SSO) is a requirement, review the supported scenarios and prerequisites", - "waf": "Reliability" + "severity": "High", + "subcategory": "Data Protection", + "text": "Sign and Verify containers with notation (Notary v2)", + "waf": "Security" }, { - "category": "Identity", - "checklist": "Azure Virtual Desktop Review", - "description": "VMs can be Windows Active Directory (AD) domain-joined, Hybrid AD-joined, Microsoft Entra ID (former Azure AD) Joined or Azure AD Domain Services joined. Be sure to review supported scenarios, limitations and requirements from the referenced article.", - "guid": "ea962a15-9394-46da-a7cc-3923266b2258", - "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#supported-identity-scenarios", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "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": [ - "AVD", - "VM", - "Entra" + "AKV", + "ACR" ], - "severity": "High", - "subcategory": "Requirements", - "text": "Select the proper AVD Session Host domain join type", + "severity": "Medium", + "subcategory": "Data Protection", + "text": "Encrypt registry with a customer managed key", "waf": "Security" }, { - "category": "Identity", - "checklist": "Azure Virtual Desktop Review", - "description": "Compare self-managed Windows Active Directory Domain Services, Microsoft Entra ID (former Azure AD), and managed Azure AD Domain Services (AAD-DS)", - "guid": "6f4a1651-bddd-4ea8-a487-cdeb4861bc3b", - "link": "https://docs.microsoft.com/azure/active-directory-domain-services/compare-identity-solutions", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "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": [ - "AVD", - "Entra" + "Entra", + "RBAC", + "ACR" ], - "severity": "Low", - "subcategory": "Requirements", - "text": "Before using Azure AD Domain Services (AAD-DS) for AVD, be sure to review the limitations.", - "waf": "Reliability" + "severity": "High", + "subcategory": "Identity and Access Control", + "text": "Use Managed Identities to connect instead of Service Principals", + "waf": "Security" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "AVD provides administrative templates for Intune and Active Directory GPO. Using these templates it is possible to centrally control several AVD configuration settings: Graphics related data logging, Screen capture protection, RDP Shortpath for managed networks, Watermarking. See companion article in 'More Info' colum for details. NOTE: FSLogix has its own separate template.", - "guid": "5549524b-36c0-4f1a-892b-ab3ca78f5db2", - "link": "https://learn.microsoft.com/azure/virtual-desktop/administrative-template", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "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": [ - "Monitor", - "AVD", - "Entra" + "Entra", + "RBAC", + "ACR" ], - "severity": "Low", - "subcategory": "Management", - "text": "Use built-in provided administrative templates for AVD settings configuration", - "waf": "Operations" + "severity": "High", + "subcategory": "Identity and Access Control", + "text": "Disable local authentication for management plane access", + "waf": "Security" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "Determine if a configuration management tool is already in place to manage Host Pool VM configuration after initial deployment, For example SCCM/SCOM, Intune/ConfigurationManager, 3rd-party solutions.", - "guid": "3334fdf9-1c23-4418-8b65-285269440b4b", - "link": "https://learn.microsoft.com/azure/virtual-desktop/management", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "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": [ - "Monitor", - "AVD", - "VM" + "Entra", + "RBAC", + "ACR" ], - "severity": "Low", - "subcategory": "Management", - "text": "Plan AVD Session Hosts configuration management strategy", - "waf": "Operations" + "severity": "High", + "subcategory": "Identity and Access Control", + "text": "Assign AcrPull & AcrPush RBAC roles rather than granting Administrative access to identity principals", + "waf": "Security" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "We recommend using Microsoft Intune, if requirements can be satisfied, to manage your Azure Virtual Desktop environment. Review supported scenarios and requirements to enable Intune for AVD Session Host management in the referenced article in the “More Info” column. Document your choice in the 'Comment' column. In that article, review the different requirements and capabilities for single-session https://learn.microsoft.com/mem/intune/fundamentals/windows-virtual-desktop and multi-session https://learn.microsoft.com/mem/intune/fundamentals/windows-virtual-desktop-multi-session AVD.", - "guid": "63a08be1-6004-4b4a-a79b-f3239faae113", - "link": "https://learn.microsoft.com/mem/intune/fundamentals/azure-virtual-desktop", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "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": [ - "Monitor", - "AVD" + "Entra", + "ACR" ], "severity": "Medium", - "subcategory": "Management", - "text": "Evaluate Intune for AVD Session Hosts management", - "waf": "Operations" + "subcategory": "Identity and Access Control", + "text": "Disable Anonymous pull access", + "waf": "Security" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "The scaling tool provides a low-cost automation option for customers who want to optimize their session host VM costs. You can use the scaling tool to schedule VMs to start and stop based on Peak and Off-Peak business hours, scale out VMs based on number of sessions per CPU core, scale in VMs during Off-Peak hours, leaving the minimum number of session host VMs running. Not available yet for Personal Host Pool type.", - "guid": "7138b820-102c-4e16-be30-1e6e872e52e3", - "link": "https://learn.microsoft.com/azure/virtual-desktop/autoscale-scenarios", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "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": [ - "Cost", - "Monitor", - "AVD", - "VM" + "Entra", + "ACR" ], - "severity": "Medium", - "subcategory": "Management", - "text": "Assess the requirements for host pool auto-scaling capability", - "waf": "Reliability" + "severity": "High", + "subcategory": "Identity and Access Control", + "text": "Disable repository-scoped access tokens", + "waf": "Security" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "Start VM On Connect lets you reduce costs by enabling end users to turn on their session host virtual machines (VMs) only when they need them. You can then turn off VMs when they're not needed. You can configure Start VM on Connect for personal or pooled host pools using the Azure portal or PowerShell. Start VM on Connect is a host pool wide setting.", - "guid": "55f612fe-f215-4f0d-a956-10e7dd96bcbc", - "link": "https://learn.microsoft.com/azure/virtual-desktop/start-virtual-machine-connect", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "description": "Deploy container images to an ACR behind a Private endpoint within a trusted network", + "guid": "b3bec3d4-f343-47c1-936d-b55f27a71eee", + "service": "ACR", "services": [ - "Cost", - "Monitor", - "AVD", - "VM" + "Entra", + "EventHubs", + "PrivateLink", + "ACR" ], - "severity": "Low", - "subcategory": "Management", - "text": "Consider the usage of Start VM on Connect for Personal Host Pools", - "waf": "Cost" + "severity": "High", + "subcategory": "Identity and Access Control", + "text": "Deploy images from a trusted environment", + "waf": "Security" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "'Start VM On Connect' provides a smart way to automatically start previously stopped Session Hosts but does not provide a mechanism to shut down when not in used. Administrators are encouraged to configure additional policies to sign users out of their sessions and run Azure automation scripts to de-allocate VMs. Users should be not allowed to shut down their Personal Hosts since will not be able to de-allocate Azure VMs, then billing will still be active with no cost reduction.", - "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", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "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": [ + "Entra", "AzurePolicy", - "Monitor", - "VM", - "AVD", - "Cost" + "ACR" ], - "severity": "Low", - "subcategory": "Management", - "text": "Evaluate the implementation of an ad-hoc mechanism to shut down Personal AVD Session Hosts", - "waf": "Cost" + "severity": "Medium", + "subcategory": "Identity and Access Control", + "text": "Disable Azure ARM audience tokens for authentication", + "waf": "Security" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "Azure Virtual Desktop billing is mainly based on cost associated to compute, networking and storage resources consumed by Host Pools. In addition to this, costs can be generated by dependent resources, for example VPN or ExpressRoute or vWAN, Active Directory Domain Controllers, DNS, etc. There is no direct cost associated to AVD objects like workspaces, host pools or application groups. To make AVD associated costs more evident and grouped by Host Pool, it is recommended to use 'cm-resource-parent' tag. ", - "guid": "51bcafca-476a-48fa-9b91-9645a7679f20", - "link": "https://learn.microsoft.com/azure/virtual-desktop/tag-virtual-desktop-resources", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "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": [ - "DNS", - "ExpressRoute", - "VPN", + "Entra", "Monitor", - "Storage", - "VWAN", - "AVD", - "Cost" + "ACR" ], - "severity": "Low", - "subcategory": "Management", - "text": "Review and adopt suggested Azure Tags for Azure Virtual Desktop", - "waf": "Cost" + "severity": "Medium", + "subcategory": "Logging and Monitoring", + "text": "Enable diagnostics logging", + "waf": "Security" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "Azure Advisor analyzes your configurations and telemetry to offer personalized recommendations to solve common problems. With these recommendations, you can optimize your Azure resources for reliability, security, operational excellence, performance, and cost.", - "guid": "611dd68c-5a4b-4252-8e44-a59a9c2399c4", - "link": "https://learn.microsoft.com/azure/virtual-desktop/azure-advisor-recommendations", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "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": [ - "Cost", - "Monitor", - "AVD", - "Entra" + "PrivateLink", + "VNet", + "Firewall", + "ACR" ], - "severity": "Low", - "subcategory": "Management", - "text": "Periodically check Azure Advisor recommendations for AVD", - "waf": "Operations" + "severity": "Medium", + "subcategory": "Network Security", + "text": "Control inbound network access with Private Link", + "waf": "Security" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "Customers have several options: Microsoft Configuration Manager, this article explains how to automatically apply updates to a Azure Virtual Desktop session hosts running Windows 10/11: https://learn.microsoft.com/azure/virtual-desktop/configure-automatic-updates, Microsoft Intune: https://docs.microsoft.com/mem/intune/fundamentals/windows-virtual-desktop-multi-session, Azure Update Management and WSUS for Windows Server OS only (client OS not supported: https://learn.microsoft.com/azure/automation/update-management/operating-system-requirements), 3rd Party tools. Outside an emergency security patching situation, it is recommended to move away from an 'in-place' update strategy patching strategy and adopt a re-imaging approach.", - "guid": "04722da2-9c2b-41cd-922f-54b29bade3aa", - "link": "https://learn.microsoft.com/mem/intune/fundamentals/azure-virtual-desktop-multi-session", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "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": [ - "Monitor", - "AVD" + "PrivateLink", + "ACR" ], "severity": "Medium", - "subcategory": "Management", - "text": "Plan for a Session Host emergency patching and update strategy", - "waf": "Operations" + "subcategory": "Network Security", + "text": "Disable Public Network access", + "waf": "Security" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "The Scheduled Agent Updates feature lets you create up to two maintenance windows per Host Pool to update AVD components at a convenient time. It is recommended to specify maintenance windows then upgrading Session Hosts will not happen during peak business hours. Scheduled Agent Updates is disabled by default. This means that, unless you enable this setting, the agent can get updated at any time by the agent update flighting service.", - "guid": "c067939b-e5ca-4698-b9ce-3bd91843e73f", - "link": "https://learn.microsoft.com/azure/virtual-desktop/scheduled-agent-updates", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "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": [ - "Monitor", - "AVD" + "PrivateLink", + "ACR" ], - "severity": "Low", - "subcategory": "Management", - "text": "Configure the Scheduled Agent Updates feature", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Network Security", + "text": "Use an Azure Container Registry SKU that supports Private Link (Premium SKU)", + "waf": "Security" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "Host pools are a collection of one or more identical virtual machines within Azure Virtual Desktop environment. We highly recommend you create a validation host pool where service updates are applied first. This allows you to monitor service updates before the service applies them to your standard or non-validation environment.", - "guid": "d1e8c38e-c936-4667-913c-005674b1e944", - "link": "https://docs.microsoft.com/azure/virtual-desktop/create-validation-host-pool", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "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": [ - "Monitor", - "AVD", - "VM" + "Defender", + "ACR" ], - "severity": "Medium", - "subcategory": "Management", - "text": "Create a validation (canary) Host Pool", - "waf": "Operations" + "severity": "Low", + "subcategory": "Network Security", + "text": "Enable Defender for Containers to scan Azure Container Registry for vulnerabilities", + "waf": "Security" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "An AVD Host Pool can be deployed in several ways: Azure Portal, ARM templates, Azure CLI tool, Powershell, manual VM creation with registration token, Terraform, 3rd-party tools. It is important to adopt proper method/s to support automatic deployment through automation and CI/CD tools.", - "guid": "a459c373-e7ed-4616-83b3-65a917ecbe48", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/wvd/eslz-platform-automation-and-devops", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "description": "Deploy trusted code that was validated and scanned for vulnerabilities according to DevSecOps practices.", + "guid": "4451e1a2-d345-4293-a763-9637a551c5c0", + "service": "ACR", "services": [ - "Monitor", - "AVD", - "VM" + "ACR" ], "severity": "Medium", - "subcategory": "Management", - "text": "Determine Host Pool deployment strategy", - "waf": "Operations" + "subcategory": "Vulnerability Management", + "text": "Deploy validated container images", + "waf": "Security" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "After you register a VM to a host pool within the Azure Virtual Desktop service, the agent regularly refreshes the VM's token whenever the VM is active. The certificate for the registration token is valid for 90 days. Because of this 90-day limit, we recommend VMs to be online for 20 minutes every 90 days so that the machine can refresh its tokens and update the agent and side-by-side stack components.", - "guid": "ebe54cd7-df2e-48bb-ac35-81559bb9153e", - "link": "https://docs.microsoft.com/azure/virtual-desktop/faq", + "category": "Security", + "checklist": "Azure Container Registry Security Review", + "description": "Use the latest versions of supported platforms, programming languages, protocols, and frameworks.", + "guid": "4e401955-387e-45ce-b126-cd132af5b20c", + "service": "ACR", "services": [ - "Monitor", - "AVD", - "VM" + "ACR" ], - "severity": "Medium", - "subcategory": "Management", - "text": "Turn on Session Host VMs at least every 90 days for token refresh", - "waf": "Operations" + "severity": "High", + "subcategory": "Vulnerability Management", + "text": "Use up-to-date platforms, languages, protocols and frameworks", + "waf": "Security" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "Azure Virtual Desktop Insights is a dashboard built on Azure Monitor Workbooks that helps IT professionals understand their Azure Virtual Desktop environments. Read the referenced article to learn how to set up Azure Monitor for Azure Virtual Desktop to monitor your AVD environments.", - "guid": "63cfff1c-ac59-49ef-8d5a-83dd4de36c1c", - "link": "https://learn.microsoft.com/azure/virtual-desktop/insights", + "category": "BCDR", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Ensure data repositories for the backup solution are stored outside of vSAN storage. Either in Azure native or on a disk pool-backed datastore", + "guid": "976f32a7-30d1-6caa-c2a0-207fdc26571b", + "link": "https://learn.microsoft.com/azure/azure-vmware/set-up-backup-server-for-azure-vmware-solution", "services": [ - "Monitor", - "AVD" + "AVS", + "Backup", + "Storage" ], - "severity": "High", - "subcategory": "Monitoring", - "text": "Enable monitoring for AVD", + "severity": "Medium", + "subcategory": "Backup", + "text": "Ensure backups are not stored on vSAN as vSAN is a finite resource", "waf": "Reliability" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "Azure Virtual Desktop uses Azure Monitor and Log Analytics for monitoring and alerts like many other Azure services. This lets admins identify issues through a single interface. The service creates activity logs for both user and administrative actions. Each activity log falls under the following categories: Management, Feed, Connections, Host Registration, Errors, Checkpoints. ", - "guid": "81770afb-c4c0-4e43-a186-58d2857ed671", - "link": "https://docs.microsoft.com/azure/virtual-desktop/diagnostics-log-analytics", + "category": "BCDR", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Microsoft backup service", + "guid": "fc8af7a1-c724-e255-c18d-4ca22a6f27f0", + "link": "https://docs.microsoft.com/azure/azure-vmware/set-up-backup-server-for-azure-vmware-solution", "services": [ - "Monitor", - "AVD", - "VM" + "AVS", + "Backup" ], "severity": "Medium", - "subcategory": "Monitoring", - "text": "Enable diagnostic settings for Workspaces, Host Pools, Application Groups and Host VMs to Log Analytics workspace", + "subcategory": "Business Continuity", + "text": "Use MABS as your backup solution", "waf": "Reliability" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "See the referenced article and this additional one to setup proper monitoring and alerting for storage: https://docs.microsoft.com/azure/storage/files/storage-troubleshooting-files-performance. ", - "guid": "2463cffe-179c-4599-be0d-5973dd4ce32c", - "link": "https://docs.microsoft.com/azure/storage/files/storage-files-monitoring?tabs=azure-portal", + "category": "BCDR", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Best practice - this is Backup, not disaster recovery", + "guid": "be28860f-3d29-a79a-1a0e-36f1b23b36ae", + "link": "Best practice to deploy backup in the same region as your AVS deployment", "services": [ - "Storage", - "Monitor", - "AVD" + "AVS", + "Backup", + "ASR" ], "severity": "Medium", - "subcategory": "Monitoring", - "text": "Create alerts on the profile storage to be alerted in case of high usage and throttling", + "subcategory": "Business Continuity", + "text": "Deploy your backup solution in the same region as your Azure VMware Solution private cloud", "waf": "Reliability" }, { - "category": "Monitoring and Management", - "checklist": "Azure Virtual Desktop Review", - "description": "You can use Azure Service Health to monitor service issues and health advisories for Azure Virtual Desktop. Azure Service Health can notify you with different types of alerts (for example, email or SMS), help you understand the effect of an issue, and keep you updated as the issue resolves.", - "guid": "18813706-f7c4-4c0d-9e51-4548d2457ed6", - "link": "https://docs.microsoft.com/azure/virtual-desktop/set-up-service-alerts", + "category": "BCDR", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Best practice - in case AVS is unavailable", + "guid": "4d2f79a5-4ccf-0dfc-557c-49619b99a540", + "link": "https://docs.microsoft.com/azure/azure-vmware/set-up-backup-server-for-azure-vmware-solution", "services": [ - "Monitor", - "AVD" + "AVS" ], "severity": "Medium", - "subcategory": "Monitoring", - "text": "Configure Azure Service Health for AVD alerts ", + "subcategory": "Business Continuity", + "text": "Preferably deploy MABS outside of the SDDC as native Azure IaaS", "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure Virtual Desktop Review", - "description": "If required to connect to on-premises environment, assess the current connectivity option or plan for the required connectivity (ExpressRoute, Azure S2S or 3rd-party NVA VPN). ", - "guid": "dd399cfd-7b28-4dc8-9555-6202bfe4563b", - "link": "https://docs.microsoft.com/azure/architecture/reference-architectures/hybrid-networking/", + "category": "BCDR", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Is a process in place to request a restore of the VMware components managed by the Azure Platform?", + "guid": "ff431c40-962c-5182-d536-0c2f0c4ce9e0", + "link": "Will Disaster Recovery Site Recovery, HCX Disaster Recovery, SRM or back tools be used?", "services": [ - "NVA", - "ExpressRoute", - "VPN", - "AVD" + "AVS" ], "severity": "Medium", - "subcategory": "Networking", - "text": "Determine if hybrid connectivity is required to connect to on-premises environment", + "subcategory": "Business Continuity", + "text": "Escalation process with Microsoft in the event of a regional DR", "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure Virtual Desktop Review", - "description": "AVD Host Pools can be deployed in either Azure Virtual WAN or traditional 'Hub & Spoke' network topologies. It is recommended to deploy each Host Pool in a separate 'spoke' VNet, using 'hub' is not recommended.", - "guid": "c8639648-a652-4d6c-85e5-02965388e5de", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/wvd/eslz-network-topology-and-connectivity", + "category": "BCDR", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Compare SRM with HCX", + "guid": "f379436d-3051-daa0-01fb-dc4e0e04d677", + "link": "https://docs.microsoft.com/azure/azure-vmware/disaster-recovery-using-vmware-site-recovery-manager", "services": [ - "VWAN", - "AVD", - "VNet" + "AVS", + "ASR" ], "severity": "Medium", - "subcategory": "Networking", - "text": "Determine Azure Virtual Network (VNet) placement for each AVD Host Pool", - "waf": "Performance" + "subcategory": "Disaster Recovery", + "text": "Use VMware Site Recovery Manager when both sites are Azure VMware Solution", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure Virtual Desktop Review", - "description": "Evaluate the bandwidth requirements, ensure VPN/ER bandwidth will be enough, ensure proper routing and firewall rules are in place, test end-to-end latency. ", - "guid": "d227dd14-2b06-4c21-a799-9a646f4389a7", - "link": "https://docs.microsoft.com/azure/architecture/reference-architectures/hybrid-networking/", + "category": "BCDR", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Recovery into Azure instead of Vmware solution", + "guid": "367f71d8-3cf6-51a0-91a5-3db3d570cc19", + "link": "https://docs.microsoft.com/azure/site-recovery/avs-tutorial-prepare-azure", "services": [ - "VPN", - "AVD" + "AVS", + "ASR" ], "severity": "Medium", - "subcategory": "Networking", - "text": "Assess which on-premises resources are required from AVD Host Pools", + "subcategory": "Disaster Recovery", + "text": "Use Azure Site Recovery when the Disaster Recovery technology is native Azure IaaS", "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure Virtual Desktop Review", - "description": "Several options are available. You can use Azure Firewall or equivalent 3rd-party NVA, Network Security Group (NSG) and/or Proxy servers. NSG is not able to enable/disable by URL, only ports and protocols. Proxy should be used only as explicit setting in user browser. Details on using Azure Firewall Premium with AVD are reported in the companion article in the 'More Info' column. Be sure to allow proper access to required AVD URLs. Forced Tunneling to on-premises is not recommended.", - "guid": "fc4972cd-3cd2-41bf-9703-6e5e6b4bed3d", - "link": "https://docs.microsoft.com/azure/firewall/protect-windows-virtual-desktop", + "category": "BCDR", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Avoid manual tasks as much as possible", + "guid": "ee02ada0-1887-bb3a-b84c-423f45a09ef9", + "link": "https://docs.microsoft.com/azure/site-recovery/avs-tutorial-prepare-azure", "services": [ - "NVA", - "Firewall", - "AVD", - "VNet" + "AVS", + "ASR" ], "severity": "Medium", - "subcategory": "Networking", - "text": "Need to control/restrict Internet outbound traffic for AVD hosts?", - "waf": "Security" + "subcategory": "Disaster Recovery", + "text": "Use Automated recovery plans with either of the Disaster solutions,", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure Virtual Desktop Review", - "description": "Required URLs for AVD control plane access by session hosts are documented here: https://docs.microsoft.com/azure/virtual-desktop/safe-url-list. A check tool is available to verify connectivity from the session hosts: https://docs.microsoft.com/azure/virtual-desktop/safe-url-list#required-url-check-tool. Forced Tunneling to on-premises is not recommended.", - "guid": "65c7acbe-45bb-4e60-ad89-f2e87778424d", - "link": "https://docs.microsoft.com/azure/virtual-desktop/safe-url-list", + "category": "BCDR", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Any other datacenter in the same region", + "guid": "0c2b74e5-9c28-780d-1df3-12d3de4aaa76", + "link": "https://docs.microsoft.com/azure/azure-vmware/connect-multiple-private-clouds-same-region", "services": [ - "AVD" + "AVS", + "ASR" ], - "severity": "High", - "subcategory": "Networking", - "text": "Ensure AVD control plane endpoints are accessible", + "severity": "Medium", + "subcategory": "Disaster Recovery", + "text": "Configure a secondary disaster recovery environment", "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure Virtual Desktop Review", - "description": "Consider the usage of Azure Defender Endpoint or similar 3rd-party agents to control user web navigation, see the Security section for more details.", - "guid": "73676ae4-6691-4e88-95ad-a42223e13810", - "link": "https://learn.microsoft.com/microsoft-365/security/defender-endpoint/onboard-windows-multi-session-device?view=o365-worldwide", + "category": "BCDR", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "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", + "guid": "c2a34ec4-2933-4e6c-dc36-e20e67abbe3f", + "link": "https://docs.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", "services": [ - "Defender", - "AVD" + "AVS", + "ASR" ], "severity": "Medium", - "subcategory": "Networking", - "text": "Need to control/restrict Internet outbound traffic only for users on AVD hosts? ", - "waf": "Security" + "subcategory": "Disaster Recovery", + "text": "Assign IP ranges unique to each region", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure Virtual Desktop Review", - "description": "Custom UDR and NSG can be applied to AVD Host Pool subnets, for example to redirect to Azure Firewall or NVA, or to filter/block network traffic. In this case is recommended to carefully review to ensure optimal path for outbound traffic to AVD control plane is used. Service Tags can now be used with UDR and NSG, then AVD management plane traffic can be easily allowed: https://learn.microsoft.com/azure/virtual-desktop/safe-url-list.", - "guid": "523181a9-4174-4158-93ff-7ae7c6d37431", - "link": "https://docs.microsoft.com/azure/firewall/protect-windows-virtual-desktop", + "category": "BCDR", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "ExpressRoute Global Reach can be used for connectivity between the primary and secondary Azure VMware Solution Private Clouds or routing must be done through network virtual appliances?", + "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", - "Firewall", - "AVD", - "VNet" + "ExpressRoute" ], - "severity": "Low", - "subcategory": "Networking", - "text": "Review custom UDR and NSG for AVD Host Pool subnets", - "waf": "Security" + "severity": "Medium", + "subcategory": "Disaster Recovery", + "text": "Use Global Reach between DR regions", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure Virtual Desktop Review", - "description": "Network traffic from AVD Session Host VMs to AVD control plane should be as direct as possible. Redirecting this traffic through a Proxy or Firewall with deep packet inspection and/or SSL termination could cause serious issues and bad customer experience. It is recommended to bypass Proxy and Firewall just for the AVD control plane. User generated traffic surfing the web instead, should be filtered by Firewall and/or redirected to a Proxy. For details and guidelines, please see the companion article in the 'More Info' column.", - "guid": "cc6edca0-aeca-4566-9e92-cf246f1465af", - "link": "https://learn.microsoft.com/azure/virtual-desktop/proxy-server-support", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "An ExR Global Reach connection will be established to the ExR circuit, no other connections", + "guid": "a2c12df2-07fa-3edd-2cec-fda0b55fb952", + "link": "https://learn.microsoft.com/azure/azure-vmware/tutorial-expressroute-global-reach-private-cloud", "services": [ - "AVD", - "VM" + "AVS", + "VWAN" ], - "severity": "High", - "subcategory": "Networking", - "text": "Do not use Proxy servers, SSL termination and Deep Packet Inspection for AVD control plane traffic", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Direct (no vWAN, no H&S)", + "text": "Global Reach to ExR circuit - no Azure resources", + "waf": "Performance" }, { - "category": "Networking", - "checklist": "Azure Virtual Desktop Review", - "description": "It is recommended to assess and review networking bandwidth requirements for users, based on the specific workload type. The referenced article provide general estimations and recommendations, but specific measure are required for proper sizing. ", - "guid": "516785c6-fa96-4c96-ad88-408f372734c8", - "link": "https://learn.microsoft.com/azure/virtual-desktop/rdp-bandwidth", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Use ExR to connect on-premises (other) location to Azure", + "guid": "f62ce162-ba5a-429d-674e-fafa1af5f706", + "link": "https://learn.microsoft.com/azure/azure-vmware/tutorial-expressroute-global-reach-private-cloud", "services": [ - "AVD", - "VM" + "AVS", + "ExpressRoute" ], - "severity": "Low", - "subcategory": "Networking", - "text": "Check the network bandwidth required for each user and in total for the VM SKU", + "severity": "Medium", + "subcategory": "ExpressRoute", + "text": "Connect to Azure using ExR", "waf": "Performance" }, { - "category": "Networking", - "checklist": "Azure Virtual Desktop Review", - "description": "If Azure Files SMB share will be used to store user profiles via FSLogix, the usage of Private Endpoint (PE) for private access to the storage is recommended. AVD Session Hosts will access the storage using a private IP in the same VNet, a separate subnet is recommended. This feature has an additional cost that must be evaluated. If PE will not be used, at least Service Endpoint is recommended (no cost associated).", - "guid": "ec27d589-9178-426d-8df2-ff60020f30a6", - "link": "https://learn.microsoft.com/azure/storage/files/storage-files-networking-endpoints", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Use the migration assesment tool and timeline to determine bandwidth required", + "guid": "cf01c73b-1247-0a7a-740c-e1ea29bda340", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-introduction", "services": [ - "Storage", - "VNet", - "AVD", - "Cost", - "PrivateLink" + "AVS", + "ExpressRoute" ], "severity": "Medium", - "subcategory": "Networking", - "text": "Evaluate usage Private Endpoint for Azure Files share", - "waf": "Security" + "subcategory": "ExpressRoute", + "text": "Bandwidth sizing", + "waf": "Performance" }, { - "category": "Networking", - "checklist": "Azure Virtual Desktop Review", - "description": "Connections to Azure Virtual Desktop can use TCP or UDP. RDP Shortpath is a feature of AVD that establishes a direct UDP-based transport between a supported Windows Remote Desktop client and session host. if clients have line of sight to AVD session hosts from internal network (VPN usage is not recommended), this feature can provide lower latency and best performances as explained in https://learn.microsoft.com/azure/virtual-desktop/rdp-shortpath?tabs=managed-networks#key-benefits.", - "guid": "b2074747-d01a-4f61-b1aa-92ad793d9ff4", - "link": "https://docs.microsoft.com/azure/virtual-desktop/shortpath", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "What traffic is routed through a firewall, what goes directly into Azure", + "guid": "aab216ee-8941-315e-eada-c7e1f2243bd1", + "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/azure-vmware-solution-foundation-networking", "services": [ - "VPN", - "AVD" + "AVS", + "ExpressRoute" ], "severity": "Medium", - "subcategory": "Networking", - "text": "Evaluate usage of RDP ShortPath for clients connecting from managed internal networks", + "subcategory": "ExpressRoute", + "text": "Traffic routing ", "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "Security mechanisms provided by GPO should be used, if available. For example, it is possible to impose desktop screen lock and idle session disconnection time. Existing GPOs applied to on-premises environment should be reviewed and eventually applied also to secure also AVD Hosts when joined to the domain.", - "guid": "a135e337-897e-431c-97d6-8cb6a22ac19f", - "link": "https://learn.microsoft.com/azure/virtual-desktop/security-guide#establish-maximum-inactive-time-and-disconnection-policies", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "AVS to ExR circuit, no traffic inspection", + "guid": "1f956e45-f62d-5c95-3a95-3bab718907f8", + "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/azure-vmware-solution-foundation-networking", "services": [ - "AVD" + "AVS", + "ExpressRoute" ], "severity": "Medium", - "subcategory": "Active Directory", - "text": "Review Active Directory GPO to secure RDP sessions", - "waf": "Security" + "subcategory": "ExpressRoute", + "text": "Global Reach ", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "Microsoft Defender for Endpoint supports Azure Virtual Desktop for Windows 10/11 Enterprise multi-session. Check article for onboarding non-persistent virtual desktop infrastructure (VDI) devices: https://docs.microsoft.com/windows/security/threat-protection/microsoft-defender-atp/configure-endpoints-vdi", - "guid": "b1172576-9ef6-4691-a483-5ac932223ece", - "link": "https://learn.microsoft.com/microsoft-365/security/defender-endpoint/deployment-vdi-microsoft-defender-antivirus", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Name of the vNet and a unique address space /24 minimum", + "guid": "91f7a87b-21ac-d712-959c-8df2ba034253", + "link": "https://learn.microsoft.com/azure/virtual-network/quick-create-portal", "services": [ - "Defender", - "AVD" + "AVS", + "VNet" ], - "severity": "High", - "subcategory": "Host Configuration", - "text": "Ensure anti-virus and anti-malware solutions are used", - "waf": "Security" + "severity": "Medium", + "subcategory": "Hub & Spoke", + "text": "VNet name & address space", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "Disks in Azure are already encrypted at rest by default with Microsoft managed keys. Host VM OS disk encryption is possible and supported using Azure Disk Encryption (ADE - BitLocker) and Disk Encryption Set (DES - Server Side Encryption), the latter is recommended. Encryption of FSLogix storage using Azure Files can be done using SSE on Azure Storage. For OneDrive encryption, see this article: https://docs.microsoft.com/compliance/assurance/assurance-encryption-for-microsoft-365-services.", - "guid": "0fd32907-98bc-4178-adc5-a06ca7144351", - "link": "https://learn.microsoft.com/azure/virtual-machines/disk-encryption-overview", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Subnet must be called GatewaySubnet", + "guid": "58a027e2-f37f-b540-45d5-e44843aba26b", + "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings", "services": [ - "Storage", - "AKV", - "AVD", - "VM" + "VPN", + "AVS", + "VNet", + "ExpressRoute" ], - "severity": "Low", - "subcategory": "Host Configuration", - "text": "Assess disk encryption requirements for AVD Session Hosts", - "waf": "Security" + "severity": "Medium", + "subcategory": "Hub & Spoke", + "text": "Gateway subnet", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "Trusted launch are Gen2 Azure VMs with enhanced security features aimed to protect against “bottom of the stack” threats through attack vectors such as rootkits, boot kits, and kernel-level malware. Recommended to enable and leverage Secure Boot, Virtual TPM (vTPM) and Integrity Monitoring.", - "guid": "36a5a67f-bb9e-4d5b-9547-8c4479816b28", - "link": "https://learn.microsoft.com/azure/virtual-desktop/security-guide#azure-virtual-desktop-support-for-trusted-launch", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Create a VPN gateway on the hub Gateway subnet", + "guid": "d4806549-0913-3e79-b580-ac2d3706e65a", + "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings", "services": [ - "Monitor", - "AVD", - "VM" + "VPN", + "AVS", + "VNet", + "ExpressRoute" ], "severity": "Medium", - "subcategory": "Host Configuration", - "text": "Enable Trusted launch in Azure Gen2 VM Session Hosts", - "waf": "Security" + "subcategory": "Hub & Spoke", + "text": "VPN Gateway", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "Trusted Launch and Gen2 VM are not only security and performance enhancing features but also system requirements for Windows 11. When building an AVD environment based on Windows 11, it is essential to enable these features.", - "guid": "135d3899-4b31-44d3-bc8f-028871a359d8", - "link": "https://learn.microsoft.com/windows/whats-new/windows-11-requirements", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Create an ExR Gateway in the hub Gateway subnet.", + "guid": "864d7a8b-7016-c769-a717-61af6bfb73d2", + "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings", "services": [ - "AVD", - "VM" + "VPN", + "AVS", + "VNet", + "ExpressRoute" ], - "severity": "High", - "subcategory": "Host Configuration", - "text": "Enable Trusted Launch and use Gen2 image are system requirements for Windows 11", - "waf": "Security" + "severity": "Medium", + "subcategory": "Hub & Spoke", + "text": "ExR Gateway", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "Displayed content will be automatically blocked or hidden in screenshots. Keep in mind screen sharing will also be blocked when using Teams or other collaboration software which use screen sharing.", - "guid": "a49dc137-7896-4343-b2bc-1a31bf1d30b6", - "link": "https://learn.microsoft.com/azure/virtual-desktop/screen-capture-protection", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "How will Internet traffic be routes, Az Firewall, NVA, Secure Hub, On-Premises firewall?", + "guid": "cc2e11b9-7911-7da1-458c-d7fcef794aad", + "link": "https://learn.microsoft.com/azure/azure-vmware/enable-public-internet-access", "services": [ - "AVD" + "AVS", + "NVA" ], - "severity": "Low", - "subcategory": "Host Configuration", - "text": "Consider enabling screen capture protection to prevent sensitive information from being captured", - "waf": "Security" + "severity": "Medium", + "subcategory": "Internet", + "text": "Egress point", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "If not absolutely required, redirecting drives, printers, and USB devices to a user's local device in a remote desktop session should be disabled or highly restricted. Restrict Windows Explorer access by hiding local and remote drive mappings is also a secure measure to adopt preventing users from discovering unwanted information about system configuration and users.", - "guid": "7ce2cd20-85b4-4f82-828e-6558736ede6a", - "link": "https://learn.microsoft.com/azure/virtual-desktop/security-guide#other-security-tips-for-session-hosts", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Allow remote connectivity to AVS via the portal, specifically to vCenter, NSX-T and HCX", + "guid": "71e68ce3-982e-5e56-0191-01100ad0e66f", + "link": "https://learn.microsoft.com/answers/questions/171195/how-to-create-jump-server-in-azure-not-bastion-paa.html", "services": [ - "AVD" + "Bastion", + "AVS" ], "severity": "Medium", - "subcategory": "Host Configuration", - "text": "Restrict device redirection and drive mapping", - "waf": "Security" + "subcategory": "Jumpbox & Bastion", + "text": "Remote connectivity to AVS", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "When choosing a deployment model, you can either provide remote users access to entire virtual desktops or only select applications. Remote applications, or RemoteApps, provide a seamless experience as the user works with apps on their virtual desktop. RemoteApps reduce risk by only letting the user work with a subset of the remote machine exposed by the application.", - "guid": "4e25d70e-3924-44f4-b66f-d6cdd4f4a973", - "link": "https://learn.microsoft.com/microsoft-365/security/defender-endpoint/web-protection-overview", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Name the jumpbox and identify the subnet where it will be hosted", + "guid": "6f8e93a2-44b1-bb1d-28a1-4d5b3c2ea857", + "link": "https://learn.microsoft.com/azure/bastion/tutorial-create-host-portal", "services": [ - "AVD" + "Bastion", + "AVS", + "VNet" ], "severity": "Medium", - "subcategory": "Management", - "text": "When possible, prefer Remote Apps over Full Desktops (DAG)", - "waf": "Security" + "subcategory": "Jumpbox & Bastion", + "text": "Configure a jumbox and Azure Bastion", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "Web content filtering feature provided by Web Protection capability in Microsoft Defender for Endpoint, can be used to to control user web navigation. If this tool is used, configuration of web filtering for user Internet browsing is recommended. Access by the Guest OS system to required AVD control plane URLs must be guaranteed.", - "guid": "e19dd344-29eb-4722-a237-a151c5bb4e4f", - "link": "https://learn.microsoft.com/microsoft-365/security/defender-endpoint/web-protection-overview", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Provides secure / seamless RDP/SSH connectivity to your vm's directly through the portal.", + "guid": "ba430d58-4541-085c-3641-068c00be9bc5", + "link": "https://learn.microsoft.com/azure/virtual-network/network-security-groups-overview", "services": [ - "Defender", - "AVD" + "Bastion", + "AVS", + "VM" ], "severity": "Medium", - "subcategory": "Management", - "text": "Need to control/restrict user Internet navigation from AVD session hosts?", - "waf": "Security" + "subcategory": "Jumpbox & Bastion", + "text": "Security measure allowing RDP access via the portal", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "We recommend you don't grant your users admin access to virtual desktops. If you need software packages, we recommend you make them available through configuration management utilities.", - "guid": "a0cdb3b5-4eb2-4eb0-9dda-a3592718e2ed", - "link": "https://docs.microsoft.com/azure/virtual-desktop/security-guide", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Using a VPN to connect to Azure to enable VMware communications (HCX) (not recommended)", + "guid": "9988598f-2a9f-6b12-9b46-488415ceb325", + "link": "https://learn.microsoft.com/azure/azure-vmware/configure-site-to-site-vpn-gateway", "services": [ - "AVD" + "VPN", + "AVS" ], - "severity": "High", - "subcategory": "Management", - "text": "Ensure AVD users will not have local administrator privileges on AVD Hosts", - "waf": "Security" + "severity": "Medium", + "subcategory": "VPN", + "text": "Connect to Azure using a VPN", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "We recommend you enable Defender for Cloud for the subscriptions, virtual machines, key vaults, and storage accounts used by AVD. With this tool is possible to assess and manage vulnerabilities, assess compliance with common frameworks like PCI, strengthen the overall security of your AVD environment and measure it over time using 'Secure Score': https://learn.microsoft.com/azure/virtual-desktop/security-guide#improve-your-secure-score.", - "guid": "1814387e-5ca9-4c26-a9b3-2ab5bdfc6998", - "link": "https://learn.microsoft.com/azure/virtual-desktop/security-guide#enable-microsoft-defender-for-cloud", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Use the migration assesment tool and timeline to determine bandwidth required (eg 3rd party tool in link)", + "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": [ - "AKV", - "Storage", - "VM", - "AVD", - "Defender", - "Subscriptions" + "VPN", + "AVS" ], "severity": "Medium", - "subcategory": "Management", - "text": "Enable Microsoft Defender for Cloud to manage AVD Session Hosts security posture", - "waf": "Security" + "subcategory": "VPN", + "text": "Bandwidth sizing", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "Enabling audit log collection lets you view user and admin activity related to Azure Virtual Desktop and store in a central repository like Log Analytics workspace. ", - "guid": "a0916a76-4980-4ad0-b278-ee293c1bc352", - "link": "https://learn.microsoft.com/azure/virtual-desktop/security-guide#collect-audit-logs", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "What traffic is routed through a firewall, what goes directly into Azure", + "guid": "e095116f-0bdc-4b51-4d71-b9e469d56f59", + "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/azure-vmware-solution-foundation-networking", "services": [ - "Monitor", - "AVD", - "Entra" + "VPN", + "AVS" ], "severity": "Medium", - "subcategory": "Management", - "text": "Enable diagnostic and audit logging", - "waf": "Security" + "subcategory": "VPN", + "text": "Traffic routing ", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "Assign the least privilege required by defining administrative, operations, and engineering roles to Azure RBAC roles. To limit access to high privilege roles within your Azure Virtual Desktop landing zone, consider integration with Azure Privileged Identity Management (PIM). Maintaining knowledge of which team is responsible for each particular administrative area helps you determine Azure role-based access control (RBAC) roles and configuration.", - "guid": "baaab757-1849-4ab8-893d-c9fc9d1bb73b", - "link": "https://docs.microsoft.com/azure/virtual-desktop/rbac", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Name and unique address space for the vWAN, name for the vWAN hub", + "guid": "4dc480ac-cecd-39c4-fdc6-680b300716ab", + "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-site-to-site-portal#openvwan", "services": [ - "RBAC", - "AVD", - "Entra" + "AVS", + "VWAN" ], - "severity": "Low", - "subcategory": "Management", - "text": "Assess the requirement to use custom RBAC roles for AVD management", - "waf": "Security" + "severity": "Medium", + "subcategory": "vWAN hub", + "text": "vWAN name, hub name and address space", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "AVD users should not have permission to install application. If required, Windows Defender Application Control (WDAC) can be used to control which drivers and applications are allowed to run on their Windows clients. ", - "guid": "b9ea80c8-0628-49fc-ae63-125aa4c0a284", - "link": "https://learn.microsoft.com/azure/virtual-desktop/security-guide#windows-defender-application-control", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Select either boh or the appropriate connection type.", + "guid": "51d6affd-8e02-6aea-d3d4-0baf618b3076", + "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-point-to-site-portal", "services": [ - "Defender", - "AVD" + "VPN", + "AVS", + "VWAN" ], "severity": "Medium", - "subcategory": "Management", - "text": "Restrict users from installing un-authorized applications", - "waf": "Security" + "subcategory": "vWAN hub", + "text": "ExR and/or VPN gateway provisioned", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "Enabling MFA and CA lets you manage risks before you grant users access to your AVD environment. When deciding which users to grant access to, we recommend you also consider who the user is, how they sign in, and which device they're using. Additional details and configuration procedures are provided in the companion article. Microsoft Entra ID is the new name for Azure Active Directory (Azure AD).", - "guid": "916d697d-8ead-4ed2-9bdd-186f1ac252b9", - "link": "https://learn.microsoft.com/azure/virtual-desktop/set-up-mfa", + "category": "Connectivity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Add Azure firewall to vWAN (recommended)", + "guid": "e32a4c67-3dc0-c134-1c12-52d46dcbab5b", + "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-expressroute-portal", "services": [ - "AVD", - "Entra" + "AVS", + "Firewall", + "VWAN" ], "severity": "Medium", - "subcategory": "Microsoft Entra ID", - "text": "Evaluate the usage of Multi-Factor Authentication (MFA) and Conditional Access (CA) for AVD users", + "subcategory": "vWAN hub", + "text": "Secure vWAN", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Virtual Desktop Review", - "description": "If Zero Trust is a requirement, review the companion article in the 'More Info' column. It provides steps to apply the principles of Zero Trust to an Azure Virtual Desktop deployment.", - "guid": "221102d0-90af-49fc-b2b7-8d3fe397e43", - "link": "https://learn.microsoft.com/security/zero-trust/azure-infrastructure-avd", + "category": "Identity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Active directory or other identity provider servers", + "guid": "fbc47fbf-bc96-fa93-ed5d-8c9be63cd5c3", + "link": "https://learn.microsoft.com/azure/azure-vmware/configure-identity-source-vcenter", "services": [ - "AVD" + "Entra", + "AVS" ], "severity": "Medium", - "subcategory": "Zero Trust", - "text": "Review and Apply Zero Trust principles and guidance", + "subcategory": "Access", + "text": "External Identity (user accounts)", "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "If used, make sure to check the list of best practices and recommendations described in the referenced article.", - "guid": "9164e990-9ae2-48c8-9c33-b6b7808bafe6", - "link": "https://learn.microsoft.com/azure/virtual-desktop/fslogix-containers-azure-files#best-practices-for-azure-virtual-desktop", + "category": "Identity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Not required for LDAPS, required for Kerberos", + "guid": "b5db7975-f6bb-8ba3-ee5f-e3e805887997", + "link": "https://learn.microsoft.com/windows-server/identity/ad-ds/plan/understanding-active-directory-site-topology", "services": [ - "Storage", - "AVD" + "Entra", + "AVS" ], "severity": "Medium", - "subcategory": "Azure Files", - "text": "Check best-practices for Azure Files", - "waf": "Performance" + "subcategory": "Access", + "text": "If using AD domain, ensure Sites & Services has been configured", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "SMB Multichannel enables clients to use multiple network connections that provide increased performance while lowering the cost of ownership. Increased performance is achieved through bandwidth aggregation over multiple NICs and utilizing Receive Side Scaling (RSS) support for NICs to distribute the IO load across multiple CPUs.", - "guid": "5784b6ca-5e9e-4bcf-8b54-c95459ea7369", - "link": "https://learn.microsoft.com/azure/storage/files/storage-files-smb-multichannel-performance", + "category": "Identity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Authentication for users, must be secure.", + "guid": "c30749c4-e2af-558c-2eb9-0b6ae84881d1", + "link": "https://learn.microsoft.com/azure/azure-vmware/configure-identity-source-vcenter", "services": [ - "Cost", - "Storage", - "ACR", - "AVD" + "Entra", + "AVS" ], - "severity": "Low", - "subcategory": "Azure Files", - "text": "Enable SMB multichannel when using a premium file share to host FSLogix profile containers.", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Access", + "text": "Use LDAPS not ldap ( vCenter)", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "If a second region is required for DR purposes verify NetApp availability in there as well.", - "guid": "4a359836-ee79-4d6c-9d3a-364a5b7abae3", - "link": "https://azure.microsoft.com/global-infrastructure/services/", + "category": "Identity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Authentication for users, must be secure.", + "guid": "64cb9b5c-9edd-787e-1dd8-2b2338e51635", + "link": "https://learn.microsoft.com/azure/azure-vmware/configure-external-identity-source-nsx-t", "services": [ - "Storage", - "AVD" + "Entra", + "AVS" ], "severity": "Medium", - "subcategory": "Azure NetApp Files", - "text": "If NetApp Files storage is required, check storage service availability in your specific region.", - "waf": "Reliability" + "subcategory": "Access", + "text": "Use LDAPS not ldap (NSX-T)", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "CA option is a recommended setting in the FSLogix scenario, as it enables a more resilient SMB session between the Session Host and NetApp Files.", - "guid": "a2661898-866a-4c8d-9d1f-8cfc86e88024", - "link": "https://learn.microsoft.com/azure/virtual-desktop/create-fslogix-profile-container", + "category": "Identity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "CN or SAN names, no wildcards, contains private key - CER or PFX", + "guid": "bec285ab-037e-d629-81d1-f61dac23cd4c", + "link": "https://youtu.be/4jvfbsrhnEs", "services": [ - "Storage", - "AVD" + "Entra", + "AVS" ], "severity": "Medium", - "subcategory": "Azure NetApp Files", - "text": "If NetApp Files storage is used enable CA (Continuous Availability) option to increase resiliency", - "waf": "Reliability" + "subcategory": "Security", + "text": "Security certificate installed on LDAPS servers ", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "An Active Directory Site should be created for the Azure virtual network environment where Azure NetApp Files (ANF) subnet will be created, and that site name should be specified in the ANF connection property when executing the join procedure as explained in the reference article.", - "guid": "6647e977-db49-48a8-bc35-743f17499d42", - "link": "https://docs.microsoft.com/azure/azure-netapp-files/create-active-directory-connections", + "category": "Identity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Standard Azure Roles Based Access Controls", + "guid": "4ba394a2-3c33-104c-8e34-2dadaba9cc73", + "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-identity", "services": [ - "Storage", - "AVD", - "VNet" + "Entra", + "RBAC", + "AVS" ], - "severity": "High", - "subcategory": "Azure NetApp Files", - "text": "If Azure NetApp Files storage is used, check Active Directory Site name setting in the Active Directory Connection configuration", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Security", + "text": "RBAC applied to Azure roles", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "Possible options: Standard HDD, Standard SSD, or Premium SSD. Ephemeral disks are not supported, Ultra-Disks not recommended. Recommended to evaluate Premium for OS disk if user density is not low, and if Cloud Cache will be used. ", - "guid": "3611c818-b0a0-4bc5-80e4-3a18a9cd289c", - "link": "https://docs.microsoft.com/azure/virtual-machines/disks-types", + "category": "Identity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Create roles in vCenter required to meet minimum viable access guidelines", + "guid": "b04ca129-83a9-3494-7512-347dd2d766db", + "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-identity#view-the-vcenter-server-privileges", "services": [ - "Storage", - "AVD" + "Entra", + "RBAC", + "AVS" ], "severity": "Medium", - "subcategory": "Capacity Planning", - "text": "Determine which type of managed disk will be used for the Session Hosts", - "waf": "Performance" + "subcategory": "Security", + "text": "RBAC model in vCenter", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "Possible options are: Azure NetApp Files, Azure Files, VM based File Server. File-server it is not recommended. Azure Files Premium typically a good starting point. NetApp usually required for large scale / high-performant environment. For a detailed comparison see the article in the 'More Info' column.", - "guid": "ed6b17db-8255-4462-b2ae-e4553afc8339", - "link": "https://docs.microsoft.com/azure/virtual-desktop/store-fslogix-profile", + "category": "Identity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "CloudAdmin account in vCenter IdP is used only as an emergency account (break-glass)", + "guid": "8e477d2f-8004-3dd0-93d6-0aece9e1b2fb", + "link": "Best practice", "services": [ - "Storage", - "AVD", - "VM" + "Entra", + "RBAC", + "AVS" ], - "severity": "High", - "subcategory": "Capacity Planning", - "text": "Determine which storage backend solution will be used for FSLogix Profiles", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Security", + "text": "CloudAdmin role usage", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "Every Host Pool should use a separate set of storage accounts/volumes (at least one) and shares. Users should have a different profile for each Host Pool since settings and configurations are specific to each Host Pool. Additionally, accessing different Host Pools at the same time can cause errors on the shared user profile VHD/X. Usage of different storage accounts/volumes for multiple shares is also recommended to scale independently.", - "guid": "2fad62bd-5004-453c-ace4-64d862e7f5a4", - "link": "https://learn.microsoft.com/azure/virtual-desktop/store-fslogix-profile", + "category": "Identity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "For roles managing the Azure VMware Solution resource in the Azure Portal (no standing permissions allowed)", + "guid": "00e0b729-f9be-f600-8c32-5ec0e8f2ed63", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", "services": [ - "Storage", - "AVD" + "Entra", + "RBAC", + "AVS" ], - "severity": "High", - "subcategory": "Capacity Planning", - "text": "Do not share storage and profiles between different Host Pools", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Security ", + "text": "Is Privileged Identity Management implemented", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "As a starting point for estimating profile container storage performance requirements we recommend to assume 10 IOPS per user in the steady state and 50 IOPS per user during sign-in/sign-out. Space requirements is simply obtained based on the maximum profiles size in FSLogix per the total number of users for each Host Pool. Multiple storage accounts can be used for the same Host Pool if required.", - "guid": "680e7828-9c93-4665-9d02-bff4564b0d93", - "link": "https://learn.microsoft.com/azure/virtual-desktop/faq#what-s-the-largest-profile-size-fslogix-can-handle-", + "category": "Identity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "For the Azure VMware Solution PIM roles", + "guid": "0842d45f-41a8-8274-1155-2f6ed554d315", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", "services": [ - "Storage", - "AVD" + "Entra", + "RBAC", + "AVS" ], - "severity": "High", - "subcategory": "Capacity Planning", - "text": "Verify storage scalability limits and Host Pool requirements", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Security ", + "text": "Is Privileged Identity Management audit reporting implemented", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "Avoid introducing additional latency and costs associated with cross-region network traffic where possible.", - "guid": "8aad53cc-79e2-4e86-9673-57c549675c5e", - "link": "https://docs.microsoft.com/azure/virtual-desktop/fslogix-containers-azure-files", + "category": "Identity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Best practice, also see Monitoring/Alerts", + "guid": "915cbcd7-0640-eb7c-4162-9f33775de559", + "link": "Best practice", "services": [ - "Cost", - "Storage", - "AVD" + "Entra", + "AVS", + "Monitor" ], - "severity": "High", - "subcategory": "Capacity Planning", - "text": "For optimal performance, the storage solution and the FSLogix profile container should be in the same Azure region.", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Security ", + "text": "Limit use of CloudAdmin account to emergency access only", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "The recommendation in Azure Virtual Desktop is to use Profile Container without Office Container (ODFC) split unless you are planning for specific Business Continuity and Disaster Recovery (BCDR) scenarios as described in the Disaster Recovery section below. https://docs.microsoft.com/fslogix/profile-container-office-container-cncpt ", - "guid": "df47d2d9-2881-4b1c-b5d1-e54a29759e39", - "link": "https://learn.microsoft.com/fslogix/concepts-container-types#when-to-use-profile-and-odfc-containers", + "category": "Identity", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Operational procedure", + "guid": "7effa0c0-9172-e8e4-726a-67dbea8be40a", + "link": "https://learn.microsoft.com/azure/azure-vmware/rotate-cloudadmin-credentials?tabs=azure-portal", "services": [ - "Storage", - "AVD", - "ASR" - ], - "severity": "High", - "subcategory": "FSLogix", - "text": "Do not use Office Containers (ODFC) if not strictly required and justified", - "waf": "Reliability" - }, - { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "Make sure to configure the following antivirus exclusions for FSLogix Profile Container virtual hard drives, as documented in the referenced article in the 'More Info' column.", - "guid": "83f63047-22ee-479d-9b5c-3632054b69ba", - "link": "https://learn.microsoft.com/fslogix/overview-prerequisites#configure-antivirus-file-and-folder-exclusions", - "services": [ - "Storage", - "AVD" + "Entra", + "AVS" ], "severity": "Medium", - "subcategory": "FSLogix", - "text": "Configure the recommended antivirus exclusions for FSLogix (includes not scanning VHD(x) files on connect).", + "subcategory": "Security ", + "text": "Is a process defined to regularly rotate cloudadmin (vCenter) and admin (NSX) credentials", "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "Profile containers have a default max size of 30GB. If large Profile Containers are anticipated, and customers wants to try to keep them small, consider using OneDrive to host Office 365 files outside the FSLogix profile.", - "guid": "01e6a84d-e5df-443d-8992-481718d5d1e5", - "link": "https://docs.microsoft.com/fslogix/profile-container-configuration-reference", + "category": "Management", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "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)", + "guid": "8f426fd0-d73b-d398-1f6f-df0cbe262a82", + "link": "https://learn.microsoft.com/azure/azure-arc/vmware-vsphere/overview", "services": [ - "Storage", - "AVD" + "AVS", + "VM", + "Arc" ], - "severity": "High", - "subcategory": "FSLogix", - "text": "Review and confirm configured maximum profile size in FSLogix", - "waf": "Cost" + "severity": "Medium", + "subcategory": "Operations", + "text": "AVS VM Management (Azure Arc)", + "waf": "Operations" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "Defaults and recommended settings are reported in the companion article in the 'More Info' column. If not recommended keys and/or values must be used, be sure to review with a Microsoft AVD expert and clearly document your choices.", - "guid": "d34aad5e-8c78-4e1d-9666-7313c405674c", - "link": "https://learn.microsoft.com/fslogix/concepts-configuration-examples", + "category": "Management", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Use Azure Policy to onboard Azure VMware Solution workloads in the Azure Management, Monitoring and Security solutions", + "guid": "11dbe773-e380-9191-1418-e886fa7a6fd0", + "link": "https://docs.microsoft.com/azure/governance/policy/overview", "services": [ - "Storage", - "ACR", - "AKV", - "AVD" + "AVS", + "AzurePolicy", + "Monitor" ], - "severity": "High", - "subcategory": "FSLogix", - "text": "Review FSLogix registry keys and determine which ones to apply", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Operations", + "text": "Azure policy", + "waf": "Operations" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "Concurrent or multiple connections are not recommended in Azure Virtual Desktop. Concurrent connections are also not supported by Session Hosts running in an Azure Virtual Desktop Host Pool. OneDrive, if used, doesn't support concurrent or multiple connections using the same container, under any circumstance. For multiple connections, usage of the same profile disk is not recommended.", - "guid": "5e985b85-9c77-43e7-b261-623b775a917e", - "link": "https://learn.microsoft.com/fslogix/concepts-multi-concurrent-connections", + "category": "Management", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "For manual deployments, consider implementing resource locks to prevent accidental actions on your Azure VMware Solution Private Cloud", + "guid": "1e59c639-9b7e-a60b-5e93-3798c1aff5db", + "link": "https://docs.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json#configure-locks", "services": [ - "Storage", - "AVD" + "AVS" ], - "severity": "High", - "subcategory": "FSLogix", - "text": "Avoid usage of concurrent or multiple connections", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Operations", + "text": "Resource locks", + "waf": "Operations" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "Cloud Cache uses OS drive as local cache storage and may generate lot of pressure on the VM disk. Depending on the VM SKU and size used, the VM temporary drive can be a viable and performant solution where to relocate Cloud Cache cached content. Before adopting this solution, tests should be executed to confirm performance and stability. More details on Cloud Cache can be found here: https://learn.microsoft.com/fslogix/concepts-fslogix-cloud-cache. ", - "guid": "b2d1215a-e114-4ba3-9df5-85ecdcd9bd3b", - "link": "https://docs.microsoft.com/fslogix/cloud-cache-configuration-reference", + "category": "Management", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "For manual deployments, all configuration and deployments must be documented", + "guid": "8f2c46aa-ca1b-cad3-3ac9-213dfc0a265e", + "link": "Make sure to create your own runbook on the deployment of AVS.", "services": [ - "Storage", - "AVD", - "VM" + "AVS" ], - "severity": "Low", - "subcategory": "FSLogix", - "text": "If FSLogix Cloud Cache is used, consider moving the cache directory to the VM temporary drive.", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Operations", + "text": "Run books", + "waf": "Operations" }, { - "category": "Storage", - "checklist": "Azure Virtual Desktop Review", - "description": "REDIRECTION.XML file is used to control what folders are redirected out of the profile container to the 'C:' drive. Exclusions should be the exception and should never be used unless the specific exclusion is completely understood by the person configuring the exclusion. Exclusions should always be fully tested in the environment where they are intended to be implemented. Configuring exclusions may impact functionality, stability and performance.", - "guid": "0b50ca97-b1d2-473c-b4d9-6e98b0f912de", - "link": "https://docs.microsoft.com/fslogix/manage-profile-content-cncpt#redirectionsxml", + "category": "Management", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Implement human understandable names for ExR authorization keys to allow for easy identification of the keys purpose/use", + "guid": "86b314f9-1f1e-317a-4dfb-cf510ad4a030", + "link": "https://docs.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", "services": [ - "Storage", - "AVD" + "AKV", + "AVS" ], "severity": "Medium", - "subcategory": "FSLogix", - "text": "Review the usage of FSLogix redirection.", - "waf": "Cost" - }, - { - "category": "BC and DR", - "checklist": "Container Apps Review", - "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": [], - "severity": "High", - "subcategory": "High Availability", - "text": "Leverage Availability Zones if regionally applicable", - "waf": "Reliability" - }, - { - "category": "BC and DR", - "checklist": "Container Apps Review", - "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": [], - "severity": "High", - "subcategory": "High Availability", - "text": "Use more than one replica and enable Zone Redundancy.", - "waf": "Reliability" - }, - { - "category": "BC and DR", - "checklist": "Container Apps Review", - "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": [], - "severity": "High", - "subcategory": "High Availability", - "text": "For cross-region DR, deploy container apps in multiple regions and follow active/active or active/passive application guidance.", - "waf": "Reliability" + "subcategory": "Operations", + "text": "Naming conventions for auth keys", + "waf": "Operations" }, { - "category": "BC and DR", - "checklist": "Container Apps Review", - "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", + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "For automatic alerting on Azure VMware Solution performance (CPU >80%, Avg Memory >80%, vSAN >70%)", + "guid": "e22a2d99-eb71-7d7c-07af-6d4cdb1d4443", + "link": "https://docs.microsoft.com/azure/azure-vmware/configure-alerts-for-azure-vmware-solution", "services": [ - "FrontDoor", - "TrafficManager" + "AVS", + "Monitor" ], - "severity": "High", - "subcategory": "High Availability", - "text": "Use Front Door or Traffic Manager to route traffic to the closest region", - "waf": "Reliability" - }, - { - "category": "BC and DR", - "checklist": "Azure Function Review", - "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": [], - "severity": "High", - "subcategory": "High Availability", - "text": "Select the right Function hosting plan based on your business & SLO requirements", - "waf": "Reliability" - }, - { - "category": "BC and DR", - "checklist": "Azure Function Review", - "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": [], - "severity": "High", - "subcategory": "High Availability", - "text": "Leverage Availability Zones where regionally applicable (not available for Consumption tier)", - "waf": "Reliability" - }, - { - "category": "BC and DR", - "checklist": "Azure Function Review", - "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": [], "severity": "Medium", - "subcategory": "High Availability", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" + "subcategory": "Alerts", + "text": "Create warning alerts for critical thresholds ", + "waf": "Operations" }, { - "category": "BC and DR", - "checklist": "Azure Function Review", - "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "Azure Functions", + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "for automatic alerting on Azure VMware Solution performance (CPU >80%, Avg Memory >80%, vSAN >70%)", + "guid": "6d02f159-627d-79bf-a931-fab6d947eda2", + "link": "https://docs.microsoft.com/azure/azure-vmware/configure-alerts-for-azure-vmware-solution", "services": [ - "AppSvc" + "AVS", + "Monitor" ], - "severity": "High", - "subcategory": "High Availability", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Alerts", + "text": "Create critical alert vSAN consumption", + "waf": "Operations" }, { - "category": "BC and DR", - "checklist": "Azure Function Review", - "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "Azure Functions", + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Provides platform alerts (generated by Microsoft)", + "guid": "1cc97b39-2c7e-246f-6d73-789cfebfe951", + "link": "https://www.virtualworkloads.com/2021/04/azure-vmware-solution-azure-service-health/", "services": [ - "AppSvc" + "AVS", + "Monitor" ], - "severity": "High", - "subcategory": "High Availability", - "text": "Ensure 'Always On' is enabled for all Function Apps running on App Service Plan", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Alerts", + "text": "Configured for Azure Service Health alerts and notifications", + "waf": "Operations" }, { - "category": "BC and DR", - "checklist": "Azure Function Review", - "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", + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Ensure you have a documented and implemented backup policy and solution for Azure VMware Solution VM workloads", + "guid": "0962606c-e3b4-62a9-5661-e4ffd62a4509", + "link": "https://docs.microsoft.com/azure/azure-vmware/set-up-backup-server-for-azure-vmware-solution", "services": [ - "Storage" + "Backup", + "AVS", + "VM", + "AzurePolicy", + "Monitor" ], "severity": "Medium", - "subcategory": "High Availability", - "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" + "subcategory": "Backup", + "text": "Backup policy", + "waf": "Operations" }, { - "category": "Application Deployment", - "checklist": "Azure Function Review", - "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "Azure Functions", - "services": [], + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Keep in mind the lead time for requesting new nodes", + "guid": "4ec7ccfb-795e-897e-4a84-fd31c04eadc6", + "link": "https://docs.microsoft.com/azure/azure-vmware/configure-alerts-for-azure-vmware-solution", + "services": [ + "AVS", + "AzurePolicy", + "Monitor" + ], "severity": "Medium", - "subcategory": "CI/CD", - "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Function App code", + "subcategory": "Capacity", + "text": "Policy around ESXi host density and efficiency", "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", + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Azure Cost Management can be used - one option, put AVS in it's own Subscription. ", + "guid": "7f8f175d-13f4-5298-9e61-0bc7e9fcc279", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/govern", "services": [ - "WAF" + "AVS", + "Cost", + "Subscriptions", + "Monitor" ], - "severity": "High", - "text": "Leverage Availability Zones if regionally applicable (this is automatically enabled).", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Costs", + "text": "Ensure a good cost management process is in place for Azure VMware Solution - ", + "waf": "Operations" }, { - "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", + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Create dashboards to enable core Azure VMware Solution monitoring insights", + "guid": "01e689e0-7c6c-b58f-37bd-4d6b9b1b9c74", + "link": "https://docs.microsoft.com/azure/azure-portal/azure-portal-dashboards", "services": [ - "WAF" + "Monitor", + "AVS", + "NetworkWatcher" ], - "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" + "severity": "Medium", + "subcategory": "Dashboard", + "text": "Connection monitor dashboard", + "waf": "Operations" }, { - "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", + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Send to an Azure Storage account or Azure EventHub for processing (direct to Log Analytics is pending)", + "guid": "f9afdcc9-649d-d840-9fb5-a3c0edcc697d", + "link": "https://docs.microsoft.com/azure/azure-vmware/configure-vmware-syslogs", "services": [ - "WAF" + "AVS", + "Storage", + "Monitor" ], - "severity": "High", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Logs & Metrics", + "text": "Configure Azure VMware Solution logging ", + "waf": "Operations" }, { - "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", + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Must be on-premises, implement if available", + "guid": "7cbac8c3-4eda-d5d9-9bda-c6b5abba9fb6", + "link": "Is vROPS or vRealize Network Insight going to be used? ", "services": [ - "WAF", - "AppSvc" + "AVS", + "Monitor" ], - "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Logs & Metrics", + "text": "vRealize Operations", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "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", + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Ensure workloads running on Azure VMware Solution are monitored using Azure Log Analytics and Azure Monitor", + "guid": "b243521a-644d-f865-7fb6-21f9019c0dd2", + "link": "https://docs.microsoft.com/azure/azure-vmware/configure-vmware-syslogs", "services": [ - "WAF", - "Entra" + "AVS", + "VM", + "Monitor" ], "severity": "Medium", - "text": "Use one Entra tenant for managing your Azure resources, unless you have a clear regulatory or business requirement for multi-tenants.", + "subcategory": "Logs & Metrics", + "text": "AVS VM logging", "waf": "Operations" }, { - "checklist": "WAF checklist", - "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", + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Between on-premises to Azure are monitored using 'connection monitor'", + "guid": "2ca97d91-dd36-7229-b668-01036ccc3cd3", + "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-create-using-portal", "services": [ - "WAF", - "Entra" + "NetworkWatcher", + "AVS", + "VPN", + "Monitor", + "ExpressRoute" ], - "severity": "Low", - "text": "Use Multi-Tenant Automation approach to managing your Microsoft Entra ID Tenants.", + "severity": "Medium", + "subcategory": "Network", + "text": "Monitor ExpressRoute and/or VPN connections ", "waf": "Operations" }, { - "checklist": "WAF checklist", - "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", + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "To monitor the Azure VMware Solution back-end ExpressRoute connection (Azure native to AVS)", + "guid": "99209143-60fe-19f0-5633-8b5671277ba5", + "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-create-using-portal", "services": [ - "WAF" + "AVS", + "ExpressRoute", + "Monitor" ], - "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", + "severity": "Medium", + "subcategory": "Network", + "text": "Monitor from an Azure native resource to an Azure VMware Solution VM", "waf": "Operations" }, { - "checklist": "WAF checklist", - "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", + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "To monitor end-to-end, on-premises to AVS workloads", + "guid": "b9e5867c-57d3-036f-fb1b-3f0a71664efe", + "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-create-using-portal", "services": [ - "WAF" + "AVS", + "Monitor" ], - "severity": "High", - "text": "If you give a partner access to administer your tenant, use Azure Lighthouse.", - "waf": "Cost" + "severity": "Medium", + "subcategory": "Network", + "text": "Monitor from an on-premises resource to an Azure VMware Solution VM", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "348ef254-c27d-442e-abba-c7571559ab91", - "link": "https://learn.microsoft.com/azure/role-based-access-control/overview", - "service": "Entra", + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Track requests to Azure VMware Solution and Azure VMware Solution based workloads", + "guid": "4af7c5f7-e5e9-bedf-a8cf-314b81735962", + "link": "Firewall logging and alerting rules are configured (Azure Firewall or 3rd party)", "services": [ - "RBAC", - "ACR", - "WAF", - "Subscriptions" + "AVS", + "Monitor" ], - "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" + "severity": "Medium", + "subcategory": "Security", + "text": "Auditing and logging is implemented for inbound internet ", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "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", + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Implemented for outbound internet connections from Azure VMware Solution or Azure VMware Solution based workloads to identify suspicious/malicious activity", + "guid": "74be60a3-cfac-f057-eda6-3ee087e805d5", + "link": "https://docs.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/eslz-network-topology-connectivity", "services": [ - "WAF" + "AVS", + "Monitor" ], - "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" + "severity": "Medium", + "subcategory": "Security", + "text": "Session monitoring ", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "4b69bad3-3aad-45e8-a68e-1d76667313b4", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", - "service": "Entra", + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Enable Diagnostic and metric logging on Azure VMware Solution", + "guid": "a434b3b5-f258-0845-cd76-d7df6ef5890e", + "link": "https://docs.microsoft.com/azure/azure-vmware/configure-vmware-syslogs", "services": [ - "WAF", - "Entra" + "AVS", + "Monitor" ], "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" + "subcategory": "VMWare", + "text": "Logging and diagnostics", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "53e8908a-e28c-484c-93b6-b7808b9fe5c4", - "link": "https://learn.microsoft.com/azure/active-directory/conditional-access/overview", - "service": "Entra", - "services": [ - "AzurePolicy", - "WAF", - "Entra" + "category": "Monitoring", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Monitor AVS workloads (each VM in AVS)", + "guid": "fb00b69a-83ec-ce72-446e-6c23a0cab09a", + "link": "https://docs.microsoft.com/azure/azure-monitor/agents/agent-windows?tabs=setup-wizard", + "services": [ + "AVS", + "VM", + "Monitor" ], - "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" + "severity": "Medium", + "subcategory": "VMware", + "text": "Log Analytics Agents deployed on Azure VMware Solution guest VM workloads", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "1049d403-a923-4c34-94d0-0018ac6a9e01", - "link": "https://learn.microsoft.com/azure/active-directory/authentication/concept-mfa-howitworks", - "service": "Entra", + "category": "Networking", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Decision on traffic flow", + "guid": "a1354b87-e18e-bf5c-c50b-8ddf0540e971", + "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-hub-and-spoke", "services": [ - "WAF" + "AVS" ], - "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/", + "severity": "Medium", + "subcategory": "Hub & Spoke", + "text": "North/South routing through Az Firewall or 3rd party ", "waf": "Security" }, { - "checklist": "WAF checklist", - "guid": "14658d35-58fd-4772-99b8-21112df27ee4", - "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", - "service": "Entra", + "category": "Networking", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Decision to route Azure to Azure traffic through Firewall, not E/W between AVS workloads (internal to AVS)", + "guid": "29a8a499-ec31-f336-3266-0895f035e379", + "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-hub-and-spoke", "services": [ - "WAF", - "Entra" + "AVS" ], "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/", + "subcategory": "Hub & Spoke", + "text": "East West (Internal to Azure)", "waf": "Security" }, { - "checklist": "WAF checklist", - "guid": "8b9fe5c4-1049-4d40-9a92-3c3474d00018", - "link": "https://learn.microsoft.com/en-us/entra/identity/domain-services/overview", - "service": "Entra", + "category": "Networking", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Requires a 3rd party NVA with Azure Route server - Scenario 2 (see link)", + "guid": "ebd3cc3c-ac3d-4293-950d-cecd8445a523", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/eslz-network-topology-connectivity", "services": [ - "WAF", - "Entra" + "ARS", + "AVS", + "NVA" ], "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" + "subcategory": "Hub & Spoke", + "text": "ExR without Global Reach", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "1cf0b8da-70bd-44d0-94af-8d99cfc89ae1", - "link": "https://learn.microsoft.com/azure/active-directory/reports-monitoring/concept-activity-logs-azure-monitor", - "service": "Entra", + "category": "Networking", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "When route server is used, ensure no more then 200 routes are propagated from route server to ExR gateway to on-premises (ARS limit). Important when using MoN", + "guid": "ffb5c5ca-bd89-ff1b-8b73-8a54d503d506", + "link": "https://learn.microsoft.com/azure/route-server/route-server-faq", "services": [ - "Monitor", - "WAF", - "Entra" + "ARS", + "AVS" ], "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.", - "waf": "Security" + "subcategory": "Hub & Spoke", + "text": "Route server ", + "waf": "Operations" }, { - "ammp": true, - "checklist": "WAF checklist", - "guid": "984a859c-773e-47d2-9162-3a765a917e1f", - "link": "https://learn.microsoft.com/azure/active-directory/roles/security-emergency-access", - "service": "Entra", + "category": "Networking", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Via on-premises, Az Firewall, 3rd Party, NSX-T pubic IP", + "guid": "a4070dad-3def-818d-e9f7-be440d10e7de", + "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-design-public-internet-access", "services": [ - "WAF" + "AVS" ], - "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/", + "severity": "Medium", + "subcategory": "Internet", + "text": "Egress point(s)", "waf": "Security" }, { - "checklist": "WAF checklist", - "guid": "35037e68-9349-4c15-b371-228514f4cdff", - "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", - "service": "Entra", + "category": "Networking", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Az Firewall, 3rd party NVA, Application Gateway, Azure Frontdoor ", + "guid": "e942c03d-beaa-3d9f-0526-9b26cd5e9937", + "link": "Research and choose optimal solution for each application", "services": [ - "RBAC", - "WAF", - "Entra" + "AVS", + "AppGW", + "NVA", + "FrontDoor" ], "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/", + "subcategory": "Internet", + "text": "Internet facing applications", "waf": "Security" }, { - "checklist": "WAF checklist", - "guid": "d5d1e4e6-1465-48d3-958f-d77249b82111", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", - "service": "Entra", + "category": "Networking", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Ensure no more then 200 routes are propagated from route server to ExR gateway to on-premises (ARS limit). Important when using MoN", + "guid": "e778a2ec-b4d7-1d27-574c-14476b167d37", + "link": "https://docs.microsoft.com/azure/route-server/route-server-faq#route-server-limits", "services": [ - "WAF", - "Entra" + "ARS", + "AVS" ], "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/", + "subcategory": "Routing", + "text": "When route server Route limit understood? ", "waf": "Security" }, { - "arm-service": "Microsoft.Network/virtualNetworks", - "checklist": "WAF checklist", - "guid": "e8bbac75-7155-49ab-a153-e8908ae28c84", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/enterprise-scale/network-topology-and-connectivity", - "service": "VNet", + "category": "Networking", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "(VPN Gateway, AppGW, FrontDoor, Load balancer, VMs (etc) (Remove: enabled on ExR/VPN Gateway subnet in Azure)", + "guid": "66c97b30-81b9-139a-cc76-dd1d94aef42a", + "link": "https://docs.microsoft.com/azure/ddos-protection/manage-ddos-protection", "services": [ - "WAF", + "AppGW", + "DDoS", + "AVS", + "VM", + "VPN", + "LoadBalancer", + "FrontDoor", + "ExpressRoute", "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/", + "subcategory": "Security", + "text": "Is DDoS standard protection of public facing IP addresses? ", "waf": "Security" }, { - "arm-service": "Microsoft.Network/virtualNetworks", - "checklist": "WAF checklist", - "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", + "category": "Networking", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "To manage Azure VMware Solution, vCenter, NSX manager and HCX manager", + "guid": "d43da920-4ecc-a4e9-dd45-a2986ce81d32", + "link": "Best practice: Bastion or 3rd party tool", "services": [ - "DNS", - "ExpressRoute", - "VPN", - "NVA", - "VNet", - "Entra", - "WAF", - "Firewall" + "AVS" ], - "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.", - "waf": "Cost" + "severity": "Medium", + "subcategory": "Security", + "text": "Use a dedicated privileged access workstation (PAW)", + "waf": "Security" }, { - "arm-service": "Microsoft.Network/virtualNetworks", - "checklist": "WAF checklist", - "guid": "143b16c3-1d7a-4a9b-9470-4489a8042d88", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "VNet", + "category": "Networking", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Use NSX-T for inter-vmware-traffic inspection", + "guid": "a2dac74f-5380-6e39-25e6-f13b99ece51f", + "link": "https://docs.vmware.com/en/VMware-NSX-T-Data-Center/3.2/administration/GUID-F6685367-7AA1-4771-927E-ED77727CFDA3.html", "services": [ - "DDoS", - "WAF" + "AVS" ], - "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/", + "severity": "Medium", + "subcategory": "Traffic Inspection", + "text": "East West (Internal to AVS)", "waf": "Security" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "e2e8abac-3571-4559-ab91-53e89f89dc7b", - "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/nva-ha", - "service": "NVA", + "category": "Networking", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Decision on whether or not to use Secure hub for E/W and Internet traffic - requires Global Reach", + "guid": "3f621543-dfac-c471-54a6-7b2849b6909a", + "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", "services": [ - "WAF", - "NVA" + "AVS", + "Firewall", + "VWAN" ], "severity": "Medium", - "text": "When deploying partner networking technologies or NVAs, follow the partner vendor's guidance.", - "waf": "Reliability" + "subcategory": "Virtual WAN", + "text": "Use Secure Hub (Azure Firewall or 3rd party)", + "waf": "Security" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "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", + "category": "Networking", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Decision to route Azure to Azure traffic through Firewall, not E/W between AVS workloads (internal to AVS)", + "guid": "d7af5670-1b39-d95d-6da2-8d660dfbe16b", + "link": "https://learn.microsoft.com/azure/firewall-manager/secure-cloud-network", "services": [ - "VPN", - "ExpressRoute", - "WAF", - "ARS" + "AVS", + "VWAN" ], - "severity": "Low", - "text": "If you need transit between ExpressRoute and VPN gateways in hub and spoke scenarios, use Azure Route Server.", + "severity": "Medium", + "subcategory": "Virtual WAN", + "text": "East West (Internal to Azure)", "waf": "Security" }, { - "arm-service": "Microsoft.Network/virtualHubs", - "checklist": "WAF checklist", - "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", + "category": "Other Services/Operations", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "When intending to use automated scale-out, be sure to apply for sufficient Azure VMware Solution quota for the subscriptions running Azure VMware Solution", + "guid": "7d049005-eb35-4a93-50a5-3b31a9f61161", + "link": "https://docs.microsoft.com/azure/azure-vmware/configure-nsx-network-components-azure-portal", "services": [ - "WAF", - "ARS", - "VNet" + "AVS", + "Subscriptions" ], - "severity": "Low", - "text": "If using Route Server, use a /27 prefix for the Route Server subnet.", - "waf": "Security" + "severity": "Medium", + "subcategory": "Automated Scale", + "text": "Scale out operations planning", + "waf": "Performance" }, { - "arm-service": "Microsoft.Network/virtualNetworks", - "checklist": "WAF checklist", - "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", + "category": "Other Services/Operations", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "When intending to use automated scale-in, be sure to take storage policy requirements into account before performing such action", + "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": [ - "ACR", - "WAF", - "VNet" + "AVS", + "AzurePolicy", + "Storage" ], "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/", + "subcategory": "Automated Scale", + "text": "Scale in operations planning", "waf": "Performance" }, { - "arm-service": "Microsoft.Network/virtualNetworks", - "checklist": "WAF checklist", - "guid": "4722d929-c1b1-4cd6-81f5-4b29bade39ad", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/network-insights-overview", - "service": "VNet", + "category": "Other Services/Operations", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "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)", + "guid": "3233e49e-62ce-97f3-8737-8230e771b694", + "link": "https://docs.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/eslz-platform-automation-and-devops#automated-scale", "services": [ - "Monitor", - "WAF" + "AVS" ], "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" + "subcategory": "Automated Scale", + "text": "Scale serialized operations planning", + "waf": "Performance" }, { - "arm-service": "Microsoft.Network/virtualNetworks", - "checklist": "WAF checklist", - "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", + "category": "Other Services/Operations", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Consider and validate scaling operations on 3rd party solutions used in the architecture (supported or not)", + "guid": "68161d66-5707-319b-e77d-9217da892593", + "link": "Best practice (testing)", "services": [ - "ExpressRoute", - "WAF", - "VNet" + "AVS" ], "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).", - "waf": "Reliability" + "subcategory": "Automated Scale", + "text": "Scale rd operations planning", + "waf": "Performance" }, { - "arm-service": "Microsoft.Network/virtualNetworks", - "checklist": "WAF checklist", - "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", + "category": "Other Services/Operations", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Define and enforce scale in/out maximum limits for your environment in the automations", + "guid": "c32cb953-e860-f204-957a-c79d61202669", + "link": "Operational planning - understand workload requirements", "services": [ - "Storage", - "WAF" + "AVS" ], "severity": "Medium", - "text": "Limit the number of routes per route table to 400.", - "waf": "Reliability" + "subcategory": "Automated Scale", + "text": "Scale maximum operations planning", + "waf": "Performance" }, { - "arm-service": "Microsoft.Network/virtualNetworks", - "checklist": "WAF checklist", - "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", + "category": "Other Services/Operations", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Implement monitoring rules to monitor automated scaling operations and monitor success and failure to enable appropriate (automated) responses", + "guid": "7bd65a5e-7b5d-652d-dbea-fc6f73a42857", + "link": "https://docs.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/eslz-management-and-monitoring", "services": [ - "WAF", - "VNet" + "AVS", + "Monitor" ], - "severity": "High", - "text": "Use the setting 'Allow traffic to remote virtual network' when configuring VNet peerings.", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Automated Scale", + "text": "Monitor scaling operations ", + "waf": "Performance" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "de0d5973-cd4c-4d21-a088-137f5e6c4cfd", - "link": "https://learn.microsoft.com/azure/expressroute/expressroute-howto-macsec", - "service": "ExpressRoute", + "category": "Other Services/Operations", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Consider the use of Azure Private-Link when using other Azure Native Services", + "guid": "95e374af-8a2a-2672-7ab7-b4a1be43ada7", + "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", "services": [ - "ExpressRoute", - "WAF" + "PrivateLink", + "AVS" ], "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.", - "waf": "Security" + "subcategory": "Networking", + "text": "Private link", + "waf": "Performance" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "ed301d6e-872e-452e-9611-cc58b5a4b151", - "link": "https://learn.microsoft.com/azure/vpn-gateway/site-to-site-vpn-private-peering", - "service": "ExpressRoute", + "category": "Other Services/Operations", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "When performing automated configuration of NSX-T segments with a single Tier-1 gateway, use Azure Portal APIs instead of NSX-Manager APIs", + "guid": "71eff90d-5ad7-ac60-6244-2a6f7d3c51f2", + "link": "Best practice", "services": [ - "VPN", - "ExpressRoute", - "WAF" + "AVS" ], "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" + "subcategory": "Networking", + "text": "Provisioning Vmware VLANs", + "waf": "Performance" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "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", + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "In which region will AVS be deployed", + "guid": "04e3a2f9-83b7-968a-1044-2811811a924b", + "link": "https://learn.microsoft.com/windows-server/identity/ad-ds/plan/understanding-active-directory-site-topology", "services": [ - "ACR", - "WAF" + "AVS" ], - "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" + "severity": "Medium", + "subcategory": "Pre-deployment", + "text": "Region selected", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/virtualNetworks", - "checklist": "WAF checklist", - "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", + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Are there regulatory or compliance policies in play", + "guid": "e52d1615-9cc6-565c-deb6-743ed7e90f4b", + "link": "Internal policy or regulatory compliance", "services": [ - "WAF" + "AVS", + "AzurePolicy" ], "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" + "subcategory": "Pre-deployment", + "text": "Data residency compliant with selected regions", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/virtualNetworks", - "checklist": "WAF checklist", - "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", + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Request through the support blade", + "guid": "92bd5ad6-441f-a983-7aa9-05dd669d760b", + "link": "https://learn.microsoft.com/azure/migrate/concepts-azure-vmware-solution-assessment-calculation", "services": [ - "WAF", - "VNet" + "AVS" ], - "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" + "severity": "Medium", + "subcategory": "Pre-deployment", + "text": "Request for number of AVS hosts submitted ", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/virtualNetworks", - "checklist": "WAF checklist", - "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", + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "PG approval for deployment", + "guid": "28370f63-1cb8-2e35-907f-c5516b6954fa", + "link": "Support request through portal or get help from Account Team", "services": [ - "WAF", - "ASR" + "AVS" ], - "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/", + "severity": "Medium", + "subcategory": "Pre-deployment", + "text": "Region and number of AVS nodes approved", "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/dnsZones", - "checklist": "WAF checklist", - "guid": "153e8908-ae28-4c84-a33b-6b7808b9fe5c", - "link": "https://learn.microsoft.com/azure/dns/private-dns-getstarted-portal", - "service": "DNS", + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Portal/subscription/resource providers/ Microsoft.AVS", + "guid": "96c76997-30a6-bb92-024d-f4f93f5f57fa", + "link": "Done through the subscription/resource providers/ AVS register in the portal", "services": [ - "DNS", - "WAF" + "AVS", + "Subscriptions" ], "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" + "subcategory": "Pre-deployment", + "text": "Resource provider for AVS registered", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/dnsZones", - "checklist": "WAF checklist", - "guid": "41049d40-3a92-43c3-974d-00018ac6a9e0", - "link": "https://learn.microsoft.com/azure/dns/dns-private-resolver-overview", - "service": "DNS", + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Connectivity, subscription & governanace model", + "guid": "5898e3ff-5e6b-bee1-6f85-22fee261ce63", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/enterprise-scale-landing-zone", "services": [ - "DNS", - "ACR", - "WAF" + "AVS", + "Subscriptions" ], "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" + "subcategory": "Pre-deployment", + "text": "Landing zone architecture", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/dnsZones", - "checklist": "WAF checklist", - "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", + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "The name of the RG where AVS will exist", + "guid": "d0181fb8-9cb8-bf4b-f5e5-b5f9bf7ae4ea", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/manage-resource-groups-portal", "services": [ - "DNS", - "WAF" + "AVS" ], - "severity": "Low", - "text": "Special workloads that require and deploy their own DNS (such as Red Hat OpenShift) should use their preferred DNS solution.", - "waf": "Operations" + "severity": "Medium", + "subcategory": "Pre-deployment", + "text": "Resource group name selected", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/dnsZones", - "checklist": "WAF checklist", - "guid": "614658d3-558f-4d77-849b-821112df27ee", - "link": "https://learn.microsoft.com/azure/dns/private-dns-autoregistration", - "service": "DNS", + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Each resource created as part of the deployment will also utilize this prefix in the name", + "guid": "0f0d20c2-5a19-726c-de20-0984e070d9d6", + "link": "Best practice - naming standards", "services": [ - "DNS", - "WAF", - "VNet", - "VM" + "AVS" ], - "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" + "severity": "Medium", + "subcategory": "Pre-deployment", + "text": "Deployment prefix selected", + "waf": "Reliability" }, { - "arm-service": "microsoft.network/bastionHosts", - "checklist": "WAF checklist", - "guid": "ee1ac551-c4d5-46cf-b035-d0a3c50d87ad", - "link": "https://learn.microsoft.com/azure/bastion/bastion-overview", - "service": "Bastion", + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "/22 unique non-overlapping IPv4 address space", + "guid": "7fbf2ab7-a36c-5957-c27a-67038557af2a", + "link": "https://learn.microsoft.com/azure/azure-vmware/tutorial-network-checklist#routing-and-subnet-considerations", "services": [ - "Bastion", - "WAF" + "AVS" ], "severity": "Medium", - "text": "Use Azure Bastion to securely connect to your network.", - "waf": "Security" + "subcategory": "Pre-deployment", + "text": "Network space for AVS management layer", + "waf": "Reliability" }, { - "arm-service": "microsoft.network/bastionHosts", - "checklist": "WAF checklist", - "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", + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "vNets used by workloads running in AVS (non-stretched)", + "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": [ - "Bastion", - "WAF", + "AVS", "VNet" ], "severity": "Medium", - "text": "Use Azure Bastion in a subnet /26 or larger.", - "waf": "Security" + "subcategory": "Pre-deployment", + "text": "Network space for AVS NSX-T segments", + "waf": "Reliability" }, { - "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", - "checklist": "WAF checklist", - "guid": "1d7aa9b6-4704-4489-a804-2d88e79d17b7", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", - "service": "WAF", + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Choose AV36, AV36P, AV52, AV36T (AV36T = Trial)", + "guid": "946c8966-f902-6f53-4f37-00847e8895c2", + "link": "https://azure.microsoft.com/pricing/details/azure-vmware/", "services": [ - "AzurePolicy", - "ACR", - "WAF", - "FrontDoor" + "AVS" ], "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" + "subcategory": "Pre-deployment", + "text": "AVS SKU (region dependent)", + "waf": "Performance" }, { - "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", - "checklist": "WAF checklist", - "guid": "3b22a5a6-7e7a-48ed-9b30-e38c3f29812b", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "WAF", - "services": [ - "AzurePolicy", - "AppGW", - "WAF", - "FrontDoor" + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Use the Azure migration assessment tool to determine the minimum number of nodes required (consider BCDR as well)", + "guid": "31833808-26ba-9c31-416f-d54a89a17f5d", + "link": "https://learn.microsoft.com/azure/migrate/how-to-assess", + "services": [ + "AVS" ], - "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" + "severity": "Medium", + "subcategory": "Pre-deployment", + "text": "Number of hosts to be deployed", + "waf": "Performance" }, { - "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", - "checklist": "WAF checklist", - "guid": "2363cefe-179b-4599-be0d-5973cd4cd21b", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "WAF", + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Understand how and if you should be using reserved instances (cost control)", + "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": [ - "WAF", - "VNet" + "AVS", + "Cost" ], - "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" + "severity": "Medium", + "subcategory": "Pre-deployment", + "text": "Reserverd Instances", + "waf": "Cost" }, { - "arm-service": "Microsoft.Network/virtualNetworks", - "checklist": "WAF checklist", - "guid": "088137f5-e6c4-4cfd-9e50-4547c2447ec6", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-reference-architectures", - "service": "VNet", + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Ensure that you have requested enough quota, ensuring you have considered growth and Disaster Recovery requirement", + "guid": "94ac48ab-ade5-3fa7-f800-263feeb97070", + "link": "https://docs.microsoft.com/azure/azure-vmware/concepts-storage#storage-policies-and-fault-tolerance", "services": [ - "DDoS", - "WAF", - "VNet" + "AVS", + "ASR" ], - "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" + "severity": "Medium", + "subcategory": "Pre-deployment", + "text": "Capacity ", + "waf": "Performance" }, { - "arm-service": "Microsoft.Network/virtualNetworks", - "checklist": "WAF checklist", - "guid": "b034c01e-110b-463a-b36e-e3346e57f225", - "link": "https://learn.microsoft.com/azure/virtual-network/ip-services/default-outbound-access", - "service": "VNet", + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Identify which of the networking scenarios make ", + "guid": "1f9d4bd5-14b8-928c-b4cb-eb211f9b8de5", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/eslz-network-topology-connectivity", "services": [ - "WAF" + "AVS" ], - "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.", + "severity": "Medium", + "subcategory": "Pre-deployment", + "text": "Networking & Connectivity See docs describing scenrario 1 through 5", "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/virtualNetworks", - "checklist": "WAF checklist", - "guid": "b1c82a3f-2320-4dfa-8972-7ae4823c8930", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-reference-architectures", - "service": "VNet", + "category": "Planning", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Ensure that access constraints to ESXi are understood, there are access limits which might affect 3rd party solutions.", + "guid": "070db19b-8a2a-fd6a-c39b-4488d8780da9", + "link": "Please Check Partner Ecosystem", "services": [ - "DDoS", - "WAF" + "AVS" ], - "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" + "severity": "Medium", + "subcategory": "Pre-deployment", + "text": "3rd party application compatibility ", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "WAF checklist", - "guid": "3c5a808d-c695-4c14-a63c-c7ab7a510e41", - "link": "https://github.com/Azure/Enterprise-Scale/wiki/ALZ-Policies#corp", - "service": "Policy", + "category": "Security", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "When in-guest encryption is used, store encryption keys in Azure Key vault when possible", + "guid": "70cfbddc-d3d4-9188-77c8-1cabaefef646", + "link": "General recommendation for storing encryption keys.", "services": [ - "AzurePolicy", - "WAF", - "VM" + "AKV", + "AVS" ], - "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.", + "severity": "Medium", + "subcategory": "Encryption", + "text": "Use Azure Key Vault with in-guest encryption ", "waf": "Security" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "359c373e-7dd6-4162-9a36-4a907ecae48e", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/connectivity-to-azure", - "service": "ExpressRoute", + "category": "Security", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "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)", + "guid": "c1a81638-18df-0ce9-a73a-4b9a8a8dd392", + "link": "https://docs.microsoft.com/azure/azure-vmware/concepts-storage#data-at-rest-encryption", "services": [ - "VPN", - "ExpressRoute", - "WAF", - "Backup" + "AVS", + "SQL" ], "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" + "subcategory": "Encryption", + "text": "Use in-guest encryption", + "waf": "Security" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "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", + "category": "Security", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Use Key vault to store secrets and authorization keys when separate Service Principles are used for deploying Azure VMware Solution and ExpressRoute", + "guid": "8d0a8f51-8d35-19cd-c2fe-4e3512fb467e", + "link": "https://docs.microsoft.com/azure/key-vault/general/authentication", "services": [ - "ExpressRoute", - "WAF" + "AKV", + "AVS", + "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" + "subcategory": "Encryption", + "text": "Keyvault use for secrets", + "waf": "Security" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "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", + "category": "Security", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Older OS security patching configured for workloads running on Azure VMware Solution are eligible for ESU", + "guid": "4f8b20e9-a2a1-f80f-af9b-8aa3b26dca08", + "link": "https://docs.microsoft.com/windows-server/get-started/extended-security-updates-deploy", "services": [ - "VPN", - "ExpressRoute", - "WAF" + "AVS" ], "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" + "subcategory": "Extended support", + "text": "Ensure extended security update support ", + "waf": "Security" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "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", + "category": "Security", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Use a SIEM/SOAR", + "guid": "9bb22fec-4d00-3b95-7136-e225d0f5c63a", + "link": "https://learn.microsoft.com/azure/sentinel/overview", "services": [ - "Cost", - "ExpressRoute", - "WAF" + "Sentinel", + "AVS" ], - "severity": "High", - "text": "Ensure that you're using unlimited-data ExpressRoute circuits only if you reach the bandwidth that justifies their cost.", - "waf": "Cost" + "severity": "Medium", + "subcategory": "Investigation", + "text": "Enable Azure Sentinel or 3rd party SIEM ", + "waf": "Security" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "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", + "category": "Security", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "MS Defender For Cloud, for workloads running on Azure VMware Solution", + "guid": "f42b0b09-c591-238a-1580-2de3c485ebd2", + "link": "https://learn.microsoft.com/azure/azure-vmware/azure-security-integration#prerequisites", "services": [ - "Cost", - "ExpressRoute", - "WAF" + "AVS", + "Defender" ], - "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.", - "waf": "Cost" + "severity": "Medium", + "subcategory": "Security", + "text": "Enable Advanced Threat Detection ", + "waf": "Security" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "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", + "category": "Security", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Are the applicable policies enabled (compliance baselines added to MDfC)", + "guid": "bcdd2348-3d0e-c6bb-1092-aa4cd1a66d6b", + "link": "https://docs.microsoft.com/azure/azure-vmware/azure-security-integration", "services": [ - "ExpressRoute", - "WAF" + "AVS", + "AzurePolicy" ], "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" + "subcategory": "Security", + "text": "Policy & Regulatory Compliance", + "waf": "Security" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "72e52e36-11cc-458b-9a4b-1511e43a58a9", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/connectivity-to-azure", - "service": "ExpressRoute", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Azure to Azure (E/W), Azure to On-premises), AVS to Internet, AVS to Azure", + "guid": "607c1ca9-da92-ae19-5a4c-eb1e876acbe7", + "link": "https://techcommunity.microsoft.com/t5/azure-migration-and/firewall-integration-in-azure-vmware-solution/ba-p/2254961#:~:text=Azure%20VMware%20Solution%20customers%20have%20multiple%20security%20options,the%20box%20to%20provide%20East-West%20and%20North-South%20firewalling.", "services": [ - "ExpressRoute", - "WAF" + "AVS" ], "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" + "subcategory": "Firewalls", + "text": "Azure / 3rd party firewall", + "waf": "Security" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "c2299c4d-7b57-4d0c-9555-62f2b3e4563a", - "link": "https://learn.microsoft.com/azure/expressroute/about-fastpath", - "service": "ExpressRoute", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "To allow HCX appliance to connect/sync", + "guid": "1d87925c-c02b-7fde-a425-7e95ad846a27", + "link": "https://docs.vmware.com/en/VMware-Cloud-on-AWS/services/com.vmware.vmc-aws-networking-security/GUID-2CFE1654-9CC9-4EDB-A625-21317299E559.html", "services": [ - "ExpressRoute", - "WAF" + "AVS" ], "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" + "subcategory": "Firewalls", + "text": "Firewalls allow for East/West traffic inside AVS", + "waf": "Security" }, { - "arm-service": "microsoft.network/virtualNetworkGateways", - "checklist": "WAF checklist", - "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", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Decision on which tool to use (SRM requires additional license - enables automation & other features)", + "guid": "468b3495-2f6e-b65a-38ef-3ba631bcaa46", + "link": "https://docs.vmware.com/en/VMware-HCX/4.2/hcx-user-guide/GUID-B842696B-89EF-4183-9C73-B77157F56055.html", "services": [ - "VPN", - "WAF" + "AVS" ], "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/", + "subcategory": "Networking", + "text": "HCX and/or SRM", "waf": "Reliability" }, { - "arm-service": "microsoft.network/virtualNetworkGateways", - "checklist": "WAF checklist", - "guid": "45866df8-cf85-4ca9-bbe2-65ec1478919e", - "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-highlyavailable", - "service": "VPN", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Read up on requirements for Service Mesh requirements and how HCX ", + "guid": "be2ced52-da08-d366-cf7c-044c19e29509", + "link": "https://docs.vmware.com/en/VMware-HCX/4.6/hcx-user-guide/GUID-76BCD059-A31A-4041-9105-ACFB56213E7C.html", "services": [ - "VPN", - "WAF" + "AVS" ], "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/", + "subcategory": "Networking", + "text": "Configuring and Managing the HCX Interconnect", "waf": "Reliability" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "718cb437-b060-2589-8856-2e93a5c6633b", - "link": "https://learn.microsoft.com/azure/expressroute/expressroute-erdirect-about", - "service": "ExpressRoute", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "If you are planning on using stretch networks ensure that your on-premises environment requirements", + "guid": "7dcac579-fc5c-5c9c-f1f7-9b1149ff2c37", + "link": "https://docs.vmware.com/en/VMware-HCX/4.2/hcx-user-guide/GUID-DBDB4D1B-60B6-4D16-936B-4AC632606909.html", "services": [ - "Cost", - "ExpressRoute", - "WAF" + "AVS" ], - "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" + "severity": "Medium", + "subcategory": "Networking", + "text": "Restrictions and limitations for network extensions", + "waf": "Performance" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "8042d88e-79d1-47b7-9b22-a5a67e7a8ed4", - "link": "https://learn.microsoft.com/azure/architecture/framework/services/networking/expressroute/reliability", - "service": "ExpressRoute", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Do workloads require MoN?", + "guid": "cf45c0b9-6c4b-3bfb-86c5-62fe54061c73", + "link": "https://learn.microsoft.com/azure/azure-vmware/vmware-hcx-mon-guidance", "services": [ - "ExpressRoute", - "WAF" + "AVS" ], "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" + "subcategory": "Networking", + "text": "Mobility optimized networking", + "waf": "Performance" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "b30e38c3-f298-412b-8363-cefe179b599d", - "link": "https://learn.microsoft.com/azure/expressroute/expressroute-monitoring-metrics-alerts", - "service": "ExpressRoute", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Operating system level of Vmware environment", + "guid": "b7cf11f3-b12e-5189-991a-06df5250d2ca", + "link": "https://learn.microsoft.com/azure/site-recovery/vmware-physical-azure-support-matrix", "services": [ - "ExpressRoute", - "WAF", - "Monitor" + "AVS" ], "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/", + "subcategory": "On-premises pre-requisites", + "text": "Support matrix (OS versions etc).", "waf": "Operations" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "5bf68dc9-325e-4873-bf88-f8214ef2e5d2", - "link": "https://learn.microsoft.com/azure/expressroute/how-to-configure-connection-monitor", - "service": "ExpressRoute", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Required that all switches are dynamic", + "guid": "45fe9252-aa1b-4e30-45c6-bc02f3b76acf", + "link": "https://docs.vmware.com/en/VMware-vSphere/7.0/vsan-network-design-guide/GUID-91E1CD6F-33A6-4AC6-BC22-3E4807296F86.html#:~:text=Migrate%20Management%20Network%201%20Add%20hosts%20to%20the,each%20host.%20...%204%20Finish%20the%20configuration.%20", "services": [ - "Monitor", - "ACR", - "WAF", - "NetworkWatcher" + "AVS" ], "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/", + "subcategory": "On-premises pre-requisites", + "text": "Standard switches converted to dynamic switches", "waf": "Operations" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "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", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "See sections on sizing and capacity in the link.", + "guid": "e9f6d736-ee44-e2ac-e7f9-e361f8c857f3", + "link": "https://learn.microsoft.com/azure/azure-vmware/plan-private-cloud-deployment", "services": [ - "ExpressRoute", - "WAF" + "AVS" ], "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" + "subcategory": "On-premises pre-requisites", + "text": "Capacity for HCX appliance", + "waf": "Performance" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "cf3fe65c-fec0-495a-8edc-9675200f2add", - "link": "https://learn.microsoft.com/azure/expressroute/expressroute-howto-coexist-resource-manager", - "service": "ExpressRoute", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Check hardware restrictions to ensure compatibility with AVS/OS ", + "guid": "1be2cdd6-15a7-9a33-aea7-113859035ce9", + "link": "https://kb.vmware.com/s/article/2007240#:~:text=ESXi%2FESX%20hosts%20and%20compatible%20virtual%20machine%20hardware%20versions,%20Not%20Supported%20%204%20more%20rows", "services": [ - "VPN", - "ExpressRoute", - "WAF" + "AVS" ], "severity": "Medium", - "text": "Use site-to-site VPN as failover of ExpressRoute, if only using a single ExpressRoute circuit.", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "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", - "WAF", - "VNet" - ], - "severity": "High", - "text": "If you are using a route table in the GatewaySubnet, make sure that gateway routes are propagated.", - "waf": "Reliability" + "subcategory": "On-premises pre-requisites", + "text": "Hardware compatibility", + "waf": "Operations" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "d581a947-69a2-4783-942e-9df3664324c8", - "link": "https://learn.microsoft.com/azure/expressroute/designing-for-high-availability-with-expressroute#active-active-connections", - "service": "ExpressRoute", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Need to be converted", + "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": [ - "ExpressRoute", - "ACR", - "WAF" + "AVS", + "Storage" ], - "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.", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Storage", + "text": "VSAN RDM disks are converted - not supported.", + "waf": "Operations" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "b258f058-b9f6-46cd-b28d-990106f0c3f8", - "link": "https://learn.microsoft.com/azure/expressroute/designing-for-high-availability-with-expressroute", - "service": "ExpressRoute", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Need to be converted", + "guid": "eb2f9313-afb2-ab35-aa24-6d97a3cb0611", + "link": "3rd-Party tools", "services": [ - "ExpressRoute", - "WAF" + "AVS", + "VM", + "Storage" ], "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" + "subcategory": "Storage", + "text": "VM with SCSI shared bus are not supported", + "waf": "Operations" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "fe2a1b53-6fbd-4c67-b58a-85d7c7a0afcb", - "link": "https://learn.microsoft.com/azure/expressroute/expressroute-bfd", - "service": "ExpressRoute", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Remove Direct IO before migration", + "guid": "3f2a5cff-c8a6-634a-1f1b-53ef9d321381", + "link": "Contact VMware", "services": [ - "WAF" + "AVS", + "VM", + "Storage" ], "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" + "subcategory": "Storage", + "text": "VM with Direct IO require removing DirectPath device", + "waf": "Operations" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "669b215a-ce43-4371-8f6f-11047f6490f1", - "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", - "service": "ExpressRoute", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Cannot migrate clusters ", + "guid": "efc8a311-74f8-0252-c6a0-4bac7610e266", + "link": "Contact VMware", "services": [ - "ExpressRoute", - "WAF" + "AVS", + "Storage" ], - "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" + "severity": "Medium", + "subcategory": "Storage", + "text": "Shared VMDK files are not supported", + "waf": "Operations" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "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", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Convert to a different format", + "guid": "ab6c89cd-a26f-b894-fe59-61863975458e", + "link": "Contact VMware", "services": [ - "ExpressRoute", - "WAF", - "Monitor", - "VNet" + "AVS", + "Storage" ], "severity": "Medium", - "text": "Configure diagnostic logs and alerts for ExpressRoute virtual network gateway.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "subcategory": "Storage", + "text": "RDM with 'physical compatibility mode' are not supported.", "waf": "Operations" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "5234c93f-b651-41dd-80c1-234177b91ced", - "link": "https://learn.microsoft.com/azure/expressroute/virtual-network-connectivity-guidance", - "service": "ExpressRoute", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Ensure the vSAN storage policy for VM's is NOT the default storage policy as this policy applies thick provisioning 'RAID-1 FTT-1' is default with Thin Provisioning", + "guid": "7628d446-6b10-9678-9cec-f407d990de43", + "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-storage#storage-policies-and-fault-tolerance", "services": [ - "ExpressRoute", - "WAF", - "VNet" + "AVS", + "VM", + "AzurePolicy", + "Storage" ], "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" + "subcategory": "Storage", + "text": "Default storage policy", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "8ac6a9e0-1e6a-483d-b5de-32c199248160", - "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", - "service": "N/A", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "The default storage policy is set to RAID-1 (Mirroring) FTT-1, with Object Space Reservation set to Thin provisioning.", + "guid": "37fef358-7ab9-43a9-542c-22673955200e", + "link": "https://learn.microsoft.com/azure/azure-vmware/configure-storage-policy", "services": [ - "ACR", - "WAF" + "AVS", + "VM", + "AzurePolicy", + "Storage" ], - "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" + "severity": "Medium", + "subcategory": "Storage", + "text": "Ensure that the appropriate VM template storage policy is used", + "waf": "Operations" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "guid": "e6c4cfd3-e504-4547-a244-7ec66138a720", - "link": "https://learn.microsoft.com/azure/firewall/overview", - "service": "Firewall", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "Ensure that the Failure-to-tolerate policy is in place to meet your vSAN storage needs", + "guid": "ebebd109-9f9d-d85e-1b2f-d302012843b7", + "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-storage#storage-policies-and-fault-tolerance", "services": [ - "WAF", - "Firewall" + "AVS", + "AzurePolicy", + "Storage" ], - "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" + "severity": "Medium", + "subcategory": "Storage", + "text": "Failure to tolerate policy", + "waf": "Operations" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "guid": "5a4b1511-e43a-458a-ac22-99c4d7b57d0c", - "link": "https://learn.microsoft.com/azure/firewall-manager/policy-overview", - "service": "Firewall", + "category": "VMware", + "checklist": "Azure VMware Solution Implementation Checklist", + "description": "ANF can be used to extend storage for Azure VMware Solution,", + "guid": "1be821bd-4f37-216a-3e3d-2a5ac6996863", + "link": "https://learn.microsoft.com/azure/azure-vmware/netapp-files-with-azure-vmware-solution", "services": [ - "AzurePolicy", - "RBAC", - "ACR", - "WAF", - "Firewall" + "AVS", + "Storage" ], "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" + "subcategory": "Storage", + "text": "Use ANF for external storage", + "waf": "Operations" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "guid": "655562f2-b3e4-4563-a4d8-739748b662d6", - "link": "https://learn.microsoft.com/azure/firewall-manager/deploy-trusted-security-partner", - "service": "Firewall", - "services": [ - "WAF", - "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" + "category": "Operations management", + "checklist": "Azure Bot Service", + "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", + "service": "Bot service", + "services": [], + "severity": "Medium", + "subcategory": "High Availablity", + "text": "Follow reliability support recommendations in Azure Bot Service", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "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", - "WAF", - "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.", - "waf": "Security" + "category": "Operations management", + "checklist": "Azure Bot Service", + "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", + "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", + "service": "Bot service", + "services": [], + "severity": "Medium", + "subcategory": "High Availablity", + "text": "Deploying bots with local data residency and regional compliance", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "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": [ - "WAF", - "Firewall" - ], - "severity": "High", - "text": "Use Azure Firewall Premium to enable additional security features.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "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": [ - "WAF", - "Firewall" - ], - "severity": "High", - "text": "Configure Azure Firewall Threat Intelligence mode to Alert and Deny for additional protection.", - "waf": "Security" + "category": "Operations management", + "checklist": "Azure Bot Service", + "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": [], + "severity": "Medium", + "subcategory": "High Availablity", + "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.Network/azureFirewalls", - "checklist": "WAF checklist", - "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", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "guid": "974a759c-763e-47d2-9161-3a7649907e0e", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ASB_v1.docx", "services": [ - "WAF", - "Firewall" + "ServiceBus" ], - "severity": "High", - "text": "Configure Azure Firewall IDPS mode to Deny for additional protection.", - "waf": "Security" + "severity": "Medium", + "subcategory": "Best Practices", + "text": "Leverage FTA Handbook", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "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", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "description": "This will be turned on automatically for a new SB namespace created from the portal with the Premium SKUs in a zone-enabled region. Both the Service Bus metadata and the messages data are replicated across datacenters in the availability zones configuration", + "guid": "338ee253-c17d-432e-aaaa-b7571549ab81", + "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-outages-disasters#availability-zones", "services": [ - "Storage", - "VWAN", - "NVA", - "VNet", - "WAF", - "Firewall" + "ServiceBus", + "ACR" ], "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" + "subcategory": "Best Practices", + "text": "Leverage Availability Zones if regionally applicable", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "guid": "715d833d-4708-4527-90ac-1b142c7045ba", - "link": "https://learn.microsoft.com/azure/firewall/firewall-structured-logs", - "service": "Firewall", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "description": "If enabled, Implements namespace metadata replication to a secondary region. Does not replicate queue/topic message data. Premium sku only.", + "guid": "53d89f89-d17b-484b-93b5-a67f7b9ed5b3", + "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-outages-disasters#geo-disaster-recovery", "services": [ - "Storage", - "WAF", - "Firewall" + "ServiceBus", + "ASR", + "Storage" ], "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": "WAF checklist", - "guid": "e960fc6b-4ab2-4db6-9609-3745135f9ffa", - "link": "https://learn.microsoft.com/azure/firewall-manager/migrate-to-policy", - "service": "Firewall", - "services": [ - "AzurePolicy", - "WAF", - "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" + "subcategory": "Geo-Disaster Recovery", + "text": "Plan for Metadata replication during regional failure", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "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", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "description": "If an outage cannot be tolerated, do not use the build-in metadata replication option. Leverage a replication pattern to replicate Service Bus messages across two or more sets of cross-region namespaces", + "guid": "1f38c403-a822-4c24-93cf-0f18ac699ef1", + "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-federation-overview", "services": [ - "WAF", - "VNet", - "Firewall" + "ServiceBus", + "ASR", + "ACR" ], - "severity": "High", - "text": "Use a /26 prefix for your Azure Firewall subnets.", - "waf": "Security" + "severity": "Medium", + "subcategory": "Geo-Disaster Recovery", + "text": "Plan for Message replication during regional failure", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "guid": "828cec2e-af6c-40c2-8fa2-1b681ee63eb7", - "link": "https://learn.microsoft.com/azure/firewall-manager/rule-hierarchy", - "service": "Firewall", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "description": "Azure Service Bus uses a message broker to handle messages that are sent to a Service Bus queue or topic. By default, all messages that are sent to a queue or topic are handled by the same message broker process. This architecture can place a limitation on the overall throughput of the message queue. However, you can also partition a queue or topic when it is created", + "guid": "d5a83de4-de32-4c18-a147-0607c5c0e4e6", + "link": "https://learn.microsoft.com/azure/architecture/best-practices/data-partitioning-strategies#partitioning-azure-service-bus", "services": [ - "AzurePolicy", - "WAF" + "ServiceBus", + "Storage" ], "severity": "Medium", - "text": "Arrange rules within the firewall policy into Rule Collection Groups and Rule Collections and based on their frequency of use.", - "waf": "Performance" + "subcategory": "Best Practices", + "text": "For applications which require high throughput, use Patritioning ", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "guid": "0da83bb1-2f39-49af-b5c9-835fc455e3d1", - "link": "https://learn.microsoft.com/azure/firewall/ip-groups", - "service": "Firewall", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "guid": "14658d24-58ed-4671-99b8-21102df26ee4", + "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-outages-disasters", "services": [ - "Storage", - "WAF" + "ServiceBus" ], "severity": "Medium", - "text": "Use IP Groups or IP prefixes to reduce number of IP table rules.", - "waf": "Performance" + "subcategory": "Best Practices", + "text": "Evaluate Premier-tier benefits of Azure Service Bus", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "guid": "c44c6f0e-1642-4a61-a17b-0922f835c93a", - "link": "https://learn.microsoft.com/azure/firewall/tutorial-firewall-dnat", - "service": "Firewall", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "guid": "11e6f883-e52f-4472-8dd6-8c5b5c2521e5", + "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-messaging-exceptions", "services": [ - "WAF" + "ServiceBus" ], - "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.", - "waf": "Performance" + "severity": "High", + "subcategory": "Best Practices", + "text": "Ensure that Service Bus Messaging Exceptions are handled properly", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "guid": "7371dc21-251a-47a3-af14-6e01b9da4757", - "link": "https://learn.microsoft.com/azure/firewall/integrate-with-nat-gateway", - "service": "Firewall", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "guid": "4a69b9d3-39ac-44e7-a68d-1d75657202b4", + "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", "services": [ - "Monitor", - "WAF" + "PrivateLink", + "ServiceBus", + "Storage" ], "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.", - "waf": "Performance" + "subcategory": "Best Practices", + "text": "Connect to Service Bus with the Advanced Messaging Queue Protocol (AMQP) and use Service Endpoints or Private Endpoints when possible.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "guid": "346840b8-1064-496e-8396-4b1340172d52", - "link": "https://learn.microsoft.com/azure/firewall/premium-features#tls-inspection", - "service": "Firewall", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "guid": "f4564b4d-974a-4759-a763-e7d261613a76", + "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-performance-improvements?tabs=net-standard-sdk-2", "services": [ - "WAF", - "Firewall" + "ServiceBus" ], "severity": "High", - "text": "If you are using Azure Firewall Premium, enable TLS Inspection.", - "waf": "Performance" + "subcategory": "Best Practices", + "text": "Review the Best Practices for performance improvements using Service Bus Messaging", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "guid": "39990a13-915c-45f9-a2d3-562d7d6c4b7c", - "link": "https://learn.microsoft.com/azure/firewall/premium-features#web-categories", - "service": "Firewall", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "guid": "49907e0e-338e-4e25-9c17-d32e8aaab757", + "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/operational-excellence", "services": [ - "ServiceBus", - "WAF" + "ServiceBus" ], - "severity": "Low", - "text": "Use web categories to allow or deny outbound access to specific topics.", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Best Practices", + "text": "Implement geo-replication on the sender and receiver side to protect against outages and disasters", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "guid": "6eff7e6c-6c4a-43d7-be3f-6641c2cb3d4a", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/gateway/application-gateway-before-azure-firewall", - "service": "Firewall", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "guid": "1549ab81-53d8-49f8-ad17-b84b33b5a67f", + "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", "services": [ - "WAF" + "ServiceBus", + "ASR", + "Storage" ], "severity": "Medium", - "text": "As part of your TLS inspection, plan for receiving traffic from Azure App Gateways for inspection.", - "waf": "Performance" + "subcategory": "Best Practices", + "text": "If you need mission-critical messaging with queues and topics, Service Bus Premium is recommended with Geo-Disaster Recovery.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "guid": "94f3eede-9aa3-4088-92a3-bb9a56509fad", - "link": "https://learn.microsoft.com/azure/firewall/dns-details", - "service": "Firewall", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "guid": "7b9ed5b3-1f38-4c40-9a82-2c2463cf0f18", + "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", "services": [ - "DNS", - "WAF", - "Firewall" + "ServiceBus" ], "severity": "Medium", - "text": "Enable Azure Firewall DNS proxy configuration.", - "waf": "Security" + "subcategory": "Best Practices", + "text": "Implement high availability for the Service Bus namespace", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "guid": "1dc04554-dece-4ffb-a49e-5c683e09f8da", - "link": "https://learn.microsoft.com/azure/firewall/firewall-diagnostics", - "service": "Firewall", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "guid": "ac699ef1-d5a8-43de-9de3-2c1881470607", + "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", "services": [ - "Monitor", - "WAF", - "Firewall" + "ServiceBus" ], "severity": "High", - "text": "Integrate Azure Firewall with Azure Monitor and enable diagnostic logging to store and analyze firewall logs.", - "waf": "Operations" + "subcategory": "Best Practices", + "text": "Ensure related messages are delivered in guaranteed order", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/azureFirewalls", - "checklist": "WAF checklist", - "guid": "64e7000e-3c06-485e-b455-ced7f454cba3", - "link": "https://learn.microsoft.com/azure/well-architected/service-guides/azure-firewall", - "service": "Firewall", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "guid": "c5c0e4e6-1465-48d2-958e-d67139b82110", + "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", "services": [ - "WAF", - "Backup" + "ServiceBus" ], "severity": "Low", - "text": "Implement backups for your firewall rules", - "waf": "Operations" + "subcategory": "Best Practices", + "text": "Evaluate different Java Messaging Service (JMS) features through the JMS API", + "waf": "Reliability" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "WAF checklist", - "guid": "d301d6e8-72e5-42e3-911c-c58b5a4b1511", - "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", - "service": "App Gateway", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "guid": "2df26ee4-11e6-4f88-9e52-f4722dd68c5b", + "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", "services": [ - "WAF", - "VNet" + "ServiceBus" ], - "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" + "severity": "Low", + "subcategory": "Best Practices", + "text": "Use .NET Nuget packages to communicate with Service Bus messaging entities", + "waf": "Reliability" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "WAF checklist", - "guid": "b3e4563a-4d87-4397-98b6-62d6d15f512a", - "link": "https://learn.microsoft.com/azure/private-link/private-endpoint-overview", - "service": "ExpressRoute", + "category": "Operations Management", + "checklist": "Service Bus Review Checklist", + "guid": "5c2521e5-4a69-4b9d-939a-c4e7c68d1d75", + "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", "services": [ - "ExpressRoute", - "WAF", - "PrivateLink" + "ServiceBus" ], "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" + "subcategory": "Best Practices", + "text": "Implement resilience for transient fault handling when sending or receiving messages", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Network/virtualNetworks", - "checklist": "WAF checklist", - "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", + "category": "Security", + "checklist": "Service Bus Review 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", "services": [ - "WAF", - "VNet" + "ServiceBus" ], - "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", + "severity": "Low", + "subcategory": "Data Protection", + "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.Network/azureFirewalls", - "checklist": "WAF checklist", - "guid": "7e7a8ed4-b30e-438c-9f29-812b2363cefe", - "link": "azure/private-link/inspect-traffic-with-azure-firewall", - "service": "Firewall", + "category": "Security", + "checklist": "Service Bus Review 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", "services": [ - "DNS", - "PrivateLink", - "NVA", - "WAF", - "Firewall" + "ServiceBus" ], "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", + "subcategory": "Data Protection", + "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.network/expressRouteCircuits", - "checklist": "WAF checklist", - "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", + "category": "Security", + "checklist": "Service Bus Review 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", "services": [ - "VPN", - "ExpressRoute", - "WAF", - "VNet" + "Entra", + "AzurePolicy", + "TrafficManager", + "RBAC", + "ServiceBus" ], - "severity": "High", - "text": "Use at least a /27 prefix for your Gateway subnets.", + "severity": "Medium", + "subcategory": "Identity and Access Management", + "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.Network/networkSecurityGroups", - "checklist": "WAF checklist", - "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", + "category": "Security", + "checklist": "Service Bus Review 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", "services": [ - "WAF", - "VNet" + "Entra", + "AKV", + "Storage", + "VM", + "AppSvc", + "ServiceBus" ], - "severity": "High", - "text": "Don't rely on the NSG inbound default rules using the VirtualNetwork service tag to limit connectivity.", + "severity": "Medium", + "subcategory": "Identity and Access Management", + "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.Network/networkSecurityGroups", - "checklist": "WAF checklist", - "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", + "category": "Security", + "checklist": "Service Bus Review 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", "services": [ - "ACR", - "WAF", - "VNet" + "Entra", + "Storage", + "RBAC", + "Subscriptions", + "ServiceBus" ], - "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/", + "severity": "High", + "subcategory": "Identity and Access Management", + "text": "Use least privilege data plane RBAC", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", "waf": "Security" }, { - "arm-service": "Microsoft.Network/networkSecurityGroups", - "checklist": "WAF checklist", - "guid": "a4d87397-48b6-462d-9d15-f512a65498f6", - "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", - "service": "NSG", + "category": "Security", + "checklist": "Service Bus Review 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": [ - "NVA", - "WAF", + "ServiceBus", "VNet", - "Entra" + "Monitor" ], "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/", + "subcategory": "Monitoring", + "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.Network/networkSecurityGroups", - "checklist": "WAF checklist", - "guid": "dfe237de-143b-416c-91d7-aa9b64704489", - "link": "https://learn.microsoft.com/azure/network-watcher/vnet-flow-logs-overview", - "service": "NSG", + "category": "Security", + "checklist": "Service Bus Review 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", "services": [ - "NetworkWatcher", - "WAF", + "PrivateLink", + "ServiceBus", "VNet" ], "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/", + "subcategory": "Networking", + "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.Network/networkSecurityGroups", - "checklist": "WAF checklist", - "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", + "category": "Security", + "checklist": "Service Bus Review 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", "services": [ - "WAF", - "VNet" + "ServiceBus" ], "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" + "subcategory": "Networking", + "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.network/virtualWans", - "checklist": "WAF checklist", - "guid": "412e7f98-3f63-4047-82dd-69c5b5c2622f", - "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-any-to-any", - "service": "VWAN", + "category": "Version Control", + "checklist": "Azure DevOps", + "description": "Implement branching policy in Azure DevOps", + "guid": "eda1dae2-cc85-4c47-a6b7-81cca0e6c465", + "link": "https://learn.microsoft.com/azure/devops/repos/git/branch-policies-overview?view=azure-devops", "services": [ - "VWAN", - "WAF" + "AzurePolicy" ], - "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/", + "severity": "High", + "subcategory": "Branching Policy", + "text": "Branch Policies", "waf": "Operations" }, { - "arm-service": "microsoft.network/virtualWans", - "checklist": "WAF checklist", - "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", + "category": "Version Control", + "checklist": "Azure DevOps", + "description": "Understand branch strategy such as GitFlow or GitHub Flow", + "guid": "bc288bec-6a16-4ca7-8444-51e1add34529", + "link": "https://learn.microsoft.com/azure/devops/repos/git/git-branching-guidance?view=azure-devops", "services": [ - "VWAN", - "ACR", - "WAF" + "AzurePolicy" ], - "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.", - "waf": "Performance" + "severity": "High", + "subcategory": "Branching Policy", + "text": "Branching strategy", + "waf": "Operations" }, { - "arm-service": "microsoft.network/virtualWans", - "checklist": "WAF checklist", - "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", + "category": "Version Control", + "checklist": "Azure DevOps", + "description": "Understand how teams work with git", + "guid": "ec723823-7a15-41c5-ab4e-401914387e5c", + "link": "https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow", "services": [ - "WAF", - "Firewall" + "AzurePolicy" ], - "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" + "severity": "High", + "subcategory": "Branching Policy", + "text": "Understand GitFlow Branch Strategy", + "waf": "Operations" }, { - "arm-service": "microsoft.network/virtualWans", - "checklist": "WAF checklist", - "guid": "6667313b-4f56-464b-9e98-4a859c773e7d", - "link": "https://learn.microsoft.com/azure/virtual-wan/migrate-from-hub-spoke-topology", - "service": "VWAN", + "category": "Version Control", + "checklist": "Azure DevOps", + "description": "Merge into higher branches after two or more reviewers in a PR", + "guid": "a9c26c9c-32ab-45bd-8c69-98a246e33899", + "link": "https://learn.microsoft.com/azure/devops/repos/git/review-pull-requests?view=azure-devops&tabs=browser", "services": [ - "VWAN", - "WAF" + "AzurePolicy" ], - "severity": "Medium", - "text": "Ensure that your virtual WAN network architecture aligns to an identified architecture scenario.", - "waf": "Reliability" + "severity": "High", + "subcategory": "Branching Policy", + "text": "Pull Request Review", + "waf": "Operations" }, { - "arm-service": "microsoft.network/virtualWans", - "checklist": "WAF checklist", - "guid": "261623a7-65a9-417e-8f34-8ef254c27d42", - "link": "https://learn.microsoft.com/azure/virtual-wan/azure-monitor-insights", - "service": "VWAN", + "category": "Version Control", + "checklist": "Azure DevOps", + "description": "Implement access control to the branches", + "guid": "7e41c77d-68cb-46a2-8ac1-9f916d697d8e", + "link": "https://learn.microsoft.com/azure/devops/repos/git/branch-permissions?view=azure-devops", "services": [ - "VWAN", - "WAF", - "Monitor" + "AzurePolicy" ], "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.", + "subcategory": "Branching Policy", + "text": "Access Control to the Branch", "waf": "Operations" }, { - "arm-service": "microsoft.network/virtualWans", - "checklist": "WAF checklist", - "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", - "WAF" - ], - "severity": "Medium", - "text": "Do not disable branch-to-branch traffic in Virtual WAN, unless these flows should be explicitly blocked.", - "waf": "Reliability" + "category": "Version Control", + "checklist": "Azure DevOps", + "description": "Perform SAST code scan", + "guid": "adfd27bd-e187-401a-a252-baa9b68a088c", + "link": "https://devblogs.microsoft.com/devops/integrate-security-into-your-developer-workflow-with-github-advanced-security-for-azure-devops/", + "services": [], + "severity": "High", + "subcategory": "Security", + "text": "Code Scan", + "waf": "Security" }, { - "arm-service": "microsoft.network/virtualWans", - "checklist": "WAF checklist", - "guid": "d49ac006-6670-4bc9-9948-d3e0a3a94f4d", - "link": "https://learn.microsoft.com/azure/virtual-wan/about-virtual-hub-routing-preference", - "service": "VWAN", - "services": [ - "VPN", - "ExpressRoute", - "WAF" - ], - "severity": "Medium", - "text": "Use AS-Path as hub routing preference, since it is more flexible than ExpressRoute or VPN.", - "waf": "Reliability" + "category": "Version Control", + "checklist": "Azure DevOps", + "description": "Understand TFVC as Code Repo", + "guid": "9a8f822b-8eb9-4d1b-a77f-26e5e6beba8e", + "link": "https://learn.microsoft.com/azure/devops/repos/tfvc/what-is-tfvc?view=azure-devops", + "services": [], + "severity": "Low", + "subcategory": "Practice", + "text": "TFVC as Code Repository", + "waf": "Operations" }, { - "arm-service": "microsoft.network/virtualWans", - "checklist": "WAF checklist", - "guid": "2586b854-237e-47f1-84a1-d45d4cd2310d", - "link": "https://learn.microsoft.com/azure/virtual-wan/about-virtual-hub-routing#labels", - "service": "VWAN", - "services": [ - "VWAN", - "WAF" - ], - "severity": "Medium", - "text": "Configure label-based propagation in Virtual WAN, otherwise connectivity between virtual hubs will be impaired.", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.network/virtualWans", - "checklist": "WAF checklist", - "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": [ - "WAF" - ], - "severity": "High", - "text": "Assign at least a /23 prefix to virtual hubs to ensure enough IP space is available.", - "waf": "Reliability" + "category": "Version Control", + "checklist": "Azure DevOps", + "description": "Compare Git vs TFVC for your project", + "guid": "d4f3437b-c336-4d71-9f27-a71eee0b9b5d", + "link": "https://learn.microsoft.com/azure/devops/repos/tfvc/comparison-git-tfvc?view=azure-devops", + "services": [], + "severity": "Low", + "subcategory": "Practice", + "text": "Choose Right version control", + "waf": "Operations" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "WAF checklist", - "guid": "5c986cb2-9131-456a-8247-6e49f541acdc", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "Policy", - "services": [ - "AzurePolicy", - "WAF" - ], + "category": "Azure Boards", + "checklist": "Azure DevOps", + "description": "Set up your team management", + "guid": "8defd5d7-21d4-41d2-900c-807bf9eab40f", + "link": "https://learn.microsoft.com/azure/devops/organizations/settings/manage-teams?view=azure-devops", + "services": [], "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": "WAF checklist", - "guid": "d8a2adb1-17d6-4326-af62-5ca44e5695f2", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "Policy", - "services": [ - "RBAC", - "AzurePolicy", - "WAF" - ], - "severity": "Medium", - "text": "Map regulatory and compliance requirements to Azure Policy definitions and Azure role assignments.", - "waf": "Security" + "subcategory": "Team Planning", + "text": "Configure your teams", + "waf": "Operations" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "WAF checklist", - "guid": "223ace8c-b123-408c-a501-7f154e3ab369", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "Policy", - "services": [ - "AzurePolicy", - "WAF", - "Subscriptions" - ], + "category": "Azure Boards", + "checklist": "Azure DevOps", + "description": "Start scheduling sprints", + "guid": "9ed5b354-78d4-447a-a26c-2863c00f1cac", + "link": "https://learn.microsoft.com/azure/devops/boards/sprints/define-sprints?view=azure-devops", + "services": [], "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": "WAF checklist", - "guid": "3829e7e3-1618-4368-9a04-77a209945bda", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "Policy", - "services": [ - "AzurePolicy", - "WAF" - ], - "severity": "High", - "text": "Manage policy assignments at the highest appropriate level with exclusions at bottom levels, if required.", - "waf": "Security" + "subcategory": "Team Planning", + "text": "Configure your sprints", + "waf": "Operations" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "WAF checklist", - "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", - "WAF", - "Subscriptions" - ], + "category": "Azure Boards", + "checklist": "Azure DevOps", + "description": "Set up your work item heirarchy", + "guid": "699ef1d5-a83d-4e5d-b36c-1c81870a0bc5", + "link": "https://learn.microsoft.com/azure/devops/organizations/settings/work/customize-process-work-item-type?view=azure-devops", + "services": [], "severity": "Low", - "text": "Use Azure Policy to control which services users can provision at the subscription/management group level.", - "waf": "Security" + "subcategory": "Team Planning", + "text": "Choose Work Item types", + "waf": "Operations" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "WAF checklist", - "guid": "be7d7e48-4327-46d8-adc0-55bcf619e8a1", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "Policy", - "services": [ - "AzurePolicy", - "WAF" - ], + "category": "Azure Boards", + "checklist": "Azure DevOps", + "description": "WIT Processes available in Azure DevOps", + "guid": "c1e43a18-658d-4285-aed6-7179b825546d", + "link": "https://learn.microsoft.com/azure/devops/boards/work-items/guidance/choose-process?view=azure-devops&tabs=agile-process", + "services": [], "severity": "High", - "text": "Use built-in policies where possible to minimize operational overhead.", - "waf": "Security" + "subcategory": "Team Planning", + "text": "Select a WIT Process", + "waf": "Operations" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "WAF checklist", - "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": [ - "AzurePolicy", - "RBAC", - "Entra", - "WAF", - "Subscriptions" - ], - "severity": "Medium", - "text": "Assign the built-in Resource Policy Contributor role at a particular scope to enable application-level governance.", - "waf": "Security" + "category": "Azure Boards", + "checklist": "Azure DevOps", + "description": "Use Azure Boards with GitHub", + "guid": "f2aee455-3afc-4833-a248-726dd68c5b5c", + "link": "https://learn.microsoft.com/azure/devops/cross-service/github-integration?view=azure-devops", + "services": [], + "severity": "Low", + "subcategory": "Tool Integration", + "text": "GitHub Integration", + "waf": "Operations" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "WAF checklist", - "guid": "19048384-5c98-46cb-8913-156a12476e49", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "Policy", - "services": [ - "AzurePolicy", - "WAF", - "Subscriptions" - ], + "category": "Azure Boards", + "checklist": "Azure DevOps", + "description": "Understand the methologies", + "guid": "2925394b-69b9-4d37-aac4-3bc68d1d7665", + "link": "https://www.atlassian.com/agile/scrum/agile-vs-scrum", + "services": [], "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" + "subcategory": "Process Planning", + "text": "Understand Agile Vs Scrum", + "waf": "Operations" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "WAF checklist", - "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", - "WAF" - ], + "category": "Azure Boards", + "checklist": "Azure DevOps", + "description": "Create Dashboard and PowerBI reports", + "guid": "7246b448-564b-44dd-94a7-59c7633bd2a1", + "link": "https://learn.microsoft.com/azure/devops/report/dashboards/overview?view=azure-devops", + "services": [], "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" + "subcategory": "Reporting", + "text": "Dashboard", + "waf": "Operations" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "WAF checklist", - "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", - "WAF", - "Subscriptions" - ], + "category": "Azure Boards", + "checklist": "Azure DevOps", + "description": "Set up backlog", + "guid": "a27a764a-90be-40e3-98ee-293c1bd363ca", + "link": "https://learn.microsoft.com/azure/devops/boards/backlogs/set-up-your-backlog?view=azure-devops", + "services": [], "severity": "Medium", - "text": "For Sovereign Landing Zone, deploy sovereignty policy baseline and assign at correct management group level.", - "waf": "Security" + "subcategory": "Reporting", + "text": "Refine your backlog", + "waf": "Operations" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "WAF checklist", - "guid": "caeea0e9-1024-41df-a52e-d99c3f22a6f4", - "link": "https://learn.microsoft.com/industry/sovereignty/policy-portfolio-baseline", - "service": "Policy", - "services": [ - "AzurePolicy", - "WAF" - ], + "category": "Azure Boards", + "checklist": "Azure DevOps", + "description": "Link your work items", + "guid": "aab75719-49ab-4919-9dc9-fc9d1bb84b37", + "link": "https://learn.microsoft.com/azure/devops/boards/queries/link-work-items-support-traceability?view=azure-devops&tabs=browser", + "services": [], "severity": "Medium", - "text": "For Sovereign Landing Zone, document Sovereign Control objectives to policy mapping.", - "waf": "Security" + "subcategory": "Reporting", + "text": "Visualize Relationships", + "waf": "Operations" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "WAF checklist", - "guid": "9b461617-db7b-4399-8ac6-d4eb7153893a", - "link": "https://learn.microsoft.com/industry/sovereignty/policy-portfolio-baseline#sovereignty-baseline-policy-initiatives", - "service": "Policy", - "services": [ - "AzurePolicy", - "WAF" - ], - "severity": "Medium", - "text": "For Sovereign Landing Zone, ensure process is in place for management of 'Sovereign Control objectives to policy mapping'.", - "waf": "Security" + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "View the velocity report", + "guid": "b5a67fcb-9ed5-4b35-978d-447a826c2863", + "link": "https://learn.microsoft.com/azure/devops/report/dashboards/team-velocity?view=azure-devops&tabs=in-context", + "services": [], + "severity": "Low", + "subcategory": "Reporting", + "text": "Review Team Velocity", + "waf": "Operations" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "WAF checklist", - "guid": "67e7a8ed-4b30-4e38-a3f2-9812b2363cef", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "Monitor", - "services": [ - "AzurePolicy", - "RBAC", - "Monitor", - "Entra", - "WAF" - ], - "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", + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Create your first pipeline", + "guid": "c00f1cac-699e-4f1d-9a83-de5de36c1c81", + "link": "https://learn.microsoft.com/azure/devops/pipelines/create-first-pipeline?view=azure-devops&tabs=java%2Ctfs-2018-2%2Cbrowser", + "services": [], + "severity": "High", + "subcategory": "Continuous Integration", + "text": "Set up pipeline", "waf": "Operations" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "WAF checklist", - "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": [ - "ARS", - "Storage", - "WAF", - "AzurePolicy" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Specify events that trigger pipelines", + "guid": "870a0bc5-c1e4-43a1-a658-d2858ed67179", + "link": "https://learn.microsoft.com/azure/devops/pipelines/build/triggers?view=azure-devops", + "services": [], "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/", + "subcategory": "Continuous Integration", + "text": "Set Build triggers", "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "e7d7e484-3276-4d8b-bc05-5bcf619e8a13", - "link": "https://learn.microsoft.com/azure/governance/machine-configuration/overview", - "service": "VM", - "services": [ - "Monitor", - "WAF", - "AzurePolicy", - "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/", + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Use YAML to create build pipeline", + "guid": "b825546d-f2ae-4e45-93af-c8339248726d", + "link": "https://learn.microsoft.com/azure/devops/pipelines/customize-pipeline?view=azure-devops", + "services": [], + "severity": "Low", + "subcategory": "Continuous Integration", + "text": "Customize YAML Pipeline", "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "WAF checklist", - "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": [ - "WAF", - "VM" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Use classic GUI editor to set up pipeline", + "guid": "d68c5b5c-2925-4394-a69b-9d379ac43bc6", + "link": "https://learn.microsoft.com/azure/devops/pipelines/get-started/pipelines-get-started?view=azure-devops&source=recommendations#define-pipelines-using-the-classic-interface", + "services": [], "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", + "subcategory": "Continuous Integration", + "text": "Use GUI for pipeline", "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "WAF checklist", - "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": [ - "WAF", - "VM" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Set up templates, parameters and expressions", + "guid": "8d1d7665-7246-4b44-a564-b4dd74a759c7", + "link": "https://learn.microsoft.com/azure/devops/pipelines/process/templates?view=azure-devops&pivots=templates-includes", + "services": [], "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", + "subcategory": "Continuous Integration", + "text": "Configure Templates", "waf": "Operations" }, { - "arm-service": "microsoft.network/networkWatchers", - "checklist": "WAF checklist", - "guid": "90483845-c986-4cb2-a131-56a12476e49f", - "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", - "service": "Network Watcher", - "services": [ - "Monitor", - "WAF", - "NetworkWatcher" - ], - "severity": "Medium", - "text": "Use Network Watcher to proactively monitor traffic flows.", - "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Set up jobs, stages and dependencies", + "guid": "633bd2a1-a27a-4764-a90b-e0e378ee293c", + "link": "https://learn.microsoft.com/azure/devops/pipelines/process/stages?view=azure-devops&tabs=yaml", + "services": [], + "severity": "High", + "subcategory": "Continuous Integration", + "text": "Jobs", "waf": "Operations" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "WAF checklist", - "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", - "WAF" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Set up conditions and Demands", + "guid": "1bd363ca-aab7-4571-a49a-b9193dc9fc9d", + "link": "https://learn.microsoft.com/azure/devops/pipelines/process/conditions?view=azure-devops&tabs=yaml%2Cstages", + "services": [], "severity": "Medium", - "text": "Use Azure Monitor Logs for insights and reporting.", + "subcategory": "Continuous Integration", + "text": "Conditions and Demands", "waf": "Operations" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "WAF checklist", - "guid": "97be9951-9048-4384-9c98-6cb2913156a1", - "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/alerts-overview", - "service": "Monitor", - "services": [ - "Monitor", - "WAF" - ], - "severity": "Medium", - "text": "Use Azure Monitor alerts for the generation of operational alerts.", + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Define Variables", + "guid": "1bb84b37-b5a6-47fc-a9ed-5b35478d447a", + "link": "https://learn.microsoft.com/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch", + "services": [], + "severity": "High", + "subcategory": "Continuous Integration", + "text": "Variables", "waf": "Operations" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "WAF checklist", - "guid": "fed3c55f-a67e-4875-aadd-3aba3f9fde31", - "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", - "service": "Monitor", - "services": [ - "Monitor", - "WAF" - ], - "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.", + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Set up your deployment pipeline", + "guid": "826c2863-c00f-41ca-a699-ef1d5a83de5d", + "link": "https://learn.microsoft.com/azure/devops/pipelines/process/create-multistage-pipeline?view=azure-devops", + "services": [], + "severity": "High", + "subcategory": "Continuous Deployment", + "text": "Deployment Pipeline", "waf": "Operations" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "WAF checklist", - "guid": "eba8cf22-45c6-4dc1-9b57-2cceb3b97ce5", - "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", - "service": "Backup", - "services": [ - "WAF", - "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.", - "waf": "Reliability" + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Select correct branches to deploy from", + "guid": "e36c1c81-870a-40bc-9c1e-43a18658d285", + "link": "https://learn.microsoft.com/azure/devops/pipelines/release/deploy-multiple-branches?view=azure-devops", + "services": [], + "severity": "Medium", + "subcategory": "Continuous Deployment", + "text": "Release branch", + "training": "https://learn.microsoft.com/azure/active-directory/managed-identities-azure-resources/overview", + "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "f541acdc-e979-4377-acdb-3751ab2ab13a", - "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", - "service": "VM", - "services": [ - "AzurePolicy", - "WAF", - "VM" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "use relevant template to deploy to azure", + "guid": "8ed67179-b825-4546-bf2a-ee4553afc833", + "link": "https://learn.microsoft.com/azure/devops/pipelines/overview-azure?view=azure-devops", + "services": [], "severity": "Medium", - "text": "Use Azure guest policies to automatically deploy software configurations through VM extensions and enforce a compliant baseline VM configuration.", - "waf": "Security" + "subcategory": "Continuous Deployment", + "text": "Deploy to Azure", + "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "WAF checklist", - "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": [ - "Monitor", - "WAF", - "AzurePolicy", - "VM" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Define Release Approvals and pre deployment checks", + "guid": "9248726d-d68c-45b5-a292-5394b69b9d37", + "link": "https://learn.microsoft.com/azure/devops/pipelines/process/approvals?view=azure-devops&tabs=check-pass", + "services": [], "severity": "Medium", - "text": "Monitor VM security configuration drift via Azure Policy.", - "waf": "Security" + "subcategory": "Continuous Deployment", + "text": "Approvals and Checks", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "2476e49f-541a-4cdc-b979-377bcdb3751a", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", - "service": "VM", - "services": [ - "ACR", - "WAF", - "VM", - "ASR" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Define Gates and post deployment checks", + "guid": "9ac43bc6-8d1d-4766-9724-6b448564b4dd", + "link": "https://learn.microsoft.com/azure/devops/pipelines/release/approvals/?view=azure-devops&tabs=yaml", + "services": [], "severity": "Medium", - "text": "Use Azure Site Recovery for Azure-to-Azure Virtual Machines disaster recovery scenarios. This enables you to replicate workloads across regions.", + "subcategory": "Continuous Deployment", + "text": "Gates", "waf": "Operations" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "WAF checklist", - "guid": "f625ca44-e569-45f2-823a-ce8cb12308ca", - "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", - "service": "Backup", - "services": [ - "WAF", - "Backup" - ], - "severity": "Medium", - "text": "Use Azure-native backup capabilities, or an Azure-compatible, 3rd-party backup solution.", + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Define Azure Function and REST API Checks", + "guid": "74a759c7-633b-4d2a-8a27-a764a90be0e3", + "link": "https://learn.microsoft.com/azure/devops/pipelines/process/invoke-checks?view=azure-devops", + "services": [], + "severity": "Low", + "subcategory": "Continuous Deployment", + "text": "Azure Function Checks", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", "waf": "Operations" }, { - "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", - "checklist": "WAF checklist", - "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" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Review pipeline reports", + "guid": "78ee293c-1bd3-463c-aaab-7571949ab919", + "link": "https://learn.microsoft.com/azure/devops/pipelines/reports/pipelinereport?view=azure-devops", + "services": [], "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.", + "subcategory": "Continuous Deployment", + "text": "Pipline Reports", + "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", "waf": "Operations" }, { - "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", - "checklist": "WAF checklist", - "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" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "configure Trend Result widget", + "guid": "3dc9fc9d-1bb8-44b3-9b5a-67fcb9ed5b35", + "link": "https://learn.microsoft.com/azure/devops/report/dashboards/analytics-widgets?toc=%2Fazure%2Fdevops%2Fpipelines%2Ftoc.json&view=azure-devops#test-results-trend-advanced", + "services": [], "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.", + "subcategory": "Analytics", + "text": "Pipeline Result Trend", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", "waf": "Operations" }, { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "WAF checklist", - "guid": "5017f154-e3ab-4369-9829-e7e316183687", - "link": "https://learn.microsoft.com/azure/key-vault/general/overview", - "service": "Key Vault", - "services": [ - "WAF", - "AKV" - ], - "severity": "High", - "text": "Use Azure Key Vault to store your secrets and credentials.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "WAF checklist", - "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": [ - "WAF", - "AKV" - ], - "severity": "Medium", - "text": "Use different Azure Key Vaults for different applications and regions to avoid transaction scale limits and restrict access to secrets.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "WAF checklist", - "guid": "2ba52752-6944-4008-ae7d-7e4843276d8b", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Key Vault", - "services": [ - "AzurePolicy", - "WAF", - "AKV" - ], - "severity": "Medium", - "text": "Provision Azure Key Vault with the soft delete and purge policies enabled to allow retention protection for deleted objects.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "WAF checklist", - "guid": "dc055bcf-619e-48a1-9f98-879525d62688", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Key Vault", - "services": [ - "RBAC", - "WAF", - "AKV", - "Entra" - ], - "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.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "WAF checklist", - "guid": "6d70ba6c-97be-4995-8904-83845c986cb2", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Key Vault", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Automate the certificate management and renewal process with public certificate authorities to ease administration.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "WAF checklist", - "guid": "913156a1-2476-4e49-b541-acdce979377b", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Key Vault", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Establish an automated process for key and certificate rotation.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "WAF checklist", - "guid": "cdb3751a-b2ab-413a-ba6e-55d7d8a2adb1", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Key Vault", - "services": [ - "VNet", - "WAF", - "AKV", - "PrivateLink" - ], - "severity": "Medium", - "text": "Enable firewall and virtual network service endpoint or private endpoint on the vault to control access to the key vault.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "WAF checklist", - "guid": "17d6326a-f625-4ca4-9e56-95f2223ace8c", - "link": "https://learn.microsoft.com/azure/key-vault/general/monitor-key-vault", - "service": "Key Vault", - "services": [ - "Monitor", - "WAF", - "AKV", - "Entra" - ], - "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.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "WAF checklist", - "guid": "b12308ca-5017-4f15-9e3a-b3693829e7e3", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Key Vault", - "services": [ - "AzurePolicy", - "WAF", - "AKV" - ], - "severity": "Medium", - "text": "Delegate Key Vault instantiation and privileged access and use Azure Policy to enforce a consistent compliant configuration.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "WAF checklist", - "guid": "91163418-2ba5-4275-8694-4008be7d7e48", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Key Vault", - "services": [ - "WAF", - "AKV" - ], - "severity": "Medium", - "text": "Use an Azure Key Vault per application per environment per region.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "WAF checklist", - "guid": "25d62688-6d70-4ba6-a97b-e99519048384", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Key Vault", - "services": [ - "ACR", - "WAF", - "AKV", - "ASR" - ], - "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.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "WAF checklist", - "guid": "4ac6b67c-b3a4-4ff9-8e87-b07a7ce7bbdb", - "link": "https://learn.microsoft.com/industry/sovereignty/key-management", - "service": "Key Vault", - "services": [ - "WAF", - "AKV" - ], - "severity": "Medium", - "text": "For Sovereign Landing Zone, use Azure Key Vault managed HSM to store your secrets and credentials.", - "waf": "Security" - }, - { - "checklist": "WAF checklist", - "guid": "4e5695f2-223a-4ce8-ab12-308ca5017f15", - "link": "https://learn.microsoft.com/azure/active-directory/reports-monitoring/overview-reports", - "service": "Entra", - "services": [ - "WAF", - "Entra" - ], - "severity": "Medium", - "text": "Use Microsoft Entra ID reporting capabilities to generate access control audit reports.", - "waf": "Security" - }, - { - "checklist": "WAF checklist", - "guid": "09945bda-4333-44f2-9911-634182ba5275", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/concept-cloud-security-posture-management", - "service": "Defender", - "services": [ - "WAF", - "Defender", - "Subscriptions" - ], - "severity": "High", - "text": "Enable Defender Cloud Security Posture Management for all subscriptions.", - "waf": "Security" - }, - { - "checklist": "WAF checklist", - "guid": "36a72a48-fffe-4c40-9747-0ab5064355ba", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/plan-defender-for-servers-select-plan", - "service": "Defender", - "services": [ - "WAF", - "Defender", - "Subscriptions" - ], - "severity": "High", - "text": "Enable a Defender Cloud Workload Protection Plan for Servers on all subscriptions.", - "waf": "Security" - }, - { - "checklist": "WAF checklist", - "guid": "77425f48-ecba-43a0-aeac-a3ac733ccc6a", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/connect-azure-subscription", - "service": "Defender", - "services": [ - "WAF", - "Defender", - "Subscriptions" - ], - "severity": "High", - "text": "Enable Defender Cloud Workload Protection Plans for Azure Resources on all subscriptions.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "24d96b30-61ee-4436-a1cc-d6ef08bc574b", - "link": "https://learn.microsoft.com/mem/configmgr/protect/deploy-use/endpoint-protection", - "service": "VM", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Enable Endpoint Protection on IaaS Servers.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "15833ee7-ad6c-46d3-9331-65c7acbe44ab", - "link": "https://learn.microsoft.com/azure/security-center/", - "service": "VM", - "services": [ - "Monitor", - "WAF", - "Defender" - ], - "severity": "Medium", - "text": "Monitor base operating system patching drift via Azure Monitor Logs and Defender for Cloud.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.Insights/components", - "checklist": "WAF checklist", - "guid": "e5f8d79f-2e87-4768-924c-516775c6ea95", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "Monitor", - "services": [ - "Monitor", - "WAF", - "Entra" - ], - "severity": "Medium", - "text": "Connect default resource configurations to a centralized Azure Monitor Log Analytics workspace.", - "waf": "Security" - }, - { - "checklist": "WAF checklist", - "guid": "1761e147-f65e-4d09-bbc2-f464f23e2eba", - "link": "https://learn.microsoft.com/industry/sovereignty/transparency-logs", - "service": "Entra", - "services": [ - "WAF", - "Entra" - ], - "severity": "Medium", - "text": "For Sovereign Landing Zone, enable transparancy logs on the Entra ID tenant.", - "waf": "Security" - }, - { - "checklist": "WAF checklist", - "guid": "d21a922d-5ca7-427a-82a6-35f7b21f1bfc", - "link": "https://learn.microsoft.com/azure/security/fundamentals/customer-lockbox-overview", - "service": "Entra", - "services": [ - "WAF", - "Entra" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Connect with WIT to visualize work", + "guid": "478d447a-826c-4286-9c00-f1cac699ef1d", + "link": "https://learn.microsoft.com/azure/devops/pipelines/integrations/configure-pipelines-work-tracking?view=azure-devops&tabs=yaml", + "services": [], "severity": "Medium", - "text": "For Sovereign Landing Zone, enable customer Lockbox on the Entra ID tenant.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "WAF checklist", - "guid": "b03ed428-4617-4067-a787-85468b9ccf3f", - "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", - "service": "Storage", - "services": [ - "Storage", - "WAF" - ], - "severity": "High", - "text": "Enable secure transfer to storage accounts.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "WAF checklist", - "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", - "WAF" - ], - "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": "WAF checklist", - "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": [ - "WAF", - "AKV", - "VM" - ], - "severity": "High", - "text": "Use Key Vault secrets to avoid hard-coding sensitive information such as credentials (virtual machines user passwords), certificates or keys.", + "subcategory": "Analytics", + "text": "Work Tracking with Pipeline", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", "waf": "Operations" }, { - "arm-service": "microsoft.cache/redis", - "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", - "services": [ - "ACR", - "WAF" - ], - "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.cache/redis", - "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", - "services": [ - "Storage", - "WAF" - ], - "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" - }, - { - "arm-service": "microsoft.cache/redis", - "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", - "services": [ - "Storage", - "WAF" - ], - "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.cache/redis", - "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", - "services": [ - "WAF", - "ASR" - ], - "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" - }, - { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "WAF checklist", - "guid": "ac1d6380-f866-4bbd-a9b4-b1ee5d7908b8", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#availability-zones", - "service": "IoT", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Leverage Availability Zones if regionally applicable (this is automatically enabled)", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "WAF checklist", - "guid": "35f651e8-0124-4ef7-8c57-658e38609e6e", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", - "service": "IoT", - "services": [ - "WAF" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Understand agent pools", + "guid": "5a83de5d-e36c-41c8-8870-a0bc5c1e43a1", + "link": "https://learn.microsoft.com/azure/devops/pipelines/agents/agents?view=azure-devops&tabs=yaml%2Cbrowser", + "services": [], "severity": "Medium", - "text": "Be aware of Microsoft-initiated failovers. These are exercised by Microsoft in rare situations to fail over all the IoT hubs from an affected region to the corresponding geo-paired region.", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "WAF checklist", - "guid": "4ed3e490-dc06-4a1e-b467-5d0239d85540", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#cross-region-dr", - "service": "IoT", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "WAF checklist", - "guid": "a11ecab0-db47-46f7-9aa7-17764e7e45a1", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", - "service": "IoT", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Learn how to trigger a manual failover.", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "WAF checklist", - "guid": "f9db8dfb-1194-460b-aedd-34dd6a69db22", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#failback", - "service": "IoT", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Learn how to fail back after a failover.", - "waf": "Reliability" + "subcategory": "Continuous Deployment", + "text": " Agents and agent pools", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Operations" }, { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Understand and provision Deployment Groups when required", + "guid": "8658d285-8ed6-4717-ab82-5546df2aee45", + "link": "https://learn.microsoft.com/azure/devops/pipelines/release/deployment-groups/?view=azure-devops", + "services": [], "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": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", - "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", - "service": "App Services", - "services": [ - "WAF", - "Backup" - ], - "severity": "Medium", - "text": "Use Premium and Standard tiers. These tiers support staging slots and automated backups.", - "waf": "Reliability" + "subcategory": "Continuous Deployment", + "text": "Deployment Groups", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Operations" }, { - "arm-service": "microsoft.web/sites", - "checklist": "WAF checklist", - "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", - "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", - "service": "App Services", + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Understand Kubernetes Deployment", + "guid": "53afc833-9248-4726-bd68-c5b5c2925394", + "link": "https://learn.microsoft.com/azure/devops/pipelines/ecosystems/kubernetes/deploy?view=azure-devops", "services": [ - "WAF" + "AKS" ], - "severity": "High", - "text": "Leverage Availability Zones where regionally applicable (requires Premium v2 or v3 tier)", - "waf": "Reliability" + "severity": "Low", + "subcategory": "Continuous Deployment", + "text": "Deploy to Kubernetes", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "Operations" }, { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Perform Dynamic Security Testing", + "guid": "b69b9d37-9ac4-43bc-98d1-d76657246b44", + "link": "https://devblogs.microsoft.com/premier-developer/azure-devops-pipelines-leveraging-owasp-zap-in-the-release-pipeline/", + "services": [], "severity": "Medium", - "text": "Implement health checks", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "WAF checklist", - "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", - "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", - "service": "App Services", - "services": [ - "WAF", - "AppSvc", - "Backup" - ], - "severity": "High", - "text": "Refer to backup and restore best practices for Azure App Service", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF", - "AppSvc" - ], - "severity": "High", - "text": "Implement Azure App Service reliability best practices", - "waf": "Reliability" + "subcategory": "Security", + "text": "DAST Scan", + "training": "https://learn.microsoft.com/learn/modules/create-custom-azure-roles-with-rbac/", + "waf": "Security" }, { - "arm-service": "microsoft.web/sites", - "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", - "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": [ - "WAF", - "AppSvc" - ], - "severity": "High", - "text": "Familiarize with reliability support in Azure App Service", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF", - "AppSvc" - ], - "severity": "Medium", - "text": "Ensure \"Always On\" is enabled for Function Apps running on a app service plan", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "Monitor", - "WAF", - "AppSvc" - ], - "severity": "Medium", - "text": "Monitor App Service instances using Health checks", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "Monitor", - "WAF" - ], - "severity": "Medium", - "text": "Monitor availability and responsiveness of web app or website using Application Insights availability tests", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "Monitor", - "WAF" - ], - "severity": "Low", - "text": "Use Application Insights Standard test to monitor availability and responsiveness of web app or website", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "AppSvc", - "WAF", - "AKV" - ], - "severity": "High", - "text": "Use Key Vault to store secrets", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "AppSvc", - "WAF", - "AKV", - "Entra" - ], - "severity": "High", - "text": "Use Managed Identity to connect to Key Vault", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "AppSvc", - "WAF", - "AKV" - ], - "severity": "High", - "text": "Use Key Vault to store TLS certificate.", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF", - "AppSvc", - "Subscriptions" - ], - "severity": "Medium", - "text": "Isolate systems that process sensitive information", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF", - "AppSvc", - "TrafficManager" - ], - "severity": "Medium", - "text": "Do not store sensitive data on local disk", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF", - "AppSvc", - "Entra" - ], - "severity": "Medium", - "text": "Use an established Identity Provider for authentication", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF", - "AppSvc" - ], - "severity": "High", - "text": "Deploy from a trusted environment", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF", - "Entra" - ], - "severity": "High", - "text": "Disable basic authentication", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF", - "AKV", - "Entra" - ], - "severity": "High", - "text": "Use Managed Identity to connect to resources", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "ACR", - "WAF", - "Entra" - ], - "severity": "High", - "text": "Pull containers using a Managed Identity", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "Monitor", - "WAF", - "AppSvc", - "Entra" - ], - "severity": "Medium", - "text": "Send App Service runtime logs to Log Analytics", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "Monitor", - "WAF", - "AppSvc", - "Entra" - ], - "severity": "Medium", - "text": "Send App Service activity logs to Log Analytics", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "Monitor", - "NVA", - "VNet", - "WAF", - "Firewall" - ], - "severity": "Medium", - "text": "Outbound network access should be controlled", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "PrivateLink", - "Storage", - "NVA", - "VNet", - "WAF", - "Firewall" - ], - "severity": "Low", - "text": "Ensure a stable IP for outbound communications towards internet addresses", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF", - "AppSvc", - "PrivateLink" - ], - "severity": "High", - "text": "Inbound network access should be controlled", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "Monitor", - "FrontDoor", - "AppGW", - "WAF", - "AppSvc" - ], - "severity": "High", - "text": "Use a WAF in front of App Service", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF", - "PrivateLink" - ], - "severity": "High", - "text": "Avoid for WAF to be bypassed", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "AzurePolicy", - "WAF", - "AppSvc" - ], - "severity": "Medium", - "text": "Set minimum TLS policy to 1.2", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF", - "AppSvc" - ], - "severity": "High", - "text": "Use HTTPS only", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "Storage", - "WAF" - ], - "severity": "High", - "text": "Wildcards must not be used for CORS", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Turn off remote debugging", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "AppSvc", - "WAF", - "Defender" - ], - "severity": "Medium", - "text": "Enable Defender for Cloud - Defender for App Service", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF", - "AppGW", - "NVA", - "EventHubs", - "VNet", - "DDoS" - ], - "severity": "Medium", - "text": "Enable DDOS Protection Standard on the WAF VNet", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "ACR", - "WAF", - "VNet", - "PrivateLink" - ], - "severity": "Medium", - "text": "Pull containers over a Virtual Network", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Conduct a penetration test", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Deploy validated code", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "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", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Use up-to-date platforms, languages, protocols and frameworks", - "waf": "Security" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", - "service": "AVS", - "services": [ - "Entra", - "WAF", - "Subscriptions" - ], - "severity": "High", - "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": "75089c20-990d-4927-b105-885576f76fc2", - "service": "AVS", - "services": [ - "AVS", - "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", - "waf": "Security" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", - "service": "AVS", - "services": [ - "WAF" - ], - "severity": "High", - "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": "cd289ced-6b17-4db8-8554-61e2aee3553a", - "service": "AVS", - "services": [ - "WAF" - ], - "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": "b9d37dac-43bc-46cd-8d79-a9b24604489a", - "service": "AVS", - "services": [ - "WAF" - ], - "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": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", - "service": "AVS", - "services": [ - "WAF", - "Entra" - ], - "severity": "High", - "text": "Ensure that NSX-Manager is integrated with an external Identity provider (LDAPS)", - "waf": "Security" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", - "service": "AVS", - "services": [ - "RBAC", - "AVS", - "WAF" - ], - "severity": "Medium", - "text": "Has an RBAC model been created for use within VMware vSphere", - "waf": "Security" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", - "service": "AVS", - "services": [ - "RBAC", - "WAF" - ], - "severity": "Medium", - "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": "d503547c-c447-4e82-9128-a71f0f1cac6d", - "service": "AVS", - "services": [ - "RBAC", - "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", - "service": "AVS", - "services": [ - "RBAC", - "WAF" - ], - "severity": "High", - "text": "Ensure all custom roles are scoped with CloudAdmin permitted authorizations", - "waf": "Security" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", - "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", - "service": "AVS", - "services": [ - "AVS", - "WAF" - ], - "severity": "High", - "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": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", - "service": "AVS", - "services": [ - "ExpressRoute", - "VPN", - "Monitor", - "NetworkWatcher", - "WAF" - ], - "severity": "High", - "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": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", - "service": "AVS", - "services": [ - "ExpressRoute", - "Monitor", - "VM", - "NetworkWatcher", - "AVS", - "WAF" - ], - "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": "f41ce6a0-64f3-4805-bc65-3ab50df01265", - "service": "AVS", - "services": [ - "Monitor", - "VM", - "NetworkWatcher", - "AVS", - "WAF" - ], - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", - "service": "AVS", - "services": [ - "WAF", - "ARS" - ], - "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": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", - "service": "AVS", - "services": [ - "RBAC", - "AVS", - "WAF", - "Entra" - ], - "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": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", - "service": "AVS", - "services": [ - "RBAC", - "AVS", - "WAF", - "Entra" - ], - "severity": "High", - "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": "78c447a8-26b2-4863-af0f-1cac599ef1d5", - "service": "AVS", - "services": [ - "AVS", - "WAF", - "Entra" - ], - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", - "service": "AVS", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Limit use of CloudAdmin account to emergency access only", - "waf": "Security" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", - "service": "AVS", - "services": [ - "RBAC", - "WAF" - ], - "severity": "Medium", - "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": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", - "service": "AVS", - "services": [ - "WAF" - ], - "severity": "Medium", - "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": "586cb291-ec16-4a1d-876e-f9f141acdce5", - "service": "AVS", - "services": [ - "AVS", - "WAF", - "VM", - "Entra" - ], - "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": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", - "service": "AVS", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Is East-West traffic filtering implemented within NSX-T", - "waf": "Security" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", - "service": "AVS", - "services": [ - "AppGW", - "AVS", - "WAF", - "Firewall" - ], - "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": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", - "service": "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", - "service": "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "334fdf91-c234-4182-a652-75269440b4be", - "service": "AVS", - "services": [ - "WAF", - "ExpressRoute", - "VPN", - "VNet", - "DDoS" - ], - "severity": "Medium", - "text": "Is DDoS standard protection enabled on ExR/VPN Gateway subnet in Azure", - "waf": "Security" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", - "service": "AVS", - "services": [ - "AVS", - "WAF" - ], - "severity": "Medium", - "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": "9ccbd869-266a-4cca-874f-aa19bf39d95d", - "service": "AVS", - "services": [ - "AVS", - "WAF", - "Defender" - ], - "severity": "Medium", - "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": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", - "service": "AVS", - "services": [ - "Arc", - "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", - "service": "AVS", - "services": [ - "SQL", - "AVS", - "WAF" - ], - "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": "a3592718-e6e2-4051-9267-6ae46691e883", - "service": "AVS", - "services": [ - "WAF", - "AKV" - ], - "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": "5ac94222-3e13-4810-9230-81a941741583", - "service": "AVS", - "services": [ - "AVS", - "WAF" - ], - "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": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", - "service": "AVS", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Ensure that the appropriate vSAN Data redundancy method is used (RAID specification)", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "d88408f3-7273-44c8-96ba-280214590146", - "service": "AVS", - "services": [ - "Storage", - "WAF", - "AzurePolicy" - ], - "severity": "High", - "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": "d89f2e87-7784-424d-9167-85c6fa95b96a", - "service": "AVS", - "services": [ - "WAF", - "ASR" - ], - "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": "5d38e53f-9ccb-4d86-a266-acca274faa19", - "service": "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", - "service": "AVS", - "services": [ - "AzurePolicy", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", - "service": "AVS", - "services": [ - "Cost", - "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", - "service": "AVS", - "services": [ - "Cost", - "AVS", - "WAF" - ], - "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": "6691e883-5ac9-4422-83e1-3810523081a9", - "service": "AVS", - "services": [ - "WAF" - ], - "severity": "Medium", - "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": "db611712-6904-40b4-aa3d-3e0803276d4b", - "service": "AVS", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Ensure all required resource reside within the same Azure availability zone(s)", - "waf": "Performance" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", - "service": "AVS", - "services": [ - "AVS", - "WAF", - "Defender", - "VM" - ], - "severity": "Medium", - "text": "Enable Microsoft Defender for Cloud for Azure VMware Solution guest VM workloads", - "waf": "Security" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", - "service": "AVS", - "services": [ - "Arc", - "AVS", - "WAF", - "VM" - ], - "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": "88f03a4d-2cd4-463c-abbc-868295abc91a", - "service": "AVS", - "services": [ - "AVS", - "WAF" - ], - "severity": "High", - "text": "Enable Diagnostic and metric logging on Azure VMware Solution", - "waf": "Operations" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", - "service": "AVS", - "services": [ - "Monitor", - "AVS", - "WAF", - "VM" - ], - "severity": "Medium", - "text": "Deploy the Log Analytics Agents to Azure VMware Solution guest VM workloads", - "waf": "Operations" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "589d457a-927c-4397-9d11-02cad6aae11e", - "service": "AVS", - "services": [ - "AzurePolicy", - "VM", - "AVS", - "WAF", - "Backup" - ], - "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": "ee29711b-d352-4caa-ab79-b198dab81932", - "service": "AVS", - "services": [ - "Monitor", - "AVS", - "WAF", - "Defender" - ], - "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": [ - "WAF", - "Defender" - ], - "severity": "Medium", - "text": "Are the applicable compliance baselines added to Microsoft Defender for Cloud", - "waf": "Security" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", - "service": "AVS", - "services": [ - "AVS", - "WAF" - ], - "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": [ - "WAF" - ], - "severity": "High", - "text": "Are data processing implications (service provider / service consumer model) clear and documented", - "waf": "Security" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "547c1747-dc56-4068-a714-435cd19dd244", - "service": "AVS", - "services": [ - "WAF" - ], - "severity": "Medium", - "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": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", - "service": "AVS", - "services": [ - "Monitor", - "AVS", - "WAF" - ], - "severity": "High", - "text": "Create dashboards to enable core Azure VMware Solution monitoring insights", - "waf": "Operations" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", - "service": "AVS", - "services": [ - "Monitor", - "AVS", - "WAF" - ], - "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": "9659e396-80e7-4828-ac93-5657d02bff45", - "service": "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", - "service": "AVS", - "services": [ - "Monitor", - "WAF" - ], - "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": "b6abad38-aad5-43cc-99e1-d86667357c54", - "service": "AVS", - "services": [ - "Storage", - "AVS", - "WAF" - ], - "severity": "Medium", - "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": "9674c5ed-85b8-459c-9733-be2b1a27b775", - "service": "AVS", - "services": [ - "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", - "service": "AVS", - "services": [ - "Storage", - "WAF", - "AzurePolicy", - "VM" - ], - "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": "d9ef1d5e-832d-442e-9611-c818b0afbc51", - "service": "AVS", - "services": [ - "WAF" - ], - "severity": "Medium", - "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": "0e43a18a-9cd2-489b-bd6b-17db8255461e", - "service": "AVS", - "services": [ - "Storage", - "WAF", - "Backup" - ], - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", - "service": "AVS", - "services": [ - "Arc", - "AVS", - "WAF" - ], - "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": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", - "service": "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", - "service": "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", - "service": "AVS", - "services": [ - "Monitor", - "AVS", - "WAF", - "AzurePolicy" - ], - "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": "aee3553a-fc83-4392-98b2-62d6cc5f5129", - "service": "AVS", - "services": [ - "AVS", - "WAF", - "Defender" - ], - "severity": "Medium", - "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": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", - "service": "AVS", - "services": [ - "WAF", - "Backup" - ], - "severity": "Medium", - "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": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", - "service": "AVS", - "services": [ - "WAF" - ], - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", - "service": "AVS", - "services": [ - "WAF", - "ASR" - ], - "severity": "Medium", - "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": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", - "service": "AVS", - "services": [ - "WAF" - ], - "severity": "High", - "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": "8255461e-2aee-4345-9aec-8339248b262d", - "service": "AVS", - "services": [ - "WAF", - "ASR" - ], - "severity": "Medium", - "text": "Use the geopolitical region pair as the secondary disaster recovery environment", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", - "service": "AVS", - "services": [ - "WAF" - ], - "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": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", - "service": "AVS", - "services": [ - "ExpressRoute", - "AVS", - "WAF", - "NVA" - ], - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", - "service": "AVS", - "services": [ - "WAF", - "Backup" - ], - "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": "bd352caa-ab79-4b18-adab-81932c9fc9d1", - "service": "AVS", - "services": [ - "AVS", - "WAF", - "Backup" - ], - "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": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", - "service": "AVS", - "services": [ - "WAF", - "Backup" - ], - "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": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", - "service": "AVS", - "services": [ - "AVS", - "WAF" - ], - "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": [ - "WAF" - ], - "severity": "Low", - "text": "For manual deployments, all configuration and deployments must be documented", - "waf": "Operations" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", - "service": "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", - "service": "AVS", - "services": [ - "WAF" - ], - "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": "e6bfbb9e-d503-4547-ac44-7e826128a71f", - "service": "AVS", - "services": [ - "WAF" - ], - "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": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", - "service": "AVS", - "services": [ - "AzurePolicy", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", - "service": "AVS", - "services": [ - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "255461e2-aee3-4553-afc8-339248b262d6", - "service": "AVS", - "services": [ - "ExpressRoute", - "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", - "service": "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", - "service": "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", - "service": "AVS", - "services": [ - "AVS", - "WAF", - "Subscriptions" - ], - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", - "service": "AVS", - "services": [ - "Storage", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", - "service": "AVS", - "services": [ - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", - "service": "AVS", - "services": [ - "WAF" - ], - "severity": "Medium", - "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": "d20b56c5-7be5-4851-a0f8-3835c586cb29", - "service": "AVS", - "services": [ - "WAF" - ], - "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": "1dc15a1c-075e-4e9f-841a-cccd579376bc", - "service": "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "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", - "services": [ - "WAF", - "VM" - ], - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "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", - "services": [ - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "WAF checklist", - "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", - "service": "AVS", - "services": [ - "VPN", - "WAF" - ], - "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": "e614658d-d457-4e92-9139-b821102cad6e", - "service": "AVS", - "services": [ - "WAF" - ], - "severity": "Medium", - "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": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", - "service": "AVS", - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "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", - "services": [ - "Storage", - "AVS", - "WAF", - "VM" - ], - "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" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "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", - "services": [ - "ExpressRoute", - "WAF", - "Storage" - ], - "severity": "Medium", - "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": "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": [ - "ExpressRoute", - "WAF", - "Storage" - ], - "severity": "Medium", - "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": "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": [ - "WAF", - "ASR" - ], - "severity": "High", - "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": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "AVS", - "services": [ - "WAF" - ], - "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": "9579d66b-896d-471f-a6ca-7be9955d04c3", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", - "service": "AVS", - "services": [ - "ExpressRoute", - "WAF" - ], - "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": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", - "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", - "service": "AVS", - "services": [ - "ExpressRoute", - "WAF" - ], - "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": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", - "service": "AVS", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Have site disaster tolerance settings been properly considered and changed for your business if needed.", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "WAF checklist", - "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Enable 2 replicas to have 99.9% availability for read operations", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "WAF checklist", - "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Enable 3 replicas to have 99.9% availability for read/write operations", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "WAF checklist", - "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": "Leverage Availability Zones by enabling read and/or write replicas", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Search/searchServices", - "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", - "services": [ - "ACR", - "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" - }, - { - "arm-service": "Microsoft.Search/searchServices", - "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", - "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" - }, - { - "arm-service": "Microsoft.Search/searchServices", - "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", - "services": [ - "WAF", - "TrafficManager" - ], - "severity": "Medium", - "text": "Use Azure Traffic Manager to coordinate requests", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Search/searchServices", - "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", - "services": [ - "Storage", - "WAF", - "Backup" - ], - "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" - }, - { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "WAF checklist", - "guid": "ab91932c-9fc9-4d1b-a881-37f5e6c0cb9e", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ADF_v1.docx", - "service": "Azure Data Factory", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Leverage FTA Resiliency Playbook for Azure Data Factory", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "WAF checklist", - "guid": "e503547c-d447-4e82-9138-a7200f1cac6d", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Use zone redundant pipelines in regions that support Availability Zones", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "WAF checklist", - "guid": "9ef1d6e8-32e5-42e3-911c-818b1a0bc511", - "link": "https://learn.microsoft.com/azure/data-factory/source-control", - "service": "Azure Data Factory", - "services": [ - "WAF", - "Backup" - ], - "severity": "Medium", - "text": "Use DevOps to Backup the ARM templates with Github/Azure DevOps integration ", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "WAF checklist", - "guid": "e43a18a9-cd29-49cf-b7b1-7db8255562f2", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", - "services": [ - "WAF", - "VM" - ], - "severity": "Medium", - "text": "Make sure you replicate the Self-Hosted Integration Runtime VMs in another region ", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "WAF checklist", - "guid": "aee4563a-fd83-4393-98b2-62d6dc5f512a", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", - "services": [ - "WAF", - "VNet" - ], - "severity": "Medium", - "text": "Make sure you replicate or duplicate your network in the sister region. You have to make a copy of your Vnet in another region", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "WAF checklist", - "description": "If your ADF Pipelines use Key Vault you don't have to do anything to replicate Key Vault. Key Vault is a managed service and Microsoft takes care of it for you", - "guid": "25498f6d-bad3-47da-a43b-c6ce1d7aa9b2", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "Azure Data Factory", - "services": [ - "WAF", - "AKV" - ], - "severity": "Low", - "text": "If using Keyvault integration, use SLA of Keyvault to understand your availablity", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Kusto/clusters", - "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", - "services": [ - "Cost", - "Storage", - "WAF" - ], - "text": "Leverage External Tables and Continuous data export overview to reduce costs", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Kusto/clusters", - "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", - "services": [ - "Storage", - "WAF" - ], - "text": "To share data, explore Leader-follower cluster configuration", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Kusto/clusters", - "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", - "services": [ - "WAF", - "ASR" - ], - "text": "To protect against regional failure, create Multiple independent clusters, preferably in two Azure Paired regions", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Kusto/clusters", - "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", - "services": [ - "RBAC", - "Storage", - "WAF" - ], - "text": "Replicate all management activities such as creating new tables or managing user roles on each cluster.", - "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", - "services": [ - "WAF" - ], - "text": "Ingest data into each cluster in parallel", - "waf": "Reliability" - }, - { - "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", - "services": [ - "ACR", - "WAF" - ], - "text": "For critical application with no tolerance for outages, create Active-Active-Active (always-on) configuration", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Kusto/clusters", - "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", - "services": [ - "ACR", - "WAF" - ], - "text": "For critical applications, create Active-Active configuration in two paired regions", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Kusto/clusters", - "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", - "services": [ - "WAF" - ], - "text": "For applications, which required only read during failure, create Active-Hot standby configuration", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Kusto/clusters", - "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", - "services": [ - "AzurePolicy", - "Storage", - "ASR", - "Cost", - "WAF" - ], - "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.Kusto/clusters", - "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", - "services": [ - "AzurePolicy", - "WAF" - ], - "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.Kusto/clusters", - "checklist": "WAF checklist", - "guid": "1559ab91-53e8-4908-ae28-b84c33b6b780", - "link": "https://learn.microsoft.com/azure/data-explorer/devops", - "service": "Azure Data Explorer", - "services": [ - "WAF" - ], - "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.Kusto/clusters", - "checklist": "WAF checklist", - "guid": "8b9fe5c4-1049-4d40-9a82-2c3474d00f18", - "link": "https://learn.microsoft.com/azure/data-explorer/devops", - "service": "Azure Data Explorer", - "services": [ - "WAF" - ], - "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.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": "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.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", - "services": [ - "ACR", - "WAF", - "AKV" - ], - "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.", - "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", - "services": [ - "WAF", - "AKV" - ], - "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": [ - "AzurePolicy", - "WAF", - "AKV" - ], - "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": [ - "AKV", - "Storage", - "WAF", - "Backup", - "Subscriptions" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Manage Service Connections", + "guid": "8564b4dd-74a7-459c-9633-bd2a1a27a764", + "link": "https://learn.microsoft.com/azure/devops/pipelines/library/service-endpoints?view=azure-devops&tabs=yaml", + "services": [], "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" + "subcategory": "Security", + "text": "Service Connections", + "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "waf": "Security" }, { - "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", + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Set data retention policies for CI and CD", + "guid": "a90be0e3-78ee-4293-a1bd-363caaab7571", + "link": "https://learn.microsoft.com/azure/devops/pipelines/policies/retention?view=azure-devops&tabs=yaml", "services": [ - "WAF", - "AKV" + "AzurePolicy" ], - "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.", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Security", + "text": "Retention Policies", + "training": "https://learn.microsoft.com/learn/modules/azure-active-directory/", + "waf": "Security" }, { - "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", - "services": [ - "WAF", - "AKV" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Set up and pay for concurrent pipelines", + "guid": "949ab919-3dc9-4fc9-b1bb-84b37b5a67fc", + "link": "https://learn.microsoft.com/azure/devops/pipelines/licensing/concurrent-jobs?view=azure-devops&tabs=ms-hosted", + "services": [], "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" + "subcategory": "Administration", + "text": "Parallel Pipelines", + "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", + "waf": "Operations" }, { - "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", - "services": [ - "WAF", - "AKV", - "Backup" - ], - "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" + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Set pipeline permissions", + "guid": "b9ed5b35-478d-4447-a826-c2863c00f1ca", + "link": "https://learn.microsoft.com/azure/devops/pipelines/policies/permissions?view=azure-devops", + "services": [], + "severity": "Medium", + "subcategory": "Security", + "text": "Pipeline Permissions", + "training": "https://learn.microsoft.com/learn/paths/implement-windows-server-iaas-virtual-machine-identity/", + "waf": "Security" }, { - "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", - "services": [ - "WAF", - "AKV", - "Backup" - ], + "category": "Azure Pipelines", + "checklist": "Azure DevOps", + "description": "Add users to pipeline", + "guid": "c699ef1d-5a83-4de5-be36-c1c81870a0bc", + "link": "https://learn.microsoft.com/azure/devops/pipelines/policies/set-permissions?view=azure-devops", + "services": [], "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" + "subcategory": "Security", + "text": "Pipeline Users", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "waf": "Security" }, { - "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", - "services": [ - "WAF", - "AKV", - "EventHubs" - ], + "category": "Azure Artifact", + "checklist": "Azure DevOps", + "description": "Configure Artifacts", + "guid": "5c1e43a1-8658-4d28-98ed-67179b825546", + "link": "https://learn.microsoft.com/azure/devops/pipelines/artifacts/artifacts-overview?view=azure-devops&tabs=nuget", + "services": [], "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" + "subcategory": "Configuration", + "text": "Artifact In Pipeline", + "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", + "waf": "Operations" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "WAF checklist", - "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", - "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", - "service": "Azure MySQL", - "services": [ - "WAF" - ], + "category": "Azure Artifact", + "checklist": "Azure DevOps", + "description": "Publish and consume artifact in pipeline", + "guid": "df2aee45-53af-4c83-9924-8726dd68c5b5", + "link": "https://learn.microsoft.com/azure/devops/pipelines/artifacts/pipeline-artifacts?view=azure-devops&tabs=yaml", + "services": [], "severity": "Medium", - "text": "Leverage Flexible Server", - "waf": "Reliability" + "subcategory": "Configuration", + "text": "Publish and download Artifact", + "training": "https://learn.microsoft.com/azure/architecture/example-scenario/identity/adds-extend-domain", + "waf": "Operations" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "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", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Leverage Availability Zones where regionally applicable", - "waf": "Reliability" + "category": "Azure Artifact", + "checklist": "Azure DevOps", + "description": "Publish NuGet packages with artifacts", + "guid": "c2925394-b69b-49d3-99ac-43bc68d1d766", + "link": "https://learn.microsoft.com/azure/devops/pipelines/artifacts/nuget?view=azure-devops&tabs=yaml", + "services": [], + "severity": "Low", + "subcategory": "Configuration", + "text": "NuGet", + "training": "https://learn.microsoft.com/azure/role-based-access-control/overview", + "waf": "Operations" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "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", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Leverage Data-in replication for cross-region DR scenarios", - "waf": "Reliability" + "category": "Azure Artifact", + "checklist": "Azure DevOps", + "description": "Publish Maven packages with artifacts", + "guid": "57246b44-8564-4b4d-b74a-759c7633bd2a", + "link": "https://learn.microsoft.com/azure/devops/pipelines/artifacts/publish-maven-artifacts?view=azure-devops", + "services": [], + "severity": "Low", + "subcategory": "Configuration", + "text": "Maven", + "waf": "Operations" }, { - "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", - "services": [ - "FrontDoor", - "WAF", - "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", + "category": "Azure Artifact", + "checklist": "Azure DevOps", + "description": "Publish NPM packages with artifacts", + "guid": "1a27a764-a90b-4e0e-978e-e293c1bd363c", + "link": "https://learn.microsoft.com/azure/devops/pipelines/artifacts/npm?view=azure-devops&tabs=yaml", + "services": [], + "severity": "Low", + "subcategory": "Configuration", + "text": "NPM", "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" - ], + "category": "Azure Artifact", + "checklist": "Azure DevOps", + "description": "Best Practices to work with Azure Artifact", + "guid": "aaab7571-949a-4b91-a3dc-9fc9d1bb84b3", + "link": "https://learn.microsoft.com/azure/devops/artifacts/concepts/best-practices?view=azure-devops", + "services": [], "severity": "Medium", - "text": "Ensure you are using Application Gateway v2 SKU", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Security" + "subcategory": "Configuration", + "text": "Best Practices", + "waf": "Operations" }, { - "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", + "category": "DevOps Practice", + "checklist": "Azure DevOps", + "description": "What is monitoring?", + "guid": "7b5a67fc-b9ed-45b3-9478-d447a826c286", + "link": "https://learn.microsoft.com/devops/operate/what-is-monitoring", "services": [ - "LoadBalancer", - "WAF" + "Monitor" ], + "severity": "High", + "subcategory": "Practice", + "text": "What to monitor?", + "waf": "Operations" + }, + { + "category": "DevOps Practice", + "checklist": "Azure DevOps", + "description": "Progressive Exposure Strategy", + "guid": "3c00f1ca-c699-4ef1-b5a8-3de5de36c1c8", + "link": "https://learn.microsoft.com/devops/operate/safe-deployment-practices", + "services": [], "severity": "Medium", - "text": "Ensure you are using the Standard SKU for your Azure Load Balancers", - "waf": "Security" + "subcategory": "Practice", + "text": "Safe Deployment Practices", + "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", - "services": [ - "LoadBalancer", - "WAF" - ], + "category": "DevOps Practice", + "checklist": "Azure DevOps", + "description": "Microsoft runs reliable systems with DevOps", + "guid": "1870a0bc-5c1e-443a-8865-8d2858ed6717", + "link": "https://learn.microsoft.com/devops/operate/how-microsoft-operates-devops", + "services": [], + "severity": "Low", + "subcategory": "Practice", + "text": "Case Study", + "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "waf": "Operations" + }, + { + "category": "DevOps Practice", + "checklist": "Azure DevOps", + "description": "Security in DevOps", + "guid": "9b825546-df2a-4ee4-953a-fc8339248726", + "link": "https://learn.microsoft.com/devops/operate/security-in-devops", + "services": [], "severity": "Medium", - "text": "Ensure your Load Balancers frontend IP addresses are zone-redundant (unless you require zonal frontends).", + "subcategory": "Practice", + "text": "DevSecOps", "waf": "Security" }, { - "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", - "services": [ - "AppGW", - "WAF", - "VNet" - ], - "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/", + "category": "DevOps Practice", + "checklist": "Azure DevOps", + "description": "Enable DevSecops with Azure And GitHub", + "guid": "dd68c5b5-c292-4539-9b69-b9d379ac43bc", + "link": "https://learn.microsoft.com/devops/devsecops/enable-devsecops-azure-github", + "services": [], + "severity": "Low", + "subcategory": "Practice", + "text": "DevSecops", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", "waf": "Security" }, { - "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", + "category": "DevOps Practice", + "checklist": "Azure DevOps", + "description": "Mirror RBAC in DevOps", + "guid": "68d1d766-5724-46b4-9856-4b4dd74a759c", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/secure/best-practices/end-to-end-governance", "services": [ - "AppGW", - "NVA", - "VNet", - "Entra", - "WAF", - "Subscriptions" + "RBAC" ], - "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/", + "severity": "Low", + "subcategory": "Practice", + "text": "Secure DevOps Govenance", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", "waf": "Security" }, { - "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", - "services": [ - "DDoS", - "WAF" - ], + "category": "DevOps Practice", + "checklist": "Azure DevOps", + "description": "Governance when using CI/CD", + "guid": "7633bd2a-1a27-4a76-9a90-be0e378ee293", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/governance/end-to-end-governance-in-azure", + "services": [], "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/", + "subcategory": "Practice", + "text": "Azure DevOps Governance", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", "waf": "Security" }, { - "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", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Configure autoscaling with a minimum amount of instances of two.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "category": "BC and DR", + "checklist": "Azure Function Review", + "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": [], + "severity": "High", + "subcategory": "High Availability", + "text": "Select the right Function hosting plan based on your business & SLO requirements", "waf": "Reliability" }, { - "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", - "services": [ - "AppGW", - "ACR", - "WAF" - ], - "severity": "Medium", - "text": "Deploy Application Gateway across Availability Zones", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "category": "BC and DR", + "checklist": "Azure Function Review", + "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": [], + "severity": "High", + "subcategory": "High Availability", + "text": "Leverage Availability Zones where regionally applicable (not available for Consumption tier)", "waf": "Reliability" }, { - "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", - "services": [ - "AzurePolicy", - "WAF", - "FrontDoor" - ], + "category": "BC and DR", + "checklist": "Azure Function Review", + "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": [], "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" + "subcategory": "High Availability", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "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", + "category": "BC and DR", + "checklist": "Azure Function Review", + "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "Azure Functions", "services": [ - "AzurePolicy", - "AppGW", - "WAF", - "FrontDoor" + "AppSvc" ], - "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", + "subcategory": "High Availability", + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "waf": "Reliability" }, { - "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", + "category": "BC and DR", + "checklist": "Azure Function Review", + "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", - "TrafficManager" + "AppSvc" ], "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/", + "subcategory": "High Availability", + "text": "Ensure 'Always On' is enabled for all Function Apps running on App Service Plan", "waf": "Reliability" }, { - "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", + "category": "BC and DR", + "checklist": "Azure Function Review", + "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": [ - "WAF", - "AVD", - "Entra" + "Storage" ], - "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", + "subcategory": "High Availability", + "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" }, { - "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", + "category": "Application Deployment", + "checklist": "Azure Function Review", + "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "Azure Functions", + "services": [], + "severity": "Medium", + "subcategory": "CI/CD", + "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Function App code", + "waf": "Operations" + }, + { + "category": "Operations Management", + "checklist": "Cognitive Services Review 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", + "services": [], + "severity": "Medium", + "subcategory": "Best Practice", + "text": "Leverage FTA HandBook for Cognitive Services", + "waf": "Reliability" + }, + { + "category": "Operations Management", + "checklist": "Cognitive Services Review 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", "services": [ - "WAF", - "Entra" + "Backup" ], "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" + "subcategory": "Backup", + "text": "Backup Your Prompts", + "waf": "Reliability" }, { - "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", + "category": "Operations Management", + "checklist": "Cognitive Services Review 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", "services": [ - "AzurePolicy", - "WAF", - "FrontDoor" + "Backup", + "ASR" ], "severity": "High", - "text": "Deploy your WAF policy for Front Door in 'Prevention' mode.", - "waf": "Security" + "subcategory": "Backup", + "text": "Business Continuity and Disaster Recovery (BCDR) considerations with Azure OpenAI Service", + "waf": "Reliability" }, { - "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", + "category": "Operations Management", + "checklist": "Cognitive Services Review Checklist", + "guid": "325af625-ca44-4e46-a5e2-223ace8bb123", + "link": "https://github.com/abacaj/chatgpt-backup#backup-your-chatgpt-conversations", + "service": "Cognitive Services", "services": [ - "WAF", - "FrontDoor", - "TrafficManager" + "Backup" ], - "severity": "High", - "text": "Avoid combining Azure Traffic Manager and Azure Front Door.", - "waf": "Security" + "severity": "Medium", + "subcategory": "Backup", + "text": "Backup Your ChatGPT conversations", + "waf": "Reliability" }, { - "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", - "services": [ - "WAF", - "FrontDoor" - ], - "severity": "High", - "text": "Use the same domain name on Azure Front Door and your origin. Mismatched host names can cause subtle bugs.", - "waf": "Security" + "category": "Operations Management", + "checklist": "Cognitive Services Review 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", + "services": [], + "severity": "Medium", + "subcategory": "DevOps", + "text": "CI/CD for custom speech", + "waf": "Reliability" }, { - "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", + "category": "Operations Management", + "checklist": "Cognitive Services Review Checklist", + "guid": "3687a046-7a1f-4893-9bda-43324f248116", + "link": "https://learn.microsoft.com/azure/ai-services/qnamaker/tutorials/export-knowledge-base", + "service": "Cognitive Services", + "services": [], + "severity": "Low", + "subcategory": "QnA Service", + "text": "Move a knowledge base using export-import", + "waf": "Reliability" + }, + { + "category": "BC and DR", + "checklist": "Azure App Service Review", + "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": [ - "WAF", - "FrontDoor" + "AppSvc" ], "severity": "Low", - "text": "Disable health probes when there is only one origin in an Azure Front Door origin group.", - "waf": "Performance" + "subcategory": "High Availability", + "text": "Refer to baseline highly available zone-redundant web application architecture for best practices", + "waf": "Reliability" }, { - "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", + "category": "BC and DR", + "checklist": "Azure App Service Review", + "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", + "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", + "service": "App Services", "services": [ - "WAF", - "FrontDoor" + "AppSvc", + "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.", + "subcategory": "High Availability", + "text": "Use Premium and Standard tiers. These tiers support staging slots and automated backups.", "waf": "Reliability" }, { - "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", + "category": "BC and DR", + "checklist": "Azure App Service Review", + "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", + "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", + "service": "App Services", "services": [ - "WAF", - "FrontDoor" + "AppSvc" ], - "severity": "Low", - "text": "Use HEAD health probes with Azure Front Door, to reduce the traffic that Front Door sends to your application.", - "waf": "Performance" + "severity": "High", + "subcategory": "High Availability", + "text": "Leverage Availability Zones where regionally applicable (requires Premium v2 or v3 tier)", + "waf": "Reliability" }, { - "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", + "category": "Operations", + "checklist": "Azure App Service Review", + "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Services", "services": [ - "LoadBalancer", - "WAF" + "AppSvc", + "Monitor" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Implement health checks", + "waf": "Reliability" + }, + { + "category": "Operations", + "checklist": "Azure App Service Review", + "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", + "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", + "service": "App Services", + "services": [ + "AppSvc", + "Backup" ], "severity": "High", - "text": "Use Azure NAT Gateway instead of Load Balancer outbound rules for better SNAT scalability", + "subcategory": "Multi-tenant service", + "text": "Refer to backup and restore best practices for Azure App Service", "waf": "Reliability" }, { - "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", + "category": "BC and DR", + "checklist": "Azure App Service Review", + "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": [ - "Cost", - "FrontDoor", - "WAF", - "AKV" + "AppSvc" ], "severity": "High", - "text": "Use managed TLS certificates with Azure Front Door. Reduce operational cost and risk of outages due to certificate renewals.", - "waf": "Operations" + "subcategory": "High Availability", + "text": "Implement Azure App Service reliability best practices", + "waf": "Reliability" }, { - "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", + "category": "BC and DR", + "checklist": "Azure App Service Review", + "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", - "FrontDoor" + "AppSvc" ], - "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" + "severity": "Low", + "subcategory": "High Availability", + "text": "Familiarize with how to move an App Service app to another region During a disaster", + "waf": "Reliability" }, { - "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", + "category": "BC and DR", + "checklist": "Azure App Service Review", + "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", + "service": "App Services", "services": [ - "WAF", - "FrontDoor" + "AppSvc" ], "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" + "subcategory": "High Availability", + "text": "Familiarize with reliability support in Azure App Service", + "waf": "Reliability" }, { - "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", + "category": "BC and DR", + "checklist": "Azure App Service Review", + "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "App Services", "services": [ - "WAF", - "FrontDoor" + "AppSvc" ], "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" + "subcategory": "High Availability", + "text": "Ensure \"Always On\" is enabled for Function Apps running on a app service plan", + "waf": "Reliability" }, { - "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", + "category": "Operations", + "checklist": "Azure App Service Review", + "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Services", "services": [ - "WAF", - "FrontDoor" + "AppSvc", + "Monitor" ], - "severity": "High", - "text": "Enable the Azure Front Door WAF. Protect your application from a range of attacks.", - "waf": "Security" + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Monitor App Service instances using Health checks", + "waf": "Reliability" }, { - "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", + "category": "Operations", + "checklist": "Azure App Service Review", + "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", + "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", + "service": "App Services", "services": [ - "WAF", - "FrontDoor" + "AppSvc", + "Monitor" ], - "severity": "High", - "text": "Tune the Azure Front Door WAF for your workload. Reduce false positive detections.", - "waf": "Security" + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Monitor availability and responsiveness of web app or website using Application Insights availability tests", + "waf": "Reliability" }, { - "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", + "category": "Operations", + "checklist": "Azure App Service Review", + "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", - "WAF", - "FrontDoor" + "AppSvc", + "Monitor" ], - "severity": "High", - "text": "Enable request body inspection feature enabled in Azure Front Door WAF policy.", - "waf": "Security" + "severity": "Low", + "subcategory": "Monitoring", + "text": "Use Application Insights Standard test to monitor availability and responsiveness of web app or website", + "waf": "Reliability" }, { - "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "WAF", - "FrontDoor" + "AppSvc", + "AKV" ], "severity": "High", - "text": "Enable the Azure Front Door WAF default rule sets. The default rule sets detect and block common attacks.", + "subcategory": "Data Protection", + "text": "Use Key Vault to store secrets", "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "WAF", - "FrontDoor" + "Entra", + "AppSvc", + "AKV" ], "severity": "High", - "text": "Enable the Azure Front Door WAF bot protection rule set. The bot rules detect good and bad bots.", + "subcategory": "Data Protection", + "text": "Use Managed Identity to connect to Key Vault", "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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", - "FrontDoor" + "AppSvc", + "AKV" ], - "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.", + "severity": "High", + "subcategory": "Data Protection", + "text": "Use Key Vault to store TLS certificate.", "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "WAF", - "FrontDoor" + "AppSvc", + "Subscriptions" ], "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.", + "subcategory": "Data Protection", + "text": "Isolate systems that process sensitive information", "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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", - "FrontDoor" + "AppSvc", + "TrafficManager" ], "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. ", + "subcategory": "Data Protection", + "text": "Do not store sensitive data on local disk", "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "WAF" + "Entra", + "AppSvc" ], - "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", + "subcategory": "Identity and Access Control", + "text": "Use an established Identity Provider for authentication", "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "WAF", - "FrontDoor" + "Entra", + "AppSvc" ], - "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.", + "severity": "High", + "subcategory": "Identity and Access Control", + "text": "Deploy from a trusted environment", "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "AppGW", - "WAF" + "Entra", + "AppSvc" ], "severity": "High", - "text": "Enable the Azure Application Gateway WAF bot protection rule set The bot rules detect good and bad bots.", + "subcategory": "Identity and Access Control", + "text": "Disable basic authentication", "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "AzurePolicy", - "AppGW", - "WAF" + "Entra", + "AppSvc", + "AKV" ], "severity": "High", - "text": "Enable request body inspection feature enabled in Azure Application Gateway WAF policy.", + "subcategory": "Identity and Access Control", + "text": "Use Managed Identity to connect to resources", "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "AppGW", - "WAF" + "Entra", + "AppSvc", + "ACR" ], "severity": "High", - "text": "Tune the Azure Application Gateway WAF for your workload. Reduce false positive detections.", + "subcategory": "Identity and Access Control", + "text": "Pull containers using a Managed Identity", "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "AzurePolicy", - "AppGW", - "WAF" + "Entra", + "AppSvc", + "Monitor" ], - "severity": "High", - "text": "Deploy your WAF policy for Application Gateway in 'Prevention' mode.", + "severity": "Medium", + "subcategory": "Logging and Monitoring", + "text": "Send App Service runtime logs to Log Analytics", "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "AppGW", - "WAF" + "Entra", + "AppSvc", + "Monitor" ], "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.", + "subcategory": "Logging and Monitoring", + "text": "Send App Service activity logs to Log Analytics", "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "AppGW", - "WAF" + "NVA", + "Monitor", + "AppSvc", + "VNet", + "Firewall" ], "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. ", + "subcategory": "Network Security", + "text": "Outbound network access should be controlled", "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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" + "PrivateLink", + "Storage", + "NVA", + "AppSvc", + "VNet", + "Firewall" ], "severity": "Low", - "text": "If you are not expecting traffic from all geographical regions, use geo-filters to block traffic from non-expected countries.", + "subcategory": "Network Security", + "text": "Ensure a stable IP for outbound communications towards internet addresses", "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "AppGW", - "WAF" + "PrivateLink", + "AppSvc" ], - "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.", + "severity": "High", + "subcategory": "Network Security", + "text": "Inbound network access should be controlled", "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ "AppGW", + "FrontDoor", + "Monitor", + "AppSvc", "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": "High", + "subcategory": "Network Security", + "text": "Use a WAF in front of App Service", "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "AppGW", + "PrivateLink", + "AppSvc", "WAF" ], - "severity": "Medium", - "text": "Add diagnostic settings to save your Azure Application Gateway WAF logs.", - "waf": "Operations" + "severity": "High", + "subcategory": "Network Security", + "text": "Avoid for WAF to be bypassed", + "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "WAF", - "FrontDoor" + "AppSvc", + "AzurePolicy" ], "severity": "Medium", - "text": "Add diagnostic settings to save your Azure Front Door WAF logs.", - "waf": "Operations" + "subcategory": "Network Security", + "text": "Set minimum TLS policy to 1.2", + "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "Sentinel", - "AppGW", + "AppSvc", "WAF" ], - "severity": "Medium", - "text": "Send Azure Application Gateway WAF logs to Microsoft Sentinel.", - "waf": "Operations" + "severity": "High", + "subcategory": "Network Security", + "text": "Use HTTPS only", + "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "Sentinel", - "WAF", - "FrontDoor" + "AppSvc", + "Storage" ], - "severity": "Medium", - "text": "Send Azure Front Door WAF logs to Microsoft Sentinel.", - "waf": "Operations" + "severity": "High", + "subcategory": "Network Security", + "text": "Wildcards must not be used for CORS", + "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "AppGW", - "WAF" + "AppSvc" ], - "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" + "severity": "High", + "subcategory": "Network Security", + "text": "Turn off remote debugging", + "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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" + "AppSvc", + "Defender" ], "severity": "Medium", - "text": "Use WAF Policies instead of the legacy WAF configuration.", - "waf": "Operations" + "subcategory": "Network Security", + "text": "Enable Defender for Cloud - Defender for App Service", + "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "ExpressRoute", - "VPN", "AppGW", + "DDoS", + "EventHubs", + "NVA", + "AppSvc", "VNet", "WAF" ], "severity": "Medium", - "text": "Filter inbound traffic in the backends so that they only accept connections from the Application Gateway subnet, for example with NSGs.", + "subcategory": "Network Security", + "text": "Enable DDOS Protection Standard on the WAF VNet", "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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", - "FrontDoor" + "PrivateLink", + "AppSvc", + "VNet", + "ACR" ], "severity": "Medium", - "text": "Make sure your origins only take traffic from your Azure Front Door instance.", + "subcategory": "Network Security", + "text": "Pull containers over a Virtual Network", "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "WAF" + "AppSvc" ], - "severity": "High", - "text": "You should encrypt traffic to the backend servers.", + "severity": "Medium", + "subcategory": "Penetration Testing", + "text": "Conduct a penetration test", "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "WAF" + "AppSvc" ], - "severity": "High", - "text": "You should use a Web Application Firewall.", + "severity": "Medium", + "subcategory": "Vulnerability Management", + "text": "Deploy validated code", "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", + "category": "Security", + "checklist": "Azure App Service Review", + "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": [ - "WAF" + "AppSvc" ], - "severity": "Medium", - "text": "Redirect HTTP to HTTPS", + "severity": "High", + "subcategory": "Vulnerability Management", + "text": "Use up-to-date platforms, languages, protocols and frameworks", "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF" + "Storage" ], "severity": "Medium", - "text": "Use gateway-managed cookies to direct traffic from a user session to the same server for processing", - "waf": "Operations" + "subcategory": " Overview", + "text": "Consider the 'Azure security baseline for storage'", + "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF" + "PrivateLink", + "Storage" ], "severity": "High", - "text": "Enable connection draining during planned service updates to prevent connection loss to existing membrs of the backend pool", + "subcategory": "Networking", + "text": "Consider using private endpoints for Azure Storage", "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF" + "RBAC", + "Storage", + "Subscriptions" ], - "severity": "Low", - "text": "Create custom error pages to display a personalized user experience", - "waf": "Operations" + "severity": "Medium", + "subcategory": "Governance", + "text": "Ensure older storage accounts are not using 'classic deployment model'", + "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF" + "Storage", + "Defender" ], - "severity": "Medium", - "text": "Edit HTTP requests and response headers for easier routing and information exchange between the client and server", + "severity": "High", + "subcategory": "Governance", + "text": "Enable Microsoft Defender for all of your storage accounts", "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF", - "FrontDoor" + "Storage" ], "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" + "subcategory": "Data Availability", + "text": "Enable 'soft delete' for blobs", + "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF" + "Storage" ], "severity": "Medium", - "text": "Use transport layer load balancing", - "waf": "Performance" + "subcategory": "Confidentiality", + "text": "Disable 'soft delete' for blobs", + "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF" + "Storage" + ], + "severity": "High", + "subcategory": "Data Availability", + "text": "Enable 'soft delete' for containers", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Storage Review 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", + "services": [ + "Storage" ], "severity": "Medium", - "text": "Configure routing based on host or domain name for multiple web applications on a single gateway", + "subcategory": "Confidentiality", + "text": "Disable 'soft delete' for containers", "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF", - "Entra" + "Storage" ], - "severity": "Medium", - "text": "Centralize SSL certificate management to reduce encryption and decryption overhead from a backend server farm", + "severity": "High", + "subcategory": "Data Availability", + "text": "Enable resource locks on storage accounts", "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "WAF checklist", - "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", - "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", - "service": "App Gateway", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "AppGW", - "WAF" + "Storage", + "Subscriptions", + "AzurePolicy" ], - "severity": "Low", - "text": "Use Application Gateway for native support for WebSocket and HTTP/2 protocols", + "severity": "High", + "subcategory": "Data Availability, Compliance", + "text": "Consider immutable blobs", "waf": "Security" }, { - "checklist": "WAF checklist", - "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", - "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", - "service": "Entra", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF", - "Entra" + "Storage" ], - "severity": "Medium", - "text": "Use long-live revocable token, cache your token and acquire your silently using Microsoft Identity Library", - "waf": "Reliability" + "severity": "High", + "subcategory": "Networking", + "text": "Require HTTPS, i.e. disable port 80 on the storage account", + "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF" + "Storage" ], - "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" + "severity": "High", + "subcategory": "Networking", + "text": "When enforcing HTTPS (disabling HTTP), check that you do not use custom domains (CNAME) for the storage account.", + "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF" + "Storage" ], "severity": "Medium", - "text": "Custom brand assets should be hosted on a CDN", - "waf": "Performance" + "subcategory": "Networking", + "text": "Limit shared access signature (SAS) tokens to HTTPS connections only", + "waf": "Security" }, { - "checklist": "WAF checklist", - "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", - "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", - "service": "AAD B2C", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF" + "Entra", + "Storage" ], - "severity": "Low", - "text": "Have multiple identiy providers (i.e., login with your microsoft, google, facebook accounts)", - "waf": "Reliability" + "severity": "High", + "subcategory": "Identity and Access Management", + "text": "Use Azure Active Directory (Azure AD) tokens for blob access", + "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF", - "VM" + "Entra", + "RBAC", + "Storage" ], "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" + "subcategory": "Identity and Access Management", + "text": "Least privilege in IaM permissions", + "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF" + "Entra", + "Storage" ], - "severity": "Medium", - "text": "Don't replicate! Replication can create issues with directory synchronization", - "waf": "Reliability" + "severity": "High", + "subcategory": "Identity and Access Management", + "text": "When using SAS, prefer 'user delegation SAS' over storage-account-key based SAS.", + "waf": "Security" }, { - "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", + "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. ", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", + "service": "Azure Storage", "services": [ - "WAF" + "Entra", + "AKV", + "Storage", + "Monitor" ], - "severity": "Medium", - "text": "Have active-active for multi-regions", - "waf": "Reliability" + "severity": "High", + "subcategory": "Identity and Access Management", + "text": "Consider disabling storage account keys, so that only AAD access (and user delegation SAS) is supported.", + "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF", - "Entra" + "AKV", + "Storage", + "AzurePolicy", + "Monitor" ], - "severity": "Medium", - "text": "Add Azure AD Domain service stamps to additional regions and locations", - "waf": "Reliability" + "severity": "High", + "subcategory": "Monitoring", + "text": "Consider using Azure Monitor to audit control plane operations on the storage account", + "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure Storage Review 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": [ - "WAF" + "Entra", + "AKV", + "Storage", + "AzurePolicy" ], "severity": "Medium", - "text": "Use Replica Sets for DR", - "waf": "Reliability" + "subcategory": "Identity and Access Management", + "text": "When using storage account keys, consider enabling a 'key expiration policy'", + "waf": "Security" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", - "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "ServiceBus", - "WAF" + "Entra", + "Storage", + "AzurePolicy" ], - "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", + "subcategory": "Identity and Access Management", + "text": "Consider configuring an SAS expiration policy", "waf": "Security" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", - "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "ServiceBus", - "WAF" + "Entra", + "AKV", + "Storage", + "AzurePolicy" ], "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/", + "subcategory": "Identity and Access Management", + "text": "Consider linking SAS to a stored access policy", "waf": "Security" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", - "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", + "category": "Security", + "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", "services": [ - "AzurePolicy", - "Entra", - "RBAC", - "TrafficManager", - "ServiceBus", - "WAF" + "AKV", + "Storage" ], "severity": "Medium", - "text": "Avoid using root account when it is not necessary", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", + "subcategory": "CI/CD", + "text": "Consider configuring your application's source code repository to detect checked-in connection strings and storage account keys.", "waf": "Security" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", - "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "AKV", - "Storage", - "VM", "Entra", - "ServiceBus", - "WAF", - "AppSvc" + "Storage" ], - "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/", + "severity": "High", + "subcategory": "Identity and Access Management", + "text": "Consider storing connection strings in Azure KeyVault (in scenarios where managed identities are not possible)", "waf": "Security" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", - "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "RBAC", + "Entra", "Storage", - "ServiceBus", - "WAF", - "Subscriptions" + "AzurePolicy" ], "severity": "High", - "text": "Use least privilege data plane RBAC", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "subcategory": "Identity and Access Management", + "text": "Strive for short validity periods for ad-hoc SAS", "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "ServiceBus", - "Monitor", - "WAF", - "VNet" + "Entra", + "Storage" ], "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/", + "subcategory": "Identity and Access Management", + "text": "Apply a narrow scope to a SAS", "waf": "Security" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", - "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "ServiceBus", - "WAF", - "VNet", - "PrivateLink" + "Entra", + "Storage" ], "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/", + "subcategory": "Identity and Access Management", + "text": "Consider scoping SAS to a specific client IP address, wherever possible", "waf": "Security" }, { - "arm-service": "Microsoft.ServiceBus/namespaces", - "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "ServiceBus", - "WAF" + "Entra", + "Storage" ], - "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/", + "severity": "Low", + "subcategory": "Identity and Access Management", + "text": "Consider checking uploaded data, after clients used a SAS to upload a file. ", "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure Storage Review 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": [ - "WAF" + "Entra", + "RBAC", + "Storage" ], "severity": "High", - "text": "Select the right Logic App hosting plan based on your business & SLO requirements", - "waf": "Reliability" + "subcategory": "Identity and Access Management", + "text": "SFTP: Limit the amount of 'local users' for SFTP access, and audit whether access is needed over time.", + "waf": "Security" }, { - "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", + "category": "Security", + "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", "services": [ - "WAF" + "Entra", + "Storage" ], - "severity": "High", - "text": "Protect logic apps from region failures with zone redundancy and availability zones", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Identity and Access Management", + "text": "SFTP: The SFTP endpoint does not support POSIX-like ACLs.", + "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF" + "Storage", + "AzurePolicy" ], "severity": "High", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" + "subcategory": "Networking", + "text": "Avoid overly broad CORS policies", + "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure Storage Review 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", "services": [ - "WAF", - "AppSvc" + "Storage" ], "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" + "subcategory": "Confidentiality and Encryption", + "text": "Determine how data at rest should be encrypted. Understand the thread model for data.", + "waf": "Security" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "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", + "category": "Security", + "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", "services": [ - "WAF" + "Storage" ], "severity": "Medium", - "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", - "waf": "Operations" + "subcategory": "Confidentiality and Encryption", + "text": "Determine which/if platform encryption should be used.", + "waf": "Security" }, { - "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", + "category": "Security", + "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", "services": [ - "WAF", - "VM" + "Storage" ], - "severity": "Low", - "text": "Enable automatic instance repairs for enhanced VM Scale Sets resiliency", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Confidentiality and Encryption", + "text": "Determine which/if client-side encryption should be used.", + "waf": "Security" }, { - "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", + "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.", + "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": [ - "WAF", - "Backup", - "VM" + "Entra", + "Storage" ], "severity": "High", - "text": "Consider Azure Backup to meet your resiliency requirements for Azure VMs", - "waf": "Reliability" + "subcategory": "Identity and Access Management", + "text": "Consider whether public blob access is needed, or whether it can be disabled for certain storage accounts. ", + "waf": "Security" }, { - "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", + "category": "Operations Management", + "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", "services": [ - "WAF", - "VM" + "Storage" ], "severity": "High", - "text": "Use Premium or Ultra disks for production VMs", + "subcategory": "Platform Version", + "text": "Leverage a storagev2 account type for better performance and reliability", "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", + "category": "BC and DR", + "checklist": "Azure Storage Review Checklist", + "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Azure Storage", "services": [ - "WAF", - "VM" + "Storage" ], "severity": "High", - "text": "Ensure Managed Disks are used for all VMs", + "subcategory": "Availablity", + "text": "Leverage GRS, ZRS or GZRS storage for the highest availability", "waf": "Reliability" }, { - "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", + "category": "BC and DR", + "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", "services": [ - "Storage", - "WAF", - "SQL", - "VM" + "Storage" ], "severity": "Medium", - "text": "Do not use the Temp disk for anything that is not acceptable to be lost", + "subcategory": "Failover", + "text": "For write operation after failover, use customer-Managed Failover ", "waf": "Reliability" }, { - "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", + "category": "Operations Management", + "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", "services": [ - "Storage", - "ACR", - "WAF", - "VM" + "Storage" ], "severity": "Medium", - "text": "Leverage Availability Zones for your VMs in regions where they are supported", + "subcategory": "Failover", + "text": "Understand Microsoft-Managed Failover details", "waf": "Reliability" }, { - "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", + "category": "Operations Management", + "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", "services": [ - "WAF", - "VM" + "Storage" ], "severity": "Medium", - "text": "For regions that do not support Availability Zones deploy VMs into Availability Sets", + "subcategory": "Data Protection", + "text": "Enable Soft Delete", "waf": "Reliability" }, { - "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", + "category": "Security", + "checklist": "Azure Event Hub Review", + "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": [ - "WAF", - "VM", - "ASR" + "EventHubs" ], - "severity": "High", - "text": "Avoid running a production workload on a single VM", - "waf": "Reliability" + "severity": "Low", + "subcategory": "Data Protection", + "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.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", + "category": "Security", + "checklist": "Azure Event Hub Review", + "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": [ - "AVS", - "WAF", - "VM", - "ASR" + "EventHubs" ], - "severity": "High", - "text": "For Azure and on-premises VMs (Hyper-V/Phyiscal/VMware) with low RTO requirements use Azure Site Recovery", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Data Protection", + "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.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", + "category": "Security", + "checklist": "Azure Event Hub Review", + "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": [ - "WAF" + "Entra", + "AzurePolicy", + "RBAC", + "TrafficManager", + "EventHubs" ], - "severity": "Low", - "text": "Use Capacity Reservations for critical workloads that require guaranteed capacity", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Identity and Access Management", + "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.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", + "category": "Security", + "checklist": "Azure Event Hub Review", + "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": [ - "WAF", + "Entra", + "AKV", + "Storage", "VM", - "ASR" + "EventHubs" ], "severity": "Medium", - "text": "Increase quotas in DR region before testing failover with ASR", - "waf": "Reliability" + "subcategory": "Identity and Access Management", + "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.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", + "category": "Security", + "checklist": "Azure Event Hub Review", + "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": [ - "WAF", - "VM" + "Entra", + "EventHubs", + "RBAC" ], - "severity": "Low", - "text": "Utilize Scheduled Events to prepare for VM maintenance", - "waf": "Reliability" + "severity": "High", + "subcategory": "Identity and Access Management", + "text": "Use least privilege data plane RBAC", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Security" }, { - "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", + "category": "Security", + "checklist": "Azure Event Hub Review", + "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": [ - "Storage", - "WAF" + "EventHubs", + "VNet", + "Monitor" ], "severity": "Medium", - "text": "Choose the most appropriate data redundancy option for Azure Storage based on your requirements", - "waf": "Reliability" + "subcategory": "Monitoring", + "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.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", + "category": "Security", + "checklist": "Azure Event Hub Review", + "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": [ - "Storage", - "WAF" + "PrivateLink", + "EventHubs", + "VNet" ], - "severity": "Low", - "text": "Apply a Delete lock to prevent accidental or malicious deletion of storage accounts", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Networking", + "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.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", + "category": "Security", + "checklist": "Azure Event Hub Review", + "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": [ - "Storage", - "WAF" + "EventHubs" ], - "severity": "Low", - "text": "Enable soft delete for Storage Account Containers", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Networking", + "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.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", + "category": "Operations Management", + "checklist": "Azure Event Hub Review", + "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": [ - "Storage", - "WAF" + "EventHubs" ], - "severity": "Low", - "text": "Enable soft delete for blobs", + "severity": "Medium", + "subcategory": "Best Practices", + "text": "Leverage FTA Resillency HandBook", "waf": "Reliability" }, { - "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", + "category": "Operations Management", + "checklist": "Azure Event Hub Review", + "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": [ - "WAF", - "Backup" + "EventHubs", + "ACR" ], - "severity": "Medium", - "text": "Enable Azure Backup enhanced soft delete for improved data protection and recovery", + "severity": "High", + "subcategory": "Zone Redudancy", + "text": "Leverage Availability Zones if regionally applicable", "waf": "Reliability" }, { - "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", + "category": "Operations Management", + "checklist": "Azure Event Hub Review", + "guid": "20b56c56-ad58-4519-8f82-735c586bb281", + "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", + "service": "Event Hubs", "services": [ - "WAF", - "Backup" + "EventHubs" ], - "severity": "Low", - "text": "Implement multi-user authorization for Azure Backup to ensure secure and controlled access to backup resources", + "severity": "Medium", + "subcategory": "Best Practices", + "text": "Use the Premium or Dedicated SKUs for predicable performance", "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", + "category": "Operations Management", + "checklist": "Azure Event Hub Review", + "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": [ - "Storage", - "WAF", - "Backup" + "EventHubs", + "ASR" ], - "severity": "Low", - "text": "Implement Immutable Storage for your vaults to protect against ransomware and prevent unauthorized modifications to backups", + "severity": "High", + "subcategory": "Geo Redudancy", + "text": "Plan for Geo Disaster Recovery using Active Passive configuration", "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", + "category": "Operations Management", + "checklist": "Azure Event Hub Review", + "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": [ - "DNS", - "ACR", - "WAF", + "EventHubs", "ASR" ], - "severity": "Low", - "text": "Implement DNS Failover using Azure DNS Private Resolvers", + "severity": "Medium", + "subcategory": "Geo Redudancy", + "text": "For Business Critical Applications, use Active Active configuration", "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", + "category": "Operations Management", + "checklist": "Azure Event Hub Review", + "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", + "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", + "service": "Event Hubs", "services": [ - "ACR", - "WAF" + "EventHubs" ], "severity": "Medium", - "text": "Use on-premises data gateway clusters to ensure high availability for business-critical data", + "subcategory": "Reliability", + "text": "Design Resilient Event Hubs", "waf": "Reliability" }, { - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "WAF", - "NVA" + "AKV", + "FrontDoor" ], - "severity": "High", - "text": "Deploy Network Virtual Appliances (NVAs) in a vendor supported configuration for High Availability", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Front Door", + "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.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" - ], + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "b71ca41b-3a80-48f3-a6cd-22cdf197c1cf", + "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", + "services": [], "severity": "Medium", - "text": "FTA Resiliency Playbook", - "waf": "Reliability" + "subcategory": "App delivery", + "text": "Perform app delivery within landing zones for both internal-facing (corp) and external-facing apps (online).", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Security" }, { - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "WAF" + "AppGW" ], - "severity": "High", - "text": "Leverage Availablity Zones where regionally applicable and ofcourse if the service offers it", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "App Gateway", + "text": "Ensure you are using Application Gateway v2 SKU", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Security" }, { - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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" + "LoadBalancer" ], "severity": "Medium", - "text": "Run multiple replicas of the database (>1 ) in Prod", - "waf": "Reliability" + "subcategory": "Load Balancer", + "text": "Ensure you are using the Standard SKU for your Azure Load Balancers", + "waf": "Security" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "9432621a-8397-4654-a882-5bc856b7ef83", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", + "service": "Load Balancer", "services": [ - "ACR", - "WAF" + "LoadBalancer" ], "severity": "Medium", - "text": "Leverage Multi-Region Writes", - "waf": "Reliability" + "subcategory": "Load Balancer", + "text": "Ensure your Load Balancers frontend IP addresses are zone-redundant (unless you require zonal frontends).", + "waf": "Security" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "ACR", - "WAF" + "VNet", + "AppGW" ], "severity": "Medium", - "text": "Distribute your data globally", - "waf": "Reliability" + "subcategory": "App Gateway", + "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.documentdb/databaseAccounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ + "Entra", + "AppGW", + "Subscriptions", + "NVA", + "VNet", "WAF" ], - "severity": "High", - "text": "Choose from several well-defined consistency models", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "App Gateway", + "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.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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "App Gateway", "services": [ - "WAF", - "CosmosDB" + "DDoS" ], "severity": "Medium", - "text": "Enable Service managed failover", + "subcategory": "App Gateway", + "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" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [], + "severity": "Medium", + "subcategory": "App Gateway", + "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.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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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", - "WAF", - "Backup", - "CosmosDB" + "AppGW", + "ACR" ], "severity": "Medium", - "text": "Enable Automatic Backups", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "subcategory": "App Gateway", + "text": "Deploy Application Gateway across Availability Zones", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Front Door", "services": [ "WAF", - "Backup" + "AzurePolicy", + "FrontDoor" ], "severity": "Medium", - "text": "Perform Periodic Backups", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", - "waf": "Reliability" + "subcategory": "Front Door", + "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.documentdb/databaseAccounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "3f29812b-2363-4cef-b179-b599de0d5973", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "Front Door", "services": [ + "AppGW", "WAF", - "Backup", - "CosmosDB" + "AzurePolicy", + "FrontDoor" ], "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" + "subcategory": "App delivery", + "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.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", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Traffic Manager", "services": [ - "WAF" + "TrafficManager" ], "severity": "High", - "text": "Follow Metaprompting guardrails for resonsible AI", - "waf": "Operational Excellence" + "subcategory": "Traffic Manager", + "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.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", - "link": "https://github.com/Azure-Samples/AI-Gateway", - "service": "Azure OpenAI", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "APIM", - "WAF", - "Entra" + "Entra", + "AVD" ], - "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" + "severity": "Low", + "subcategory": "App delivery", + "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.CognitiveServices/accounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "Monitor", - "WAF" + "Entra" ], - "severity": "High", - "text": "Enable monitoring for your AOAI instances", - "waf": "Operational Excellence" + "severity": "Medium", + "subcategory": "App delivery", + "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.CognitiveServices/accounts", - "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", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "Monitor", "WAF", - "AKV", - "Subscriptions" + "AzurePolicy", + "FrontDoor" ], "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" + "subcategory": "Front Door", + "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.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "Monitor", - "WAF" + "TrafficManager", + "FrontDoor" ], "severity": "High", - "text": "Monitor token usage to prevent service disruptions due to capacity", - "waf": "Operational Excellence" + "subcategory": "Front Door", + "text": "Avoid combining Azure Traffic Manager and Azure Front Door.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "Monitor", - "WAF" + "FrontDoor" ], - "severity": "Medium", - "text": "observe metrics like processed inference tokens, generated completion tokens monitor for rate limit", - "waf": "Operational Excellence" + "severity": "High", + "subcategory": "Front Door", + "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.CognitiveServices/accounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "APIM", - "WAF" + "FrontDoor" ], "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" + "subcategory": "Front Door", + "text": "Disable health probes when there is only one origin in an Azure Front Door origin group.", + "waf": "Performance" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", - "link": "https://github.com/Azure-Samples/openai-enterprise-iac", - "service": "Azure OpenAI", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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" + "FrontDoor" ], - "severity": "High", - "text": "Use Infrastructure as code to deploy the Azure OpenAI Service, model deployments, and all related resources", - "waf": "Operational Excellence" + "severity": "Medium", + "subcategory": "Front Door", + "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.CognitiveServices/accounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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", - "Entra" + "FrontDoor" ], - "severity": "High", - "text": "Use Microsoft Entra Authentication with Managed Identity instead of API Key", - "waf": "Security" + "severity": "Low", + "subcategory": "Front Door", + "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.CognitiveServices/accounts", - "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", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "WAF" + "LoadBalancer" ], "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" + "subcategory": "Load Balancer", + "text": "Use Azure NAT Gateway instead of Load Balancer outbound rules for better SNAT scalability", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "WAF" + "AKV", + "Cost", + "FrontDoor" ], "severity": "High", - "text": "Evaluate usage of Provisioned throughput model ", - "waf": "Performance" + "subcategory": "Front Door", + "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.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", - "service": "Azure OpenAI", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ + "FrontDoor", "WAF" ], - "severity": "High", - "text": "Review and implement Azure AI content safety", - "waf": "Operational Excellence" + "severity": "Medium", + "subcategory": "Front Door", + "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.CognitiveServices/accounts", - "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", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", + "service": "Front Door", "services": [ - "WAF" + "FrontDoor" ], "severity": "High", - "text": "Define and evaluate the throughput of the system based on tokens & response per minute and align with requirements", - "waf": "Performance" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Improve latency of the system by limiting token sizes, streaming options", - "waf": "Performance" + "subcategory": "Front Door", + "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.CognitiveServices/accounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", + "service": "Front Door", "services": [ - "ServiceBus", - "Storage", - "WAF" + "FrontDoor" ], "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" + "subcategory": "Front Door", + "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.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "5bda4332-4f24-4811-9331-82ba51752694", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", + "service": "Front Door", "services": [ + "FrontDoor", "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" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", - "services": [ - "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" + "subcategory": "Front Door", + "text": "Enable the Azure Front Door WAF. Protect your application from a range of attacks.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", - "service": "Azure OpenAI", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ + "FrontDoor", "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" + "subcategory": "Front Door", + "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.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "e9951904-8384-45c9-a6cb-2912156a1147", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "WAF" + "WAF", + "AzurePolicy", + "FrontDoor" ], - "severity": "Medium", - "text": "Have a baseline for performance without fine-tuning for knowing whether or not fine-tuning has improved model performance", - "waf": "Performance" + "severity": "High", + "subcategory": "Front Door", + "text": "Enable request body inspection feature enabled in Azure Front Door WAF policy.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "ACR", + "FrontDoor", "WAF" ], - "severity": "Low", - "text": "Deploy multiple OAI instances across regions", - "waf": "Reliability" + "severity": "High", + "subcategory": "Front Door", + "text": "Enable the Azure Front Door WAF default rule sets. The default rule sets detect and block common attacks.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "APIM", - "WAF", - "Entra" + "FrontDoor", + "WAF" ], "severity": "High", - "text": "Implement retry & healthchecks with Gateway pattern like APIM", - "waf": "Reliability" + "subcategory": "Front Door", + "text": "Enable the Azure Front Door WAF bot protection rule set. The bot rules detect good and bad bots.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ + "FrontDoor", "WAF" ], "severity": "Medium", - "text": "Ensure having adequate quotas of TPM & RPM for the workload", - "waf": "Reliability" + "subcategory": "Front Door", + "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.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", - "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", - "service": "Azure OpenAI", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ + "FrontDoor", "WAF" ], "severity": "Medium", - "text": "Review the considerations in HAI toolkit guidance and apply those interaction practices for the slution", - "waf": "Operational Excellence" + "subcategory": "Front Door", + "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.CognitiveServices/accounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "ACR", + "FrontDoor", "WAF" ], "severity": "Medium", - "text": "Deploy separate fine tuned models across regions if finetuning is employed", - "waf": "Reliability" + "subcategory": "Front Door", + "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.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "77a1f893-5bda-4433-84f2-4811633182ba", - "link": "https://learn.microsoft.com/azure/backup/backup-overview", - "service": "Azure OpenAI", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "WAF", - "Backup", - "ASR" + "FrontDoor" ], - "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" + "severity": "Low", + "subcategory": "Front Door", + "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.CognitiveServices/accounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ + "FrontDoor", "WAF" ], - "severity": "High", - "text": "Azure AI search service tiers should be choosen to have a SLA ", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Front Door", + "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.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", - "link": "https://learn.microsoft.com/purview/purview", - "service": "Azure OpenAI", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ + "AppGW", "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": "High", + "subcategory": "App Gateway", + "text": "Enable the Azure Application Gateway WAF bot protection rule set. The bot rules detect good and bad bots.", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ + "AppGW", + "AzurePolicy", "WAF" ], "severity": "High", - "text": "Encrypt data used for RAG with SSE/Disk encryption with optional BYOK", + "subcategory": "App Gateway", + "text": "Enable request body inspection feature enabled in Azure Application Gateway WAF policy.", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", - "link": "https://learn.microsoft.com/azure/search/search-security-overview", - "service": "Azure OpenAI", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "ACR", + "AppGW", "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", + "subcategory": "App Gateway", + "text": "Tune the Azure Application Gateway WAF in detection mode for your workload. Reduce false positive detections.", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "ammp": true, + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "RBAC", + "AppGW", + "AzurePolicy", "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", + "subcategory": "App Gateway", + "text": "Deploy your WAF policy for Application Gateway in 'Prevention' mode.", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", - "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", - "service": "Azure OpenAI", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", + "service": "App Gateway", "services": [ + "AppGW", "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", + "subcategory": "App Gateway", + "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.CognitiveServices/accounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "Sentinel", - "Monitor", - "WAF", - "Defender" + "AppGW", + "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", + "subcategory": "App Gateway", + "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.CognitiveServices/accounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [], + "severity": "Low", + "subcategory": "App Gateway", + "text": "If you are not expecting traffic from all geographical regions, use geo-filters to block traffic from non-expected countries.", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", + "service": "App Gateway", "services": [ - "AzurePolicy", + "AppGW", "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", + "subcategory": "App Gateway", + "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.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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ + "AppGW", "WAF" ], - "severity": "High", - "text": "Implement Prompt shields and groundedness detection using Content Safety ", - "waf": "Operational Excellence" + "severity": "Medium", + "subcategory": "App Gateway", + "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.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", - "link": "https://learn.microsoft.com/azure/compliance/", - "service": "Azure OpenAI", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ + "AppGW", "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.", - "waf": "Security" + "severity": "Medium", + "subcategory": "App Gateway", + "text": "Add diagnostic settings to save your Azure Application Gateway WAF logs.", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", - "service": "Azure OpenAI", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ + "FrontDoor", "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.", - "waf": "Security" + "subcategory": "Front Door", + "text": "Add diagnostic settings to save your Azure Front Door WAF logs.", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", - "service": "Azure OpenAI", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ + "Sentinel", + "AppGW", "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.", - "waf": "Security" + "severity": "Medium", + "subcategory": "App Gateway", + "text": "Send Azure Application Gateway WAF logs to Microsoft Sentinel.", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", - "service": "Azure OpenAI", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ + "Sentinel", + "FrontDoor", "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", - "waf": "Security" + "subcategory": "Front Door", + "text": "Send Azure Front Door WAF logs to Microsoft Sentinel.", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", - "service": "Azure OpenAI", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [ - "RBAC", - "AzurePolicy", + "AppGW", "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", - "waf": "Security" + "subcategory": "App Gateway", + "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.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", - "service": "Azure OpenAI", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", + "service": "App Gateway", "services": [ + "AzurePolicy", "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", - "waf": "Security" + "severity": "Medium", + "subcategory": "App Gateway", + "text": "Use WAF Policies instead of the legacy WAF configuration.", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", + "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", + "service": "App Gateway", "services": [ - "RBAC", - "WAF" + "VPN", + "VNet", + "AppGW", + "ExpressRoute" ], - "severity": "High", - "text": "Apply RBAC to th data stores having embeddings and vectors and scope access based on role's access requirements", + "severity": "Medium", + "subcategory": "App Gateway", + "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.CognitiveServices/accounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", + "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", + "service": "Front Door", "services": [ - "WAF", - "PrivateLink" + "FrontDoor" ], - "severity": "High", - "text": "Configure private endpoint for AI services to restrict service access within your network", + "severity": "Medium", + "subcategory": "Front Door", + "text": "Make sure your origins only take traffic from your Azure Front Door instance.", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", - "service": "Azure OpenAI", - "services": [ - "WAF", - "VNet", - "Firewall" - ], + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", + "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", + "service": "App Gateway", + "services": [], "severity": "High", - "text": "Enforce strict inbound and outbound traffic control with Azure Firewall and UDRs and limit the external integration points", + "subcategory": "App Gateway", + "text": "You should encrypt traffic to the backend servers.", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", - "service": "Azure OpenAI", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", + "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", + "service": "App Gateway", "services": [ "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", + "subcategory": "App Gateway", + "text": "You should use a Web Application Firewall.", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", - "services": [ - "WAF" - ], + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", + "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", + "service": "App Gateway", + "services": [], "severity": "Medium", - "text": "Use prompt compression tools like LLMLingua or gprtrim", - "waf": "Cost Optimization" + "subcategory": "App Gateway", + "text": "Redirect HTTP to HTTPS", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", - "services": [ - "WAF", - "AKV", - "Entra" - ], + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": [], + "severity": "Medium", + "subcategory": "App Gateway", + "text": "Use gateway-managed cookies to direct traffic from a user session to the same server for processing", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", + "service": "App Gateway", + "services": [], "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.", + "subcategory": "App Gateway", + "text": "Enable connection draining during planned service updates to prevent connection loss to existing members of the backend pool", + "waf": "Security" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", + "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", + "service": "App Gateway", + "services": [], + "severity": "Low", + "subcategory": "App Gateway", + "text": "Create custom error pages to display a personalized user experience", + "waf": "Operations" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", + "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", + "service": "App Gateway", + "services": [], + "severity": "Medium", + "subcategory": "App Gateway", + "text": "Edit HTTP requests and response headers for easier routing and information exchange between the client and server", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "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": "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" + "subcategory": "App Gateway", + "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.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "93555620-2bfe-4456-9b0d-834a348b263e", - "service": "Azure OpenAI", - "services": [ - "Monitor", - "WAF" - ], + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "29dcc19f-a8fa-4c35-8281-290577538793", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "App Gateway", + "services": [], "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", + "subcategory": "App Gateway", + "text": "Use transport layer load balancing", + "waf": "Performance" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", + "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", + "service": "App Gateway", + "services": [], + "severity": "Medium", + "subcategory": "App Gateway", + "text": "Configure routing based on host or domain name for multiple web applications on a single gateway", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", - "service": "Azure OpenAI", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", + "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", + "service": "App Gateway", "services": [ - "WAF" + "Entra" ], "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", + "subcategory": "App Gateway", + "text": "Centralize SSL certificate management to reduce encryption and decryption overhead from a backend server farm", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure Application Delivery Networking", + "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", + "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", + "service": "App Gateway", "services": [ - "WAF" + "AppGW" ], "severity": "Low", - "text": "Azure AI Services are properly tagged for better management", - "waf": "Operational Excellence" + "subcategory": "App Gateway", + "text": "Use Application Gateway for native support for WebSocket and HTTP/2 protocols", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", - "services": [ - "WAF" - ], - "severity": "Low", - "text": "Azure AI Service accounts follows organizational naming conventions", - "waf": "Operational Excellence" + "category": "BC and DR", + "checklist": "Logic Apps checklist", + "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", + "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", + "service": "Logic Apps", + "services": [], + "severity": "High", + "subcategory": "High Availability", + "text": "Select the right Logic App hosting plan based on your business & SLO requirements", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", - "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", - "service": "Azure OpenAI", - "services": [ - "WAF" - ], + "category": "BC and DR", + "checklist": "Logic Apps 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": [], "severity": "High", - "text": "Diagnostic logs in Azure AI services resources should be enabled", - "waf": "Operational Excellence" + "subcategory": "High Availability", + "text": "Protect logic apps from region failures with zone redundancy and availability zones", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", - "link": "https://learn.microsoft.com/azure/ai-services/authentication", - "service": "Azure OpenAI", - "services": [ - "WAF", - "Entra" - ], + "category": "BC and DR", + "checklist": "Logic Apps 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": [], "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" + "subcategory": "High Availability", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Azure OpenAI", + "category": "BC and DR", + "checklist": "Logic Apps checklist", + "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", + "link": "https://learn.microsoft.com/azure/app-service/environment/intro", + "service": "Logic Apps", "services": [ - "WAF", - "AKV", - "Entra" + "AppSvc" ], "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" + "subcategory": "High Availability", + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Azure OpenAI", - "services": [ - "WAF", - "AKV" - ], + "category": "Application Deployment", + "checklist": "Logic Apps checklist", + "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", + "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", + "service": "Logic Apps", + "services": [], + "severity": "Medium", + "subcategory": "CI/CD", + "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", + "waf": "Operations" + }, + { + "category": "Operations Management", + "checklist": "DataBricks Review Checklist", + "guid": "65285269-440c-44be-9d3e-0844276d4bdc", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/pass-foudations-playbooks-ADB_v1.docx", + "services": [], "severity": "High", - "text": "Regularly rotate and expire keys stored in Azure Key Vault to minimize the risk of unauthorized access.", - "waf": "Security" + "subcategory": "Best Practices", + "text": "Reference Databricks HA/DR playbook", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "adfe27be-e297-401a-a352-baaab79b088d", - "link": "https://github.com/openai/tiktoken", - "service": "Azure OpenAI", + "category": "Operations Management", + "checklist": "DataBricks Review Checklist", + "guid": "89d558b9-37d3-4974-b111-2dbd7aaf12e6", + "link": "https://learn.microsoft.com/azure/databricks/security/secrets/secret-scopes", "services": [ - "WAF" + "Backup" ], - "severity": "High", - "text": "Use tiktoken to understand token sizes for token optimizations in conversational mode", - "waf": "Cost Optimization" + "severity": "Medium", + "subcategory": "Backup", + "text": "Backup Your Workspace Configuration including ARM templates and Secret Scopes", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", - "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", - "service": "Azure OpenAI", + "category": "Operations Management", + "checklist": "DataBricks Review Checklist", + "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": [ - "WAF" + "Backup", + "ACR" ], - "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": "Medium", + "subcategory": "Backup", + "text": "Share MetaData Across different Databricks Workspaces using Hive External Metastore", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Operations Management", + "checklist": "DataBricks Review Checklist", + "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": [ - "WAF" + "Backup", + "ASR" ], - "severity": "High", - "text": "Setup a process to regularly update and patch the LLM libraries and other system components", - "waf": "Security" + "severity": "Medium", + "subcategory": "Backup", + "text": "Plan Disaster Recovery Strategy in Databricks using the Hive External Metastore", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "e29711b1-352b-4eee-879b-588defc4972c", - "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", - "service": "Azure OpenAI", + "category": "Operations Management", + "checklist": "DataBricks Review Checklist", + "guid": "4b1d944a-3598-437e-b79d-6c6d3a364a5b", + "link": "https://www.databricks.com/blog/2021/04/20/attack-of-the-delta-clones-against-disaster-recovery-availability-complexity.html", "services": [ - "AzurePolicy", - "WAF" + "Backup" ], - "severity": "High", - "text": "Adhere to Azure OpenAI or other LLMs terms of use, policies and guidance and allowed use cases", - "waf": "Operational Excellence" + "severity": "Medium", + "subcategory": "Backup", + "text": "Backup your data with deep and shallow clones", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Operations Management", + "checklist": "DataBricks Review Checklist", + "description": "Download the blob using Secondary Endpoint in RAGRS Storage Account", + "guid": "7abae48a-bd54-4cd7-ae2e-86768357c559", + "link": "https://techcommunity.microsoft.com/t5/azure-paas-blog/download-the-blob-using-secondary-endpoint-in-ragrs-storage/ba-p/2403750", "services": [ - "Cost", - "WAF" + "Storage", + "Backup" ], "severity": "Medium", - "text": "Understand difference in cost of base models and fine tuned models and token step sizes", - "waf": "Cost Optimization" + "subcategory": "Backup", + "text": "Backup your data to Azure Storage RA-GRS", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Operations Management", + "checklist": "DataBricks Review Checklist", + "guid": "675c5ee8-5b85-49c7-944c-e3b1a28b875a", + "link": "https://learn.microsoft.com/azure/databricks/dev-tools/index-ci-cd", "services": [ - "Cost", - "WAF" + "Backup" ], "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" + "subcategory": "Backup", + "text": "Backup your code with DevOps", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Operations Management", + "checklist": "DataBricks Review Checklist", + "guid": "a1bf1038-9f03-4a4d-8ce4-63dbbbc8682a", + "link": "https://learn.microsoft.com/azure/databricks/administration-guide/disaster-recovery", "services": [ - "Cost", - "Monitor", - "WAF" + "ASR" ], - "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" + "severity": "High", + "subcategory": "Disaster Recovery", + "text": "Plan for Disaster recovery using Active/Active or Active/Passive Configuration", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Operations Management", + "checklist": "DataBricks Review Checklist", + "description": "Migration package to log all Databricks resources for backup and/or migrating to another Databricks workspace", + "guid": "5abc92a4-eda1-4dae-8cc8-5c47c6b781cc", + "link": "https://github.com/databrickslabs/migrate", "services": [ - "WAF" + "Backup" ], "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" + "subcategory": "Migration", + "text": "Use Databricks Migration tools", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", - "link": "https://learn.microsoft.com/azure/search/search-reliability", - "service": "Azure OpenAI", + "category": "Operations Management", + "checklist": "DataBricks Review Checklist", + "guid": "a0e6c465-89d5-458b-a37d-3974d1112dbd", + "link": "https://github.com/databrickslabs/databricks-sync", + "services": [], + "severity": "Low", + "subcategory": "Migration", + "text": "Use Databricks Sync", + "waf": "Reliability" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure Red Hat OpenShift", + "guid": "d7e47431-76c8-4bdb-b55b-ce619e8a03f9", + "link": "https://learn.microsoft.com/azure/openshift/howto-create-service-principal?pivots=aro-azurecli", "services": [ - "WAF" + "Entra", + "RBAC" ], - "severity": "Medium", - "text": "Review the guidance provided on setting up AI search for Reliability", - "waf": "Operational Excellence" + "severity": "High", + "subcategory": "Identity", + "text": "Create a service principal and its role assignments before creating the ARO clusters.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Identity and Access Management", + "checklist": "Azure Red Hat OpenShift", + "guid": "7879424d-6267-486d-90b9-6c97be985190", + "link": "https://learn.microsoft.com/azure/openshift/configure-azure-ad-ui", "services": [ - "Storage", - "WAF" + "Entra" ], - "severity": "Medium", - "text": "Plan and manage AI Search Vector storage", - "waf": "Operational Excellence" + "severity": "High", + "subcategory": "Identity", + "text": "Use AAD to authenticate users in your ARO cluster.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Identity and Access Management", + "checklist": "Azure Red Hat OpenShift", + "guid": "adfec5f9-a82d-46e9-a8d1-5a0c7fed5d15", + "link": "https://docs.openshift.com/container-platform/4.14/authentication/remove-kubeadmin.html", "services": [ - "WAF" + "Entra" ], "severity": "Medium", - "text": "Apply LLMOps practices to automate the lifecycle management of your GenAI applications", - "waf": "Operational Excellence" + "subcategory": "Identity", + "text": "When using AAD authentication, remove kubeadmin user from the cluster.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Identity and Access Management", + "checklist": "Azure Red Hat OpenShift", + "guid": "483835c9-86bb-4291-8155-a11475e39f54", + "link": "https://docs.openshift.com/container-platform/4.13/applications/projects/working-with-projects.html", "services": [ - "WAF" + "Entra", + "RBAC" ], "severity": "High", - "text": "Evaluate usage of billing models - PAYG vs PTU", - "waf": "Cost Optimization" + "subcategory": "Identity", + "text": "Define OpenShift projects to restrict RBAC privilege and isolate workloads in your cluster.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Identity and Access Management", + "checklist": "Azure Red Hat OpenShift", + "guid": "0acccd97-9376-4bcd-a375-0ab2ab039da6", + "link": "https://docs.openshift.com/container-platform/4.13/authentication/using-rbac.html", "services": [ - "WAF" + "Entra", + "RBAC" ], "severity": "Medium", - "text": "Evaluate the quality of prompts and applications when switching between model versions", - "waf": "Operational Excellence" + "subcategory": "Identity", + "text": "Define the required RBAC roles in OpenShift are scoped to either a project or a cluster.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Identity and Access Management", + "checklist": "Azure Red Hat OpenShift", + "guid": "d54d7c89-29db-4107-b532-5ae625ca44e4", + "link": "https://learn.microsoft.com/azure/cost-management-billing/manage/direct-ea-administration#manage-notification-contacts", "services": [ - "Monitor", - "WAF" + "Entra", + "AKV" ], "severity": "Medium", - "text": "Evaluate, monitor and refine your GenAI apps for features like groundedness, relevance, accuracy, coherence, fluency, �", - "waf": "Operational Excellence" + "subcategory": "Identity", + "text": "Minimize the number of users who have administrator rights and secrets access.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "294798b1-578b-4219-a46c-eb5443513592", - "service": "Azure OpenAI", + "category": "Identity and Access Management", + "checklist": "Azure Red Hat OpenShift", + "guid": "685e2223-ace8-4bb1-8307-ca5f16f154e3", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", "services": [ - "WAF" + "Entra", + "RBAC" ], "severity": "Medium", - "text": "Evaluate your Azure AI Search results based on different search parameters", - "waf": "Operational Excellence" + "subcategory": "Identity", + "text": "Use Privileged Identity Management in AAD for ARO users with privileged roles.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Network topology and connectivity", + "checklist": "Azure Red Hat OpenShift", + "guid": "aa369282-9e7e-4216-8836-87af467a1f89", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", "services": [ + "Entra", + "DDoS", + "Subscriptions", + "VNet", + "Firewall", "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", + "subcategory": "DDoS", + "text": "Use Azure DDoS Network/IP Protection to protect the virtual network you use for the ARO cluster unless you use Azure Firewall or WAF in a centralized subscription", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Network topology and connectivity", + "checklist": "Azure Red Hat OpenShift", + "guid": "35bda433-24f1-4481-8533-182aa5174269", + "link": "https://docs.openshift.com/container-platform/4.13/networking/routes/secured-routes.html", + "services": [], + "severity": "High", + "subcategory": "Encryption", + "text": "All web applications you configure to use an ingress should use TLS encryption and shouldn't allow access over unencrypted HTTP.", + "waf": "Security" + }, + { + "category": "Network topology and connectivity", + "checklist": "Azure Red Hat OpenShift", + "guid": "44008ae7-d7e4-4743-876c-8bdbf55bce61", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", "services": [ + "FrontDoor", "WAF" ], "severity": "Medium", - "text": "Use prompt engineering techniques to improve the accuracy of LLM responses", - "waf": "Operational Excellence" + "subcategory": "Internet", + "text": "Use Azure Front Door with WAF to securely publish ARO applications to the internet, especially in multi-region environments.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "e737897e-71ca-47da-acfa-962a1594946d", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", - "service": "Azure OpenAI", + "category": "Network topology and connectivity", + "checklist": "Azure Red Hat OpenShift", + "guid": "9e8a03f9-7879-4424-b626-786d60b96c97", + "link": "https://learn.microsoft.com/azure/openshift/howto-secure-openshift-with-front-door", "services": [ - "WAF" + "PrivateLink", + "FrontDoor" ], "severity": "Medium", - "text": "Red team your GenAI applications", + "subcategory": "Internet", + "text": "If exposing an app on ARO with Azure Front Door, use private link to connect Front Door with the ARO router.", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", - "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", - "service": "Azure OpenAI", + "category": "Network topology and connectivity", + "checklist": "Azure Red Hat OpenShift", + "guid": "be985190-4838-435c-a86b-b2912155a114", + "link": "https://learn.microsoft.com/azure/openshift/howto-restrict-egress", "services": [ - "WAF" + "AzurePolicy", + "NVA", + "Firewall" ], "severity": "Medium", - "text": "Provide end users with scoring options for LLM responses and track these scores. ", - "waf": "Operational Excellence" + "subcategory": "Internet", + "text": "If your security policy requires you to inspect all outbound internet traffic that's generated in the ARO cluster, secure egress network traffic by using Azure Firewall or an NVA.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Network topology and connectivity", + "checklist": "Azure Red Hat OpenShift", + "guid": "75e39f54-0acc-4cd9-9937-6bcda3750ab2", + "link": "https://learn.microsoft.com/azure/openshift/howto-create-private-cluster-4x", "services": [ - "WAF" + "AzurePolicy" ], "severity": "High", - "text": "Consider Quota management practices", - "waf": "Cost Optimization" + "subcategory": "Private access", + "text": "If your security policy requires you to use a private IP address for the OpenShift API, deploy a private ARO cluster.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", - "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", - "service": "Azure OpenAI", + "category": "Network topology and connectivity", + "checklist": "Azure Red Hat OpenShift", + "guid": "ab039da6-d54d-47c8-a29d-b107d5325ae6", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-private-link", "services": [ - "APIM", - "ACR", - "Entra", - "LoadBalancer", - "WAF" + "PrivateLink", + "ACR" ], "severity": "Medium", - "text": "Use Load balancer solutions like APIM based gateway for balancing load and capacity across services and regions", - "waf": "Operational Excellence" + "subcategory": "Private access", + "text": "Use Azure Private Link to secure network connections to managed Azure services, including to Azure Container Registry.", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "25ca44e4-685e-4222-9ace-8bb12307ca5f", + "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-enable-arc-enabled-clusters", "services": [ - "WAF" + "Monitor" ], + "severity": "High", + "subcategory": "Operations", + "text": "Establish a monitoring process using the inbuilt Prometheus, OpenShift Logging or Container Insights integration.", + "waf": "Operations" + }, + { + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "16f154e3-aa36-4928-89e7-e216183687af", + "link": "https://docs.openshift.com/container-platform/4.13/cicd/pipelines/understanding-openshift-pipelines.html", + "services": [], "severity": "Medium", - "text": "Leverage FTA HandBook for Cognitive Services", - "waf": "Reliability" + "subcategory": "Operations", + "text": "Automate the application delivery process through DevOps practices and CI/CD solutions, such as Pipelines/GitOps provided by OpenShift.", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "467a1f89-35bd-4a43-924f-14811533182a", + "link": "https://learn.microsoft.com/azure/architecture/guide/design-principles/managed-services", + "services": [], + "severity": "Low", + "subcategory": "Operations", + "text": "Whenever possible, remove the service state from inside containers. Instead, use an Azure platform as a service (PaaS) that supports multiregion replication.", + "waf": "Operations" + }, + { + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "1b7da8cf-aa66-4e15-b4d5-ada97dc3e232", + "link": "https://learn.microsoft.com/azure/openshift/howto-create-a-storageclass", "services": [ - "WAF", - "Backup" + "Storage" ], + "severity": "Low", + "subcategory": "Operations", + "text": "Use RWX storage with inbuilt Azure Files storage class.", + "waf": "Operations" + }, + { + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "6bb235c7-05e1-4696-bded-fa8a4c8cdec4", + "link": "https://docs.openshift.com/container-platform/4.13/nodes/clusters/nodes-cluster-limit-ranges.html", + "services": [], "severity": "Medium", - "text": "Backup Your Prompts", - "waf": "Reliability" + "subcategory": "Performance", + "text": "Use pod requests and limits to manage the compute resources within a cluster.", + "waf": "Performance" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "c620c30c-14ee-4b7f-9ae8-d9b3fec228e7", + "link": "https://docs.openshift.com/container-platform/4.13/applications/quotas/quotas-setting-per-project.html", + "services": [], + "severity": "Medium", + "subcategory": "Performance", + "text": "Enforce resource quotas on projects.", + "waf": "Performance" + }, + { + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "87ab177a-db59-4f6b-a613-334fd09dc234", + "link": "https://docs.openshift.com/container-platform/4.13/machine_management/applying-autoscaling.html", + "services": [], + "severity": "High", + "subcategory": "Performance", + "text": "Define ClusterAutoScaler and MachineAutoScaler to scale machines when your cluster runs out of resources to support more deployments.", + "waf": "Performance" + }, + { + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "19db6128-1269-4040-a4ba-4d3e0804276d", + "link": "https://learn.microsoft.com/azure/openshift/support-policies-v4#supported-virtual-machine-sizes", "services": [ - "WAF", - "ASR" + "VM" ], "severity": "High", - "text": "Business Continuity and Disaster Recovery (BCDR) considerations with Azure OpenAI Service", + "subcategory": "Reliability", + "text": "Use virtual machine sizes that are large enough to contain multiple container instances so you get the benefits of increased density, but not so large that your cluster can't handle the workload of a failing node.", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "WAF checklist", - "guid": "325af625-ca44-4e46-a5e2-223ace8bb123", - "link": "https://github.com/abacaj/chatgpt-backup#backup-your-chatgpt-conversations", - "service": "Cognitive Services", - "services": [ - "WAF", - "Backup" - ], - "severity": "Medium", - "text": "Backup Your ChatGPT conversations", + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "4b98b15c-8b31-4aa5-aceb-58889135e227", + "link": "https://docs.openshift.com/container-platform/4.13/machine_management/deploying-machine-health-checks.html", + "services": [], + "severity": "High", + "subcategory": "Reliability", + "text": "Deploy machine health checks to automatically repair damaged machines in a machine pool.", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "896d31b6-6c67-4ba5-a119-c08e8f5d587c", + "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-metric-alerts", "services": [ - "WAF" + "Monitor" ], - "severity": "Medium", - "text": "CI/CD for custom speech", + "severity": "High", + "subcategory": "Reliability", + "text": "Use an alerting system to provide notifications when things need direct action: Container Insights metric alerts or in-built Alerting UI.", "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "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", + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "7e9ced16-acd1-476e-b9b2-41a998a57ae7", + "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview#availability-zones", + "services": [], + "severity": "High", + "subcategory": "Reliability", + "text": "Ensure that the cluster is created in a region that supports AZs and create a machine set for each AZ.", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "7b997e71-1b7d-4a8c-baa6-6e15d4d5ada9", + "link": "https://docs.openshift.com/container-platform/4.13/machine_management/creating-infrastructure-machinesets.html", "services": [ - "WAF" + "AKS" ], "severity": "Low", - "text": "Move a knowledge base using export-import", + "subcategory": "Reliability", + "text": "Create infrastructure machine sets to hold infrastructure components. Apply specific Kubernetes labels to these machines and then update the infrastructure components to run on only those machines.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Purview/accounts", - "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", + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "7dc3e232-6bb2-435c-905e-1696fdedfa8a", + "link": "https://learn.microsoft.com/azure/openshift/howto-create-a-backup#create-a-backup-with-velero-to-include-snapshots", "services": [ - "WAF" + "Backup" ], "severity": "Medium", - "text": "Leverage FTA Resillency Handbook", + "subcategory": "Reliability", + "text": "Create application backup and plan for restore and include persistent volumes in the backup.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "ab067acb-49e5-4b96-8332-4ecf8cc13318", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "81c12318-1a64-4174-8583-3fb4ae3c2df7", + "link": "https://docs.openshift.com/container-platform/4.13/nodes/pods/nodes-pods-priority.html", + "services": [], + "severity": "Low", + "subcategory": "Reliability", + "text": "Use pod priorities, so that in case of limited resources the most critical pods will run.", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "43166c3b-cbe0-45bb-b209-d4a0da577784", + "link": "https://docs.openshift.com/container-platform/4.13/architecture/admission-plug-ins.html", "services": [ - "WAF" + "AzurePolicy" ], - "severity": "High", - "text": "Plan for Data Center level outage", - "waf": "Reliability" + "severity": "Low", + "subcategory": "Security", + "text": "Regulate cluster functions using admission plug-ins, which are commonly used to enforce security policy, resource limitations, or configuration requirements.", + "waf": "Security" }, { - "arm-service": "Microsoft.Purview/accounts", - "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", + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "24d21678-5d2f-4a56-a56a-d48408fe8273", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", "services": [ - "WAF" + "ACR" ], + "severity": "Low", + "subcategory": "Security", + "text": "Store your container images in Azure Container Registry and geo-replicate the registry to each region.", + "waf": "Security" + }, + { + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "4c486ba2-80dc-4059-8cf7-5ee8e1309ccc", + "link": "https://docs.openshift.com/container-platform/4.13/nodes/pods/nodes-pods-vertical-autoscaler.html", + "services": [], "severity": "Medium", - "text": "Practice Failover for BCDR", - "waf": "Reliability" + "subcategory": "Workload", + "text": "Optimize the CPU and memory request values, and maximize the efficiency of the cluster resources using vertical pod autoscaler.", + "waf": "Performance" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "97b15b8a-219a-44ab-bb57-879024d22678", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "d579366b-cda2-4750-aa1a-bfe9d55d14c3", + "link": "https://docs.openshift.com/container-platform/4.13/applications/application-health.html", "services": [ - "WAF", - "Backup" + "Monitor" ], - "severity": "High", - "text": "Plan a backup strategy and take regular backups", + "severity": "Medium", + "subcategory": "Workload", + "text": "Add health probes to your pods to monitor application health. Make sure pods contain livenessProbe and readinessProbe. Use Startup probes to determine the point at which the application has started up.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "6d20b56c-56a9-4581-89bf-8d8e5c586b7d", - "link": "https://learn.microsoft.com/purview/manage-kafka-dotnet", - "service": "Purview", - "services": [ - "WAF", - "EventHubs" - ], - "severity": "Low", - "text": "Use Microsoft Purview's Event Hubs to subscribe and create entities to another account", + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "c4929cb1-b3d1-4325-ae12-4ba34d0685ed", + "link": "https://docs.openshift.com/container-platform/4.13/nodes/pods/nodes-pods-autoscaling.html", + "services": [], + "severity": "Medium", + "subcategory": "Workload", + "text": "Scale pods to meet demand using horizontal pod autoscaler.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "8cdc15ac-c075-4ee9-a130-a8889579e76b", - "link": "https://learn.microsoft.com/purview/deployment-best-practices", - "service": "Purview", + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "dce9be3b-b0dd-4b3b-95fb-2ec14eeaa359", + "link": "https://docs.openshift.com/container-platform/4.13/nodes/pods/nodes-pods-configuring.html#nodes-pods-pod-distruption-about_nodes-pods-configuring", "services": [ - "WAF" + "Cost" ], "severity": "Medium", - "text": "Follow Purview accounts architectures and deployment best practices", + "subcategory": "Workload", + "text": "Use disruption budgets to ensure the required number of pod replicas exist to handle expected application load.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "896e710a-7da7-4be9-a56d-14d3c49d997c", - "link": "https://learn.microsoft.com/purview/concept-best-practices-collections", - "service": "Purview", - "services": [ - "WAF" - ], + "category": "Operations management", + "checklist": "Azure Red Hat OpenShift", + "guid": "2829e2ed-b217-4367-9aff-6791b4935ada", + "link": "https://docs.openshift.com/container-platform/4.13/nodes/scheduling/nodes-scheduler-pod-topology-spread-constraints.html", + "services": [], "severity": "Medium", - "text": "Follow Collection Architectures and best practices", + "subcategory": "Workload", + "text": "Use pod topology constraints to automatically schedule pods on nodes throughout the cluster.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "b3d1325a-a225-4c6f-9e06-85edddea8a4b", - "link": "https://learn.microsoft.com/purview/concept-best-practices-asset-lifecycle", - "service": "Purview", - "services": [ - "WAF" - ], + "category": "Operations Management", + "checklist": "Azure Red Hat OpenShift", + "guid": "fea1dbf3-dd95-4d48-a7c8-91dcb1f7d575", + "link": "https://learn.microsoft.com/azure/openshift/intro-openshift#service-level-agreement", + "services": [], "severity": "Medium", - "text": "Follow Assest lifecycle best practices", + "subcategory": "Availablity", + "text": "Leverage Current ARO SLA - 99.95 into BCDR planning", "waf": "Reliability" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "7cdeb3c6-1fc2-4fc1-9eea-6e69d8d9a3ed", - "link": "https://learn.microsoft.com/purview/concept-best-practices-automation", - "service": "Purview", + "category": "Operations Management", + "checklist": "Azure Red Hat OpenShift", + "guid": "b95e06e1-58e2-4ea3-a92c-2de6e2065b3a", + "link": "https://www.redhat.com/rhdc/managed-files/pa-getting-started-azure-openshift-ebook-f20686-201911-en_0.pdf", + "services": [], + "severity": "High", + "subcategory": "Cluster Design", + "text": "Run user workloads on the worker nodes, not the control plane nodes", + "waf": "Reliability" + }, + { + "category": "Operations Management", + "checklist": "Azure Red Hat OpenShift", + "description": "Create infrastructure machine sets to hold infrastructure components. Apply specific Kubernetes labels to these machines and then update the infrastructure components to run on only those machines", + "guid": "76af4a69-1e88-439a-ba46-667e13c10567", + "link": "https://learn.microsoft.com/azure/openshift/howto-segregate-machinesets", "services": [ - "WAF" + "VNet", + "AKS" ], "severity": "Medium", - "text": "Follow automation best practices", + "subcategory": "Cluster Design", + "text": "Isolate workloads into worker nodes running in individual subnets as needed", "waf": "Reliability" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "c218e687-ab06-47ac-a49e-5b9603324ecf", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", + "category": "Operations Management", + "checklist": "Azure Red Hat OpenShift", + "guid": "785c6fe9-6c96-4ad8-a44c-f3b2b38c886b", + "link": "https://learn.microsoft.com/azure/openshift/howto-create-a-backup", "services": [ - "WAF", "Backup" ], "severity": "Medium", - "text": "Follow Backup and Migration Best practices", + "subcategory": "Backup", + "text": "Backup a cluster state for stateful workload scenarios to a paired region", "waf": "Reliability" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "8cc13318-da61-4170-869f-4fb4aa3d3ef7", - "link": "https://learn.microsoft.com/purview/concept-best-practices-glossary", - "service": "Purview", + "category": "Operations Management", + "checklist": "Azure Red Hat OpenShift", + "guid": "a2c02149-9014-4a5d-9ce5-74dccbd9792a", + "link": "https://access.redhat.com/documentation/red_hat_openshift_container_storage/4.4/html/deploying_and_managing_openshift_container_storage_on_microsoft_azure/deploying-openshift-container-storage-on-microsoft-azure_rhocs", "services": [ - "WAF" + "Storage", + "ACR" ], "severity": "Medium", - "text": "Follow Purview Glossary Best Practices", + "subcategory": "Data Store", + "text": "If container storage is required, ensure availability across regions if needed: Using RWX storage with inbuilt Azure Files storage class. Using CSI Drivers for storage provisioning", "waf": "Reliability" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "f3176c4b-97b1-45b8-a219-a4abeb578790", - "link": "https://learn.microsoft.com/purview/concept-workflow", - "service": "Purview", + "category": "Operations Management", + "checklist": "Azure Red Hat OpenShift", + "guid": "6bcca2b4-fea1-4dbf-9dd9-5d48c7c891dc", + "link": "https://docs.openshift.com/aro/3/dev_guide/persistent_volumes.html", + "services": [], + "severity": "Medium", + "subcategory": "Data Store", + "text": "Whenever possible, move state out of containers and into external databases that support multi-region replication. Avoid Persistent Volumes", + "waf": "Reliability" + }, + { + "category": "Platform Automation", + "checklist": "Azure Red Hat OpenShift", + "guid": "42324ece-81c1-4231-a1a6-417415833fb4", + "link": "https://docs.openshift.com/container-platform/4.13/applications/deployments/route-based-deployment-strategies.html", + "services": [], + "severity": "Low", + "subcategory": "Workload", + "text": "Consider blue/green or canary strategies to deploy new releases of application.", + "waf": "Operations" + }, + { + "category": "Platform Automation", + "checklist": "Azure Red Hat OpenShift", + "guid": "ae3c2df7-4316-46c3-acbe-05bbe209d4a0", + "link": "https://docs.openshift.com/container-platform/4.13/cicd/gitops/understanding-openshift-gitops.html", + "services": [], + "severity": "Low", + "subcategory": "Workload", + "text": "Consider using Red Hat OpenShift GitOps. Red Hat OpenShift GitOps uses Argo CD to maintain cluster resources and support application CI/CD.", + "waf": "Operations" + }, + { + "category": "Security", + "checklist": "Azure Red Hat OpenShift", + "guid": "da577784-24d2-4167-a5d2-fa56c56ad484", + "link": "https://learn.microsoft.com/azure/openshift/support-lifecycle", + "services": [], + "severity": "High", + "subcategory": "Control plane", + "text": "Keep your clusters on the latest OpenShift version to avoid potential security or upgrade issues.", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Red Hat OpenShift", + "guid": "08fe8273-4c48-46ba-880d-c0591cf75ee8", + "link": "https://learn.microsoft.com/azure/azure-arc/kubernetes/quickstart-connect-cluster", "services": [ - "WAF" + "Arc", + "AKS" ], + "severity": "High", + "subcategory": "Control plane", + "text": "Connect Azure Red Hat OpenShift clusters to Azure Arc-enabled Kubernetes.", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Red Hat OpenShift", + "guid": "e1309ccc-d579-4366-acda-2750aa1abfe9", + "link": "https://docs.openshift.com/container-platform/4.10/security/encrypting-etcd.html", + "services": [], "severity": "Low", - "text": "Leverage Workflows ", - "waf": "Reliability" + "subcategory": "Encryption", + "text": "For Azure Red Hat OpenShift 4 clusters, etcd data isn't encrypted by default, but it's recommended to enable etcd encryption to provide another layer of data security.", + "waf": "Security" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "24d22678-6d20-4b56-a56a-958119bf8d8e", - "link": "https://learn.microsoft.com/purview/concept-best-practices-security", - "service": "Purview", + "category": "Security", + "checklist": "Azure Red Hat OpenShift", + "guid": "d55d14c3-c492-49cb-8b3d-1325ae124ba3", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-introduction", "services": [ - "WAF" + "Arc", + "Defender", + "AKS" ], "severity": "Medium", - "text": "Follow Purview Security Best Practices", - "waf": "Reliability" + "subcategory": "Posture", + "text": "Use Microsoft Defender for Containers supported via Arc-enabled Kubernetes to secure clusters, containers, and applications.", + "waf": "Security" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "5c586b7d-8cdc-415a-ac07-5ee9b130a888", - "link": "https://learn.microsoft.com/purview/concept-best-practices-lineage-azure-data-factory", - "service": "Purview", + "category": "Security", + "checklist": "Azure Red Hat OpenShift", + "guid": "4d0685ed-dce9-4be3-ab0d-db3b55fb2ec1", + "link": "https://learn.microsoft.com/azure/azure-arc/kubernetes/tutorial-akv-secrets-provider", "services": [ - "WAF" + "AKV", + "Arc", + "AKS" ], "severity": "Medium", - "text": "Follow Purview Data Lineage Best Practices", - "waf": "Reliability" + "subcategory": "Secrets", + "text": "For applications that require access to sensitive information, use a service principal and the AKV Secrets Provider with the extension for Arc-enabled Kubernetes clusters.", + "waf": "Security" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "9579e76b-896e-4710-a7da-7be9956d14d3", - "link": "https://learn.microsoft.com/purview/concept-best-practices-scanning", - "service": "Purview", - "services": [ - "WAF" - ], + "category": "Security", + "checklist": "Azure Red Hat OpenShift", + "guid": "4eeaa359-2829-4e2e-bb21-73676aff6791", + "link": "https://learn.microsoft.com/azure/aks/developer-best-practices-pod-security#secure-pod-access-to-resources", + "services": [], "severity": "Medium", - "text": "Follow Best Practices for Scanning Registered Sources", - "waf": "Reliability" + "subcategory": "Workload", + "text": "Secure pod access to resources. Provide the least number of permissions, and avoid using root or privileged escalation.", + "waf": "Security" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "c49d997c-b3d1-4325-aa22-5c6f4e0685ed", - "link": "https://learn.microsoft.com/purview/concept-best-practices-classification", - "service": "Purview", + "category": "Security", + "checklist": "Azure Red Hat OpenShift", + "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": [ - "WAF" + "AzurePolicy", + "Monitor" ], "severity": "Medium", - "text": "Follow Classification Best Practices in Governance Portal", - "waf": "Reliability" + "subcategory": "Workload", + "text": "Monitor and enforce configuration by using the Azure Policy Extension.", + "waf": "Security" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "ddea8a4b-7cde-4b3c-91fc-2fc14eea6e69", - "link": "https://learn.microsoft.com/purview/sensitivity-labels-frequently-asked-questions", - "service": "Purview", + "category": "Security", + "checklist": "Azure Red Hat OpenShift", + "guid": "15833fb4-ae3c-42df-9431-66c3bcbe05bb", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-introduction", "services": [ - "WAF" + "Defender" ], - "severity": "Medium", - "text": "Perform Sensitivity Labelling in the Purview Data Map", - "waf": "Reliability" + "severity": "High", + "subcategory": "Workload", + "text": "Scan your images for vulnerabilities with Microsoft Defender or any other image scanning solution.", + "waf": "Security" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "d8d9a3ed-c218-4e68-9ab0-67acb49e5b96", - "link": "https://learn.microsoft.com/purview/concept-data-share", - "service": "Purview", + "category": "Security", + "checklist": "Azure Red Hat OpenShift", + "guid": "e209d4a0-da57-4778-924d-216785d2fa56", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-private-link", "services": [ - "Storage", - "WAF" + "Subscriptions", + "ACR" ], "severity": "Low", - "text": "Leverage Azure Storage in-place data sharing with Microsoft Purview", - "waf": "Reliability" + "subcategory": "Workload", + "text": "Deploy a dedicated and private instance of Azure Container Registry to each landing zone subscription.", + "waf": "Security" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "03324ecf-8cc1-4331-ada6-1170269f4fb4", - "link": "https://learn.microsoft.com/purview/concept-insights", - "service": "Purview", + "category": "Business", + "checklist": "Multitenant architecture", + "guid": "41177955-fe8f-430b-ae72-20dc5b6880da", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/overview", "services": [ - "WAF" + "Entra" ], - "severity": "Low", - "text": "Leverage Data Estate Insights", - "waf": "Reliability" + "severity": "High", + "subcategory": "Business", + "text": "Understand what kind of solution you're creating, such as business-to-business (B2B), business-to-consumer (B2C), or your enterprise software, and how tenants are different from users.", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "aa3d3ef7-f317-46c4-a97b-15b8a219a4ab", - "link": "https://learn.microsoft.com/purview/catalog-adoption-insights", - "service": "Purview", - "services": [ - "WAF" - ], - "severity": "Low", - "text": "Use Data stewardship and Catalog adoption", - "waf": "Reliability" + "category": "Business", + "checklist": "Multitenant architecture", + "guid": "2d33d1b7-697c-49f9-b944-afbeac0b2c8f", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", + "services": [], + "severity": "High", + "subcategory": "Business", + "text": "Define your tenants. Understand how many tenants you will support initially, and your growth plans.", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "eb578790-24d2-4267-a6d2-0b56c56a9581", - "link": "https://learn.microsoft.com/purview/concept-insights", - "service": "Purview", - "services": [ - "WAF" - ], - "severity": "Low", - "text": "Use Inventory and Ownership", - "waf": "Reliability" + "category": "Business", + "checklist": "Multitenant architecture", + "guid": "a2111b8b-cc66-4aa2-9da6-c09fa23851b6", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/pricing-models", + "services": [], + "severity": "High", + "subcategory": "Business", + "text": "Define your pricing model and ensure it aligns with your tenants' consumption of Azure resources.", + "waf": "Cost" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "19bf8d8e-5c58-46b7-b8cd-c15acc075ee9", - "link": "https://learn.microsoft.com/purview/glossary-insights", - "service": "Purview", - "services": [ - "WAF" - ], - "severity": "Low", - "text": "Leverage Insights for Glossary, Classifications, Sensitivity Labels", - "waf": "Reliability" + "category": "Business", + "checklist": "Multitenant architecture", + "guid": "331e84a6-2d65-4359-92ff-a1870b062995", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/pricing-models", + "services": [], + "severity": "Medium", + "subcategory": "Business", + "text": "Understand whether you need to separate your tenants into different tiers. Tiers might have different pricing, features, performance promises, geographic locations, and so forth.", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "b130a888-9579-4e76-a896-e710a7da7be9", - "link": "https://learn.microsoft.com/purview/compliance-manager", - "service": "Purview", - "services": [ - "WAF" - ], + "category": "Business", + "checklist": "Multitenant architecture", + "guid": "90516b37-aab1-46ca-95bb-cc14a6a1608b", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", + "services": [], "severity": "Medium", - "text": "Generate assessment scores", - "waf": "Reliability" + "subcategory": "Business", + "text": "Based on your customers' requirements, decide on the tenancy models that are appropriate for various parts of your solution.", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "956d14d3-c49d-4997-ab3d-1325aa225c6f", - "link": "https://learn.microsoft.com/purview/compliance-manager-scoring", - "service": "Purview", + "category": "Business", + "checklist": "Multitenant architecture", + "guid": "f5d76ae1-7048-4ff5-abba-f1ca799578b9", + "link": "https://learn.microsoft.com/azure/marketplace/plan-saas-offer", "services": [ - "WAF" + "Entra" ], "severity": "Medium", - "text": "Profiling- get summaries of data content", - "waf": "Reliability" + "subcategory": "Business", + "text": "When you're ready, sell your B2B multitenant solution using the Microsoft Commercial Marketplace.", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "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", - "services": [ - "AzurePolicy", - "WAF" - ], - "severity": "Low", - "text": "Follow Microsoft Purview Data Owner access policies", + "category": "Reliability", + "checklist": "Multitenant architecture", + "guid": "9e7cedd9-1e05-4aeb-a7b3-01fe695a394c", + "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/design-checklist", + "services": [], + "severity": "High", + "subcategory": "Reliability", + "text": "Review the Azure Well-Architected Reliability checklist, which is applicable to all workloads.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "4eea6e69-d8d9-4a3e-bc21-8e687ab067ac", - "link": "https://learn.microsoft.com/purview/concept-self-service-data-access-policy", - "service": "Purview", - "services": [ - "AzurePolicy", - "WAF" - ], - "severity": "Low", - "text": "Follow Self-service access policies", + "category": "Reliability", + "checklist": "Multitenant architecture", + "guid": "e9521a55-2a7c-425c-8f3e-c38fd0c4df75", + "link": "https://learn.microsoft.com/azure/architecture/antipatterns/noisy-neighbor/noisy-neighbor", + "services": [], + "severity": "High", + "subcategory": "Reliability", + "text": "Understand the Noisy Neighbor antipattern. Prevent individual tenants from impacting the system's availability for other tenants.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "WAF checklist", - "guid": "b49e5b96-0332-44ec-b8cc-13318da61170", - "link": "https://learn.microsoft.com/purview/concept-policies-devops", - "service": "Purview", - "services": [ - "AzurePolicy", - "WAF" - ], - "severity": "Low", - "text": "Follow DevOps policies", + "category": "Reliability", + "checklist": "Multitenant architecture", + "guid": "2b99cb00-9abb-49b6-b11c-f2af9692f09e", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/overview", + "services": [], + "severity": "Medium", + "subcategory": "Reliability", + "text": "Design your multitenant solution for the level of growth that you expect. But don't overengineer for unrealistic growth.", "waf": "Reliability" }, { - "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" - ], + "category": "Reliability", + "checklist": "Multitenant architecture", + "guid": "7a634a0e-1c9d-42b1-aac2-5a5378f103f1", + "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/business-metrics", + "services": [], "severity": "Medium", - "text": "Follow reliability support recommendations in Azure Bot Service", + "subcategory": "Reliability", + "text": "Define service-level objectives (SLOs) and optionally service-level agreements (SLAs) for your solution. SLAs and SLOs should be based on the requirements of your tenants, as well as the composite SLA of the Azure resources in your architecture.", "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", + "category": "Reliability", + "checklist": "Multitenant architecture", + "guid": "45beeeaf-fc59-4079-8fca-65d5724abaa7", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/compute", + "services": [], + "severity": "High", + "subcategory": "Reliability", + "text": "Test the scale of your solution. Ensure that it performs well under all levels of load, and that it scales correctly as the number of tenants increases.", "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" - ], + "category": "Reliability", + "checklist": "Multitenant architecture", + "guid": "2ff55551-984b-4606-95eb-bfb9c8b36761", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/compute", + "services": [], "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.", + "subcategory": "Reliability", + "text": "Apply chaos engineering principles to test the reliability of your solution.", "waf": "Reliability" }, { - "arm-service": "Microsoft.DBforPostgreSQL/servers", - "checklist": "WAF checklist", - "guid": "65285269-441c-44bf-9d3e-0844276d4bdc", - "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview", - "service": "PostgreSQL", + "category": "Security", + "checklist": "Multitenant architecture", + "guid": "8238c038-8eb2-4a02-8bd5-4908c9442c1c", + "link": "https://learn.microsoft.com/security/zero-trust", + "services": [], + "severity": "High", + "subcategory": "Security", + "text": "Apply the Zero Trust and least privilege principles in all layers of your solution.", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Multitenant architecture", + "guid": "92160e00-6894-4102-97e0-615d4ed93c01", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/map-requests", "services": [ - "WAF" + "Entra" ], + "severity": "High", + "subcategory": "Security", + "text": "Ensure that you can correctly map user requests to tenants. Consider including the tenant context as part of the identity system, or by using another means, like application-level tenant authorization.", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Multitenant architecture", + "guid": "3c1538b4-5676-4b85-b451-432befb37b4f", + "link": "https://learn.microsoft.com/azure/security/fundamentals/pen-testing", + "services": [], "severity": "Medium", - "text": "Leverage Flexible Server", - "waf": "Reliability" + "subcategory": "Security", + "text": "Perform ongoing penetration testing and security code reviews.", + "waf": "Security" }, { - "arm-service": "Microsoft.DBforPostgreSQL/servers", - "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", + "category": "Security", + "checklist": "Multitenant architecture", + "guid": "5fca45ce-cf2d-42c0-a62c-aac92ba31498", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/governance-compliance", + "services": [], + "severity": "High", + "subcategory": "Security", + "text": "Understand your tenants' compliance requirements, including data residency and any compliance or regulatory standards that they require you to meet.", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Multitenant architecture", + "guid": "30adb90d-83d4-4a2e-986e-327ffe04e7a5", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/domain-names", "services": [ - "WAF" + "DNS" ], "severity": "High", - "text": "Leverage Availability Zones where regionally applicable", - "waf": "Reliability" + "subcategory": "Security", + "text": "Correctly manage domain names and avoid vulnerabilities like dangling DNS and subdomain takeover attacks.", + "waf": "Security" }, { - "arm-service": "Microsoft.DBforPostgreSQL/servers", - "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", + "category": "Security", + "checklist": "Multitenant architecture", + "guid": "72ded36d-c633-4e0d-bd41-799a29da3481", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/service/overview", + "services": [], + "severity": "Medium", + "subcategory": "Security", + "text": "Follow service-specific guidance for multitenancy.", + "waf": "Security" + }, + { + "category": "Cost Optimization", + "checklist": "Multitenant architecture", + "guid": "db30a9fc-9b1d-40f3-ab90-01f6a3e87fc8", + "link": "https://learn.microsoft.com/azure/architecture/framework/cost/design-checklist", "services": [ - "WAF" + "Cost" ], "severity": "Medium", - "text": "Leverage cross-region read replicas for BCDR", - "waf": "Reliability" + "subcategory": "Cost Optimization", + "text": "Review the Azure Well-Architected Operational Excellence checklist, which is applicable to all workloads.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", + "category": "Cost Optimization", + "checklist": "Multitenant architecture", + "guid": "8533af39-52f6-45b6-a9c3-81b2a54a31e0", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/measure-consumption", "services": [ - "ACR", - "WAF" + "Cost" ], "severity": "High", - "text": "Disable Azure Container Registry image export", - "waf": "Security" + "subcategory": "Cost Optimization", + "text": "Ensure you can adequately measure per-tenant consumption and correlate it with your infrastructure costs.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", + "category": "Cost Optimization", + "checklist": "Multitenant architecture", + "guid": "c851fd44-7cf1-459c-95a4-f6455d75a981", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/cost-management-allocation", "services": [ - "AzurePolicy", - "ACR", - "WAF" + "Cost", + "Monitor" ], + "severity": "Medium", + "subcategory": "Cost Optimization", + "text": "Avoid antipatterns. Antipatterns include failing to track costs, tracking costs with unnecessary precision, real-time measurement, and using monitoring tools for billing.", + "waf": "Cost" + }, + { + "category": "Operational Excellence", + "checklist": "Multitenant architecture", + "guid": "0d475a5a-2c0f-47ab-b1e1-701da68d3407", + "link": "https://learn.microsoft.com/azure/architecture/checklist/data-ops", + "services": [], "severity": "High", - "text": "Enable Azure Policies for Azure Container Registry", - "waf": "Security" + "subcategory": "Operational Excellence", + "text": "Review the Azure Well-Architected Operational Excellence checklist, which is applicable to all workloads.", + "waf": "Operations" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", + "category": "Operational Excellence", + "checklist": "Multitenant architecture", + "guid": "9f7fa7a9-47fc-4f04-81f6-9f9e87571ed3", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenant-lifecycle", + "services": [], + "severity": "Medium", + "subcategory": "Operational Excellence", + "text": "Use automation to manage the tenant lifecycle, such as onboarding, deployment, provisioning, and configuration.", + "waf": "Operations" + }, + { + "category": "Operational Excellence", + "checklist": "Multitenant architecture", + "guid": "e0bfceed-4f4e-492d-b9f5-898815faa363", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/updates", + "services": [], + "severity": "Medium", + "subcategory": "Operational Excellence", + "text": "Find the right balance for deploying service updates. Consider both your tenants' requirements and your own operational requirements.", + "waf": "Operations" + }, + { + "category": "Operational Excellence", + "checklist": "Multitenant architecture", + "guid": "a3f80518-d428-4c02-b2cc-dfaef47db7e2", "services": [ - "ACR", - "WAF", - "AKV" + "Monitor" ], "severity": "High", - "text": "Sign and Verify containers with notation (Notary v2)", - "waf": "Security" + "subcategory": "Operational Excellence", + "text": "Monitor the health of the overall system, as well as each tenant.", + "waf": "Operations" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", + "category": "Operational Excellence", + "checklist": "Multitenant architecture", + "guid": "dfb42da5-f871-4953-9e5c-da6fda3f1411", "services": [ - "ACR", - "WAF", - "AKV" + "Monitor" ], "severity": "Medium", - "text": "Encrypt registry with a customer managed key", - "waf": "Security" + "subcategory": "Operational Excellence", + "text": "Configure and test alerts to notify you when specific tenants are experiencing issues or are exceeding their consumption limits.", + "waf": "Operations" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", - "services": [ - "RBAC", - "ACR", - "WAF", - "Entra" - ], + "category": "Operational Excellence", + "checklist": "Multitenant architecture", + "guid": "c0c72a1b-e34d-4b3d-b808-2e49f51ce47e", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/resource-organization", + "services": [], "severity": "High", - "text": "Use Managed Identities to connect instead of Service Principals", - "waf": "Security" + "subcategory": "Operational Excellence", + "text": "Organize your Azure resources for isolation and scale.", + "waf": "Operations" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", - "services": [ - "RBAC", - "WAF" - ], + "category": "Operational Excellence", + "checklist": "Multitenant architecture", + "guid": "c5c5e22d-4b51-4cac-a980-f7aac1a4b427", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/deployment-configuration", + "services": [], + "severity": "Medium", + "subcategory": "Operational Excellence", + "text": "Avoid deployment and configuration antipatterns. Antipatterns include running separate versions of the solution for each tenant, hardcoding tenant-specific configurations or logic, and manual deployments.", + "waf": "Operations" + }, + { + "category": "Performance Efficiency", + "checklist": "Multitenant architecture", + "guid": "f0b1fbd8-689c-4ab3-be1d-ad7607d2fbfd", + "link": "https://learn.microsoft.com/azure/architecture/framework/scalability/performance-efficiency", + "services": [], "severity": "High", - "text": "Disable local authentication for management plane access", - "waf": "Security" + "subcategory": "Performance Efficiency", + "text": "Review the Azure Well-Architected Performance Efficiency checklist, which is applicable to all workloads.", + "waf": "Performance" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", - "services": [ - "RBAC", - "ACR", - "WAF", - "Entra" - ], + "category": "Performance Efficiency", + "checklist": "Multitenant architecture", + "guid": "18911c4c-934c-49a8-839a-60c092afce30", + "link": "https://learn.microsoft.com/azure/architecture/antipatterns/noisy-neighbor/noisy-neighbor", + "services": [], "severity": "High", - "text": "Assign AcrPull & AcrPush RBAC roles rather than granting Administrative access to identity principals", - "waf": "Security" + "subcategory": "Performance Efficiency", + "text": "If you use shared infrastructure, plan for how you'll mitigate Noisy Neighbor concerns. Ensure that one tenant can't reduce the performance of the system for other tenants.", + "waf": "Performance" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", + "category": "Performance Efficiency", + "checklist": "Multitenant architecture", + "guid": "6acf7eb5-24a3-47c7-ae87-1196cd96048e", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/compute", "services": [ - "WAF" + "Storage" ], "severity": "Medium", - "text": "Disable Anonymous pull access", - "waf": "Security" + "subcategory": "Performance Efficiency", + "text": "Determine how you'll scale your compute, storage, networking, and other Azure resources to match the demands of your tenants.", + "waf": "Performance" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", - "services": [ - "WAF", - "Entra" - ], + "category": "Performance Efficiency", + "checklist": "Multitenant architecture", + "guid": "ea55400d-f97d-45aa-b71b-34224bf91ed4", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/resource-organization", + "services": [], "severity": "High", - "text": "Disable repository-scoped access tokens", - "waf": "Security" + "subcategory": "Performance Efficiency", + "text": "Consider each Azure resource's scale limits. Organize your resources appropriately, in order to avoid resource organization antipatterns. For example, don't over-architect your solution to work within unrealistic scale requirements.", + "waf": "Performance" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", + "category": "Storage", + "checklist": "Azure Stack HCI Review", + "guid": "9f519499-5820-4060-88fe-cab4538c9dd0", + "link": "https://learn.microsoft.com/windows-server/storage/storage-spaces/storage-spaces-direct-hardware-requirements", "services": [ - "EventHubs", - "ACR", - "WAF", - "PrivateLink" + "Storage" ], - "severity": "High", - "text": "Deploy images from a trusted environment", - "waf": "Security" + "severity": "Medium", + "subcategory": "Physical", + "text": "All planned storage pools should use direct-attached storage (SATA, SAS, NVMe)", + "waf": "Performance" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", + "category": "Storage", + "checklist": "Azure Stack HCI Review", + "guid": "f7c015e0-7d97-4283-b006-567afeb2b5ca", + "link": "https://learn.microsoft.com/azure-stack/hci/concepts/drive-symmetry-considerations#understand-capacity-imbalance", "services": [ - "AzurePolicy", - "ACR", - "WAF", - "Entra" + "Storage", + "ACR" ], "severity": "Medium", - "text": "Disable Azure ARM audience tokens for authentication", - "waf": "Security" + "subcategory": "Physical", + "text": "Disks are symmetrical across all nodes", + "waf": "Performance" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", + "category": "Storage", + "checklist": "Azure Stack HCI Review", + "guid": "f785b143-2c1e-4466-9baa-dde8ba4c7aaa", + "link": "https://learn.microsoft.com/azure-stack/hci/concepts/fault-tolerance#parity", "services": [ - "Monitor", - "ACR", - "WAF", - "Entra" + "Backup", + "Storage" ], "severity": "Medium", - "text": "Enable diagnostics logging", - "waf": "Security" + "subcategory": "S2D", + "text": "Parity type disk redundancy should only be used for low I/O volumes (backup/archive)", + "waf": "Performance" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", + "category": "Storage", + "checklist": "Azure Stack HCI Review", + "guid": "8a705965-9840-43cc-93b3-06d089406bb4", + "link": "https://learn.microsoft.com/windows-server/storage/storage-spaces/storage-spaces-direct-hardware-requirements#physical-deployments", "services": [ - "Firewall", - "WAF", - "VNet", - "PrivateLink" + "Storage" ], "severity": "Medium", - "text": "Control inbound network access with Private Link", - "waf": "Security" + "subcategory": "S2D", + "text": "Ensure there at least 2 capacity disks with available capacity in the Storage Pool", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", + "category": "Storage", + "checklist": "Azure Stack HCI Review", + "guid": "2a4f629a-d623-4610-a8e3-d6fd66057d8e", + "link": "https://learn.microsoft.com/windows-server/storage/storage-spaces/delimit-volume-allocation", "services": [ - "WAF", - "PrivateLink" + "Storage" ], - "severity": "Medium", - "text": "Disable Public Network access", - "waf": "Security" + "severity": "Low", + "subcategory": "S2D", + "text": "'Delimited allocation' has been considered to improve volume resiliency in a multi-node failure", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", + "category": "Storage", + "checklist": "Azure Stack HCI Review", + "guid": "960eb9be-1f0f-4fc1-9b31-fcf1cf9e34e6", + "link": "https://learn.microsoft.com/azure-stack/hci/concepts/plan-volumes#choosing-how-many-volumes-to-create", "services": [ - "ACR", - "WAF", - "PrivateLink" + "Storage" ], "severity": "Medium", - "text": "Use an Azure Container Registry SKU that supports Private Link (Premium SKU)", - "waf": "Security" + "subcategory": "S2D", + "text": "CSVs are created in multiples of node count", + "waf": "Performance" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", + "category": "Storage", + "checklist": "Azure Stack HCI Review", + "guid": "859ba2b9-a3a8-4ca1-bb61-165effbf1c03", + "link": "https://learn.microsoft.com/azure-stack/hci/concepts/cache", "services": [ - "ACR", - "WAF", - "Defender" + "Storage" ], - "severity": "Low", - "text": "Enable Defender for Containers to scan Azure Container Registry for vulnerabilities", - "waf": "Security" + "severity": "Medium", + "subcategory": "S2D", + "text": "If a cache tier is implemented, the number of capacity drives is a multiple of the number of cache drives", + "waf": "Performance" }, { - "arm-service": "microsoft.containerregistry/registries", - "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", + "category": "Storage", + "checklist": "Azure Stack HCI Review", + "guid": "d8a65f05-db06-461d-81dc-7899ad3f8f1e", + "link": "https://learn.microsoft.com/azure-stack/hci/concepts/plan-volumes#reserve-capacity", "services": [ - "WAF" + "Storage" ], "severity": "Medium", - "text": "Deploy validated container images", - "waf": "Security" + "subcategory": "S2D", + "text": "A minimum of 1 type of each disk type per node has been factored as a reserve disk", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "WAF checklist", - "description": "Use the latest versions of supported platforms, programming languages, protocols, and frameworks.", - "guid": "4e401955-387e-45ce-b126-cd132af5b20c", - "service": "ACR", + "category": "Storage", + "checklist": "Azure Stack HCI Review", + "description": "VMFleet is a tool that can be used to measure the performance of a storage subsystem, best used to baseline performance prior to workload deployment", + "guid": "9d138f1d-5363-476e-bbd7-acfa500bdc0c", + "link": "https://github.com/microsoft/diskspd/wiki/VMFleet", "services": [ - "WAF" + "Storage" ], - "severity": "High", - "text": "Use up-to-date platforms, languages, protocols and frameworks", - "waf": "Security" + "severity": "Low", + "subcategory": "S2D", + "text": "VMFleet has been run prior to workload deployment to baseline storage performance", + "waf": "Performance" }, { - "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", + "category": "Storage", + "checklist": "Azure Stack HCI Review", + "guid": "13c12e2a-c938-4dd1-9223-507d5e17f9c5", "services": [ - "WAF", - "EventHubs" + "Storage" ], - "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": "Medium", + "subcategory": "Host OS", + "text": "OS drives use a dedicated storage controller", + "waf": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "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", + "category": "Storage", + "checklist": "Azure Stack HCI Review", + "guid": "a631e7dc-8879-45bd-b0a7-e5927b805428", + "link": "https://learn.microsoft.com/azure-stack/hci/manage/use-csv-cache", "services": [ - "WAF", - "EventHubs" + "Storage" ], "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" + "subcategory": "Host OS", + "text": "CSV in-memory read caching is enabled and properly configured", + "waf": "Performance" }, { - "arm-service": "microsoft.eventhub/namespaces", - "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", + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "guid": "c062cd9a-f1db-4f83-aab3-9cb03f56c140", + "link": "https://learn.microsoft.com/azure-stack/hci/concepts/host-network-requirements#switch-embedded-teaming-set", "services": [ - "TrafficManager", - "AzurePolicy", - "RBAC", - "EventHubs", - "Entra", - "WAF" + "ACR" ], "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" + "subcategory": "Host", + "text": "NICs are symmetrical across nodes", + "waf": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "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", + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "guid": "ea8054db-a558-4533-80c8-5d9cf447ba19", "services": [ - "AKV", - "Storage", - "VM", - "EventHubs", - "Entra", - "WAF" + "Storage" ], + "severity": "High", + "subcategory": "Host", + "text": "Storage networking is redundant", + "waf": "Reliability" + }, + { + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "guid": "15d976c5-e267-49a1-8b00-62010bfa5188", + "link": "https://learn.microsoft.com/azure-stack/hci/deploy/network-atc", + "services": [], "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" + "subcategory": "Host", + "text": "Host networking configuration is managed by Network ATC and intents are healthy", + "waf": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "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", + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "guid": "676c53ad-b29a-4de1-9d03-d7d2674405b8", + "link": "https://learn.microsoft.com/azure-stack/hci/concepts/network-hud-overview", + "services": [], + "severity": "Low", + "subcategory": "Host", + "text": "Network HUD has been configured", + "waf": "Reliability" + }, + { + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "guid": "8f6d58d9-6c1a-4ec1-b2d7-b2c6ba8f3949", + "link": "https://learn.microsoft.com/azure-stack/hci/concepts/host-network-requirements", "services": [ - "RBAC", - "WAF", - "EventHubs" + "Storage", + "VNet" ], - "severity": "High", - "text": "Use least privilege data plane RBAC", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", - "waf": "Security" + "severity": "Medium", + "subcategory": "Host", + "text": "Storage NICs are assigned static IP addresses on separate subnets and VLANs", + "waf": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "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", + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "guid": "824e53ec-953e-40c2-a6b8-52970b5b0f74", + "link": "https://learn.microsoft.com/azure-stack/hci/plan/two-node-switched-converged", + "services": [], + "severity": "Medium", + "subcategory": "Host", + "text": "For switchless designs, dual link full mesh connectivity has been implemented", + "waf": "Reliability" + }, + { + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "guid": "dbc85d0e-0ebd-4589-a789-0fa8ceb1d0f0", + "link": "https://learn.microsoft.com/azure-stack/hci/concepts/physical-network-requirements#using-switchless", "services": [ - "Monitor", - "WAF", - "VNet", - "EventHubs" + "Storage" ], "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" + "subcategory": "Host", + "text": "If the cluster is made up of more than 3 nodes, a switched storage network has been implemented", + "waf": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "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", + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "guid": "603c6d71-59d2-419c-a312-8edc6e799c6a", "services": [ - "EventHubs", - "WAF", - "VNet", - "PrivateLink" + "Storage" ], - "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" + "severity": "High", + "subcategory": "Host", + "text": "RDMA is enabled on the Storage networking", + "waf": "Performance" }, { - "arm-service": "microsoft.eventhub/namespaces", - "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", + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "guid": "9e260eae-bca1-4827-a259-76ee63fda8d6", + "link": "https://github.com/microsoft/SDN/blob/master/Diagnostics/Test-Rdma.ps1", + "services": [], + "severity": "Medium", + "subcategory": "Host", + "text": "Test-RDMA.ps1 has been run to validate the RDMA configuration", + "waf": "Performance" + }, + { + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "description": "This ensures that Management traffic is not exposed to the VM traffic", + "guid": "abc85d0e-0ebd-4589-a777-0fa8ceb1d0f0", + "link": "", "services": [ - "WAF", - "EventHubs" + "VM" ], "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/", + "subcategory": "Host", + "text": "If a VMSwitch is shared for Compute and Management traffic, require that Management traffic is tagged with a VLAN ID", "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", - "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", + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "description": "This ensures you have at least 3 NCs active at all times during NC upgrades.", + "guid": "eb36f5f4-0fa7-4a2c-85f3-1b1c7c7817c0", "services": [ - "WAF" + "VM" ], "severity": "Medium", - "text": "Leverage FTA Resillency HandBook", + "subcategory": "SDN", + "text": "There are at least 3 Network Controller VMs deployed", "waf": "Reliability" }, { - "arm-service": "microsoft.eventhub/namespaces", - "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", + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "guid": "8bc78c85-6028-4a43-af2d-082a0a344909", + "link": "https://learn.microsoft.com/windows-server/networking/sdn/manage/update-backup-restore", "services": [ - "ACR", - "WAF", - "EventHubs" + "Backup" ], "severity": "High", - "text": "Leverage Availability Zones if regionally applicable", - "waf": "Reliability" + "subcategory": "SDN", + "text": "Backups of SDN infrastructure are configured and tested", + "waf": "Operations" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "WAF checklist", - "guid": "20b56c56-ad58-4519-8f82-735c586bb281", - "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", - "service": "Event Hubs", + "category": "Management and Monitoring", + "checklist": "Azure Stack HCI Review", + "guid": "51eaa4b6-b9a7-43e1-a7dc-634d3107bc6d", "services": [ - "WAF" + "Monitor" ], "severity": "Medium", - "text": "Use the Premium or Dedicated SKUs for predicable performance", - "waf": "Reliability" + "subcategory": "Cluster", + "text": "SCOM Managed Instance has been considered for more complex monitoring and alerting scenarios", + "waf": "Operations" }, { - "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", + "category": "Management and Monitoring", + "checklist": "Azure Stack HCI Review", + "guid": "831f5aca-99ef-41e7-8263-9509f5093b43", + "link": "https://learn.microsoft.com/azure-stack/hci/manage/setup-hci-system-alerts", "services": [ - "EventHubs", - "WAF", - "ASR" + "Monitor" ], "severity": "High", - "text": "Plan for Geo Disaster Recovery using Active Passive configuration", - "waf": "Reliability" + "subcategory": "Cluster", + "text": "Alerts have been configured for the cluster, either using Azure Monitor, SCOM, or a third-party solution", + "waf": "Operations" }, { - "arm-service": "microsoft.eventhub/namespaces", - "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", + "category": "Management and Monitoring", + "checklist": "Azure Stack HCI Review", + "guid": "f95d0e7e-9f61-476d-bf65-59f2454d1d39", + "link": "https://learn.microsoft.com/azure-stack/hci/manage/monitor-hci-single?tabs=22h2-and-later", "services": [ - "EventHubs", - "WAF", - "ASR" + "Monitor" ], "severity": "Medium", - "text": "For Business Critical Applications, use Active Active configuration", - "waf": "Reliability" + "subcategory": "Cluster", + "text": "Insights has been enabled at the cluster level and all nodes are reporting data", + "waf": "Operations" }, { - "arm-service": "microsoft.eventhub/namespaces", - "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", + "category": "Management and Monitoring", + "checklist": "Azure Stack HCI Review", + "guid": "f4250fcb-ff53-40c9-b304-3560464fd90c", + "link": "https://learn.microsoft.com/azure-stack/hci/manage/monitor-hci-single?tabs=22h2-and-later", "services": [ - "WAF", - "EventHubs" + "Monitor" ], "severity": "Medium", - "text": "Design Resilient Event Hubs", - "waf": "Reliability" + "subcategory": "Cluster", + "text": "Azure Monitoring Agent has been deployed to hosts and an appropriate Data Collection Rule has been configured", + "waf": "Operations" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "WAF checklist", - "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", - "service": "Azure Monitor", + "category": "Management and Monitoring", + "checklist": "Azure Stack HCI Review", + "guid": "6143af1d-0d1a-4163-b1c9-662f7459bb98", "services": [ - "Monitor", - "WAF" + "Monitor" ], "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" + "subcategory": "Hardware", + "text": "Relevant hardware monitoring has been configured", + "waf": "Operations" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "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", + "category": "Management and Monitoring", + "checklist": "Azure Stack HCI Review", + "guid": "9cbdf225-549a-41cf-9c97-794766a6f2b0", + "link": "https://learn.microsoft.com/azure-stack/hci/manage/health-service-overview", "services": [ - "WAF", - "Backup" + "Monitor" ], "severity": "Medium", - "text": "check backup instances with the underlying datasource not found", - "waf": "Cost" + "subcategory": "Hardware", + "text": "Relevant hardware alerting has been configured", + "waf": "Operations" }, { - "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", - "service": "VM", + "category": "Operations", + "checklist": "Azure Stack HCI Review", + "guid": "c0da5bbd-0f0d-4a26-98ec-38c9cc42b323", "services": [ - "WAF" + "VM" ], - "severity": "Medium", - "text": "Delete or archive unassociated services (disks, nics, ip addresses etc)", - "waf": "Cost" + "severity": "Low", + "subcategory": "VM Management - Resource Bridge", + "text": "The Azure CLI has been installed on every node to enable RB management from WAC", + "waf": "Operations" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "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", + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "guid": "a8ecf23c-c048-4fa9-b87b-51ebfb409863", + "services": [ + "VM" + ], + "severity": "Low", + "subcategory": "VM Management - Resource Bridge", + "text": "DHCP is available in the cluster to support Guest Configuration at VM deployment from Azure", + "waf": "Operations" + }, + { + "category": "Backup and Disaster Recovery", + "checklist": "Azure Stack HCI Review", + "guid": "074541e3-fe08-458a-8062-32d13dcc10c6", + "link": "https://learn.microsoft.com/azure/backup/back-up-azure-stack-hyperconverged-infrastructure-virtual-machines", "services": [ - "Storage", - "WAF", "Backup", + "VM", "ASR" ], + "severity": "High", + "subcategory": "VM", + "text": "Backups of HCI VMs have been configured using MABS or a third-party solution", + "waf": "Operations" + }, + { + "category": "Operations", + "checklist": "Azure Stack HCI Review", + "guid": "48f7ae57-1035-4101-8a38-fbe163d03e8a", + "services": [], + "severity": "High", + "subcategory": "Cluster Configuration", + "text": "Cluster configuration or a configuration script has been documented and maintained", + "waf": "Operations" + }, + { + "category": "Operations", + "checklist": "Azure Stack HCI Review", + "guid": "f2a6a19a-ffe6-444d-badb-cb336c8e7b50", + "link": "https://learn.microsoft.com/azure-stack/hci/manage/witness", + "services": [], + "severity": "High", + "subcategory": "Cluster Configuration", + "text": "A cluster witness has been configured for clusters with less than 5 nodes", + "waf": "Reliability" + }, + { + "category": "Operations", + "checklist": "Azure Stack HCI Review", + "guid": "a47339fe-62c5-44a0-bb83-3d46ef16292f", + "link": "https://learn.microsoft.com/azure-stack/hci/manage/update-cluster", + "services": [], "severity": "Medium", - "text": "Consider a good balance between site recovery storage and backup for non mission critical applications", - "waf": "Cost" + "subcategory": "Cluster Configuration", + "text": "Cluster-Aware Updating has been configured for Windows and hardware updates (if available)", + "waf": "Operations" }, { - "arm-service": "Microsoft.Insights/components", - "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", + "category": "Operations", + "checklist": "Azure Stack HCI Review", + "guid": "7f1d6fe8-3079-44ea-8ea6-14494d1aa470", + "link": "https://learn.microsoft.com/azure-stack/hci/deploy/validate", + "services": [], + "severity": "High", + "subcategory": "Cluster Configuration", + "text": "Cluster validation has been run against the configured cluster", + "waf": "Reliability" + }, + { + "category": "Operations", + "checklist": "Azure Stack HCI Review", + "guid": "81693af0-5638-4aa2-a153-1d6189df30a7", + "link": "https://learn.microsoft.com/azure-stack/hci/manage/azure-benefits", "services": [ - "Monitor", - "WAF" + "VM" ], "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", + "subcategory": "Cluster Configuration", + "text": "Azure Benefits has been enabled at the cluster and VM levels", "waf": "Cost" }, { - "arm-service": "Microsoft.Insights/components", - "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", + "category": "Operations", + "checklist": "Azure Stack HCI Review", + "guid": "8c967ee8-8170-4537-a28d-33431cd3632a", + "link": "https://learn.microsoft.com/azure-stack/hci/manage/use-environment-checker", + "services": [], + "severity": "Medium", + "subcategory": "Cluster Configuration", + "text": "The Environment Checker module has been run to validate the environment", + "waf": "Reliability" + }, + { + "category": "Operations", + "checklist": "Azure Stack HCI Review", + "guid": "43ffbfab-766e-4950-a102-78b479136e4d", + "link": "https://learn.microsoft.com/azure-stack/hci/manage/azure-benefits", "services": [ - "Storage", - "WAF", "AzurePolicy" ], "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" + "subcategory": "Cluster Configuration", + "text": "Group Policy inheritance on the HCI cluster and node Active Directory organizational unit has been blocked or applied policies have been evaluated for compatibility issues (usually WinRM and PowerShell execution policy)", + "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "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", + "category": "Operations", + "checklist": "Azure Stack HCI Review", + "guid": "e6a3f3a7-4a7d-49e2-985a-6e39dd284027", + "services": [], + "severity": "Medium", + "subcategory": "Cluster Configuration", + "text": "WAC is on the latest release and configured to automatically upgrade extensions", + "waf": "Reliability" + }, + { + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "guid": "d1caa31f-cc26-42b2-b92f-2b667c0e6020", + "link": "https://learn.microsoft.com/azure/architecture/hybrid/azure-stack-hci-dr", "services": [ - "Storage", - "WAF", - "Backup" + "Entra" ], "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" + "subcategory": "Stretch Clustering", + "text": "There is sub 5ms latency between each site if synchronous replication is being configured AAD", + "waf": "Performance" }, { - "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", + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "guid": "3277558e-3155-4088-b49a-78594cb4ce1a", "services": [ "Storage", - "WAF", - "AzurePolicy" + "VNet" ], - "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": "High", + "subcategory": "Stretch Clustering", + "text": "Management, Replication and Storage networks excluded from stretched VLANs configurations, are routed, and in different subnets", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "VM", + "category": "Operations", + "checklist": "Azure Stack HCI Review", + "guid": "baed6066-8531-44ba-bd94-38cbabbf4099", + "services": [], + "severity": "High", + "subcategory": "Stretch Clustering", + "text": "There is a plan detailed for site failure and recovery", + "waf": "Operations" + }, + { + "category": "Networking", + "checklist": "Azure Stack HCI Review", + "guid": "8e62945f-b9ac-4a5c-a4e4-836f527010b4", "services": [ - "WAF", - "VM" + "ACR" ], "severity": "Medium", - "text": "Make sure advisor is configured for VM right sizing ", - "waf": "Cost" + "subcategory": "Stretch Clustering", + "text": "Separate vLANs and networks are used for each replication network across both sites", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "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", + "category": "Operations", + "checklist": "Azure Stack HCI Review", + "guid": "8e62945f-b9ac-4a5c-a4e4-836f527010b5", + "link": "https://learn.microsoft.com/azure/architecture/hybrid/azure-stack-hci-dr#cost-optimization", "services": [ - "Cost", - "AzurePolicy", - "WAF", - "VM" + "Storage" ], - "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": "High", + "subcategory": "Stretch Clustering", + "text": "Use either a cloud witness or a file share witness in a third site for cluster quorum for clusters with less than 5 nodes", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", - "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", - "service": "VM", + "category": "Operations", + "checklist": "Azure Stack HCI Review", + "guid": "8e62945f-b9ac-4a5c-a4e4-836f527010b6", + "link": "https://learn.microsoft.com/azure/architecture/hybrid/azure-stack-hci-dr#cost-optimization", + "services": [], + "severity": "High", + "subcategory": "Stretch Clustering", + "text": "When using data deduplication, only enable it on the primary/source volumes", + "waf": "Reliability" + }, + { + "category": "Operations", + "checklist": "Azure Stack HCI Review", + "guid": "ac527887-f6f4-40a3-b883-e04d704f013b", + "link": "https://learn.microsoft.com/windows-server/storage/storage-replica/stretch-cluster-replication-using-shared-storage#provision-operating-system-features-roles-storage-and-network", "services": [ - "LoadBalancer", - "WAF" + "Storage" ], - "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" + "severity": "High", + "subcategory": "Stretch Clustering", + "text": "Storage backing log volumes must be faster (ideally) or at least as fast as capacity storage", + "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", + "category": "Backup and Disaster Recovery", + "checklist": "Azure Stack HCI Review", + "guid": "8ea49f70-1038-4283-b0c4-230165d3eabc", + "link": "https://learn.microsoft.com/azure-stack/hci/manage/azure-site-recovery", "services": [ - "WAF", - "VM" + "Backup", + "ASR" ], "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" + "subcategory": "Disaster Recovery", + "text": "Azure Site Recovery has been considered for DR purposes", + "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "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", + "category": "Security", + "checklist": "Azure Stack HCI Review", + "guid": "03e65fdc-2628-4a1a-ba2e-a5174340ba52", + "link": "https://learn.microsoft.com/windows/security/operating-system-security/data-protection/bitlocker/protecting-cluster-shared-volumes-and-storage-area-networks-with-bitlocker", + "services": [], + "severity": "Medium", + "subcategory": "Host", + "text": "BitLocker has been enabled on CSVs for volume encryption, where appropriate", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Stack HCI Review", + "guid": "9645d2e6-ba28-453c-b6d5-d9ef29fc34be", + "link": "https://learn.microsoft.com/windows-server/storage/file-server/smb-security", + "services": [], + "severity": "Medium", + "subcategory": "Host", + "text": "SMB encryption has been enabled, where appropriate", + "waf": "Security" + }, + { + "category": "Security", + "checklist": "Azure Stack HCI Review", + "guid": "8f03437a-5068-4486-9a78-0402ce771298", + "link": "https://learn.microsoft.com/microsoft-365/security/defender-endpoint/microsoft-defender-antivirus-on-windows-server", "services": [ - "Cost", - "WAF", - "ARS", - "VM" + "Defender" ], "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" + "subcategory": "Host", + "text": "Microsoft Defender Antivirus has been enabled on all nodes", + "waf": "Security" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", - "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", - "service": "VM", + "category": "Security", + "checklist": "Azure Stack HCI Review", + "guid": "dba6b211-fc02-43b3-b7c8-f163c188332e", + "link": "https://learn.microsoft.com/windows/security/identity-protection/credential-guard/credential-guard-manage", + "services": [], + "severity": "Medium", + "subcategory": "Host", + "text": "Credential Guard has been configured, where appropriate", + "waf": "Security" + }, + { + "category": "Responsible AI", + "checklist": "Azure OpenAI Review", + "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": [], + "severity": "High", + "subcategory": "Metaprompting", + "text": "Follow Metaprompting guardrails for resonsible AI", + "waf": "Operational Excellence" + }, + { + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", + "link": "https://github.com/Azure-Samples/AI-Gateway", + "service": "Azure OpenAI", "services": [ - "WAF" + "Entra", + "APIM" ], - "severity": "Medium", - "text": "Only larger disks can be reserved => 1 TiB -", - "waf": "Cost" + "severity": "High", + "subcategory": "Load Balancing", + "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.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", - "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", - "service": "VM", + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "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": [ - "WAF" + "Monitor" ], - "severity": "Medium", - "text": "After the right-sizing optimization", - "waf": "Cost" + "severity": "High", + "subcategory": "Monitoring", + "text": "Enable monitoring for your AOAI instances", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.Sql/servers", - "checklist": "WAF checklist", - "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", - "service": "Azure SQL", + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "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": [ - "Cost", - "SQL", - "WAF", - "AzurePolicy" + "AKV", + "Subscriptions", + "Monitor" ], - "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", + "subcategory": "Alerts", + "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.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", - "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", - "service": "VM", + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "Azure OpenAI", "services": [ - "WAF", - "VM" + "Monitor" ], - "severity": "Medium", - "text": "The VM + license part discount (ahub + 3YRI) is around 70% discount", - "waf": "Cost" + "severity": "High", + "subcategory": "Monitoring", + "text": "Monitor token usage to prevent service disruptions due to capacity", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "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", + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "Azure OpenAI", "services": [ - "WAF", - "VM" + "Monitor" ], "severity": "Medium", - "text": "Consider using a VMSS to match demand rather than flat sizing", - "waf": "Cost" + "subcategory": "Observability", + "text": "observe metrics like processed inference tokens, generated completion tokens monitor for rate limit", + "waf": "Operational Excellence" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "AKS", + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "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": [ - "WAF", - "AKS" + "APIM" ], - "severity": "Medium", - "text": "Use AKS autoscaler to match your clusters usage (make sure the pods requirements match the scaler)", - "waf": "Cost" + "severity": "Low", + "subcategory": "Observability", + "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.RecoveryServices/vaults", - "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", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Move recovery points to vault-archive where applicable (Validate)", - "training": "https://azure.microsoft.com/pricing/reservations/", - "waf": "Cost" + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", + "link": "https://github.com/Azure-Samples/openai-enterprise-iac", + "service": "Azure OpenAI", + "services": [], + "severity": "High", + "subcategory": "Infrastructure Deployment", + "text": "Use Infrastructure as code to deploy the Azure OpenAI Service, model deployments, and all related resources", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.Databricks/workspaces", - "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", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "4350d092-d234-4292-a752-8537a551c5bf", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", + "service": "Azure OpenAI", "services": [ - "LoadBalancer", - "WAF", - "VM" + "Entra" ], - "severity": "Medium", - "text": "Consider using Spot VMs with fallback where possible. Consider autotermination of clusters.", - "waf": "Cost" + "severity": "High", + "subcategory": "Authentication", + "text": "Use Microsoft Entra Authentication with Managed Identity instead of API Key", + "waf": "Security" }, { - "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": [ - "WAF" - ], - "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" + "category": "Responsible AI", + "checklist": "Azure OpenAI Review", + "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": [], + "severity": "High", + "subcategory": "Evaluation", + "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.Web/sites", - "checklist": "WAF checklist", - "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", - "link": "https://learn.microsoft.com/azure/automation/update-management/overview", - "service": "Azure Functions", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Functions - Cache data locally", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", - "waf": "Cost" + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "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": [], + "severity": "High", + "subcategory": "Hosting model", + "text": "Evaluate usage of Provisioned throughput model ", + "waf": "Performance" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "WAF checklist", - "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": "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" + "category": "Responsible AI", + "checklist": "Azure OpenAI Review", + "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", + "service": "Azure OpenAI", + "services": [], + "severity": "High", + "subcategory": "Content Safety", + "text": "Review and implement Azure AI content safety", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.Web/sites", - "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", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Functions - Keep your functions warm", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "Cost" + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "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": [], + "severity": "High", + "subcategory": "Throughput definition", + "text": "Define and evaluate the throughput of the system based on tokens & response per minute and align with requirements", + "waf": "Performance" }, { - "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": [ - "WAF" - ], + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", + "service": "Azure OpenAI", + "services": [], "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" + "subcategory": "Latency improvement", + "text": "Improve latency of the system by limiting token sizes, streaming options", + "waf": "Performance" }, { - "arm-service": "Microsoft.Web/sites", - "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", + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "service": "Azure OpenAI", "services": [ - "WAF" + "Storage", + "ServiceBus" ], "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" + "subcategory": "Elasticity segregation", + "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.Web/sites", - "checklist": "WAF checklist", - "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", - "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", - "service": "Azure Functions", - "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" + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "guid": "5bda4332-4f24-4811-9331-82ba51752694", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "Azure OpenAI", + "services": [], + "severity": "High", + "subcategory": "Benchmarking", + "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.network/frontdoors", - "checklist": "WAF checklist", - "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "Front Door", - "services": [ - "WAF", - "FrontDoor", - "EventHubs" - ], + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "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": [], "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" + "subcategory": "Elasticity ", + "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.network/frontdoors", - "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", - "services": [ - "AppSvc", - "WAF", - "FrontDoor" - ], + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", + "service": "Azure OpenAI", + "services": [], + "severity": "High", + "subcategory": "Model choice", + "text": "Choose the right model for the right task. Pick models with right tradeoff between speed, quality of response and output complexity", + "waf": "Performance" + }, + { + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "guid": "e9951904-8384-45c9-a6cb-2912156a1147", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "Azure OpenAI", + "services": [], "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" + "subcategory": "Fine tuning", + "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.Storage/storageAccounts", - "checklist": "WAF checklist", - "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", - "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", - "service": "Storage", + "category": "BC and DR", + "checklist": "Azure OpenAI Review", + "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": [ - "WAF" + "ACR" ], - "severity": "Medium", - "text": "Consider archiving tiers for less used data", - "waf": "Cost" + "severity": "Low", + "subcategory": "Multi-region architecture", + "text": "Deploy multiple OAI instances across regions", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", - "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", - "service": "VM", + "category": "BC and DR", + "checklist": "Azure OpenAI Review", + "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": [ - "WAF" + "Entra", + "APIM" ], + "severity": "High", + "subcategory": "Load balancing", + "text": "Implement retry & healthchecks with Gateway pattern like APIM", + "waf": "Reliability" + }, + { + "category": "BC and DR", + "checklist": "Azure OpenAI Review", + "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": [], "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" + "subcategory": "Quotas", + "text": "Ensure having adequate quotas of TPM & RPM for the workload", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "WAF checklist", - "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", - "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", - "service": "Storage", - "services": [ - "WAF" - ], + "category": "Responsible AI", + "checklist": "Azure OpenAI Review", + "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", + "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", + "service": "Azure OpenAI", + "services": [], "severity": "Medium", - "text": "Consider using standard SSD rather than Premium or Ultra where possible", - "waf": "Cost" + "subcategory": "UX best practice", + "text": "Review the considerations in HAI toolkit guidance and apply those interaction practices for the slution", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "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", + "category": "BC and DR", + "checklist": "Azure OpenAI Review", + "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": [ - "Storage", - "WAF" + "ACR" ], "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" + "subcategory": "Load balancing", + "text": "Deploy separate fine tuned models across regions if finetuning is employed", + "waf": "Reliability" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "WAF checklist", - "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", - "service": "Site Recovery", + "category": "BC and DR", + "checklist": "Azure OpenAI Review", + "guid": "77a1f893-5bda-4433-84f2-4811633182ba", + "link": "https://learn.microsoft.com/azure/backup/backup-overview", + "service": "Azure OpenAI", "services": [ - "WAF", + "Backup", "ASR" ], "severity": "Medium", - "text": "For ASR, consider using Standard SSD disks if the RPO/RTO and replication throughput allow it", - "waf": "Cost" + "subcategory": "Data Backup and Disaster Recovery", + "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.Storage/storageAccounts", - "checklist": "WAF checklist", - "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", - "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", - "service": "Storage", - "services": [ - "Storage", - "WAF" - ], - "severity": "Medium", - "text": "Storage accounts: check hot tier and/or GRS necessary", - "waf": "Cost" + "category": "BC and DR", + "checklist": "Azure OpenAI Review", + "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": [], + "severity": "High", + "subcategory": "SLA considerations", + "text": "Azure AI search service tiers should be choosen to have a SLA ", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", - "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", - "service": "VM", - "services": [ - "WAF" - ], - "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" + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", + "link": "https://learn.microsoft.com/purview/purview", + "service": "Azure OpenAI", + "services": [], + "severity": "Low", + "subcategory": "Data Sensitivity", + "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.Synapse/workspaces", - "checklist": "WAF checklist", - "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", - "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", - "service": "Synapse", - "services": [ - "Cost", - "Monitor", - "WAF", - "EventHubs" - ], - "severity": "Medium", - "text": "Create budgets to manage costs and create alerts that automatically notify stakeholders of spending anomalies and overspending risks.", - "waf": "Cost" + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "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": [], + "severity": "High", + "subcategory": "Encryption at Rest", + "text": "Encrypt data used for RAG with SSE/Disk encryption with optional BYOK", + "waf": "Security" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "WAF checklist", - "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "Synapse", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", + "link": "https://learn.microsoft.com/azure/search/search-security-overview", + "service": "Azure OpenAI", "services": [ - "Cost", - "Storage", - "WAF" + "ACR" ], - "severity": "Medium", - "text": "Export cost data to a storage account for additional data analysis.", - "waf": "Cost" + "severity": "High", + "subcategory": "Transit Encryption", + "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.Synapse/workspaces", - "checklist": "WAF checklist", - "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "Synapse", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "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": [ - "Cost", - "SQL", - "WAF" + "RBAC" ], - "severity": "Medium", - "text": "Control costs for a dedicated SQL pool by pausing the resource when it is not in use.", - "waf": "Cost" + "severity": "High", + "subcategory": "Access Control", + "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.Synapse/workspaces", - "checklist": "WAF checklist", - "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", - "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", - "service": "Synapse", - "services": [ - "WAF" - ], + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", + "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", + "service": "Azure OpenAI", + "services": [], "severity": "Medium", - "text": "Enable the serverless Apache Spark automatic pause feature and set your timeout value accordingly.", - "waf": "Cost" + "subcategory": "Data Masking and Redaction", + "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.Synapse/workspaces", - "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", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", + "service": "Azure OpenAI", "services": [ - "WAF" + "Sentinel", + "Defender", + "Monitor" ], - "severity": "Medium", - "text": "Create multiple Apache Spark pool definitions of various sizes.", - "waf": "Cost" + "severity": "High", + "subcategory": "Threat Detection and Monitoring", + "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.Synapse/workspaces", - "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", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "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": [ - "Cost", - "WAF" + "AzurePolicy" ], "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" + "subcategory": "Data Retention and Disposal", + "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.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", - "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", - "service": "VM", - "services": [ - "Cost", - "WAF", - "VM" - ], - "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" + "category": "Responsible AI", + "checklist": "Azure OpenAI Review", + "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", + "service": "Azure OpenAI", + "services": [], + "severity": "High", + "subcategory": "Jail break Safety", + "text": "Implement Prompt shields and groundedness detection using Content Safety ", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "544451e1-92d3-4442-a3c7-628637a551c5", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "VM", - "services": [ - "WAF", - "VM" - ], - "severity": "Medium", - "text": "Right-sizing all VMs", - "waf": "Cost" + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", + "link": "https://learn.microsoft.com/azure/compliance/", + "service": "Azure OpenAI", + "services": [], + "severity": "High", + "subcategory": "Data Privacy and Compliance", + "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.Compute/virtualMachines", - "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", - "services": [ - "WAF", - "VM" - ], + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", + "service": "Azure OpenAI", + "services": [], "severity": "Medium", - "text": "Swap VM sized with normalized and most recent sizes", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Cost" + "subcategory": "Employee Awareness and Training", + "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.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", - "services": [ - "Monitor", - "WAF", - "VM" - ], - "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" + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", + "service": "Azure OpenAI", + "services": [], + "severity": "High", + "subcategory": "Environment segregation", + "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.Compute/virtualMachines", - "checklist": "WAF checklist", - "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", - "services": [ - "WAF", - "VM" - ], + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", + "service": "Azure OpenAI", + "services": [], "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" + "subcategory": "Index Segregation", + "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.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", - "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", - "service": "APIM", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", + "service": "Azure OpenAI", "services": [ - "AzurePolicy", - "WAF" + "RBAC", + "AzurePolicy" ], "severity": "Medium", - "text": "Implement an error handling policy at the global level", - "waf": "Operations" + "subcategory": "Sensitive Data in Separate Instances", + "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.ApiManagement/service", - "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", - "services": [ - "AzurePolicy", - "WAF" - ], - "severity": "Medium", - "text": "Ensure all APIs policies include a element.", - "waf": "Operations" + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", + "service": "Azure OpenAI", + "services": [], + "severity": "High", + "subcategory": "Embedding and Vector handling", + "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.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", - "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", - "service": "APIM", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "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": [ - "AzurePolicy", - "ACR", - "WAF" + "RBAC" ], - "severity": "Medium", - "text": "Use Policy Fragments to avoid repeating same policies definitions across multiple APIs", - "waf": "Operations" + "severity": "High", + "subcategory": "Access control", + "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.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", - "link": "https://learn.microsoft.com/azure/api-management/monetization-support", - "service": "APIM", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "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": [ - "WAF" + "PrivateLink" ], - "severity": "Medium", - "text": "If you are planning to monetize your APIs, review the 'monetization support' article for best practices", - "waf": "Operations" + "severity": "High", + "subcategory": "Network security", + "text": "Configure private endpoint for AI services to restrict service access within your network", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", + "service": "Azure OpenAI", "services": [ - "Monitor", - "WAF" + "VNet", + "Firewall" ], "severity": "High", - "text": "Enable Diagnostics Settings to export logs to Azure Monitor", - "waf": "Operations" + "subcategory": "Network security", + "text": "Enforce strict inbound and outbound traffic control with Azure Firewall and UDRs and limit the external integration points", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", - "service": "APIM", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Enable Application Insights for more detailed telemetry", - "waf": "Operations" + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", + "service": "Azure OpenAI", + "services": [], + "severity": "High", + "subcategory": "Control Network Access", + "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.ApiManagement/service", - "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", + "category": "Cost Optimization", + "checklist": "Azure OpenAI Review", + "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", + "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", + "service": "Azure OpenAI", "services": [ - "Monitor", - "WAF" + "Cost" ], - "severity": "High", - "text": "Configure alerts on the most critical metrics", - "waf": "Operations" + "severity": "Medium", + "subcategory": "Token Optimization", + "text": "Use prompt compression tools like LLMLingua or gprtrim", + "waf": "Cost Optimization" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", + "service": "Azure OpenAI", "services": [ - "WAF", + "Entra", "AKV" ], "severity": "High", - "text": "Ensure that custom SSL certificates are stored an Azure Key Vault so they can be securely accessed and updated", + "subcategory": "Secure APIs and Endpoints", + "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.ApiManagement/service", - "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", - "services": [ - "WAF", - "Entra" - ], - "severity": "High", - "text": "Protect incoming requests to APIs (data plane) with Azure AD", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "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": [], + "severity": "Medium", + "subcategory": "Implement Strong Authentication", + "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.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", - "service": "APIM", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "93555620-2bfe-4456-9b0d-834a348b263e", + "service": "Azure OpenAI", "services": [ - "WAF", - "Entra" + "Monitor" ], "severity": "Medium", - "text": "Use Microsoft Entra ID to authenticate users in the Developer Portal", + "subcategory": "Use Network Monitoring", + "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.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", - "service": "APIM", - "services": [ - "WAF" - ], + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", + "service": "Azure OpenAI", + "services": [], "severity": "Medium", - "text": "Create appropriate groups to control the visibility of the products", + "subcategory": "Security Audits and Penetration Testing", + "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.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "06862505-2d9a-4874-9491-2837b00a3475", - "link": "https://learn.microsoft.com/azure/api-management/backends", - "service": "APIM", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", + "service": "Azure OpenAI", + "services": [], + "severity": "Low", + "subcategory": "Infrastructure Deployment", + "text": "Azure AI Services are properly tagged for better management", + "waf": "Operational Excellence" + }, + { + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "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": [], + "severity": "Low", + "subcategory": "Infrastructure Deployment", + "text": "Azure AI Service accounts follows organizational naming conventions", + "waf": "Operational Excellence" + }, + { + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", + "service": "Azure OpenAI", + "services": [], + "severity": "High", + "subcategory": "Diagnostics Logging", + "text": "Diagnostic logs in Azure AI services resources should be enabled", + "waf": "Operational Excellence" + }, + { + "category": "Identity and Access Management", + "checklist": "Azure OpenAI Review", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "link": "https://learn.microsoft.com/azure/ai-services/authentication", + "service": "Azure OpenAI", "services": [ - "WAF" + "Entra" ], - "severity": "Medium", - "text": "Use Backends feature to eliminate redundant API backend configurations", - "waf": "Operations" + "severity": "High", + "subcategory": "Entra ID based access", + "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.ApiManagement/service", - "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", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", "services": [ - "AzurePolicy", - "WAF" + "Entra", + "AKV" ], - "severity": "Medium", - "text": "Use Named Values to store common values that can be used in policies", - "waf": "Operations" + "severity": "High", + "subcategory": "Secure Key Management", + "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.ApiManagement/service", - "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", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", "services": [ - "ACR", - "WAF" + "AKV" ], - "severity": "Medium", - "text": "For DR, leverage the premium tier with deployments scaled across two or more regions for 99.99% SLA", - "waf": "Reliability" + "severity": "High", + "subcategory": "Key Rotation and Expiration", + "text": "Regularly rotate and expire keys stored in Azure Key Vault to minimize the risk of unauthorized access.", + "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", - "link": "https://learn.microsoft.com/azure/api-management/high-availability", - "service": "APIM", + "category": "Cost Optimization", + "checklist": "Azure OpenAI Review", + "guid": "adfe27be-e297-401a-a352-baaab79b088d", + "link": "https://github.com/openai/tiktoken", + "service": "Azure OpenAI", "services": [ - "WAF" + "Cost" ], - "severity": "Medium", - "text": "Deploy at least one unit in two or more availability zones for an increased SLA of 99.99%", - "waf": "Reliability" + "severity": "High", + "subcategory": "Token Optimization", + "text": "Use tiktoken to understand token sizes for token optimizations in conversational mode", + "waf": "Cost Optimization" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", + "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", + "service": "Azure OpenAI", + "services": [], + "severity": "High", + "subcategory": "Secure coding practice", + "text": "Follow secure coding practices to prevent common vulnerabilities such as injection attacks, cross-site scripting (XSS), or security misconfigurations", + "waf": "Security" + }, + { + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "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": [], + "severity": "High", + "subcategory": "Patching and updates", + "text": "Setup a process to regularly update and patch the LLM libraries and other system components", + "waf": "Security" + }, + { + "category": "Responsible AI", + "checklist": "Azure OpenAI Review", + "guid": "e29711b1-352b-4eee-879b-588defc4972c", + "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", + "service": "Azure OpenAI", "services": [ - "WAF", - "Backup" + "AzurePolicy" ], "severity": "High", - "text": "Ensure there is an automated backup routine", - "waf": "Reliability" + "subcategory": "Governance", + "text": "Adhere to Azure OpenAI or other LLMs terms of use, policies and guidance and allowed use cases", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", - "link": "https://learn.microsoft.com/azure/api-management/retry-policy", - "service": "APIM", + "category": "Cost Optimization", + "checklist": "Azure OpenAI Review", + "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": [ - "AzurePolicy", - "WAF" + "Cost" ], "severity": "Medium", - "text": "Use Policies to add a fail-over backend URL and caching to reduce failing calls.", - "waf": "Reliability" + "subcategory": "Cost familiarization", + "text": "Understand difference in cost of base models and fine tuned models and token step sizes", + "waf": "Cost Optimization" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", + "category": "Cost Optimization", + "checklist": "Azure OpenAI Review", + "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "service": "Azure OpenAI", "services": [ - "AzurePolicy", - "WAF", - "EventHubs" + "Cost" ], - "severity": "Low", - "text": "If you need to log at high performance levels, consider Event Hubs policy", - "waf": "Operations" + "severity": "High", + "subcategory": "Batch processing", + "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.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", - "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", - "service": "APIM", + "category": "Cost Optimization", + "checklist": "Azure OpenAI Review", + "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", + "service": "Azure OpenAI", "services": [ - "AzurePolicy", - "WAF" + "Cost", + "Monitor" ], "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" + "subcategory": "Cost monitoring", + "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.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", - "service": "APIM", + "category": "Cost Optimization", + "checklist": "Azure OpenAI Review", + "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": [ - "WAF" + "Cost" ], "severity": "Medium", - "text": "Configure autoscaling to scale out the number of instances when the load increases", - "waf": "Performance" + "subcategory": "Token limit", + "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.ApiManagement/service", - "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", - "services": [ - "WAF" - ], + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", + "link": "https://learn.microsoft.com/azure/search/search-reliability", + "service": "Azure OpenAI", + "services": [], "severity": "Medium", - "text": "Deploy self-hosted gateways where Azure doesn't have a region close to the backend APIs.", - "waf": "Performance" + "subcategory": "AI Search Reliability", + "text": "Review the guidance provided on setting up AI search for Reliability", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "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": [ - "WAF" + "Storage" ], "severity": "Medium", - "text": "Use the premium tier for production workloads.", - "waf": "Reliability" + "subcategory": "AI Search Vector Limits", + "text": "Plan and manage AI Search Vector storage", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", - "services": [ - "AzurePolicy", - "WAF" - ], + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "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": [], "severity": "Medium", - "text": "In multi-region model, use Policies to route the requests to regional backends based on availability or latency.", - "waf": "Reliability" + "subcategory": "DevOps", + "text": "Apply LLMOps practices to automate the lifecycle management of your GenAI applications", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", + "category": "Cost Optimization", + "checklist": "Azure OpenAI Review", + "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": [ - "APIM", - "WAF", - "Entra" + "Cost" ], "severity": "High", - "text": "Be aware of APIM's limits", - "waf": "Reliability" + "subcategory": "Costing Model", + "text": "Evaluate usage of billing models - PAYG vs PTU", + "waf": "Cost Optimization" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Ensure that the self-hosted gateway deployments are resilient.", - "waf": "Reliability" + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "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": [], + "severity": "Medium", + "subcategory": "DevOps", + "text": "Evaluate the quality of prompts and applications when switching between model versions", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "7519e385-a88b-4d34-966b-6269d686e890", - "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", - "service": "APIM", + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "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": [ - "APIM", - "WAF", - "FrontDoor", - "Entra" + "Monitor" ], "severity": "Medium", - "text": "Use Azure Front Door in front of APIM for multi-region deployment", - "waf": "Performance" + "subcategory": "Development", + "text": "Evaluate, monitor and refine your GenAI apps for features like groundedness, relevance, accuracy, coherence, fluency, �", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", - "services": [ - "WAF", - "VNet" - ], + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "guid": "294798b1-578b-4219-a46c-eb5443513592", + "service": "Azure OpenAI", + "services": [], "severity": "Medium", - "text": "Deploy the service within a Virtual Network (VNet)", - "waf": "Security" + "subcategory": "Development", + "text": "Evaluate your Azure AI Search results based on different search parameters", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", - "services": [ - "APIM", - "Monitor", - "VNet", - "Entra", - "WAF" - ], + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "guid": "2744293b-b628-4537-a551-19b08e8f5854", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", + "service": "Azure OpenAI", + "services": [], "severity": "Medium", - "text": "Deploy network security groups (NSG) to your subnets to restrict or monitor traffic to/from APIM.", - "waf": "Security" + "subcategory": "Development", + "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.ApiManagement/service", - "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", - "services": [ - "APIM", - "VNet", - "Entra", - "WAF", - "PrivateLink" - ], + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "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": [], "severity": "Medium", - "text": "Deploy Private Endpoints to filter incoming traffic when APIM is not deployed to a VNet.", - "waf": "Security" + "subcategory": "Development", + "text": "Use prompt engineering techniques to improve the accuracy of LLM responses", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", - "services": [ - "WAF" - ], - "severity": "High", - "text": "Disable Public Network Access", + "category": "Governance and Security", + "checklist": "Azure OpenAI Review", + "guid": "e737897e-71ca-47da-acfa-962a1594946d", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", + "service": "Azure OpenAI", + "services": [], + "severity": "Medium", + "subcategory": "Security Audits and Penetration Testing", + "text": "Red team your GenAI applications", "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", - "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", - "service": "APIM", - "services": [ - "WAF" - ], + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", + "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", + "service": "Azure OpenAI", + "services": [], "severity": "Medium", - "text": "Simplify management with PowerShell automation scripts", - "waf": "Operations" + "subcategory": "End user feedback", + "text": "Provide end users with scoring options for LLM responses and track these scores. ", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", + "category": "Cost Optimization", + "checklist": "Azure OpenAI Review", + "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": [ - "APIM", - "WAF", - "Entra" + "Cost" ], - "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", + "subcategory": "Quota Management", + "text": "Consider Quota management practices", + "waf": "Cost Optimization" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", - "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", - "service": "APIM", + "category": "Operations Management", + "checklist": "Azure OpenAI Review", + "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", + "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", + "service": "Azure OpenAI", "services": [ + "Entra", "APIM", - "WAF", - "Entra" + "LoadBalancer", + "ACR" ], "severity": "Medium", - "text": "Promote usage of Visual Studio Code APIM extension for faster API development", - "waf": "Operations" + "subcategory": "Load Balancing", + "text": "Use Load balancer solutions like APIM based gateway for balancing load and capacity across services and regions", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "354f1c03-8112-4965-85ad-c0074bddf231", - "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", - "service": "APIM", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Implement DevOps and CI/CD in your workflow", - "waf": "Operations" + "category": "BC and DR", + "checklist": "IoT Hub Review", + "guid": "ac1d6380-f866-4bbd-a9b4-b1ee5d7908b8", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#availability-zones", + "service": "IoT", + "services": [], + "severity": "High", + "subcategory": "High Availability", + "text": "Leverage Availability Zones if regionally applicable (this is automatically enabled)", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", - "services": [ - "WAF" - ], + "category": "BC and DR", + "checklist": "IoT Hub Review", + "guid": "35f651e8-0124-4ef7-8c57-658e38609e6e", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", + "service": "IoT", + "services": [], "severity": "Medium", - "text": "Secure APIs using client certificate authentication", - "waf": "Security" + "subcategory": "High Availability", + "text": "Be aware of Microsoft-initiated failovers. These are exercised by Microsoft in rare situations to fail over all the IoT hubs from an affected region to the corresponding geo-paired region.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "2a67d143-1033-4c0a-8732-680896478f08", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", - "service": "APIM", - "services": [ - "WAF" - ], - "severity": "Medium", - "text": "Secure backend services using client certificate authentication", - "waf": "Security" + "category": "BC and DR", + "checklist": "IoT Hub Review", + "guid": "4ed3e490-dc06-4a1e-b467-5d0239d85540", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#cross-region-dr", + "service": "IoT", + "services": [], + "severity": "High", + "subcategory": "High Availability", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" + }, + { + "category": "BC and DR", + "checklist": "IoT Hub Review", + "guid": "a11ecab0-db47-46f7-9aa7-17764e7e45a1", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", + "service": "IoT", + "services": [], + "severity": "High", + "subcategory": "High Availability", + "text": "Learn how to trigger a manual failover.", + "waf": "Reliability" + }, + { + "category": "BC and DR", + "checklist": "IoT Hub Review", + "guid": "f9db8dfb-1194-460b-aedd-34dd6a69db22", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#failback", + "service": "IoT", + "services": [], + "severity": "High", + "subcategory": "High Availability", + "text": "Learn how to fail back after a failover.", + "waf": "Reliability" + }, + { + "category": "BC and DR", + "checklist": "Container Apps Review", + "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": [], + "severity": "High", + "subcategory": "High Availability", + "text": "Leverage Availability Zones if regionally applicable", + "waf": "Reliability" + }, + { + "category": "BC and DR", + "checklist": "Container Apps Review", + "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": [], + "severity": "High", + "subcategory": "High Availability", + "text": "Use more than one replica and enable Zone Redundancy.", + "waf": "Reliability" + }, + { + "category": "BC and DR", + "checklist": "Container Apps Review", + "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": [], + "severity": "High", + "subcategory": "High Availability", + "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.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", - "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", - "service": "APIM", + "category": "BC and DR", + "checklist": "Container Apps Review", + "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": [ - "WAF" + "TrafficManager", + "FrontDoor" ], - "severity": "Medium", - "text": "Review 'Recommendations to mitigate OWASP API Security Top 10 threats' article and check what is applicable to your APIs", - "waf": "Security" + "severity": "High", + "subcategory": "High Availability", + "text": "Use Front Door or Traffic Manager to route traffic to the closest region", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "WAF checklist", - "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", - "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", - "service": "APIM", + "category": "Operations Management", + "checklist": "PostgreSQL Review Checklist", + "guid": "65285269-441c-44bf-9d3e-0844276d4bdc", + "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview", + "service": "PostgreSQL", "services": [ - "WAF" + "SQL" ], "severity": "Medium", - "text": "Use Authorizations feature to simplify management of OAuth 2.0 token for your backend APIs", - "waf": "Security" + "subcategory": "Best Practices", + "text": "Leverage Flexible Server", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", + "category": "Operations Management", + "checklist": "PostgreSQL Review Checklist", + "guid": "016ccf31-ae5a-41eb-9888-9535e227896d", + "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview#architecture-and-high-availability", + "service": "PostgreSQL", "services": [ - "WAF" + "SQL" ], "severity": "High", - "text": "Use the latest TLS version when encrypting information in transit. Disable outdated and unnecessary protocols and ciphers when possible.", - "waf": "Security" + "subcategory": "Best Practices", + "text": "Leverage Availability Zones where regionally applicable", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", + "category": "Operations Management", + "checklist": "PostgreSQL Review 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", "services": [ - "WAF", - "AKV" + "SQL" ], + "severity": "Medium", + "subcategory": "Best Practices", + "text": "Leverage cross-region read replicas for BCDR", + "waf": "Reliability" + }, + { + "category": "Operations Management", + "checklist": "Stream Analytics Review Checklist", + "guid": "32e52e36-11c8-418b-8a0b-c511e43a18a9", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-stream_analytics_v1.docx", + "services": [], "severity": "High", - "text": "Ensure that secrets (Named values) are stored an Azure Key Vault so they can be securely accessed and updated", - "waf": "Security" + "subcategory": "High Availablity ", + "text": "Leverage FTA Resiliency Handbook for Stream Analytics", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", - "services": [ - "WAF", - "Entra" - ], + "category": "Operations Management", + "checklist": "Stream Analytics Review Checklist", + "description": "Azure Stream Analytics provides high availability (99.9% SLA) for jobs and clusters within a region, the details of which are transparent to the end customer. If failures occur within the service, per the documentation �Azure Stream Analytics guarantees exactly once event processing and at-least-once delivery of events, so events are never lost.�", + "guid": "cd289ced-6b17-4db8-8554-62f2aee4553a", + "link": "https://azure.microsoft.com/en-in/products/stream-analytics", + "services": [], "severity": "Medium", - "text": "Use managed identities to authenticate to other Azure resources whenever possible", - "waf": "Security" + "subcategory": "High Availablity ", + "text": "Understand High Availability 99% SLA and use it to plan your DR strategy", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "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", - "services": [ - "APIM", - "AppGW", - "WAF", - "Entra" - ], - "severity": "High", - "text": "Use web application firewall (WAF) by deploying Application Gateway in front of APIM", - "waf": "Security" + "category": "Operations Management", + "checklist": "Stream Analytics Review Checklist", + "description": "Azure Stream Analytics resources (jobs, clusters, etc.) are regional and do not provide automatic geo-failover. However, you can achieve geo-redundancy by deploying identical Stream Analytics jobs in multiple Azure regions. Each job connects to local input and output sources. It is the responsibility of your application to both send input data into the two regional inputs and reconcile between the two regional outputs.", + "guid": "fc833934-8b26-42d6-ac5f-512925498e6d", + "link": "https://learn.microsoft.com/azure/stream-analytics/geo-redundancy", + "services": [], + "severity": "Medium", + "subcategory": "Geo Redundancy", + "text": "Plan for Geo Redudancy of the service", + "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", - "services": [ - "Storage", - "WAF" - ], + "category": "Operations Management", + "checklist": "Stream Analytics Review Checklist", + "guid": "b9d37dac-43bc-46cd-8d7a-a9b24604489a", + "link": "https://learn.microsoft.com/azure/stream-analytics/geo-redundancy", + "services": [], "severity": "Medium", - "text": "Consider the 'Azure security baseline for storage'", - "waf": "Security" + "subcategory": "Geo Redundancy", + "text": "Depending on your availablity requirement, configure Active/Active configuration or Active/Passive configuration ", + "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", + "category": "Application Deployment", + "checklist": "Azure AKS Review", + "guid": "785c2fa5-5b56-4ad4-a408-fe72734c476b", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/containers/aks/secure-baseline-aks", "services": [ - "Storage", - "WAF", - "PrivateLink" + "AKS" ], - "severity": "High", - "text": "Consider using private endpoints for Azure Storage", - "waf": "Security" + "severity": "Medium", + "subcategory": "Development", + "text": "Use canary or blue/green deployments", + "waf": "Operations" }, { - "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", + "category": "Application Deployment", + "checklist": "Azure AKS Review", + "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", + "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", + "service": "AKS", "services": [ - "RBAC", - "Storage", - "WAF", - "Subscriptions" + "AKS" ], - "severity": "Medium", - "text": "Ensure older storage accounts are not using 'classic deployment model'", - "waf": "Security" + "severity": "Low", + "subcategory": "Development", + "text": "If required for AKS Windows workloads HostProcess containers can be used", + "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", + "category": "Application Deployment", + "checklist": "Azure AKS Review", + "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", + "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", + "service": "AKS", "services": [ - "Storage", - "WAF", - "Defender" + "AKS" ], - "severity": "High", - "text": "Enable Microsoft Defender for all of your storage accounts", - "waf": "Security" + "severity": "Low", + "subcategory": "Development", + "text": "Use KEDA if running event-driven workloads", + "waf": "Performance" }, { - "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", + "category": "Application Deployment", + "checklist": "Azure AKS Review", + "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", + "link": "https://dapr.io/", + "service": "AKS", "services": [ - "Storage", - "WAF" + "AKS" ], - "severity": "Medium", - "text": "Enable 'soft delete' for blobs", - "waf": "Security" + "severity": "Low", + "subcategory": "Development", + "text": "Use Dapr to ease microservice development", + "waf": "Operations" }, { - "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", + "category": "Application Deployment", + "checklist": "Azure AKS Review", + "guid": "3acbe04b-be20-49d3-afda-47778424d116", + "link": "https://learn.microsoft.com/azure/developer/terraform/create-k8s-cluster-with-tf-and-aks", "services": [ - "Storage", - "WAF" + "AKS" ], "severity": "Medium", - "text": "Disable 'soft delete' for blobs", - "waf": "Security" + "subcategory": "Infrastructure as Code", + "text": "Use automation through ARM/TF to create your Azure resources", + "waf": "Operations" }, { - "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", + "category": "BC and DR", + "checklist": "Azure AKS Review", + "guid": "36cb45e5-7960-4332-9bdf-8cc23318da61", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/enterprise-scale/business-continuity-and-disaster-recovery", "services": [ - "WAF" + "ASR", + "AKS" ], "severity": "High", - "text": "Enable 'soft delete' for containers", - "waf": "Security" + "subcategory": "Disaster Recovery", + "text": "Schedule and perform DR tests regularly", + "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", + "category": "BC and DR", + "checklist": "Azure AKS Review", + "guid": "170265f4-bb46-4a39-9af7-f317284797b1", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", "services": [ - "Storage", - "WAF" + "LoadBalancer", + "TrafficManager", + "FrontDoor", + "AKS" ], "severity": "Medium", - "text": "Disable 'soft delete' for containers", - "waf": "Security" + "subcategory": "High Availability", + "text": "Use Azure Traffic Manager or Azure Front Door as a global load balancer for region failover", + "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", + "category": "BC and DR", + "checklist": "Azure AKS Review", + "graph": "resources | where type=='microsoft.containerservice/managedclusters' | extend compliant= isnotnull(properties.agentPoolProfiles[0].availabilityZones) | distinct id,compliant", + "guid": "578a219a-46be-4b54-9350-24922634292b", + "link": "https://learn.microsoft.com/azure/aks/availability-zones", "services": [ - "Storage", - "WAF" + "AKS" ], - "severity": "High", - "text": "Enable resource locks on storage accounts", - "waf": "Security" + "severity": "Medium", + "subcategory": "High Availability", + "text": "Use Availability Zones if they are supported in your Azure region", + "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", + "category": "BC and DR", + "checklist": "Azure AKS Review", + "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": [ - "Storage", - "WAF", - "AzurePolicy", - "Subscriptions" + "AKS" ], "severity": "High", - "text": "Consider immutable blobs", - "waf": "Security" + "subcategory": "High Availability", + "text": "Use the SLA-backed AKS offering", + "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", + "category": "BC and DR", + "checklist": "Azure AKS Review", + "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", "services": [ - "Storage", - "WAF" + "Cost", + "AKS" ], - "severity": "High", - "text": "Require HTTPS, i.e. disable port 80 on the storage account", - "waf": "Security" + "severity": "Low", + "subcategory": "High Availability", + "text": "Use Disruption Budgets in your pod and deployment definitions", + "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", + "category": "BC and DR", + "checklist": "Azure AKS Review", + "guid": "3c763963-7a55-42d5-a15e-401955387e5c", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", + "service": "ACR", "services": [ - "Storage", - "WAF" + "ACR", + "AKS" ], "severity": "High", - "text": "When enforcing HTTPS (disabling HTTP), check that you do not use custom domains (CNAME) for the storage account.", - "waf": "Security" + "subcategory": "High Availability", + "text": "If using a private registry, configure region replication to store images in multiple regions", + "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", + "category": "BC and DR", + "checklist": "Azure AKS Review", + "guid": "daa9a260-c3ea-4490-b077-5fc1f2a80cb0", + "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", "services": [ "Storage", - "WAF" + "ASR", + "AKS" ], - "severity": "Medium", - "text": "Limit shared access signature (SAS) tokens to HTTPS connections only", - "waf": "Security" + "severity": "High", + "subcategory": "Disaster Recovery", + "text": "Use Zone-Redundant Storage (ZRS) with stateful 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", + "category": "BC and DR", + "checklist": "Azure AKS Review", + "guid": "bc14aea6-e65d-48d9-a3ad-c218e6436b06", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/enterprise-scale/business-continuity-and-disaster-recovery", "services": [ - "Storage", - "WAF", - "Entra" + "AKS" ], "severity": "High", - "text": "Use Azure Active Directory (Azure AD) tokens for blob access", - "waf": "Security" + "subcategory": "Requirements", + "text": "Define non-functional requirements such as SLAs, RTO (Recovery Time Objective) and RPO (Recovery Point Objective).", + "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", + "category": "Cost Governance", + "checklist": "Azure AKS Review", + "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": [ - "RBAC", - "WAF" + "Cost", + "AKS" ], - "severity": "Medium", - "text": "Least privilege in IaM permissions", - "waf": "Security" + "severity": "Low", + "subcategory": "Cost", + "text": "Use an external application such as kubecost to allocate costs to different users", + "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", + "category": "Cost Governance", + "checklist": "Azure AKS Review", + "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", + "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", + "service": "AKS", "services": [ - "Storage", - "WAF", - "Entra" + "Cost", + "AKS" ], - "severity": "High", - "text": "When using SAS, prefer 'user delegation SAS' over storage-account-key based SAS.", - "waf": "Security" + "severity": "Low", + "subcategory": "Cost", + "text": "Use scale down mode to delete/deallocate nodes", + "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", + "category": "Cost Governance", + "checklist": "Azure AKS Review", + "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", + "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", + "service": "AKS", "services": [ - "AKV", - "Storage", - "Monitor", - "Entra", - "WAF" + "Cost", + "AKS" ], - "severity": "High", - "text": "Consider disabling storage account keys, so that only AAD access (and user delegation SAS) is supported.", - "waf": "Security" + "severity": "Medium", + "subcategory": "Cost", + "text": "When required use multi-instance partitioning GPU on AKS Clusters", + "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", + "category": "Cost Governance", + "checklist": "Azure AKS Review", + "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", + "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", + "service": "AKS", "services": [ - "AzurePolicy", - "AKV", - "Storage", - "Monitor", - "WAF" + "Cost", + "AKS" ], - "severity": "High", - "text": "Consider using Azure Monitor to audit control plane operations on the storage account", - "waf": "Security" + "severity": "Low", + "subcategory": "Cost", + "text": "If running a Dev/Test cluster use NodePool Start/Stop", + "waf": "Cost" }, { - "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", + "category": "Governance and Security", + "checklist": "Azure AKS Review", + "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": [ - "Storage", - "WAF", "AzurePolicy", - "AKV" + "AKS" ], "severity": "Medium", - "text": "When using storage account keys, consider enabling a 'key expiration policy'", + "subcategory": "Compliance", + "text": "Use Azure Policy for Kubernetes to ensure cluster compliance", "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", + "category": "Governance and Security", + "checklist": "Azure AKS Review", + "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": [ - "AzurePolicy", - "WAF" + "AKS" ], "severity": "Medium", - "text": "Consider configuring an SAS expiration policy", + "subcategory": "Compliance", + "text": "Separate applications from the control plane with user/system node pools", "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", + "category": "Governance and Security", + "checklist": "Azure AKS Review", + "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", + "link": "https://learn.microsoft.com/azure/aks/use-system-pools", + "service": "AKS", "services": [ - "AzurePolicy", - "WAF", - "Storage", - "AKV" + "AKS" ], - "severity": "Medium", - "text": "Consider linking SAS to a stored access policy", + "severity": "Low", + "subcategory": "Compliance", + "text": "Add taint to your system nodepool to make it dedicated", "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", + "category": "Governance and Security", + "checklist": "Azure AKS Review", + "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", + "link": "https://learn.microsoft.com/azure/container-registry/", + "service": "AKS", "services": [ - "Storage", - "WAF", - "AKV" + "ACR", + "AKS" ], "severity": "Medium", - "text": "Consider configuring your application's source code repository to detect checked-in connection strings and storage account keys.", + "subcategory": "Compliance", + "text": "Use a private registry for your images, such as ACR", "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", + "category": "Governance and Security", + "checklist": "Azure AKS Review", + "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", + "link": "https://learn.microsoft.com/azure/security-center/container-security", + "service": "ACR", "services": [ - "Storage", - "WAF", - "Entra" + "AKS" ], - "severity": "High", - "text": "Consider storing connection strings in Azure KeyVault (in scenarios where managed identities are not possible)", + "severity": "Medium", + "subcategory": "Compliance", + "text": "Scan your images for vulnerabilities", "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", + "category": "Governance and Security", + "checklist": "Azure AKS Review", + "guid": "cc639637-a652-42ac-89e8-06965388e9de", + "link": "https://learn.microsoft.com/azure/security-center/container-security", "services": [ - "Storage", - "WAF", - "AzurePolicy" + "Defender", + "AKS" ], - "severity": "High", - "text": "Strive for short validity periods for ad-hoc SAS", + "severity": "Medium", + "subcategory": "Compliance", + "text": "Use Azure Security Center to detect security posture vulnerabilities", "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", + "category": "Governance and Security", + "checklist": "Azure AKS Review", + "guid": "42d4aefe-2383-470e-b019-c30df24996b2", + "link": "https://learn.microsoft.com/azure/aks/use-multiple-node-pools#add-a-fips-enabled-node-pool", "services": [ - "WAF" + "AKS" ], - "severity": "Medium", - "text": "Apply a narrow scope to a SAS", + "severity": "Low", + "subcategory": "Compliance", + "text": "If required configure FIPS", "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", + "category": "Governance and Security", + "checklist": "Azure AKS Review", + "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", + "service": "AKS", "services": [ - "WAF" + "AKS" ], - "severity": "Medium", - "text": "Consider scoping SAS to a specific client IP address, wherever possible", + "severity": "High", + "subcategory": "Compliance", + "text": "Define app separation requirements (namespace/nodepool/cluster)", "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", + "category": "Governance and Security", + "checklist": "Azure AKS Review", + "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", + "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", + "service": "AKS", "services": [ - "Storage", - "WAF" + "AKV", + "AKS" ], - "severity": "Low", - "text": "Consider checking uploaded data, after clients used a SAS to upload a file. ", + "severity": "Medium", + "subcategory": "Secrets", + "text": "Store your secrets in Azure Key Vault with the CSI Secrets Store driver", "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", + "category": "Governance and Security", + "checklist": "Azure AKS Review", + "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", + "link": "https://learn.microsoft.com/azure/aks/update-credentials", + "service": "AKS", "services": [ - "RBAC", - "Storage", - "WAF", - "Entra" + "AKV", + "AKS" ], "severity": "High", - "text": "SFTP: Limit the amount of 'local users' for SFTP access, and audit whether access is needed over time.", + "subcategory": "Secrets", + "text": "If using Service Principals for the cluster, refresh credentials periodically (like quarterly)", "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", + "category": "Governance and Security", + "checklist": "Azure AKS Review", + "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", + "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", + "service": "AKS", "services": [ - "WAF" + "AKV", + "AKS" ], "severity": "Medium", - "text": "SFTP: The SFTP endpoint does not support POSIX-like ACLs.", + "subcategory": "Secrets", + "text": "If required add Key Management Service etcd encryption", "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", + "category": "Governance and Security", + "checklist": "Azure AKS Review", + "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", + "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", + "service": "AKS", "services": [ - "Storage", - "WAF", - "AzurePolicy" + "AKV", + "AKS" ], - "severity": "High", - "text": "Avoid overly broad CORS policies", + "severity": "Low", + "subcategory": "Secrets", + "text": "If required consider using Confidential Compute for AKS", "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", + "category": "Governance and Security", + "checklist": "Azure AKS Review", + "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", + "service": "AKS", "services": [ - "Storage", - "WAF" + "AKV", + "Defender", + "AKS" ], - "severity": "High", - "text": "Determine how data at rest should be encrypted. Understand the thread model for data.", + "severity": "Medium", + "subcategory": "Secrets", + "text": "Consider using Defender for Containers", "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", + "category": "Identity and Access Management", + "checklist": "Azure AKS Review", + "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": [ - "WAF" + "Entra", + "AKS" ], - "severity": "Medium", - "text": "Determine which/if platform encryption should be used.", + "severity": "High", + "subcategory": "Identity", + "text": "Use managed identities instead of Service Principals", "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", + "category": "Identity and Access Management", + "checklist": "Azure AKS Review", + "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": [ - "WAF" + "Entra", + "AKS" ], "severity": "Medium", - "text": "Determine which/if client-side encryption should be used.", + "subcategory": "Identity", + "text": "Integrate authentication with AAD (using the managed integration)", "waf": "Security" }, { - "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", + "category": "Identity and Access Management", + "checklist": "Azure AKS Review", + "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", + "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", + "service": "AKS", "services": [ - "Storage", - "WAF" + "Entra", + "AKS" ], - "severity": "High", - "text": "Consider whether public blob access is needed, or whether it can be disabled for certain storage accounts. ", + "severity": "Medium", + "subcategory": "Identity", + "text": "Limit access to admin kubeconfig (get-credentials --admin)", "waf": "Security" }, { - "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", + "category": "Identity and Access Management", + "checklist": "Azure AKS Review", + "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", + "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", + "service": "AKS", "services": [ - "Storage", - "WAF" + "Entra", + "RBAC", + "AKS" ], - "severity": "High", - "text": "Leverage a storagev2 account type for better performance and reliability", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Identity", + "text": "Integrate authorization with AAD RBAC", + "waf": "Security" }, { - "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", + "category": "Identity and Access Management", + "checklist": "Azure AKS Review", + "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", + "service": "AKS", "services": [ - "Storage", - "WAF" + "Entra", + "RBAC", + "AKS" ], "severity": "High", - "text": "Leverage GRS, ZRS or GZRS storage for the highest availability", - "waf": "Reliability" + "subcategory": "Identity", + "text": "Use namespaces for restricting RBAC privilege in Kubernetes", + "waf": "Security" }, { - "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", + "category": "Identity and Access Management", + "checklist": "Azure AKS Review", + "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", + "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", + "service": "AKS", "services": [ - "WAF" + "Entra", + "AKS" ], "severity": "Medium", - "text": "For write operation after failover, use customer-Managed Failover ", - "waf": "Reliability" + "subcategory": "Identity", + "text": "For Pod Identity Access Management use Azure AD Workload Identity (preview)", + "waf": "Security" }, { - "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", + "category": "Identity and Access Management", + "checklist": "Azure AKS Review", + "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", + "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", + "service": "AKS", "services": [ - "WAF" + "Entra", + "AKS" ], "severity": "Medium", - "text": "Understand Microsoft-Managed Failover details", - "waf": "Reliability" + "subcategory": "Identity", + "text": "For AKS non-interactive logins use kubelogin (preview)", + "waf": "Security" }, { - "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", + "category": "Identity and Access Management", + "checklist": "Azure AKS Review", + "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": [ - "WAF" + "Entra", + "AKS" ], "severity": "Medium", - "text": "Enable Soft Delete", - "waf": "Reliability" + "subcategory": "Identity", + "text": "Disable AKS local accounts", + "waf": "Security" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", - "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", + "category": "Identity and Access Management", + "checklist": "Azure AKS Review", + "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": [ - "WAF", + "Entra", "AKS" ], "severity": "Low", - "text": "If required for AKS Windows workloads HostProcess containers can be used", - "waf": "Reliability" + "subcategory": "Identity", + "text": "Configure if required Just-in-time cluster access", + "waf": "Security" }, { - "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", + "category": "Identity and Access Management", + "checklist": "Azure AKS Review", + "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": [ - "WAF" + "Entra", + "AKS" ], "severity": "Low", - "text": "Use KEDA if running event-driven workloads", - "waf": "Performance" + "subcategory": "Identity", + "text": "Configure if required AAD conditional access for AKS", + "waf": "Security" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", - "link": "https://dapr.io/", + "category": "Identity and Access Management", + "checklist": "Azure AKS Review", + "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", + "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", "service": "AKS", "services": [ - "WAF" + "Entra", + "AKS" ], "severity": "Low", - "text": "Use Dapr to ease microservice development", - "waf": "Operations" + "subcategory": "Identity", + "text": "If required for Windows AKS workloads configure gMSA ", + "waf": "Security" }, { - "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", + "category": "Identity and Access Management", + "checklist": "Azure AKS Review", + "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": [ - "WAF", + "Entra", "AKS" ], - "severity": "High", - "text": "Use the SLA-backed AKS offering", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Identity", + "text": "For finer control consider using a managed Kubelet Identity", + "waf": "Security" }, { - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", + "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", "service": "AKS", "services": [ - "Cost", - "WAF" + "ACR", + "AppGW", + "AKS" ], - "severity": "Low", - "text": "Use Disruption Budgets in your pod and deployment definitions", + "severity": "Medium", + "subcategory": "Best practices", + "text": "If using AGIC, do not share an AppGW across clusters", "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "WAF checklist", - "guid": "3c763963-7a55-42d5-a15e-401955387e5c", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", - "service": "ACR", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "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": [ - "ACR", - "WAF" + "AKS" ], "severity": "High", - "text": "If using a private registry, configure region replication to store images in multiple regions", + "subcategory": "Best practices", + "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.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", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", "service": "AKS", "services": [ - "Cost", - "WAF" + "AKS" ], - "severity": "Low", - "text": "Use an external application such as kubecost to allocate costs to different users", - "waf": "Cost" + "severity": "Medium", + "subcategory": "Best practices", + "text": "For Windows workloads use Accelerated Networking", + "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "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": [ - "WAF" + "LoadBalancer", + "AKS" ], - "severity": "Low", - "text": "Use scale down mode to delete/deallocate nodes", - "waf": "Cost" + "severity": "High", + "subcategory": "Best practices", + "text": "Use the standard ALB (as opposed to the basic one)", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", - "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "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": [ - "WAF", + "VNet", "AKS" ], "severity": "Medium", - "text": "When required use multi-instance partitioning GPU on AKS Clusters", - "waf": "Cost" + "subcategory": "Best practices", + "text": "If using Azure CNI, consider using different Subnets for NodePools", + "waf": "Security" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", - "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", + "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", "service": "AKS", "services": [ - "WAF" + "PrivateLink", + "VNet", + "Cost", + "AKS" ], - "severity": "Low", - "text": "If running a Dev/Test cluster use NodePool Start/Stop", - "waf": "Cost" + "severity": "Medium", + "subcategory": "Cost", + "text": "Use Private Endpoints (preferred) or Virtual Network Service Endpoints to access PaaS services from the cluster", + "waf": "Security" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "guid": "e8a03f97-8794-468d-96a7-86d60f96c97b", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", "services": [ - "AzurePolicy", - "WAF", + "VPN", "AKS" ], "severity": "Medium", - "text": "Use Azure Policy for Kubernetes to ensure cluster compliance", - "waf": "Security" + "subcategory": "HA", + "text": "If hybrid connectivity is required, use 2xER or ER+VPN for better availability", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "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" + "AKS" ], - "severity": "Medium", - "text": "Separate applications from the control plane with user/system node pools", - "waf": "Security" + "severity": "High", + "subcategory": "IPAM", + "text": "Choose the best CNI network plugin for your requirements (Azure CNI recommended)", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", - "link": "https://learn.microsoft.com/azure/aks/use-system-pools", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", "service": "AKS", "services": [ - "WAF" + "VNet", + "AKS" ], - "severity": "Low", - "text": "Add taint to your system nodepool to make it dedicated", - "waf": "Security" + "severity": "High", + "subcategory": "IPAM", + "text": "If using Azure CNI, size your subnet accordingly considering the maximum number of pods per node", + "waf": "Performance" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", - "link": "https://learn.microsoft.com/azure/container-registry/", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", "service": "AKS", "services": [ - "ACR", - "WAF" + "AKS" ], - "severity": "Medium", - "text": "Use a private registry for your images, such as ACR", - "waf": "Security" + "severity": "High", + "subcategory": "IPAM", + "text": "If using Azure CNI, check the maximum pods/node (default 30)", + "waf": "Performance" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "WAF checklist", - "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", - "link": "https://learn.microsoft.com/azure/security-center/container-security", - "service": "ACR", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "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": [ - "WAF" + "VNet", + "AKS" ], - "severity": "Medium", - "text": "Scan your images for vulnerabilities", + "severity": "Low", + "subcategory": "IPAM", + "text": "If using private-IP LoadBalancer services, use a dedicated subnet (not the AKS subnet)", "waf": "Security" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", "service": "AKS", "services": [ - "WAF" + "AKS" ], "severity": "High", - "text": "Define app separation requirements (namespace/nodepool/cluster)", - "waf": "Security" + "subcategory": "IPAM", + "text": "Size the service IP address range accordingly (it is going to limit the cluster scalability)", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", - "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", + "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", "service": "AKS", "services": [ - "WAF", - "AKV" + "AKS" ], - "severity": "Medium", - "text": "Store your secrets in Azure Key Vault with the CSI Secrets Store driver", + "severity": "Low", + "subcategory": "Operations", + "text": "If required add your own CNI plugin", "waf": "Security" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", - "link": "https://learn.microsoft.com/azure/aks/update-credentials", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "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": [ - "WAF" + "AKS" ], - "severity": "High", - "text": "If using Service Principals for the cluster, refresh credentials periodically (like quarterly)", - "waf": "Security" + "severity": "Low", + "subcategory": "Operations", + "text": "If required configure Public IP per node in AKS", + "waf": "Performance" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", - "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", + "link": "https://learn.microsoft.com/azure/aks/concepts-network", "service": "AKS", "services": [ - "WAF" + "AKS" ], "severity": "Medium", - "text": "If required add Key Management Service etcd encryption", - "waf": "Security" + "subcategory": "Scalability", + "text": "Use an ingress controller to expose web-based apps instead of exposing them with LoadBalancer-type services", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", - "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", + "link": "https://learn.microsoft.com/azure/aks/nat-gateway", "service": "AKS", "services": [ - "WAF", "AKS" ], "severity": "Low", - "text": "If required consider using Confidential Compute for AKS", - "waf": "Security" + "subcategory": "Scalability", + "text": "Use Azure NAT Gateway as outboundType for scaling egress traffic", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "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", - "Defender" + "AKS" ], "severity": "Medium", - "text": "Consider using Defender for Containers", - "waf": "Security" + "subcategory": "Scalability", + "text": "Use Dynamic allocations of IPs in order to avoid Azure CNI IP exhaustion", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "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": [ - "WAF", - "Entra" + "NVA", + "AKS" ], "severity": "High", - "text": "Use managed identities instead of Service Principals", + "subcategory": "Security", + "text": "Filter egress traffic with AzFW/NVA if your security requirements mandate it", "waf": "Security" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "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": [ - "WAF", - "Entra" + "AKS" ], "severity": "Medium", - "text": "Integrate authentication with AAD (using the managed integration)", + "subcategory": "Security", + "text": "If using a public API endpoint, restrict the IP addresses that can access it", "waf": "Security" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", - "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "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": [ - "WAF" + "AKS" ], - "severity": "Medium", - "text": "Limit access to admin kubeconfig (get-credentials --admin)", + "severity": "High", + "subcategory": "Security", + "text": "Use private clusters if your requirements mandate it", "waf": "Security" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", - "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "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": [ - "RBAC", - "WAF", - "Entra" + "AzurePolicy", + "AKS" ], "severity": "Medium", - "text": "Integrate authorization with AAD RBAC", + "subcategory": "Security", + "text": "For Windows 2019 and 2022 AKS nodes Calico Network Policies can be used ", "waf": "Security" }, { - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "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": [ - "RBAC", - "WAF", + "AzurePolicy", "AKS" ], "severity": "High", - "text": "Use namespaces for restricting RBAC privilege in Kubernetes", + "subcategory": "Security", + "text": "Enable a Kubernetes Network Policy option (Calico/Azure)", "waf": "Security" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", - "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", "service": "AKS", "services": [ - "WAF", - "Entra" + "AzurePolicy", + "AKS" ], - "severity": "Medium", - "text": "For Pod Identity Access Management use Azure AD Workload Identity (preview)", + "severity": "High", + "subcategory": "Security", + "text": "Use Kubernetes network policies to increase intra-cluster security", "waf": "Security" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", - "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", "service": "AKS", "services": [ "WAF", "AKS" ], - "severity": "Medium", - "text": "For AKS non-interactive logins use kubelogin (preview)", + "severity": "High", + "subcategory": "Security", + "text": "Use a WAF for web workloads (UIs or APIs)", "waf": "Security" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "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", + "DDoS", "AKS" ], "severity": "Medium", - "text": "Disable AKS local accounts", + "subcategory": "Security", + "text": "Use DDoS Standard in the AKS Virtual Network", "waf": "Security" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "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" + "AKS" ], "severity": "Low", - "text": "Configure if required Just-in-time cluster access", + "subcategory": "Security", + "text": "If required add company HTTP Proxy", "waf": "Security" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Network Topology and Connectivity", + "checklist": "Azure AKS Review", + "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", + "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", "service": "AKS", "services": [ - "WAF", - "AKS", - "Entra" + "AKS" ], - "severity": "Low", - "text": "Configure if required AAD conditional access for AKS", + "severity": "Medium", + "subcategory": "Security", + "text": "Consider using a service mesh for advanced microservice communication management", "waf": "Security" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", - "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", "service": "AKS", "services": [ - "WAF", + "Monitor", + "AKS" + ], + "severity": "High", + "subcategory": "Alerting", + "text": "Configure alerts on the most critical metrics (see Container Insights for recommendations)", + "waf": "Operations" + }, + { + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "337453a3-cc63-4963-9a65-22ac19e80696", + "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", + "service": "AKS", + "services": [ + "Entra", "AKS" ], "severity": "Low", - "text": "If required for Windows AKS workloads configure gMSA ", - "waf": "Security" + "subcategory": "Compliance", + "text": "Check regularly Azure Advisor for recommendations on your cluster", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", + "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", "service": "AKS", "services": [ - "WAF", - "Entra" + "AKS" ], - "severity": "Medium", - "text": "For finer control consider using a managed Kubelet Identity", - "waf": "Security" + "severity": "Low", + "subcategory": "Compliance", + "text": "Enable AKS auto-certificate rotation", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", - "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", + "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", "service": "AKS", "services": [ - "AppGW", - "ACR", - "WAF" + "AKS" ], - "severity": "Medium", - "text": "If using AGIC, do not share an AppGW across clusters", - "waf": "Reliability" + "severity": "High", + "subcategory": "Compliance", + "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.containerservice/managedClusters", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", + "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", "service": "AKS", "services": [ - "WAF", "AKS" ], "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" + "subcategory": "Compliance", + "text": "Use kured for Linux node upgrades in case you are not using node-image upgrade", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", + "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", "service": "AKS", "services": [ - "WAF" + "AKS" ], - "severity": "Medium", - "text": "For Windows workloads use Accelerated Networking", - "waf": "Performance" + "severity": "High", + "subcategory": "Compliance", + "text": "Have a regular process to upgrade the cluster node images periodically (weekly, for example)", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", "service": "AKS", "services": [ - "LoadBalancer", - "WAF" + "AKS" ], - "severity": "High", - "text": "Use the standard ALB (as opposed to the basic one)", - "waf": "Reliability" + "severity": "Low", + "subcategory": "Compliance", + "text": "Consider gitops to deploy applications or cluster configuration to multiple clusters", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "d7672c26-7602-4482-85a4-14527fbe855c", + "link": "https://learn.microsoft.com/azure/aks/command-invoke", "service": "AKS", "services": [ - "WAF", - "VNet" + "AKS" ], - "severity": "Medium", - "text": "If using Azure CNI, consider using different Subnets for NodePools", - "waf": "Security" + "severity": "Low", + "subcategory": "Compliance", + "text": "Consider using AKS command invoke on private clusters", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", - "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", + "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", "service": "AKS", "services": [ - "WAF", - "VNet", - "PrivateLink" + "AKS" ], - "severity": "Medium", - "text": "Use Private Endpoints (preferred) or Virtual Network Service Endpoints to access PaaS services from the cluster", - "waf": "Security" + "severity": "Low", + "subcategory": "Compliance", + "text": "For planned events consider using Node Auto Drain", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", + "link": "https://learn.microsoft.com/azure/aks/faq", "service": "AKS", "services": [ - "WAF" + "AKS" ], "severity": "High", - "text": "Choose the best CNI network plugin for your requirements (Azure CNI recommended)", - "waf": "Reliability" + "subcategory": "Compliance", + "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.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "category": "Operations", + "checklist": "Azure AKS Review", + "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", - "VNet" + "AKS" ], - "severity": "High", - "text": "If using Azure CNI, size your subnet accordingly considering the maximum number of pods per node", - "waf": "Performance" + "severity": "Low", + "subcategory": "Compliance", + "text": "Use custom Node RG (aka 'Infra RG') name", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", + "link": "https://kubernetes.io/docs/setup/release/notes/", "service": "AKS", "services": [ - "WAF" + "AKS" ], - "severity": "High", - "text": "If using Azure CNI, check the maximum pods/node (default 30)", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Compliance", + "text": "Do not use deprecated Kubernetes APIs in your YAML manifests", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", + "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", "service": "AKS", "services": [ - "WAF", - "VNet", "AKS" ], "severity": "Low", - "text": "If using private-IP LoadBalancer services, use a dedicated subnet (not the AKS subnet)", - "waf": "Security" + "subcategory": "Compliance", + "text": "Taint Windows nodes", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "category": "Operations", + "checklist": "Azure AKS Review", + "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" + "AKS" ], - "severity": "High", - "text": "Size the service IP address range accordingly (it is going to limit the cluster scalability)", - "waf": "Reliability" + "severity": "Low", + "subcategory": "Compliance", + "text": "Keep windows containers patch level in sync with host patch level", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", - "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", + "category": "Operations", + "checklist": "Azure AKS Review", + "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": [ - "WAF" + "Monitor", + "AKS" ], "severity": "Low", - "text": "If required add your own CNI plugin", - "waf": "Security" + "subcategory": "Compliance", + "text": "Send master logs (aka API logs) to Azure Monitor or your preferred log management solution", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", + "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", "service": "AKS", "services": [ - "WAF", "AKS" ], "severity": "Low", - "text": "If required configure Public IP per node in AKS", - "waf": "Performance" + "subcategory": "Compliance", + "text": "If required use nodePool snapshots", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", - "link": "https://learn.microsoft.com/azure/aks/concepts-network", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", + "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", "service": "AKS", "services": [ - "WAF" + "Cost", + "AKS" ], - "severity": "Medium", - "text": "Use an ingress controller to expose web-based apps instead of exposing them with LoadBalancer-type services", - "waf": "Reliability" + "severity": "Low", + "subcategory": "Cost", + "text": "Consider spot node pools for non time-sensitive workloads", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", - "link": "https://learn.microsoft.com/azure/aks/nat-gateway", + "category": "Operations", + "checklist": "Azure AKS Review", + "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": [ - "WAF" + "Cost", + "AKS" ], "severity": "Low", - "text": "Use Azure NAT Gateway as outboundType for scaling egress traffic", - "waf": "Reliability" + "subcategory": "Cost", + "text": "Consider AKS virtual node for quick bursting", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", "service": "AKS", "services": [ - "WAF" + "Monitor", + "AKS" ], - "severity": "Medium", - "text": "Use Dynamic allocations of IPs in order to avoid Azure CNI IP exhaustion", - "waf": "Reliability" + "severity": "High", + "subcategory": "Monitoring", + "text": "Monitor your cluster metrics with Container Insights (or other tools like Prometheus)", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "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", - "NVA" + "Monitor", + "AKS" ], "severity": "High", - "text": "Filter egress traffic with AzFW/NVA if your security requirements mandate it", - "waf": "Security" + "subcategory": "Monitoring", + "text": "Store and analyze your cluster logs with Container Insights (or other tools like Telegraf/ElasticSearch)", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", + "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", "service": "AKS", "services": [ - "WAF" + "Monitor", + "AKS" ], "severity": "Medium", - "text": "If using a public API endpoint, restrict the IP addresses that can access it", - "waf": "Security" + "subcategory": "Monitoring", + "text": "Monitor CPU and memory utilization of the nodes", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "1a4835ac-9422-423e-ae80-b123081a5417", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", "service": "AKS", "services": [ - "WAF" + "Monitor", + "AKS" ], - "severity": "High", - "text": "Use private clusters if your requirements mandate it", - "waf": "Security" + "severity": "Medium", + "subcategory": "Monitoring", + "text": "If using Azure CNI, monitor % of pod IPs consumed per node", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "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": [ - "AzurePolicy", - "WAF", + "Storage", + "Monitor", + "EventHubs", + "ServiceBus", "AKS" ], "severity": "Medium", - "text": "For Windows 2019 and 2022 AKS nodes Calico Network Policies can be used ", - "waf": "Security" + "subcategory": "Monitoring", + "text": "Monitor OS disk queue depth in nodes", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "be209d39-fda4-4777-a424-d116785c2fa5", + "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", "service": "AKS", "services": [ - "AzurePolicy", - "WAF", + "LoadBalancer", + "Monitor", + "NVA", "AKS" ], - "severity": "High", - "text": "Enable a Kubernetes Network Policy option (Calico/Azure)", - "waf": "Security" + "severity": "Medium", + "subcategory": "Monitoring", + "text": "If not using egress filtering with AzFW/NVA, monitor standard ALB allocated SNAT ports", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", + "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", "service": "AKS", "services": [ - "AzurePolicy", - "WAF", + "Monitor", "AKS" ], - "severity": "High", - "text": "Use Kubernetes network policies to increase intra-cluster security", - "waf": "Security" + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Subscribe to resource health notifications for your AKS cluster", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", "service": "AKS", "services": [ - "WAF" + "AKS" ], "severity": "High", - "text": "Use a WAF for web workloads (UIs or APIs)", - "waf": "Security" + "subcategory": "Resources", + "text": "Configure requests and limits in your pod specs", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "769ef669-1a48-435a-a942-223ece80b123", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", "service": "AKS", "services": [ - "DDoS", - "WAF", - "VNet", "AKS" ], "severity": "Medium", - "text": "Use DDoS Standard in the AKS Virtual Network", - "waf": "Security" + "subcategory": "Resources", + "text": "Enforce resource quotas for namespaces", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "081a5417-4158-433e-a3ad-3c2de733165c", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", "service": "AKS", "services": [ - "WAF" + "Subscriptions", + "AKS" ], - "severity": "Low", - "text": "If required add company HTTP Proxy", - "waf": "Security" + "severity": "High", + "subcategory": "Resources", + "text": "Ensure your subscription has enough quota to scale out your nodepools", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", - "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "f4fd0602-7ab5-46f1-b66a-e9dea9654a65", + "link": "https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/", "service": "AKS", "services": [ - "WAF" + "AKS" ], - "severity": "Medium", - "text": "Consider using a service mesh for advanced microservice communication management", - "waf": "Security" + "severity": "High", + "subcategory": "Resources", + "text": "Configure Liveness and Readiness probes for all deployments", + "waf": "Operations" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", + "category": "Operations", + "checklist": "Azure AKS Review", + "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": [ - "Monitor", - "WAF" + "AKS" ], - "severity": "High", - "text": "Configure alerts on the most critical metrics (see Container Insights for recommendations)", - "waf": "Operations" + "severity": "Medium", + "subcategory": "Scalability", + "text": "Use the Cluster Autoscaler", + "waf": "Performance" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "337453a3-cc63-4963-9a65-22ac19e80696", - "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", + "category": "Operations", + "checklist": "Azure AKS Review", + "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": [ - "WAF", - "Entra" + "AKS" ], "severity": "Low", - "text": "Check regularly Azure Advisor for recommendations on your cluster", - "waf": "Operations" + "subcategory": "Scalability", + "text": "Customize node configuration for AKS node pools", + "waf": "Performance" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", - "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", + "link": "https://learn.microsoft.com/azure/aks/concepts-scale", "service": "AKS", "services": [ - "WAF", "AKS" ], - "severity": "Low", - "text": "Enable AKS auto-certificate rotation", - "waf": "Operations" + "severity": "Medium", + "subcategory": "Scalability", + "text": "Use the Horizontal Pod Autoscaler when required", + "waf": "Performance" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", - "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", + "category": "Operations", + "checklist": "Azure AKS Review", + "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": [ - "WAF", "AKS" ], "severity": "High", - "text": "Have a regular process to upgrade your kubernetes version periodically (quarterly, for example), or use the AKS autoupgrade feature", - "waf": "Operations" + "subcategory": "Scalability", + "text": "Consider an appropriate node size, not too large or too small", + "waf": "Performance" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", - "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", + "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", "service": "AKS", "services": [ - "WAF" + "AKS" ], - "severity": "High", - "text": "Use kured for Linux node upgrades in case you are not using node-image upgrade", - "waf": "Operations" + "severity": "Low", + "subcategory": "Scalability", + "text": "If more than 5000 nodes are required for scalability then consider using an additional AKS cluster", + "waf": "Performance" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", - "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", + "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", "service": "AKS", "services": [ - "WAF" + "AKS" ], - "severity": "High", - "text": "Have a regular process to upgrade the cluster node images periodically (weekly, for example)", - "waf": "Operations" + "severity": "Low", + "subcategory": "Scalability", + "text": "Consider subscribing to EventGrid Events for AKS automation", + "waf": "Performance" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", + "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", "service": "AKS", "services": [ - "WAF" + "AKS" ], "severity": "Low", - "text": "Consider gitops to deploy applications or cluster configuration to multiple clusters", - "waf": "Operations" + "subcategory": "Scalability", + "text": "For long running operation on an AKS cluster consider event termination", + "waf": "Performance" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "d7672c26-7602-4482-85a4-14527fbe855c", - "link": "https://learn.microsoft.com/azure/aks/command-invoke", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", + "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", "service": "AKS", "services": [ - "WAF", "AKS" ], "severity": "Low", - "text": "Consider using AKS command invoke on private clusters", - "waf": "Operations" + "subcategory": "Scalability", + "text": "If required consider using Azure Dedicated Hosts for AKS nodes", + "waf": "Performance" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", - "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", + "category": "Operations", + "checklist": "Azure AKS Review", + "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" + "Storage", + "AKS" ], - "severity": "Low", - "text": "For planned events consider using Node Auto Drain", - "waf": "Operations" + "severity": "High", + "subcategory": "Storage", + "text": "Use ephemeral OS disks", + "waf": "Performance" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", - "link": "https://learn.microsoft.com/azure/aks/faq", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", + "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", "service": "AKS", "services": [ - "WAF" + "Storage", + "AKS" ], "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" + "subcategory": "Storage", + "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", - "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", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", + "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", "service": "AKS", "services": [ - "WAF" + "Storage", + "AKS" ], "severity": "Low", - "text": "Use custom Node RG (aka 'Infra RG') name", - "waf": "Operations" + "subcategory": "Storage", + "text": "For hyper performance storage option use Ultra Disks on AKS", + "waf": "Performance" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", - "link": "https://kubernetes.io/docs/setup/release/notes/", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", "service": "AKS", "services": [ - "WAF", + "Storage", + "SQL", "AKS" ], "severity": "Medium", - "text": "Do not use deprecated Kubernetes APIs in your YAML manifests", - "waf": "Operations" + "subcategory": "Storage", + "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": "c1881370-6f7c-44c0-b4e5-14648d2457ed", - "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", "service": "AKS", "services": [ - "WAF" + "Storage", + "AKS" ], - "severity": "Low", - "text": "Taint Windows nodes", - "waf": "Operations" + "severity": "Medium", + "subcategory": "Storage", + "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": "67138b82-0102-4ce1-9ee3-01e6e882e52e", - "link": "https://learn.microsoft.com/virtualization/windowscontainers/deploy-containers/version-compatibility?tabs=windows-server-20H2%2Cwindows-10-20H2", + "category": "Operations", + "checklist": "Azure AKS Review", + "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", + "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", "service": "AKS", "services": [ - "WAF" + "Storage", + "AKS" ], - "severity": "Low", - "text": "Keep windows containers patch level in sync with host patch level", - "waf": "Operations" + "severity": "Medium", + "subcategory": "Storage", + "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", - "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", + "category": "Cleanup", + "checklist": "Cost Optimization Checklist", + "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", + "service": "Azure Monitor", "services": [ - "Monitor", - "WAF" + "Cost", + "Monitor" ], - "severity": "Low", - "text": "Send master logs (aka API logs) to Azure Monitor or your preferred log management solution", - "waf": "Operations" + "severity": "Medium", + "subcategory": "Azure Monitor - enforce data collection rules", + "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", - "checklist": "WAF checklist", - "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", - "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", - "service": "AKS", + "category": "Cleanup", + "checklist": "Cost Optimization 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", "services": [ - "WAF" + "Backup", + "Cost" ], - "severity": "Low", - "text": "If required use nodePool snapshots", + "severity": "Medium", + "subcategory": "Backup", + "text": "check backup instances with the underlying datasource not found", "waf": "Cost" }, { - "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", + "category": "Cleanup", + "checklist": "Cost Optimization Checklist", + "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": [ - "WAF" + "Cost" ], - "severity": "Low", - "text": "Consider spot node pools for non time-sensitive workloads", - "waf": "Operations" + "severity": "Medium", + "subcategory": "Delete/archive", + "text": "Delete or archive unassociated services (disks, nics, ip addresses etc)", + "waf": "Cost" }, { - "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", + "category": "Cleanup", + "checklist": "Cost Optimization Checklist", + "guid": "659d3958-fd77-4289-a835-556df2bfe456", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", "services": [ - "WAF", - "AKS" + "Cost" ], - "severity": "Low", - "text": "Consider AKS virtual node for quick bursting", - "waf": "Operations" + "severity": "Medium", + "subcategory": "Delete/archive", + "text": "Consider snooze and stop technique (snooze a service after x days, stop after 2x, delete/deallocate after 3x)", + "waf": "Cost" }, { - "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", + "category": "Cleanup", + "checklist": "Cost Optimization Checklist", + "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": [ - "Monitor", - "WAF" + "Backup", + "Storage", + "Cost" ], - "severity": "High", - "text": "Monitor your cluster metrics with Container Insights (or other tools like Prometheus)", - "waf": "Operations" + "severity": "Medium", + "subcategory": "Delete/archive", + "text": "Delete or archive unused resources (old backups, logs, storage accounts, etc...)", + "waf": "Cost" }, { - "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", + "category": "Cleanup", + "checklist": "Cost Optimization 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", "services": [ - "WAF" + "Backup", + "Storage", + "Cost", + "ASR" ], - "severity": "High", - "text": "Store and analyze your cluster logs with Container Insights (or other tools like Telegraf/ElasticSearch)", - "waf": "Operations" + "severity": "Medium", + "subcategory": "Delete/archive", + "text": "Consider a good balance between site recovery storage and backup for non mission critical applications", + "waf": "Cost" }, { - "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", + "category": "Cleanup", + "checklist": "Cost Optimization 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", "services": [ - "Monitor", - "WAF" + "Cost", + "Monitor" ], "severity": "Medium", - "text": "Monitor CPU and memory utilization of the nodes", - "waf": "Operations" + "subcategory": "Log Analytics retention for workspaces", + "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", - "checklist": "WAF checklist", - "guid": "1a4835ac-9422-423e-ae80-b123081a5417", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "category": "Cleanup", + "checklist": "Cost Optimization 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", "services": [ - "Monitor", - "WAF" + "Storage", + "Cost", + "AzurePolicy" ], "severity": "Medium", - "text": "If using Azure CNI, monitor % of pod IPs consumed per node", - "waf": "Operations" + "subcategory": "Policy", + "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.containerservice/managedClusters", - "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", + "category": "Cleanup", + "checklist": "Cost Optimization Checklist", + "guid": "59bb91a3-ed90-4cae-8cc8-4c37b6b780cb", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-enterprise-agreement#design-considerations", "services": [ - "Storage", - "Monitor", - "EventHubs", - "ServiceBus", - "WAF" + "Cost" ], "severity": "Medium", - "text": "Monitor OS disk queue depth in nodes", - "waf": "Operations" + "subcategory": "Run orphaned resources workbook - delete or snooze ghost items", + "text": "https://github.com/dolevshor/azure-orphan-resources", + "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/tutorial-acm-create-budgets", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "be209d39-fda4-4777-a424-d116785c2fa5", - "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", - "service": "AKS", + "category": "Cleanup", + "checklist": "Cost Optimization Checklist", + "guid": "9fe5c464-89d4-457a-a27c-3874d0102cac", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-enterprise-agreement#design-considerations", "services": [ - "NVA", - "LoadBalancer", - "WAF", - "Monitor" + "Cost" ], "severity": "Medium", - "text": "If not using egress filtering with AzFW/NVA, monitor standard ALB allocated SNAT ports", - "waf": "Operations" + "subcategory": "Shutdown/deallocate", + "text": "Shutdown underutilized instances", + "training": "https://learn.microsoft.com/azure/cost-management-billing/understand/analyze-unexpected-charges", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", - "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", - "service": "AKS", + "category": "Cleanup", + "checklist": "Cost Optimization 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", "services": [ - "WAF", - "AKS" + "VM", + "Backup", + "Storage", + "Cost" ], "severity": "Medium", - "text": "Subscribe to resource health notifications for your AKS cluster", - "waf": "Operations" + "subcategory": "stopped/deallocated VMs: check disks", + "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", - "checklist": "WAF checklist", - "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "category": "Cleanup", + "checklist": "Cost Optimization 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", "services": [ - "WAF" + "Storage", + "Cost", + "AzurePolicy" ], - "severity": "High", - "text": "Configure requests and limits in your pod specs", - "waf": "Operations" + "severity": "Medium", + "subcategory": "storage accounts lifecycle policy", + "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", - "checklist": "WAF checklist", - "guid": "769ef669-1a48-435a-a942-223ece80b123", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "category": "Cleanup", + "checklist": "Cost Optimization Checklist", + "guid": "f2bfe456-3b0d-4834-a348-726de69c6b5c", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", "services": [ - "WAF" + "Cost" ], "severity": "Medium", - "text": "Enforce resource quotas for namespaces", - "waf": "Operations" + "subcategory": "Tagging", + "text": "Use specific tags for temporary items with 'delete by DATE' format - and automate monthly cleanup", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "DB/App tuning", + "checklist": "Cost Optimization Checklist", + "guid": "2a26494b-69ba-4d37-aad5-3cc78e1d7666", + "link": "https://learn.microsoft.com/azure/cost-management-billing/manage/mca-section-invoice", "services": [ - "WAF", - "Subscriptions" + "Cost" ], - "severity": "High", - "text": "Ensure your subscription has enough quota to scale out your nodepools", - "waf": "Operations" + "severity": "Medium", + "subcategory": "DB optimization", + "text": "Plan for db optimization with the intent of downsizing the related services (and improve performance)", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "DB/APP tuning", + "checklist": "Cost Optimization Checklist", + "guid": "7357c449-674b-45ed-a5a8-59c7733be2a1", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", "services": [ - "WAF" + "Cost" ], - "severity": "High", - "text": "Configure Liveness and Readiness probes for all deployments", - "waf": "Operations" + "severity": "Medium", + "subcategory": "App modernization", + "text": "Modernizing the app towards a microservices architecture will have the effect of letting the app scale according to the single service and not the entire stack", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "DB/APP tuning", + "checklist": "Cost Optimization Checklist", + "guid": "a27b765a-91be-41f3-a8ef-394c2bd463cb", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", "services": [ - "WAF" + "VM", + "Storage", + "Cost" ], "severity": "Medium", - "text": "Use the Cluster Autoscaler", - "waf": "Performance" + "subcategory": "DB optimization", + "text": "optimizing the DB queries will increase performance and allow better right-sizing of storage and VMs", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "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", + "category": "DB/APP tuning", + "checklist": "Cost Optimization Checklist", + "guid": "bac75819-59bb-491a-9ed9-0cae2cc84c37", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", "services": [ - "WAF", - "AKS" + "Cost" ], - "severity": "Low", - "text": "Customize node configuration for AKS node pools", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Demand shaping", + "text": "Using demand shaping on PaaS services will optimize costs and performances", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "WAF checklist", - "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", - "link": "https://learn.microsoft.com/azure/aks/concepts-scale", - "service": "AKS", + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "b6b780cb-9fe5-4c46-989d-457a927c3874", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/naming-and-tagging", "services": [ - "WAF" + "Entra", + "Cost" ], "severity": "Medium", - "text": "Use the Horizontal Pod Autoscaler when required", - "waf": "Performance" + "subcategory": "Advisor", + "text": "Start from the Azure Advisor page suggestions.", + "waf": "Cost" }, { - "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", + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "VM", "services": [ - "WAF" + "VM", + "Cost" ], - "severity": "High", - "text": "Consider an appropriate node size, not too large or too small", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Advisor", + "text": "Make sure advisor is configured for VM right sizing ", + "waf": "Cost" + }, + { + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "881a1bd5-d1e4-44a1-a659-d3958fd77289", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "services": [ + "Cost" + ], + "severity": "Medium", + "subcategory": "Automation", + "text": "Consider implementing IaC scripts or devops pipelines to match the cost governance process", + "waf": "Cost" }, { - "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", + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "b835556d-f2bf-4e45-93b0-d834a348726d", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", "services": [ - "WAF", - "AKS" + "Cost", + "Monitor" ], - "severity": "Low", - "text": "If more than 5000 nodes are required for scalability then consider using an additional AKS cluster", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Automation", + "text": "Set up cost alerts for applications that have variable costs (ideally for all of them)", + "waf": "Cost" }, { - "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", + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "e69c6b5c-2a26-4494-a69b-ad37aad53cc7", + "link": "https://learn.microsoft.com/security/benchmark/azure/mcsb-asset-management#am-2-use-only-approved-services", "services": [ - "WAF", - "AKS" + "Cost" ], - "severity": "Low", - "text": "Consider subscribing to EventGrid Events for AKS automation", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Automation", + "text": "Use Azure Automation: Automate repetitive tasks can help you save time and resources, reducing costs in the process. ", + "waf": "Cost" }, { - "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", + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "8e1d7666-7357-4c44-a674-b5ed85a859c7", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", "services": [ - "WAF", - "AKS" + "Cost" ], - "severity": "Low", - "text": "For long running operation on an AKS cluster consider event termination", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Automation", + "text": "Run orphaned resources workbook", + "waf": "Cost" }, { - "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", + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "733be2a1-a27b-4765-a91b-e1f388ef394c", + "link": "https://learn.microsoft.com/azure/governance/policy/overview#azure-rbac-permissions-in-azure-policy", "services": [ - "WAF", - "AKS" + "Storage", + "Cost" ], - "severity": "Low", - "text": "If required consider using Azure Dedicated Hosts for AKS nodes", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Baseline", + "text": "Try and establish a baseline of monthly spending and an acceptable saving target against the baseline (new services will not be optimized at this stage)", + "waf": "Cost" }, { - "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", + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "2bd463cb-bac7-4581-a59b-b91a3ed90cae", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", "services": [ - "WAF" + "Cost", + "AzurePolicy" ], - "severity": "High", - "text": "Use ephemeral OS disks", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Baseline", + "text": "Establish a cost optimization baseline by using a policy that tags every new resource as #NEW", + "waf": "Cost" }, { - "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", + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "2cc84c37-b6b7-480c-a9fe-5c46489d457a", + "link": "https://learn.microsoft.com/azure/automation/automation-solution-vm-management-config", "services": [ - "WAF", - "AKS" + "Cost" ], - "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" + "severity": "Medium", + "subcategory": "Baseline", + "text": "Organize resources to maximize cost insights and accountability", + "waf": "Cost" }, { - "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", + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "927c3874-d010-42ca-a6aa-e01e6a84de5d", + "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": [ - "Storage", - "WAF", - "AKS" + "Cost" ], - "severity": "Low", - "text": "For hyper performance storage option use Ultra Disks on AKS", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Budgets", + "text": "Create budgets", + "waf": "Cost" }, { - "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", + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "e36d1d92-881a-41bd-9d1e-44a19659d395", + "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": [ - "SQL", - "WAF", - "Storage" + "Cost" ], "severity": "Medium", - "text": "Avoid keeping state in the cluster, and store data outside (AzStorage, AzSQL, Cosmos, etc)", - "waf": "Performance" + "subcategory": "Cost Analysis", + "text": "In cost analysis - use daily granularity, grouped by service name to analyze the spending of the past 3 months and identify the top 3 spenders", + "waf": "Cost" }, { - "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", + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "8fd77289-b835-4556-bf2b-fe4563b0d834", + "link": "https://learn.microsoft.com/azure/active-directory/hybrid/how-to-connect-sync-staging-server", "services": [ - "Storage", - "WAF" + "Cost" ], "severity": "Medium", - "text": "If using AzFiles Standard, consider AzFiles Premium and/or ANF for performance reasons", - "waf": "Performance" + "subcategory": "Cost Analysis", + "text": "Check daily for cost spikes and anomalies (ideally with automatic billing exports)", + "waf": "Cost" }, { - "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", + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "a348726d-e69c-46b5-a2a2-6494b69bad37", + "link": "https://learn.microsoft.com/azure/active-directory/roles/security-emergency-access", "services": [ - "Storage", - "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" + "subcategory": "Cost Analysis", + "text": "Automate cost retrieval for deep analysis or integration", + "waf": "Cost" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "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", + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "aad53cc7-8e1d-4766-9735-7c449674b5ed", + "link": "https://learn.microsoft.com/azure/active-directory/reports-monitoring/concept-activity-logs-azure-monitor", "services": [ - "WAF" + "Cost", + "ACR" ], "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" + "subcategory": "Free services", + "text": "Take advantage of Azure free services: Azure offers a number of free services, such as DevOps, Azure Container Registry, and Azure Logic Apps, that can help you save costs on development and operations. ", + "waf": "Cost" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "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", + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "96c96ad8-844c-4f3b-8b38-c886ba2c0214", + "link": "https://learn.microsoft.com/azure/role-based-access-control/overview", "services": [ - "WAF", - "FrontDoor", - "TrafficManager" + "Cost" ], "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" + "subcategory": "Tagging", + "text": "Tag shared resources", + "waf": "Cost" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "WAF checklist", - "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", - "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", - "service": "Spring Apps", + "category": "Process Administration", + "checklist": "Cost Optimization Checklist", + "guid": "99014a5d-3ce5-474d-acbd-9792a6bcca2b", + "link": "https://learn.microsoft.com/azure/active-directory/conditional-access/overview", "services": [ - "ACR", - "WAF" + "Cost" ], "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" + "subcategory": "Tagging", + "text": "Consider using tags to all services for cost allocation", + "waf": "Cost" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "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", + "category": "reservations", + "checklist": "Cost Optimization Checklist", + "guid": "4fea1dbf-3dd9-45d4-ac7c-891dcb1f7d57", + "link": "https://learn.microsoft.com/azure/active-directory/authentication/concept-mfa-howitworks", "services": [ - "WAF" + "Cost" ], "severity": "Medium", - "text": "Use more than 1 app instance for your apps", - "waf": "Reliability" + "subcategory": "automation", + "text": "Consider Reservation automation to track and promptly react to changes", + "waf": "Cost" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "WAF checklist", - "guid": "7504c230-6035-4183-95a5-85762acc6075", - "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", - "service": "Spring Apps", + "category": "Reservations", + "checklist": "Cost Optimization 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", "services": [ - "Monitor", - "WAF" + "VM", + "SQL", + "Cost", + "AzurePolicy" ], "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" + "subcategory": "check AHUB is applied to all Windows VMs, RHEL and SQL", + "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.AppPlatform/Spring", - "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", + "category": "Reservations", + "checklist": "Cost Optimization Checklist", + "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "service": "VM", "services": [ - "WAF" + "LoadBalancer", + "Cost" ], "severity": "Medium", - "text": "Set up autoscaling in Spring Cloud Gateway", - "waf": "Reliability" + "subcategory": "Check Red Hat Licences if applicable", + "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.AppPlatform/Spring", - "checklist": "WAF checklist", - "guid": "97411607-b6fd-4335-99d1-9885faf4e392", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", - "service": "Spring Apps", + "category": "Reservations", + "checklist": "Cost Optimization Checklist", + "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": [ - "WAF" + "AppSvc", + "Cost" ], - "severity": "Low", - "text": "Enable autoscale for the apps with Standard consumption & dedicated plan.", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Functions", + "text": "Saving plans will provide 17% on select app service plans", + "waf": "Cost" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "WAF checklist", - "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", - "link": "https://learn.microsoft.com/azure/spring-apps/overview", - "service": "Spring Apps", + "category": "Reservations", + "checklist": "Cost Optimization Checklist", + "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", + "service": "VM", "services": [ - "WAF" + "VM", + "Cost" ], "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" + "subcategory": "Planning", + "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.Web/sites", - "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", + "category": "Reservations", + "checklist": "Cost Optimization 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", "services": [ - "WAF" + "VM", + "ARS", + "Cost" ], - "severity": "High", - "text": "Select the right Function hosting plan based on your business & SLO requirements", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Reservations/savings plans", + "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.Web/sites", - "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", + "category": "Reservations", + "checklist": "Cost Optimization Checklist", + "guid": "a785c6fe-96c9-46ad-a844-cf3b2b38c886", + "link": "https://azure.microsoft.com/resources/achieving-compliant-data-residency-and-security-with-azure/", "services": [ - "WAF" + "Cost" ], - "severity": "High", - "text": "Leverage Availability Zones where regionally applicable (not available for Consumption tier)", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Reservations/savings plans", + "text": "Plan for Azure Savings Plans for all the workloads that are dynamic and need maximum flexibility", + "waf": "Cost" }, { - "arm-service": "Microsoft.Web/sites", - "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", + "category": "Reservations", + "checklist": "Cost Optimization Checklist", + "guid": "ba2c0214-9901-44a5-b3ce-574dccbd9792", + "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", "services": [ - "WAF" + "Cost" ], "severity": "Medium", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" + "subcategory": "Reservations/savings plans", + "text": "Plan for Azure Reservations for all the workloads that are less dynamic and won't change much", + "waf": "Cost" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "WAF checklist", - "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "Azure Functions", + "category": "Reservations", + "checklist": "Cost Optimization Checklist", + "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", + "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", + "service": "VM", "services": [ - "WAF", - "AppSvc" + "Storage", + "Cost" ], - "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Reserve storage", + "text": "Only larger disks can be reserved => 1 TiB -", + "waf": "Cost" }, { - "arm-service": "Microsoft.Web/sites", - "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", + "category": "Reservations", + "checklist": "Cost Optimization Checklist", + "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", + "service": "VM", "services": [ - "WAF", - "AppSvc" + "VM", + "Cost" ], - "severity": "High", - "text": "Ensure 'Always On' is enabled for all Function Apps running on App Service Plan", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Reserve VMs with normalized and rationalized sizes", + "text": "After the right-sizing optimization", + "waf": "Cost" }, { - "arm-service": "Microsoft.Web/sites", - "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", + "category": "Reservations", + "checklist": "Cost Optimization Checklist", + "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", + "service": "Azure SQL", "services": [ - "Storage", - "WAF" + "SQL", + "Cost", + "AzurePolicy" ], "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" + "subcategory": "SQL Database AHUB", + "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.Web/sites", - "checklist": "WAF checklist", - "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "Azure Functions", + "category": "Reservations", + "checklist": "Cost Optimization Checklist", + "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", + "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", + "service": "VM", "services": [ - "WAF" + "VM", + "SQL", + "Cost" ], "severity": "Medium", - "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Function App code", - "waf": "Operations" + "subcategory": "SQL Database Reservations", + "text": "The VM + license part discount (ahub + 3YRI) is around 70% discount", + "waf": "Cost" }, { - "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", + "category": "Reservations", + "checklist": "Cost Optimization Checklist", + "guid": "e13c1056-75c1-4e94-9b45-9837ff7ae7c6", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/identity-access-landing-zones#managed-identities", "services": [ - "WAF" + "Cost" ], - "severity": "High", - "text": "Select the right Logic App hosting plan based on your business & SLO requirements", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Tracking", + "text": "Make sure you Azure Reservations and Savings plans are close to 100% utilization or make the necessary changes to reach it.", + "waf": "Cost" }, { - "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", + "category": "Reservations", + "checklist": "Cost Optimization Checklist", + "guid": "d3b475a5-c7ac-4be4-abbe-64dd89f2e877", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/identity-access-landing-zones#rbac-recommendations", "services": [ - "WAF" + "Cost", + "AzurePolicy" ], - "severity": "High", - "text": "Protect logic apps from region failures with zone redundancy and availability zones", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Tracking", + "text": "Make sure that your reservations usage is close to 100%. If not, either enforce an allowed SKU policy or exchange the reservation", + "waf": "Cost" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "78468d55-a785-4c6f-b96c-96ad8844cf3b", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-create-roles-and-resource-roles-review", "services": [ - "WAF" + "Cost", + "AzurePolicy" ], - "severity": "High", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Automation", + "text": "Plan and enforce a On/Off policy for production services, where possible", + "waf": "Cost" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "2b38c886-ba2c-4021-9990-14a5d3ce574d", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-diagnostic-settings-to-save-your-wafs-logs", "services": [ - "WAF", - "AppSvc" + "Cost", + "AzurePolicy" ], - "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Automation", + "text": "Plan and enforce a On-Demand policy with auto-shutdown for non-production services, where possible", + "waf": "Cost" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "WAF checklist", - "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", - "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", - "service": "Logic Apps", + "category": "Right-sizing", + "checklist": "Cost Optimization 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", "services": [ - "WAF" + "VM", + "Cost" ], "severity": "Medium", - "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", - "waf": "Operations" + "subcategory": "Autoscale", + "text": "Consider using a VMSS to match demand rather than flat sizing", + "waf": "Cost" }, { - "arm-service": "Microsoft.App/containerApps", - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "service": "AKS", "services": [ - "WAF" + "Cost", + "AKS" ], - "severity": "High", - "text": "Leverage Availability Zones if regionally applicable", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Autoscale", + "text": "Use AKS autoscaler to match your clusters usage (make sure the pods requirements match the scaler)", + "waf": "Cost" }, { - "arm-service": "Microsoft.App/containerApps", - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "93665720-2bff-4456-9b0d-934a359c363e", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", "services": [ - "WAF" + "Cost" ], - "severity": "High", - "text": "Use more than one replica and enable Zone Redundancy.", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Autoscale", + "text": "Right-size PaaS service according to average use and accomodate spikes with auto or manual scaling", + "waf": "Cost" }, { - "arm-service": "Microsoft.App/containerApps", - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "7dd61623-a364-4a90-9eba-e38ead53cc7d", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", "services": [ - "WAF" + "Cost" ], - "severity": "High", - "text": "For cross-region DR, deploy container apps in multiple regions and follow active/active or active/passive application guidance.", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Autoscale", + "text": "Plan for demand shaping where applicable", + "waf": "Cost" }, { - "arm-service": "Microsoft.App/containerApps", - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "e2e8aaab-3571-4549-ab91-53d89f89dc7b", "services": [ - "WAF", - "FrontDoor", - "TrafficManager" + "Cost" ], - "severity": "High", - "text": "Use Front Door or Traffic Manager to route traffic to the closest region", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Autoscale", + "text": "Consider implementing a service re-scaling logic within the application", + "training": "https://learn.microsoft.com/azure/cost-management-billing/savings-plan/", + "waf": "Cost" }, { - "checklist": "WAF checklist", - "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", - "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization 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", "services": [ - "SAP", - "WAF" + "Backup", + "Cost" ], "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" + "subcategory": "Backup", + "text": "Move recovery points to vault-archive where applicable (Validate)", + "training": "https://azure.microsoft.com/pricing/reservations/", + "waf": "Cost" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", + "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", + "service": "Databricks", "services": [ - "SAP", - "WAF" + "LoadBalancer", + "Cost", + "VM" ], "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" + "subcategory": "Databricks", + "text": "Consider using Spot VMs with fallback where possible. Consider autotermination of clusters.", + "waf": "Cost" }, { - "checklist": "WAF checklist", - "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", + "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", + "service": "Azure Functions", "services": [ - "SAP", - "WAF" + "Cost" ], "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" + "subcategory": "Functions", + "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" }, { - "checklist": "WAF checklist", - "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", + "link": "https://learn.microsoft.com/azure/automation/update-management/overview", + "service": "Azure Functions", "services": [ - "WAF", - "Backup" + "Cost" ], "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" + "subcategory": "Functions", + "text": "Functions - Cache data locally", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", + "waf": "Cost" }, { - "checklist": "WAF checklist", - "guid": "b651423c-8552-42db-a545-5cb50c05527a", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", + "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", + "service": "Azure Functions", "services": [ "Storage", - "ASR", - "SQL", - "SAP", - "WAF", - "Backup" + "Cost" ], - "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" + "severity": "Medium", + "subcategory": "Functions", + "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" }, { - "checklist": "WAF checklist", - "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "Azure Functions", "services": [ - "SAP", - "WAF" + "Cost" ], "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" + "subcategory": "Functions", + "text": "Functions - Keep your functions warm", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Cost" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Azure Functions", "services": [ - "VPN", - "ExpressRoute", - "WAF", - "ASR" + "Cost" ], - "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" + "severity": "Medium", + "subcategory": "Functions", + "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" }, { - "checklist": "WAF checklist", - "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", + "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", + "service": "Azure Functions", "services": [ - "ACR", - "WAF", - "AKV" + "Cost" ], - "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", + "subcategory": "Functions", + "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" }, { - "checklist": "WAF checklist", - "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", + "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", + "service": "Azure Functions", "services": [ - "SAP", - "WAF", - "VNet", - "ASR" + "Cost" ], "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" + "subcategory": "Functions", + "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" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "df03a822-cd46-43cb-abc8-ac299ebc91a4", + "link": "https://learn.microsoft.com/azure/sentinel/quickstart-onboard", "services": [ - "SAP", - "Storage", - "WAF" + "Cost" ], - "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", + "subcategory": "Networking", + "text": "Evaluate your network topology against networking costs and where applicable reduce the egress and peering data", + "waf": "Cost" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Front Door", "services": [ - "WAF" + "EventHubs", + "Cost", + "FrontDoor" ], - "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" + "severity": "Medium", + "subcategory": "Networking", + "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" }, { - "checklist": "WAF checklist", - "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", - "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization 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", "services": [ - "WAF", - "VNet" + "AppSvc", + "Cost", + "FrontDoor" ], - "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" + "severity": "Medium", + "subcategory": "Networking", + "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" }, { - "checklist": "WAF checklist", - "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "f843e52f-4722-4d92-ac1b-1cd521e54a29", + "link": "https://learn.microsoft.com/azure/azure-monitor/agents/diagnostics-extension-overview", "services": [ - "Entra", - "WAF", - "VM", - "ASR" + "Cost" ], - "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", + "subcategory": "PaaS", + "text": "Consider using free tiers where applicable for all non-production environments", + "waf": "Cost" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "b9de39ac-0e7c-428d-a936-657202bff456", + "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/alerts-overview", "services": [ - "SAP", - "WAF" + "Cost" ], - "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" + "severity": "Medium", + "subcategory": "Serverless", + "text": "Using serverless patterns for spikes can help keeping costs down", + "waf": "Cost" }, { - "checklist": "WAF checklist", - "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", + "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", + "service": "Storage", "services": [ - "SAP", - "WAF" + "Storage", + "Cost" ], - "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" + "severity": "Medium", + "subcategory": "Storage", + "text": "Consider archiving tiers for less used data", + "waf": "Cost" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", + "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", + "service": "VM", "services": [ "Storage", - "WAF", - "VM" + "Cost" ], - "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" + "severity": "Medium", + "subcategory": "Storage", + "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" }, { - "checklist": "WAF checklist", - "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", - "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", + "service": "Storage", "services": [ - "SAP", "Storage", - "WAF" + "Cost" ], - "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", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Storage", + "text": "Consider using standard SSD rather than Premium or Ultra where possible", + "waf": "Cost" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization 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", "services": [ - "SAP", - "WAF" + "Storage", + "Cost" ], - "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" + "severity": "Medium", + "subcategory": "Storage", + "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" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", + "service": "Site Recovery", "services": [ - "SAP", - "LoadBalancer", - "WAF" + "ASR", + "Cost", + "Storage" ], - "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" + "severity": "Medium", + "subcategory": "Storage", + "text": "For ASR, consider using Standard SSD disks if the RPO/RTO and replication throughput allow it", + "waf": "Cost" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", + "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", + "service": "Storage", "services": [ - "LoadBalancer", - "WAF" + "Storage", + "Cost" ], - "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" + "severity": "Medium", + "subcategory": "storage", + "text": "Storage accounts: check hot tier and/or GRS necessary", + "waf": "Cost" }, { - "checklist": "WAF checklist", - "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", + "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", + "service": "VM", "services": [ - "WAF" + "Storage", + "Cost" ], - "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" + "severity": "Medium", + "subcategory": "Storage", + "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" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", + "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", + "service": "Synapse", "services": [ - "SAP", - "WAF", - "VM", - "Entra" + "EventHubs", + "Cost", + "Monitor" ], - "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" + "severity": "Medium", + "subcategory": "Synapse", + "text": "Create budgets to manage costs and create alerts that automatically notify stakeholders of spending anomalies and overspending risks.", + "waf": "Cost" }, { - "checklist": "WAF checklist", - "guid": "cbe05bbe-209d-4490-ba47-778424d11678", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "Synapse", "services": [ - "RBAC", - "WAF", - "VM", - "Entra" + "Storage", + "Cost" ], - "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" + "severity": "Medium", + "subcategory": "Synapse", + "text": "Export cost data to a storage account for additional data analysis.", + "waf": "Cost" }, { - "checklist": "WAF checklist", - "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", - "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "Synapse", "services": [ - "WAF" + "SQL", + "Cost" ], "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" + "subcategory": "Synapse", + "text": "Control costs for a dedicated SQL pool by pausing the resource when it is not in use.", + "waf": "Cost" }, { - "checklist": "WAF checklist", - "guid": "9674e7c7-7796-4181-8920-09f4429543ba", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", + "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", + "service": "Synapse", "services": [ - "WAF", - "VM" + "Cost" ], - "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" + "severity": "Medium", + "subcategory": "Synapse", + "text": "Enable the serverless Apache Spark automatic pause feature and set your timeout value accordingly.", + "waf": "Cost" }, { - "checklist": "WAF checklist", - "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization 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", "services": [ - "SAP", - "WAF", - "Entra" + "Cost" ], - "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", + "subcategory": "Synapse", + "text": "Create multiple Apache Spark pool definitions of various sizes.", + "waf": "Cost" }, { - "checklist": "WAF checklist", - "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization 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", "services": [ - "SAP", - "ACR", - "WAF" + "Cost" ], - "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", + "subcategory": "Synapse", + "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" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", + "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", + "service": "VM", "services": [ - "SAP", - "WAF", - "Entra" + "VM", + "Cost" ], - "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" + "severity": "Medium", + "subcategory": "VM", + "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" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "544451e1-92d3-4442-a3c7-628637a551c5", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "VM", "services": [ - "WAF", "VM", - "Entra" + "Cost" ], "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" + "subcategory": "VM", + "text": "Right-sizing all VMs", + "waf": "Cost" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", + "service": "VM", "services": [ - "Storage", - "WAF", - "VM" + "VM", + "Cost" ], "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" + "subcategory": "VM", + "text": "Swap VM sized with normalized and most recent sizes", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Cost" }, { - "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", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", "services": [ - "SAP", - "WAF" + "VM", + "Cost", + "Monitor" ], "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" + "subcategory": "VM", + "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" }, { - "checklist": "WAF checklist", - "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", + "category": "Right-sizing", + "checklist": "Cost Optimization Checklist", + "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", "services": [ - "Storage", - "WAF" + "VM", + "Cost" ], - "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" + "severity": "Medium", + "subcategory": "VM", + "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" }, { - "checklist": "WAF checklist", - "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", - "service": "SAP", - "services": [ - "SAP", - "Storage", - "WAF" - ], + "category": "Operations Management", + "checklist": "Cognitive Search Review Checklist", + "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", + "services": [], "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", + "subcategory": "High Availablity", + "text": "Enable 2 replicas to have 99.9% availability for read operations", "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", - "service": "SAP", - "services": [ - "SAP", - "Storage", - "WAF", - "ASR" - ], - "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", + "category": "Operations Management", + "checklist": "Cognitive Search Review Checklist", + "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", + "services": [], + "severity": "Medium", + "subcategory": "High Availablity", + "text": "Enable 3 replicas to have 99.9% availability for read/write operations", "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", - "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", - "service": "SAP", - "services": [ - "SAP", - "Storage", - "WAF" - ], + "category": "Operations Management", + "checklist": "Cognitive Search Review Checklist", + "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", + "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", + "service": "Cognitive Search", + "services": [], "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.", + "subcategory": "High Availablity", + "text": "Leverage Availability Zones by enabling read and/or write replicas", "waf": "Reliability" }, { - "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", + "category": "Operations Management", + "checklist": "Cognitive Search Review 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", "services": [ - "SAP", - "Cost", - "WAF" + "ACR" ], "severity": "Medium", - "text": "Automate SAP System Start-Stop to manage costs.", - "waf": "Cost" + "subcategory": "Georeplication", + "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" }, { - "checklist": "WAF checklist", - "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", + "category": "Operations Management", + "checklist": "Cognitive Search Review Checklist", + "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", + "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", + "service": "Cognitive Search", "services": [ - "Storage", - "Cost", - "VM", - "SAP", - "WAF" + "ACR" ], - "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": "Medium", + "subcategory": "Georeplication", + "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" }, { - "checklist": "WAF checklist", - "guid": "9877f353-2591-4e8b-8381-e9043fed1010", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", + "category": "Operations Management", + "checklist": "Cognitive Search Review 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", "services": [ - "Storage", - "Cost", - "VM", - "SAP", - "WAF" + "TrafficManager" ], - "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": "Medium", + "subcategory": "Georeplication", + "text": "Use Azure Traffic Manager to coordinate requests", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", - "service": "SAP", + "category": "Operations Management", + "checklist": "Cognitive Search Review Checklist", + "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", + "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", + "service": "Cognitive Search", "services": [ - "RBAC", - "WAF", - "Subscriptions" + "Storage", + "Backup", + "ASR" ], "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/", - "waf": "Security" - }, - { - "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", - "services": [ - "SAP", - "WAF", - "Entra" - ], - "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", - "waf": "Security" + "subcategory": "Disaster Recovery", + "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" }, { - "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", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "When you are creating a SQL Server on Azure VM, carefully consider the type of workload necessary. If you are migrating an existing environment, collect a performance baseline to determine your SQL Server on Azure VM requirements. If this is a new VM, then create your new SQL Server VM based on your vendor requirements.", + "guid": "1fc3fc14-eea6-4e69-b8d9-a3eec218e687", + "link": "https://learn.microsoft.com/sql/dma/dma-sku-recommend-sql-db?view=sql-server-ver16", "services": [ - "SAP", - "WAF", - "Entra" + "VM", + "SQL" ], - "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.", - "waf": "Security" + "severity": "High", + "subcategory": "VM Size", + "text": "Collect the target workload's performance characteristics and use them to determine the appropriate VM size for your business.", + "waf": "Performance" }, { - "checklist": "WAF checklist", - "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "The memory optimized virtual machine sizes are a primary target for SQL Server VMs and the recommended choice by Microsoft. The memory optimized virtual machines offer stronger memory-to-CPU ratios and medium-to-large cache options.Consider Ebdsv5-series series first for most SQL Server workloads.", + "guid": "e04abe1f-8d39-4fda-9776-8424c116775c", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-vm-size?view=azuresql#memory-optimized", "services": [ - "SAP", - "WAF" + "VM", + "SQL" ], "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", - "waf": "Security" + "subcategory": "VM Size", + "text": "Use memory optimized virtual machine sizes for the best performance of SQL Server workloads.", + "waf": "Performance" }, { - "checklist": "WAF checklist", - "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "To find the most effective configuration for SQL Server workloads on an Azure VM, start by measuring the storage performance of your business application. Once storage requirements are known, select a virtual machine that supports the necessary IOPS and throughput with the appropriate memory-to-vCore ratio.", + "guid": "2ea55b56-ad48-4408-be72-734b476ba18f", + "link": "https://learn.microsoft.com/azure/virtual-machines/premium-storage-performance#counters-to-measure-application-performance-requirements", "services": [ - "SAP", - "WAF" + "VM", + "Storage", + "SQL" ], "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", - "waf": "Security" + "subcategory": "Storage", + "text": "Determine storage bandwidth and latency requirements for SQL Server data, log, and tempdb files before choosing the disk type.", + "waf": "Performance" }, { - "checklist": "WAF checklist", - "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "This provides more dedicated disk IOPS and throughput on the disk level and also allows you to configure the Azure disk host caching setting for each disk to the optimal setting for that data type.", + "guid": "dbf590ce-65de-48e0-9f9c-cbd468266abc", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", "services": [ - "SAP", - "WAF" - ], - "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" + "Storage", + "SQL" + ], + "severity": "High", + "subcategory": "Storage", + "text": "Place data, log, and tempdb files on separate drives", + "waf": "Performance" }, { - "checklist": "WAF checklist", - "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Premium SSD is always recommend as a minimum for SQL Server in order to obtain better performance and lower latency. P30 and P40 are recommended because disk caching is not supported for disks 4 TiB and larger ( P50 and above) and they provide the optimal price to performance ratio", + "guid": "e6a84de5-df43-4d19-a248-1718d5d1e5f6", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", "services": [ - "SAP", - "WAF", - "AKV" + "Storage", + "SQL" ], - "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" + "severity": "High", + "subcategory": "Storage", + "text": "For the data drive, use premium P30 and P40 or smaller disks to ensure the availability of cache support", + "waf": "Performance" }, { - "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", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Log files have primarily write-heavy operations. Therefore, they do not benefit from the ReadOnly cache. Hence evaluate your price vs performance vs capacity and chose the right storage disk.", + "guid": "25659d35-58fd-4772-99c9-31112d027fe4", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", "services": [ - "SAP", - "WAF", - "AKV" + "Storage", + "SQL", + "Cost" ], - "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.", - "waf": "Security" + "severity": "High", + "subcategory": "Storage", + "text": "For the log drive plan for capacity and test performance versus cost while evaluating the premium P30 - P80 disks", + "waf": "Performance" }, { - "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", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Placing TempDB on the D drive can help performance. Consider the size required and always test performance.", + "guid": "12f70983-f630-4472-8ee6-9d6b5c2622f5", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", "services": [ - "SAP", - "WAF" + "VM", + "Storage", + "SQL" ], "severity": "Medium", - "text": "Implement SSO by using OAuth for SAP NetWeaver to allow third-party or custom applications to access SAP NetWeaver OData services.", - "waf": "Security" + "subcategory": "Storage", + "text": "Place tempdb on the local ephemeral SSD (default D:\\) drive for most SQL Server workloads that are not part of Failover Cluster Instance (FCI) after choosing the optimal VM size.", + "waf": "Performance" }, { - "checklist": "WAF checklist", - "guid": "a747c350-8d4c-449c-93af-393dbca77c48", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Striping Data and Log disk can increase bandwidth. Ensure that VM size also matches expected output", + "guid": "4b69bad3-4aad-45e8-a78e-1d76667313c4", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", "services": [ - "SAP", - "WAF" + "VM", + "Storage", + "SQL" ], - "severity": "Medium", - "text": "Implement SSO to SAP HANA", - "waf": "Security" + "severity": "High", + "subcategory": "Storage", + "text": "Stripe multiple Azure data disks using Storage Spaces to increase I/O bandwidth", + "waf": "Performance" }, { - "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", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Your storage caching policy varies depending on the type of SQL Server data files that are hosted on the drive.Enable Read-only caching for the disks hosting SQL Server data files.Reads from cache will be faster than the uncached reads from the data disk.Set the caching policy to None for disks hosting the transaction log. There is no performance benefit to enabling caching for the Transaction log disk.", + "guid": "05674b5e-985b-4859-a773-e7e261623b77", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", "services": [ - "SAP", - "WAF", - "Entra" + "Storage", + "SQL", + "AzurePolicy" ], - "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" + "severity": "High", + "subcategory": "Storage", + "text": "Set host caching to read-only for data file disks and none for log file disks.", + "waf": "Performance" }, { - "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", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Check that you storage is in the same region as your VM. For exaplme if your VM is in EAST US 2 ensure your storage is in East US 2.", + "guid": "5a917e1f-348e-4f35-9c27-d42e8bbac868", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", "services": [ - "SAP", - "WAF" + "VM", + "Storage", + "SQL" ], - "severity": "Medium", - "text": "For applications that access SAP, you might want to use principal propagation to establish SSO.", - "waf": "Security" + "severity": "High", + "subcategory": "Storage", + "text": "Provision the storage account in the same region as the SQL Server VM", + "waf": "Performance" }, { - "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", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "SQL Server uses extents to store data. These are 64KB in size. Therefore, on a SQL Server machine, the NTFS allocation unit size for hosting SQL database files should be 64 KB.", + "guid": "155abb91-63e9-4908-ae28-c84c33b6b780", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", "services": [ - "SAP", - "WAF", - "Entra" + "Storage", + "SQL" ], - "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" + "severity": "High", + "subcategory": "Storage", + "text": "Format your data disk to use 64 KB block size (allocation unit size) for all data files placed on a drive other than the temporary D:\\ drive", + "waf": "Performance" }, { - "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", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "It is recommended that you determine BCDR needs and requirements ensuring that you are able to meet you SLAs of the environment.", + "guid": "8b9fe5c4-2049-4d41-9a92-3c3474d11028", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/business-continuity-high-availability-disaster-recovery-hadr-overview?view=azuresql#azure-only-disaster-recovery-solutions", "services": [ - "SAP", - "WAF" + "VM", + "SQL" ], "severity": "Medium", - "text": "Implement SSO to SAP BTP", - "waf": "Security" + "subcategory": "HADR", + "text": "Determine HA/DR requirements for each VM to be migrated.", + "waf": "Reliability" }, { - "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", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "When depoying High Availability you need to use availability sets or availability zones to avoid unexpected outages.", + "guid": "ac6aae01-e6a8-44de-9df4-3d1992481718", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/business-continuity-high-availability-disaster-recovery-hadr-overview?view=azuresql#high-availability-nodes-in-an-availability-set", "services": [ - "SAP", - "WAF", - "Entra" + "VM", + "SQL" ], - "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.", - "waf": "Security" + "severity": "High", + "subcategory": "HADR", + "text": "Place your VMs in an availability set or different availability zones.", + "waf": "Reliability" }, { - "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", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Prefered option when deploying an Availability Group. The recommended solution is to use multi-subnets when deploying Always on Availability Groups.", + "guid": "d5d1e5f6-2565-49d3-958f-d77249c93111", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/availability-group-azure-portal-configure?view=azuresql&tabs=azure-cli", "services": [ - "SAP", - "AzurePolicy", - "WAF", - "Subscriptions" + "VM", + "SQL", + "LoadBalancer", + "VNet" ], "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" + "subcategory": "HADR", + "text": "Deploy your SQL Server VMs to multiple subnets whenever possible to avoid the dependency on an Azure Load Balancer or a distributed network name (DNN) to route traffic to your HADR solution. ( If one is implementing FCI or AG)", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "High availability and disaster recovery (HADR) features, such as the Always On availability group and the failover cluster instance rely on underlying Windows Server Failover Cluster technology. Review the best practices for modifying your HADR settings to better support the cloud environment.", + "guid": "2d027fe4-12f7-4098-9f63-04722ee69d6b", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql-vm#hadr-configuration", "services": [ - "SAP", - "WAF", - "Subscriptions" + "ASR", + "SQL" ], "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" + "subcategory": "HADR", + "text": "Change the cluster to less aggressive parameters to avoid unexpected outages from transient network failures or Azure platform maintenance. ( If one is implementing FCI or AG)", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Ensure that quorum is set correct for the number of instances deployed.", + "guid": "5c2622f5-4b69-4bad-94aa-d5e8c78e1d76", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/hadr-cluster-best-practices?view=azuresql-vm&tabs=windows2012#quorum-voting", "services": [ - "WAF", - "Subscriptions" + "SQL" ], "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" + "subcategory": "HADR", + "text": "Configure cluster quorum voting to use 3 or more odd number of votes. Don't assign votes to DR regions. ( If one is implementing FCI or AG)", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", - "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "On Azure virtual machines, clusters use a load balancer to hold an IP address that needs to be on one cluster node at a time. In this solution, the load balancer holds the IP address for the virtual network name (VNN) listener for the Always On availability group when the SQL Server VMs are in a single subnet.", + "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": [ - "WAF", - "VM", - "Subscriptions" + "LoadBalancer", + "SQL", + "VNet", + "VM" ], "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" + "subcategory": "HADR", + "text": "When using the virtual network name (VNN) and Azure Load Balancer to connect to your HADR solution, specify MultiSubnetFailover = true in the connection string, even if your cluster only spans one subnet. ( If one is implementing FCI or AG)", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", - "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "SQL Server, Azure SQL Database, and Azure SQL Managed Instance support row and page compression for rowstore tables and indexes, and support columnstore and columnstore archival compression for columnstore tables and indexes.", + "guid": "61623b77-5a91-47e1-b348-ef354c27d42e", + "link": "https://learn.microsoft.com/sql/relational-databases/data-compression/data-compression?view=sql-server-ver16", "services": [ - "WAF" + "Storage", + "SQL" ], "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" + "subcategory": "SQL Server", + "text": "Enable database page compression where appropriate.", + "waf": "Performance" }, { - "checklist": "WAF checklist", - "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", - "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "By default, data and log files are initialized to overwrite any existing data left on the disk from previously deleted files. Data and log files are first initialized by zeroing the files (filling with zeros).In SQL Server, for data files only, instant file initialization (IFI) allows for faster execution of the previously mentioned file operations, since it reclaims used disk space without filling that space with zeros. Instead, disk content is overwritten as new data is written to the files.", + "guid": "8bbac868-155a-4bb9-863e-9908ae28c84c", + "link": "https://learn.microsoft.com/sql/relational-databases/databases/database-instant-file-initialization?view=sql-server-ver16", "services": [ - "WAF", - "VM", - "Subscriptions" + "Storage", + "SQL" ], "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.", + "subcategory": "SQL Server", + "text": "Enable instant file initialization for data files.", "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "e6e20617-3686-4af4-9791-f8935ada4332", - "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Recommended for best performance and availability migrate all databases to data and log disks", + "guid": "33b6b780-8b9f-4e5c-9204-9d413a923c34", + "link": "https://learn.microsoft.com/sql/relational-databases/databases/move-database-files?view=sql-server-ver16", "services": [ - "WAF" + "SQL" ], - "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", + "subcategory": "SQL Server", + "text": "Move all databases to data disks, including system databases.", "waf": "Operations" }, { - "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", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Part of the SQL Server Feature checklist in the link that is recommended when SQL Server Instance is in an Azure VM.", + "guid": "b824546c-e1ae-4e34-93ae-c8239248725d", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql-vm#sql-server-features", "services": [ - "Cost", - "WAF", - "TrafficManager" + "VM", + "Storage", + "SQL" ], - "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/", + "severity": "Low", + "subcategory": "SQL Server", + "text": "Move SQL Server error log and trace file directories to data disks.", "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Part of the SQL Server Feature checklist in the link that is recommended when SQL Server Instance is in an Azure VM.", + "guid": "d68c5b5c-2925-4394-a69a-9d2799c42bb6", + "link": "https://learn.microsoft.com/sql/database-engine/configure-windows/server-memory-server-configuration-options#use-", "services": [ - "WAF", - "Backup" + "VM", + "SQL" ], "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" + "subcategory": "SQL Server", + "text": "Set max SQL Server memory limit to leave enough memory for the Operating System.", + "waf": "Performance" }, { - "checklist": "WAF checklist", - "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Part of the SQL Server Feature checklist in the link that is recommended when SQL Server Instance is in an Azure VM.", + "guid": "8d1d7555-6246-4b43-a563-b4dc74a748b6", + "link": "https://learn.microsoft.com/sql/database-engine/configure-windows/enable-the-lock-pages-in-memory-option-windows", "services": [ - "Storage", - "WAF", "VM", - "Entra" - ], - "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" - }, - { - "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", - "services": [ - "SAP", - "WAF" + "SQL" ], "severity": "High", - "text": "Ensure time-zone matches between the operating system and the SAP system.", - "waf": "Operations" - }, - { - "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", - "services": [ - "WAF", - "Entra" - ], - "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" + "subcategory": "SQL Server", + "text": "Enable lock pages in memory.", + "waf": "Performance" }, { - "checklist": "WAF checklist", - "guid": "a491dfc4-9353-4213-9217-eef0949f9467", - "link": "https://azure.microsoft.com/pricing/offers/dev-test/", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Part of the SQL Server Feature checklist in the link that is recommended when SQL Server Instance is in an Azure VM.", + "guid": "633ad2a0-916a-4664-a8fa-d0e278ee293c", + "link": "https://learn.microsoft.com/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store", "services": [ - "Cost", - "WAF" + "VM", + "SQL" ], "severity": "Low", - "text": "Consider running dev/test systems in a snooze model to save and optimize Azure run costs.", - "waf": "Cost" + "subcategory": "SQL Server", + "text": "Enable Query Store on all production SQL Server databases following best practices.", + "waf": "Performance" }, { - "checklist": "WAF checklist", - "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", - "link": "https://learn.microsoft.com/azure/lighthouse/overview", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Part of the SQL Server Feature checklist in the link that is recommended when SQL Server Instance is in an Azure VM.", + "guid": "1bc352ba-aab7-4571-a49a-b8093dc9ec9d", + "link": "https://learn.microsoft.com/sql/relational-databases/databases/tempdb-database#optimizing-tempdb-performance-in-sql-server", "services": [ - "SAP", - "WAF", - "Entra" + "VM", + "SQL" ], - "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.", - "waf": "Operations" + "severity": "High", + "subcategory": "SQL Server", + "text": "Ensure that all tempdb best practices are followed.", + "waf": "Performance" }, { - "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", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Part of the SQL Server Feature checklist in the link that is recommended when SQL Server Instance is in an Azure VM.", + "guid": "1bb73b36-a5a6-47fb-a9ed-5b35478c3479", + "link": "https://docs.microsoft.com/azure/governance/management-groups/how-to/protect-resource-hierarchy#setting---require-authorization", "services": [ - "WAF", - "VM" + "VM", + "SQL" ], - "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", + "severity": "High", + "subcategory": "SQL Server", + "text": "Schedule SQL Server Agent jobs to run DBCC CHECKDB, index reorganize, index rebuild, and update statistics jobs.", "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", - "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Part of the SQL Server Feature checklist in the link that is recommended when SQL Server Instance is in an Azure VM.", + "guid": "816b2863-cffe-41ca-a599-ef0d5a73dd4c", + "link": "https://docs.microsoft.com/azure/governance/management-groups/how-to/protect-resource-hierarchy#setting---require-authorization", "services": [ - "SAP", - "WAF" + "VM", + "SQL" ], - "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", + "subcategory": "SQL Server", + "text": "Limit autogrowth of the database and Disable autoshrink", "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "14591147-5e39-4e53-89cc-cd979366bcda", - "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Constrained vCPU virtual machines (VMs) are a type of VM where the vCPU count can be constrained to a half or a quarter of the original VM size. This allows customers to reduce the cost of software licensing while maintaining the same memory, storage, and I/O bandwidth", + "guid": "e36c1c81-770a-4fbc-9c0d-43918648d285", + "link": "https://learn.microsoft.com/azure/virtual-machines/constrained-vcpu", "services": [ - "SAP", + "VM", + "Storage", "SQL", - "WAF", - "Monitor" + "Cost" ], - "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" + "severity": "Low", + "subcategory": "Cost Optimization", + "text": "Optimize SQL Server License cost with Constrained vCPU VM's", + "training": "https://learn.microsoft.com/azure/active-directory/managed-identities-azure-resources/overview", + "waf": "Cost" }, { - "checklist": "WAF checklist", - "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", - "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Azure Hybrid Benefit allows you to exchange your existing licenses for discounted rates on Azure SQL Database and Azure SQL Managed Instance. Y", + "guid": "7ed67178-b824-4546-ae1a-ee3453aec823", + "link": "https://azure.microsoft.com/en-ca/pricing/hybrid-benefit/", "services": [ - "Monitor", - "VM", - "Entra", - "SAP", - "WAF" + "SQL", + "Cost" ], - "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" + "severity": "Low", + "subcategory": "Cost Optimization", + "text": "Leverage Azure Hybrid benefit to maximize the value of your on premises licenses in the cloud", + "waf": "Cost" }, { - "checklist": "WAF checklist", - "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "The SQL Server IaaS Agent extension (SqlIaasExtension) runs on SQL Server on Azure Windows Virtual Machines (VMs) to automate management and administration tasks.", + "guid": "9248725d-d68c-45b5-a292-5394a69a9d27", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/sql-agent-extension-automatic-registration-all-vms?view=azuresql-vm&tabs=azure-cli", "services": [ - "AzurePolicy", - "WAF" + "VM", + "SQL" ], "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/", + "subcategory": "Azure", + "text": "Register with the SQL IaaS Agent Extension to unlock a number of feature benefits.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", - "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", - "service": "SAP", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Accelerated Networking provides consistent ultra-low network latency via Azure's in-house programmable hardware and technologies", + "guid": "99c42bb6-8d1d-4755-9624-6b438563b4dc", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", "services": [ - "SAP", - "Monitor", - "WAF", - "NetworkWatcher" + "VM", + "SQL" ], - "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", + "subcategory": "Azure", + "text": "Ensure Accelerated Networking is enabled on the virtual machine.", "waf": "Operations" }, { - "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", + "category": "SQL Server on Azure VM", + "checklist": "SQL Migration Review", + "description": "Microsoft Defender detects anomalous activities indicating unusual and potentially harmful attempts to access or exploit databases on the SQL server.", + "guid": "74a748b6-633a-4d2a-8916-a66498fad0e2", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/secure-score-security-controls", "services": [ - "SAP", - "WAF", - "VM" + "VM", + "SQL", + "Defender" ], - "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" + "severity": "High", + "subcategory": "Azure", + "text": "Leverage Microsoft Defender for Cloud to improve the overall security posture of your virtual machine deployment.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Security" }, { - "checklist": "WAF checklist", - "guid": "616785d6-fa96-4c96-ad88-518f482734c8", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "There are some PaaS limitations that are introduced in SQL Managed Instance and some behavior changes compared to SQL Server. It is important to review and understand these differences.", + "guid": "78ee293c-1bc3-452b-aaab-7571849ab809", + "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/transact-sql-tsql-differences-sql-server?view=azuresql", "services": [ - "SAP", - "WAF", - "Subscriptions" + "EventHubs", + "SQL" ], "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" + "subcategory": "Pre Migration", + "text": "Review the major differences between SQL Server and Managed Instance", + "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", - "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "SQL Managed Instance has characteristics and resource limits that depend on the underlying infrastructure and architecture. It is important to review these limits.", + "guid": "3dc9ec9d-1bb7-43b3-9a5a-67fba9ed5b35", + "link": "https://docs.microsoft.com/azure/azure-sql/managed-instance/resource-limits", "services": [ - "Storage", - "WAF", - "ASR" + "SQL" ], - "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", + "subcategory": "Pre Migration", + "text": "Review capacity limits for SQL MI", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "waf": "Performance" }, { - "checklist": "WAF checklist", - "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", - "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "The instance settings between managed instance and your source SQL Server can be different . It is important to review those differences that can impact performance.", + "guid": "8bc178bd-c5a0-46ca-9144-351e19dd3442", + "link": "https://medium.com/azure-sqldb-managed-instance/compare-environment-settings-on-sql-server-and-azure-sql-that-may-impact-performance-e90c21fa9b08", "services": [ - "SAP", - "Sentinel", - "WAF", - "Monitor" + "SQL" ], - "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" + "severity": "High", + "subcategory": "Pre Migration", + "text": "Compare instance settings on SQL Server and Azure SQL MI that may impact performance", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", + "waf": "Performance" }, { - "checklist": "WAF checklist", - "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", - "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "Assess on-premises SQL Server instance(s) migrating to Azure SQL Managed Instance. The assessment workflow helps you to detect issues that block the migration itself and also partially supported and unsupported features", + "guid": "9eb72281-37a1-451c-9bb4-e4f1814287d5", + "link": "https://docs.microsoft.com/azure/dms/ads-sku-recommend", "services": [ - "Cost", - "WAF" + "SQL" ], - "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": "High", + "subcategory": "Pre Migration", + "text": "Run Data Migration assistant or Azure Data Studio Migration Extension to detect compatibility issues that can impact database functionality on Managed Instance", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", "waf": "Operations" }, { - "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", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "The SKU recommendation feature can evaluate the source SQL Server performance and utilization characteristics to recommend a right-sized Azure SQL Managed Instance to assist with your migration journey.", + "guid": "ca8c26c9-b32a-4b5b-afc6-898a135e3378", + "link": "https://learn.microsoft.com/azure/dms/ads-sku-recommend", "services": [ - "Monitor", - "WAF", - "VM" + "SQL" ], - "severity": "Low", - "text": "Use inter-VM latency monitoring for latency-sensitive applications.", + "severity": "High", + "subcategory": "Pre Migration", + "text": "Select the right compute resources for your workload by leveraging the SKU recommendation tools.", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", "waf": "Performance" }, { - "checklist": "WAF checklist", - "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "Review Unsupported Features, Migration Blockers and Breaking Changes for each database from the Assessment", + "guid": "97e31c67-d68c-4b69-82ac-19f906d697c8", + "link": "https://learn.microsoft.com/azure/dms/ads-sku-recommend", "services": [ - "SAP", - "Monitor", - "WAF", - "ASR" + "SQL" ], - "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" + "severity": "High", + "subcategory": "Pre Migration", + "text": "Review and address the issues highlighted in DMA/Azure Data Studio", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "Operations" }, { - "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", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "The SQL Managed Instance default DNS zone .database.windows.net can be changed with your own. However, the managed instance hostname part of its FQDN should remain the same.", + "guid": "eaded26b-dd18-46f0-ac25-1b999a68af87", + "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/frequently-asked-questions-faq?view=azuresql-mi#can-a-managed-instance-have-the-same-name-as-a-sql-server-on-premises-instance", "services": [ - "SAP", - "Storage", - "WAF" + "DNS", + "SQL" ], - "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" + "severity": "High", + "subcategory": "Pre Migration", + "text": "Plan for connection string changes as changing a managed instance name is not supported", + "training": "https://learn.microsoft.com/learn/modules/create-custom-azure-roles-with-rbac/", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "c027f893-f404-41a9-b33d-39d625a14964", - "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "There are addional requirements in configuring a vnet and subnet hosting the managed instance.", + "guid": "c9a7f821-b8eb-48c0-aa77-e25e4d5aeaa8", + "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/vnet-existing-add-subnet?view=azuresql-mi", "services": [ - "SAP", - "WAF" + "VNet", + "SQL" ], - "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", + "subcategory": "Pre Migration", + "text": "Review managed instance VNet requirements", + "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "Though it's possible to deploy managed instances to a subnet with a number of IP addresses that's less than the output of the subnet formula, always consider using bigger subnets instead. Using a bigger subnet can help avoid future issues stemming from a lack of IP addresses, such as the inability to create additional instances within the subnet or scale existing instances.", + "guid": "dc4e2436-bb33-46d7-85f1-7960eee0b9b5", + "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/vnet-subnet-determine-size?view=azuresql-mi", "services": [ - "SAP", - "Storage", - "WAF" + "VNet", + "SQL" ], - "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" + "severity": "High", + "subcategory": "Deployment", + "text": "Ensure managed instance subnet has sufficient IP addresses available", + "training": "https://learn.microsoft.com/learn/modules/azure-active-directory/", + "waf": "Operations" }, { - "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", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "SQL Managed Instance has characteristics and resource limits that depend on the underlying infrastructure and architecture. SQL Managed Instance can be deployed on multiple hardware configurations.", + "guid": "c8defc4d-721d-431d-850f-b707ae9eab40", + "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/resource-limits?view=azuresql-mi#service-tier-characteristics", "services": [ - "SAP", - "SQL", - "WAF" + "SQL" ], - "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", + "severity": "High", + "subcategory": "Pre Migration", + "text": "Plan between General Purpose and Business Critical tiers of MI", + "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", "waf": "Performance" }, { - "checklist": "WAF checklist", - "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "The auto-failover groups feature allows you to manage the replication and failover of user databases in a managed instance to a managed instance in another Azure region. Auto-failover groups are designed to simplify deployment and management of geo-replicated databases at scale.", + "guid": "ed329079-8bc1-478b-bc5a-06ca7144351e", + "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/auto-failover-group-sql-mi?view=azuresql-mi&tabs=azure-powershell", "services": [ - "SAP", - "Monitor", - "WAF", - "ASR" + "SQL" ], "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" + "subcategory": "Pre Migration", + "text": "Based on your RPO/RTO's , determine if Auto failover Group needs to be implemented. If so, plan for the deployment attributes of the second instance.", + "training": "https://learn.microsoft.com/learn/paths/implement-windows-server-iaas-virtual-machine-identity/", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "There are multiple ways to connect your application to the managed instance. Review and understand the pros and cons and decide on the best approach for your application.", + "guid": "5d226886-d30b-466c-97be-595190f83845", + "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/connect-application-instance?view=azuresql-mi", "services": [ - "AzurePolicy", - "AppGW", - "WAF" + "SQL" ], - "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/", - "waf": "Security" + "severity": "Low", + "subcategory": "Pre Migration", + "text": "Review the Connectivity Design between Database and Application, test & validate it", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "waf": "Operations" }, { - "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", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "Compare migration options to choose the path that's appropriate to your business needs.", + "guid": "c586cb29-1ec1-46a1-b076-ef9f141acdce", + "link": "https://learn.microsoft.com/azure/azure-sql/migration-guides/managed-instance/sql-server-to-managed-instance-overview?view=azuresql-mi#migration-tools", "services": [ - "DNS", - "SAP", - "WAF", - "VM" + "SQL" ], "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", + "subcategory": "Pre Migration", + "text": "Plan for the Migration Method. Depending on the DB Size and Application downtime window, select the preferred Migration Method.", + "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", "waf": "Operations" }, { - "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", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "After you verify that data is the same on both source and target, you can cut over from the source to the target environment. It's important to plan the cutover process with business / application teams to ensure minimal interruption during cutover doesn't affect business continuity.", + "guid": "579377bc-db37-451a-a2ac-1fad66e15d4d", + "link": "https://learn.microsoft.com/azure/dms/tutorial-sql-server-managed-instance-online#performing-migration-cutover", "services": [ - "DNS", - "SAP", - "WAF", - "VNet" + "SQL" ], "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" + "subcategory": "Pre Migration", + "text": "Plan the cutover process with business / application teams to ensure minimal interruption during cutover and it does not affect business continuity.", + "training": "https://learn.microsoft.com/azure/architecture/example-scenario/identity/adds-extend-domain", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "a3592829-e6e2-4061-9368-6af46791f893", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "A time zone of a managed instance can be set during instance creation only. The default time zone is UTC", + "guid": "4a2adb1c-3d23-426a-b225-ca44e1695fdd", + "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/timezones-overview?view=azuresql#set-a-time-zone", "services": [ - "SAP", - "ACR", - "WAF", - "VNet" + "SQL" ], - "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", - "waf": "Reliability" + "severity": "High", + "subcategory": "Deployment", + "text": "Ensure you customize your time zone setting at the instance creation time. One cannot change it later.", + "training": "https://learn.microsoft.com/azure/role-based-access-control/overview", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "Server-level collation in Azure SQL Managed Instance can be specified when the instance is created and cannot be changed later.Default server-level collation is SQL_Latin1_General_CP1_CI_AS.", + "guid": "deace4cb-1deb-44c6-90c3-fc14eebb3693", + "link": "https://learn.microsoft.com/sql/relational-databases/collations/set-or-change-the-server-collation?view=sql-server-ver16", "services": [ - "SAP", - "WAF", - "NVA" + "SQL" ], "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" + "subcategory": "Deployment", + "text": "Ensure you select the right collation setting at the instance creation time. One cannot change it later", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", - "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "When you're migrating a database protected by Transparent Data Encryption (TDE) to Azure SQL Managed Instance using the native restore option, the corresponding certificate from the SQL Server instance needs to be migrated before database restore.", + "guid": "829e3eec-2183-4687-a007-7a2b5945bda4", + "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/tde-certificate-migrate?view=azuresql-mi&tabs=azure-powershell", "services": [ - "SAP", - "VWAN", - "ACR", - "WAF" + "VM", + "SQL" ], "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", + "subcategory": "Deployment", + "text": "For TDE Enabled Database, corresponding certificate from the on-premises or Azure VM SQL Server needs to be migrated before database restore", "waf": "Operations" }, { - "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", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "System databases can be restored only from backups that are created on the version of SQL Server that the server instance is currently running. This is not the case when you are migrating to SQL Managed Instance.Azure PowerShell and DBATools PowerShell libraries enable you to easily script and automate and customize all parts of the migration process.", + "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": [ - "WAF", - "NVA", - "VNet" + "Backup", + "SQL" ], - "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", + "severity": "Low", + "subcategory": "Migration", + "text": "Restore of system databases is not supported. To migrate instance-level objects (stored in master or msdb databases), we recommend to script them out and run T-SQL scripts on the destination instance.", "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", - "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "When using migration options that continuously replicate / sync data changes from source to the target, the source data and schema can change and drift from the target. During data sync, ensure that all changes on the source are captured and applied to the target during the migration process.", + "guid": "e3d3e084-3276-4d4b-bc01-5bcf219e4a1e", "services": [ - "VWAN", - "NVA", - "VNet", - "SAP", - "WAF" + "SQL" ], - "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", + "severity": "High", + "subcategory": "Migration", + "text": "Ensure that all changes on the source are captured and applied to the target during the migration process.", "waf": "Operations" }, { - "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", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "Ensure that the application is able to succesffuly connect to the managed instance post migration of the databases.", + "guid": "b5887952-5d22-4688-9d30-b66c57be5951", + "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/connect-application-instance?view=azuresql-mi", "services": [ - "SAP", - "WAF", - "VM" + "SQL" ], - "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", + "subcategory": "Migration", + "text": "Test Application Connectivity to MI and Databases", + "waf": "Operations" }, { - "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", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "High availability is a fundamental part of SQL Managed Instance platform that works transparently for your database applications. Failovers from primary to secondary nodes in case of node degradation or fault detection, or during regular monthly software updates are an expected occurrence for all applications using SQL Managed Instance in Azure.", + "guid": "90f83845-c586-4cb2-a1ec-16a1d076ef9f", + "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/user-initiated-failover?view=azuresql", "services": [ - "WAF", - "ASR" + "SQL" ], "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" + "subcategory": "Post Migration", + "text": "Consider executing a manual failover on SQL Managed Instance to test for fault and failover resiliency.", + "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "waf": "Reliability" }, { - "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", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "Ensuring that your applications are failover resilient prior to deploying to production will help mitigate the risk of application faults in production and will contribute to application availability for your customers.", + "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": [ - "WAF" + "LoadBalancer", + "EventHubs", + "SQL" ], "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" + "subcategory": "Post Migration", + "text": "If failover groups have been implemented, Test Manual Failover and Failback and test application connectivity behavior during failover/failback", + "waf": "Reliability" }, { - "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", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "This provides more dedicated disk IOPS and throughput", + "guid": "aa359272-8e6e-4205-8726-76ae46691e88", + "link": "https://techcommunity.microsoft.com/t5/azure-sql-blog/storage-performance-best-practices-and-considerations-for-azure/ba-p/305525", "services": [ "Storage", - "WAF", - "VNet" + "SQL" ], - "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" + "severity": "High", + "subcategory": "Post Migration", + "text": "Optimize Storage Performance for General Purpose Managed Instance", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "waf": "Performance" }, { - "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", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "Many organizations have policies that require that certificates or encryption keys be created and managed internally. If your organization has a similar policy, this architecture might apply to you. If your customers require internal management of these items, the architecture also might apply to you.", + "guid": "35ad9422-23e1-4381-8523-081a94174158", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/data/sql-managed-instance-cmk", "services": [ - "WAF", - "Firewall" + "AKV", + "Backup", + "SQL", + "AzurePolicy" ], - "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/", + "severity": "Low", + "subcategory": "Post Migration", + "text": "Enable Customer managed TDE for taking your own copy only full backups", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", "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", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "The maintenance window feature provides you with the ability to onboard Azure SQL resource to prescheduled time blocks outside of business hours.", + "guid": "33ef7ad7-c6d3-4733-865c-7acbe44bbe60", + "link": "https://learn.microsoft.com/azure/azure-sql/database/planned-maintenance?view=azuresql", "services": [ - "SAP", - "AppGW", - "WAF" + "SQL" ], "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" + "subcategory": "Post Migration", + "text": "Plan for Azure maintenance events", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "By using the long-term retention (LTR) feature, you can store specified SQL Database and SQL Managed Instance full backups in Azure Blob storage with configured redundancy for up to 10 years.", + "guid": "9d89f2e8-7778-4424-b516-785c6fa96b96", + "link": "https://learn.microsoft.com/azure/azure-sql/database/long-term-retention-overview?view=azuresql-mi", "services": [ - "AzurePolicy", - "ACR", - "WAF", - "FrontDoor" + "ARS", + "Backup", + "SQL", + "Storage" ], - "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", + "subcategory": "Post Migration", + "text": "Configure Long Term backup retention, view backups and restore from backups", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "By using Azure Hybrid Benefit, you can achieve cost savings, modernise and maintain a flexible hybrid environment while optimising business applications.", + "guid": "ad88408f-3727-434c-a76b-a28021459014", + "link": "https://azure.microsoft.com/en-gb/pricing/hybrid-benefit/#overview", "services": [ - "AzurePolicy", - "AppGW", - "WAF", - "FrontDoor" + "SQL", + "Cost" ], - "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", + "subcategory": "Post Migration", + "text": "Take advantage of Azure Hybrid Benefit and Azure Reservations where applicable.", + "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", + "waf": "Cost" }, { - "checklist": "WAF checklist", - "guid": "5ada4332-4e13-4811-9231-81aa41742694", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", + "category": "SQL Managed Instance", + "checklist": "SQL Migration Review", + "description": "If you don't have threat protection Advanced Threat Protection is part of the Microsoft Defender for SQL offering, which is a unified package for advanced SQL security capabilities.", + "guid": "65d38e53-f9cc-4bd8-9926-6acca274faa1", + "link": "https://learn.microsoft.com/azure/azure-sql/database/threat-detection-overview?view=azuresql", "services": [ - "LoadBalancer", - "AppGW", - "WAF" + "SQL", + "Defender" ], "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", + "subcategory": "Post Migration", + "text": "Leverage Microsoft Defender for Cloud to improve the overall security posture", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", "waf": "Security" }, { - "checklist": "WAF checklist", - "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "SAP", + "category": "Operations Management", + "checklist": "DNS Review Checklist", + "guid": "a96b96ad-8840-48f3-9273-4c876ba28021", + "link": "https://learn.microsoft.com/azure/dns/private-dns-resiliency", "services": [ - "SAP", - "VWAN", - "ACR", - "WAF" + "DNS", + "VNet" ], - "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": "High", + "subcategory": "Azure Private DNS", + "text": "Verify that Zones are linked to Vnets in multiple regions", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", - "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", - "service": "SAP", + "category": "Operations Management", + "checklist": "DNS Review Checklist", + "guid": "45901465-d38e-453f-accb-d969266acca2", + "link": "https://learn.microsoft.com/azure/dns/private-dns-resiliency", "services": [ - "Storage", - "ACR", - "VNet", - "WAF", - "Backup", - "PrivateLink" + "DNS" ], - "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": "High", + "subcategory": "Azure Private DNS", + "text": "If different Zones are used between regions, verify a plan for making sure that Zones are up to date in a DR failover situation", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", - "service": "SAP", + "category": "Operations Management", + "checklist": "DNS Review Checklist", + "guid": "74faa19b-f39d-495d-94c7-c8919ca1f6d5", + "link": "https://learn.microsoft.com/azure/reliability/reliability-traffic-manager?toc=%2Fazure%2Fdns%2Ftoc.json", "services": [ - "SAP", - "WAF", - "VM" + "DNS", + "TrafficManager", + "ASR" ], - "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": "Medium", + "subcategory": "Azure DNS", + "text": "Plan for disaster recovery with Azure DNS and Traffic Manager", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", - "service": "SAP", + "category": "Operations Management", + "checklist": "DNS Review Checklist", + "guid": "315ae524-ba34-4d45-a5e1-2139bd7bb012", + "link": "https://learn.microsoft.com/azure/dns/private-resolver-reliability#availability-zones", "services": [ - "LoadBalancer", - "WAF" + "DNS" ], "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" + "subcategory": "Azure DNS Resolver", + "text": "Enable availability zones with Private Resolver", + "waf": "Reliability" }, { - "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", + "category": "Operations Management", + "checklist": "DNS Review Checklist", + "guid": "f7b95e06-e154-4e2a-a359-2828e6e20517", + "link": "https://learn.microsoft.com/azure/dns/tutorial-dns-private-resolver-failover", "services": [ - "SAP", - "WAF", - "VNet", - "VM" + "DNS", + "ASR" ], "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" + "subcategory": "Azure DNS Resolver", + "text": "Plan for failover with Private Resolvers in a Disaster Recovery", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "category": "Operations Management", + "checklist": "DNS Review Checklist", + "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": [ - "SAP", - "WAF", - "VNet" + "DNS", + "VM" ], - "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", - "waf": "Performance" + "severity": "Medium", + "subcategory": "VM Based DNS Service", + "text": "Follow VM Guidance for resillency of VM", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "fa96c96a-d885-418f-9827-34c886ba2802", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "category": "Operations Management", + "checklist": "DNS Review Checklist", + "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": [ - "SAP", - "WAF" + "DNS", + "VM", + "Entra" ], "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", - "waf": "Performance" + "subcategory": "VM Based DNS Service", + "text": "IF AD based DNS, follow the Identity -> Windows Server AD path", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "category": "BC and DR", + "checklist": "Azure Data Explorer Review 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", "services": [ - "SAP", - "WAF" + "Storage", + "Cost" ], - "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", - "waf": "Performance" + "subcategory": "Replication", + "text": "Leverage External Tables and Continuous data export overview to reduce costs", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "category": "BC and DR", + "checklist": "Azure Data Explorer Review 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", "services": [ - "SAP", - "Cost", - "WAF", - "VNet" + "Storage" ], - "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" + "subcategory": "Replication", + "text": "To share data, explore Leader-follower cluster configuration", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "402a9846-d515-4061-aff8-cd30088693fa", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", - "service": "SAP", + "category": "BC and DR", + "checklist": "Azure Data Explorer Review 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", "services": [ - "LoadBalancer", - "WAF" + "ASR" ], - "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" + "subcategory": "Replication", + "text": "To protect against regional failure, create Multiple independent clusters, preferably in two Azure Paired regions", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "87585797-5551-4d53-bb7d-a94ee415734d", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", - "service": "SAP", + "category": "BC and DR", + "checklist": "Azure Data Explorer Review 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", "services": [ - "SAP", - "WAF", - "VNet" + "RBAC", + "Storage" ], - "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" + "subcategory": "Replication", + "text": "Replicate all management activities such as creating new tables or managing user roles on each cluster.", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", - "services": [ - "SAP", - "WAF", - "Backup", - "VM" - ], - "severity": "High", - "text": "Review SAP HANA database backups for Azure VMs.", - "waf": "Cost" + "category": "BC and DR", + "checklist": "Azure Data Explorer Review Checklist", + "guid": "18ca6017-0265-4f4b-a46a-393af7f31728", + "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-create-solution", + "service": "Azure Data Explorer", + "services": [], + "subcategory": "Replication", + "text": "Ingest data into each cluster in parallel", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", + "category": "BC and DR", + "checklist": "Azure Data Explorer Review 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", "services": [ - "SAP", - "Monitor", - "WAF", - "ASR" + "ACR" ], - "severity": "Medium", - "text": "Review Site Recovery built-in monitoring, where used for SAP.", - "waf": "Cost" + "subcategory": "DR Configuration", + "text": "For critical application with no tolerance for outages, create Active-Active-Active (always-on) configuration", + "waf": "Reliability" }, { - "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", + "category": "BC and DR", + "checklist": "Azure Data Explorer Review 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", "services": [ - "SAP", - "Monitor", - "WAF" + "ACR" ], - "severity": "High", - "text": "Review the Monitoring the SAP HANA System Landscape guidance.", - "waf": "Operations" + "subcategory": "DR Configuration", + "text": "For critical applications, create Active-Active configuration in two paired regions", + "waf": "Reliability" }, { - "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", + "category": "BC and DR", + "checklist": "Azure Data Explorer Review 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", + "services": [], + "subcategory": "DR Configuration", + "text": "For applications, which required only read during failure, create Active-Hot standby configuration", + "waf": "Reliability" + }, + { + "category": "BC and DR", + "checklist": "Azure Data Explorer Review 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", "services": [ - "WAF", - "Backup", - "VM" + "Storage", + "Cost", + "ASR", + "AzurePolicy" ], - "severity": "Medium", - "text": "Review Oracle Database in Azure Linux VM backup strategies.", - "waf": "Operations" + "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", + "waf": "Reliability" }, { - "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", + "category": "Operations Management", + "checklist": "Azure Data Explorer Review 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", "services": [ - "SQL", - "WAF", - "Storage" + "AzurePolicy" ], - "severity": "Medium", - "text": "Review the use of Azure Blob Storage with SQL Server 2016.", - "waf": "Operations" + "subcategory": "IaC", + "text": "Wrap DevOps and source control around all your code", + "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "waf": "Reliability" + }, + { + "category": "Operations Management", + "checklist": "Azure Data Explorer Review Checklist", + "guid": "1559ab91-53e8-4908-ae28-b84c33b6b780", + "link": "https://learn.microsoft.com/azure/data-explorer/devops", + "service": "Azure Data Explorer", + "services": [], + "subcategory": "IaC", + "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" }, { - "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", - "services": [ - "WAF", - "Backup", - "VM" - ], - "severity": "Medium", - "text": "Review the use of Automated Backup v2 for Azure VMs.", - "waf": "Operations" + "category": "Operations Management", + "checklist": "Azure Data Explorer Review Checklist", + "guid": "8b9fe5c4-1049-4d40-9a82-2c3474d00f18", + "link": "https://learn.microsoft.com/azure/data-explorer/devops", + "service": "Azure Data Explorer", + "services": [], + "subcategory": "IaC", + "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" }, { - "checklist": "WAF checklist", - "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", - "service": "SAP", + "category": "Business Continuity and Disaster Recovery", + "checklist": "Azure Virtual Desktop Review", + "description": "AVD control plane does not offer a financially backed service level agreement. We strive to attain at least 99.9% availability for the Azure Virtual Desktop service URLs. The availability of the session host virtual machines in your subscription is covered by the Virtual Machines SLA. Dependent resources/services and infrastructure availability must be also considered to properly satisfy global high-availability requirements.", + "guid": "56c57ba5-9119-4bf8-b8f5-c586c7d9cdc1", + "link": "https://azure.microsoft.com/support/legal/sla/virtual-desktop/v1_0/", "services": [ - "WAF" + "VM", + "ASR", + "AVD", + "Subscriptions" ], "severity": "High", - "text": "Enabling Write accelerator for M series when using premium disks(V1)", - "waf": "Operations" + "subcategory": "Compute", + "text": "Determine the expected High Availability SLA for applications/desktops published through AVD", + "waf": "Reliability" }, { - "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", + "category": "Business Continuity and Disaster Recovery", + "checklist": "Azure Virtual Desktop Review", + "description": "'Active-Active' model can be achieved with multiple host pools in different regions. A single Host Pool with VMs from different regions is not recommended. If multiple pools for same users will be used, the problem of how to synchronize/replicate user profiles must be solved. FSLogix Cloud Cache could be used, but need to be carefully reviewed and planned, or customers can decide to do not synchronize/replicate at all. 'Active-Passive' can be achieved using Azure Site Recovery (ASR) or on-demand Pool deployment with automated mechanism. For a detailed discussion on multi-region BCDR, please read the companion article in the 'More Info' column and this FSLogix related page: https://learn.microsoft.com/fslogix/concepts-container-recovery-business-continuity.", + "guid": "6acc076e-f9b1-441a-a989-579e76b897e7", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/wvd/azure-virtual-desktop-multi-region-bcdr", "services": [ - "WAF" + "VM", + "Storage", + "ASR", + "AVD" ], "severity": "Medium", - "text": "Test availability zone latency.", - "waf": "Performance" + "subcategory": "Compute", + "text": "Assess Geo Disaster Recovery requirements for AVD Host Pools", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", - "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", - "service": "SAP", + "category": "Business Continuity and Disaster Recovery", + "checklist": "Azure Virtual Desktop Review", + "description": "Before approaching Azure Virtual Desktop BCDR planning and design, it is important to initially consider which applications consumed through AVD are critical. You may want to separate them from non-critical apps and use a separate Host Pool with a different disaster recovery approach and capabilities.", + "guid": "10a7da7b-e996-46e1-9d3c-4ada97cc3d13", + "link": "https://docs.microsoft.com/azure/virtual-desktop/disaster-recovery", "services": [ - "SAP", - "WAF" + "ASR", + "AVD" ], - "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": "Low", + "subcategory": "Compute", + "text": "Separate critical applications in different AVD Host Pools", + "waf": "Reliability" }, { - "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", + "category": "Business Continuity and Disaster Recovery", + "checklist": "Azure Virtual Desktop Review", + "description": "Each Host Pool can be deployed using Availability Zones (AZ) or Availability Set (AS). To maximize resiliency, usage of AZ is recommended: at Host Pool creation time you can decide to spread Host Pool Session Hosts across all available AZ. Usage of AS will not protect from single datacenter failure, then should be used only in regions where AZ are not available. More details on AZ and AVD in the companion article. For a comparison between AZ and AS you can read here: https://learn.microsoft.com/azure/virtual-machines/availability.", + "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": [ - "SAP", - "WAF" + "ASR", + "AVD", + "ACR" ], - "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", + "subcategory": "Compute", + "text": "Plan the best resiliency option for AVD Host Pool deployment", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", - "service": "SAP", + "category": "Business Continuity and Disaster Recovery", + "checklist": "Azure Virtual Desktop Review", + "description": "Azure Backup can be used to protect Host Pool VMs. For Pooled Pools, this is not necessary since should be stateless. Instead, this option can be considered for Personal Host Pools.", + "guid": "4c61fc3f-c14e-4ea6-b69e-8d9a3eec218e", + "link": "https://docs.microsoft.com/azure/virtual-desktop/disaster-recovery", "services": [ - "SQL", - "WAF", - "Monitor" + "Backup", + "VM", + "AVD", + "ASR" ], "severity": "Medium", - "text": "Review SQL Server performance monitoring using CCMS.", - "waf": "Performance" + "subcategory": "Compute", + "text": "Assess the requirement to backup AVD Session Host VMs", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", - "link": "https://me.sap.com/notes/500235", - "service": "SAP", + "category": "Business Continuity and Disaster Recovery", + "checklist": "Azure Virtual Desktop Review", + "description": "Even for Personal Pools, usage of Availability Zones, when available, is recommended. Three possible in-region DR strategies are possible, it is recommended to select the best one based on cost, RTO/RPO, and if it is really necessary to save the entire VM OS disk: (1) create each session host in a specific zone (AZ) and then use Azure Site Recovery (ASR) to replicate to a different zone. (2) Use Azure Backup to backup and restore the specific session host in a different AZ. (3) Create a new session host in a different AZ and rely on FSLogix and/or OneDrive to make data and settings available on the new machine. All options require administrator intervention for DR and direct user assignment at Host Pool level, then must be planned and configured in advance.", + "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": [ - "SAP", - "WAF", - "VM" + "Backup", + "VM", + "ASR", + "AVD", + "Cost" ], "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" + "subcategory": "Compute", + "text": "Prepare a local DR strategy for Personal Host Pool Session Hosts", + "waf": "Reliability" }, { - "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", + "category": "Business Continuity and Disaster Recovery", + "checklist": "Azure Virtual Desktop Review", + "description": "If custom images are used to deploy AVD Host Pool VMs, it is important to ensure those artifacts are available in all regions where AVD is deployed. Azure Compute Gallery service can be used to replicate images across all regions where a Host Pool is deployed, with redundant storage and in multiple copies. Please be aware that the Azure Compute Gallery service isn't a global resource. For disaster recovery scenarios, the best practice is to have at least two galleries, in different regions.", + "guid": "dd2e0d5d-771d-441e-9610-cc57b4a4a141", + "link": "https://learn.microsoft.com/azure/virtual-machines/azure-compute-gallery", "services": [ - "SAP", - "Monitor", - "WAF" + "Storage", + "VM", + "ASR", + "AVD", + "ACR" ], - "severity": "Medium", - "text": "Review SAP HANA studio alerts.", - "waf": "Performance" + "severity": "Low", + "subcategory": "Dependencies", + "text": "Plan for Golden Image cross-region availability", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", - "link": "https://me.sap.com/notes/1969700", - "service": "SAP", + "category": "Business Continuity and Disaster Recovery", + "checklist": "Azure Virtual Desktop Review", + "description": "If users of the AVD infrastructure need on-premises resource access, high availability of network infrastructure required to connect is also critical and should be considered. Resiliency of authentication infrastructure needs to be assessed and evaluated. BCDR aspects for dependent applications and other resources need to be considered to ensure availability in the secondary DR location.", + "guid": "fd339489-8c12-488b-9c6a-57cfb644451e", + "link": "https://docs.microsoft.com/azure/virtual-desktop/disaster-recovery", "services": [ - "SAP", - "WAF" + "ASR", + "AVD" ], "severity": "Medium", - "text": "Perform SAP HANA health checks using HANA_Configuration_Minichecks.", - "waf": "Performance" + "subcategory": "Dependencies", + "text": "Assess Infrastructure & Application dependencies ", + "waf": "Reliability" }, { - "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", + "category": "Business Continuity and Disaster Recovery", + "checklist": "Azure Virtual Desktop Review", + "description": "Not all data inside FSLogix user profiles may deserve protection from disaster. Additionally, if external storage is used, for example OneDrive or File Servers/Shares, what is remaining in the FSLogix profile is minimal and could be lost in some extreme circumstances. In other cases, data inside the profile can be rebuilt from other storages (for example Outlook Inbox in cached mode).", + "guid": "687ab077-adb5-49e5-a960-3334fdf8cc23", + "link": "https://docs.microsoft.com/fslogix/manage-profile-content-cncpt", "services": [ - "WAF", - "VM" + "Storage", + "ASR", + "AVD" ], "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" + "subcategory": "Storage", + "text": "Assess which data need to be protected in the Profile and Office Containers", + "waf": "Reliability" }, { - "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", + "category": "Business Continuity and Disaster Recovery", + "checklist": "Azure Virtual Desktop Review", + "description": "Preventing data loss for critical user data is important, first step is to assess which data need to be saved and protected. If using OneDrive or other external storage, saving user Profile and/or Office Containers data maybe not necessary. Appropriate mechanism must be considered to provide protection for critical user data. Azure Backup service can be used to protect Profile and Office Containers data when stored on Azure Files Standard and Premium tiers. Azure NetApp Files Snapshots and Policies can be used for Azure NetApp Files (all tiers).", + "guid": "fc4972cc-3cd2-45bf-a707-6e9eab4bed32", + "link": "https://docs.microsoft.com/azure/virtual-desktop/disaster-recovery", "services": [ - "SAP", - "WAF" + "Storage", + "Backup", + "ASR", + "AVD", + "AzurePolicy" ], "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", - "waf": "Security" + "subcategory": "Storage", + "text": "Build a backup protection strategy for Profile and Office Containers", + "waf": "Reliability" }, { - "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", + "category": "Business Continuity and Disaster Recovery", + "checklist": "Azure Virtual Desktop Review", + "description": "In AVD, multiple replication mechanisms and strategies can be used for user data residing in FSLogix containers: [Profile Pattern #1]: Native Azure storage replication mechanisms, for example Azure Files Standard GRS replication, Azure NetApp Files Cross Region Replication. Use Zone Replicated Storage (ZRS) or Geo replicated storage (GRS) for Azure Files is recommended. LRS with local-only resiliency can be used if no zone/region protection is required. NOTE: Azure Files Share Standard is LRS/ZRS/GRS, but with 100TB large support enabled only LRS/ZRS are supported. [Profile Pattern #2]: FSLogix Cloud Cache is built in automatic mechanism to replicate containers between different (up to 4) storage accounts. Cloud Cache should be used only when:(1) User Profile or Office containers data availability required high-availability SLA is critical and need to be resilient to region failure. (2) Selected storage option is not able to satisfy BCDR requirements. For example, with Azure File Share Premium tier, or Azure File Share Standard with Large File Support enabled, GRS is not available. (3) When replication between disparate storage is required. [Profile Pattern #3]: Only set up geo disaster recovery for application data and not for user data/profile containers: store important application data in separate storages, like OneDrive or other external storage with its own built-in DR mechanism.", + "guid": "9f7547c1-746d-4c56-868a-714435bd09dd", + "link": "https://docs.microsoft.com/azure/virtual-desktop/disaster-recovery", "services": [ - "SAP", - "SQL", - "WAF" + "Storage", + "ASR", + "AVD" ], - "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" + "severity": "Medium", + "subcategory": "Storage", + "text": "Assess Profile Container storage replication requirements and resiliency for BCDR purpose", + "waf": "Reliability" }, { - "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", + "category": "Business Continuity and Disaster Recovery", + "checklist": "Azure Virtual Desktop Review", + "description": "For local disaster recovery, Azure Backup for Azure Files can be used. For cross-region geo disaster recovery: GRS for Azure Files is only available with standard SKU and no large share support, then not suitable in most customer scenarios. If geo-replication is required with Azure File Share Premium, replication with FSLogix Cloud Cache can be evaluated, or 'in-region' Availability Zone (AZ) only resiliency should be considered.", + "guid": "3d4f3537-c134-46dc-9602-7a71efe1bd05", + "link": "https://docs.microsoft.com/azure/backup/backup-afs", "services": [ - "SQL", - "WAF" + "Backup", + "Storage", + "ASR", + "AVD" ], - "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" + "severity": "Medium", + "subcategory": "Storage", + "text": "Review Azure Files disaster recovery strategy", + "waf": "Reliability" }, { - "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", + "category": "Business Continuity and Disaster Recovery", + "checklist": "Azure Virtual Desktop Review", + "description": "Zone Redundant Storage will maximize in-region resiliency for the user profile data. ZRS is supported for premium file shares through the 'FileStorage' storage account kind. ZRS is supported in standard general-purpose v2 storage accounts. Usage of zone redundant storage must be paired with zone redundant deployment of Session Hosts in each Host Pool. ", + "guid": "10d4e875-d502-4142-a795-f2b6eff34f88", + "link": "https://learn.microsoft.com/azure/storage/files/files-redundancy#zone-redundant-storage", "services": [ "Storage", - "SQL", - "SAP", - "WAF", - "Backup" + "ASR", + "AVD" ], "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" + "subcategory": "Storage", + "text": "Use Zone Redundant Storage (ZRS) for Azure Files to maximize resiliency", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", - "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", - "service": "SAP", + "category": "Business Continuity and Disaster Recovery", + "checklist": "Azure Virtual Desktop Review", + "description": "For local disaster recovery, Azure NetApp Files (ANF) native backup is available. ANF is essentially locally redundant, then for cross-region geo disaster recovery it is necessary to use an additional mechanism that is Cross-Region Replication (CRR) https://learn.microsoft.com/azure/azure-netapp-files/cross-region-replication-create-peering. Currently, ANF does not provide replication nor redundancy across different Availability Zones (AZ), only the possibility to select in which single AZ to place the ANF volume: https://learn.microsoft.com/azure/azure-netapp-files/manage-availability-zone-volume-placement.", + "guid": "23429db7-2281-4376-85cc-57b4a4b18142", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/cross-region-replication-create-peering", "services": [ + "Backup", "Storage", - "WAF" + "ASR", + "AVD", + "ACR" ], "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", - "waf": "Security" + "subcategory": "Storage", + "text": "Review Azure NetApp Files disaster recovery strategy", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", - "link": "https://learn.microsoft.com/azure/key-vault/general/overview", - "service": "SAP", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "Applications can be preinstalled in the golden image/s, can be attached using MSIX & AppAttach feature or distributed to the session hosts after host pool deployment using traditional software distribution methods.", + "guid": "86ba2802-1459-4014-95d3-8e5309ccbd97", + "link": "https://learn.microsoft.com/azure/virtual-desktop/set-up-golden-image", "services": [ - "WAF", - "AKV" + "AVD" ], "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" + "subcategory": "Golden Images", + "text": "Determine how applications will be deployed in AVD Host Pools", + "waf": "Operations" }, { - "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", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "Multiple golden images can be required to support different OS versions and/or settings, different groups of applications that must be separated and cannot be included in a single image.", + "guid": "9266bcca-274f-4aa1-abf3-9d95d44c7c89", + "link": "https://learn.microsoft.com/azure/virtual-desktop/set-up-golden-image", "services": [ - "RBAC", - "AzurePolicy", - "WAF", - "Subscriptions" + "AVD" ], "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", - "waf": "Security" + "subcategory": "Golden Images", + "text": "Estimate the number of golden images that will be required", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "SAP", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "Determine which Guest OS will be used to deploy each Host Pool: Windows 10 vs. Windows Server, Marketplace vs. Custom images", + "guid": "19ca1f6d-5315-4ae5-84ba-34d4585e2213", + "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#operating-systems-and-licenses", "services": [ - "AzurePolicy", - "WAF", - "AKV" + "AVD" ], "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", - "waf": "Security" - }, - { - "checklist": "WAF checklist", - "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", - "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", - "service": "SAP", - "services": [ - "RBAC", - "AzurePolicy", - "WAF" - ], - "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" + "subcategory": "Golden Images", + "text": "Determine which OS image/s you will use for Host Pool deployment", + "waf": "Reliability" }, { - "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", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "Azure VM custom images can be created and stored in different ways: in an Azure Compute Gallery, as a managed image object or as a managed disk in the storage. The recommended way is to use Azure Compute Gallery.", + "guid": "5a2adb2c-3e23-426b-b225-ca44e1696fdd", + "link": "https://learn.microsoft.com/azure/virtual-machines/shared-image-galleries", "services": [ - "SAP", "Storage", - "WAF", - "Defender" - ], - "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" - }, - { - "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", - "services": [ - "RBAC", - "SAP", - "WAF", - "Defender" + "VM", + "AVD" ], - "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", - "waf": "Security" + "severity": "Low", + "subcategory": "Golden Images", + "text": "Select the proper store for custom images", + "waf": "Reliability" }, { - "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", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "If custom images will be used, plan for an automated build process. If no pre-existing software factory exists, consider using Custom Image Templates and/or Azure Image Builder to automate the build process.", + "guid": "9bd7bb01-2f7b-495e-86e1-54e2aa359282", + "link": "https://learn.microsoft.com/azure/virtual-desktop/create-custom-image-templates", "services": [ - "SAP", - "WAF" + "AVD" ], "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" + "subcategory": "Golden Images", + "text": "Design your build process for custom images", + "waf": "Operations" }, { - "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", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "There are some known best practices and recommendations for the golden image customization, be sure to check the referenced article.", + "guid": "deace4cb-1dec-44c6-90c3-fc14eebb36a3", + "link": "https://learn.microsoft.com/azure/virtual-desktop/set-up-golden-image", "services": [ - "WAF", - "AKV" + "AVD" ], "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", - "waf": "Security" - }, - { - "checklist": "WAF checklist", - "guid": "4935ada4-2223-4ece-a1b1-23181a541741", - "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", - "service": "SAP", - "services": [ - "WAF", - "AKV" - ], - "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" - }, - { - "checklist": "WAF checklist", - "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", - "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", - "service": "SAP", - "services": [ - "SAP", - "WAF", - "AKV" - ], - "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" + "subcategory": "Golden Images", + "text": "If custom image will be used, check recommended best practices for AVD on how to build custom image", + "waf": "Operations" }, { - "checklist": "WAF checklist", - "guid": "209d490d-a477-4784-84d1-16785d2fa56c", - "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", - "service": "SAP", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "FSLogix stack installed in AVD session hosts does not provide auto-update capability. For this reason, it is recommended to download the latest version of FSLogix and include in the golden image update process.", + "guid": "ed5c9027-dd1a-4343-86ca-52b199223186", + "link": "https://learn.microsoft.com/fslogix/how-to-install-fslogix", "services": [ - "RBAC", - "SAP", - "WAF", - "Subscriptions" + "AVD" ], "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" + "subcategory": "Golden Images", + "text": "Include the latest version of FSLogix in the golden image update process", + "waf": "Reliability" }, { - "checklist": "WAF checklist", - "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", - "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", - "service": "SAP", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "This tool-set has been created to automatically apply setting referenced in white paper 'Optimizing Windows 10, version 2004 for a Virtual Desktop Infrastructure (VDI) role': https://docs.microsoft.com/windows-server/remote/remote-desktop-services/rds-vdi-recommendations-2004. Usage of the tool and/or optimizations mentioned in the white-paper should be considered. ", + "guid": "829e3fec-2183-4687-a017-7a2b5945bda4", + "link": "https://github.com/The-Virtual-Desktop-Team/Virtual-Desktop-Optimization-Tool", "services": [ - "SAP", - "WAF", - "NVA", - "PrivateLink" + "RBAC", + "AVD" ], - "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": "Low", + "subcategory": "Golden Images", + "text": "Evaluate the usage of Virtual-Desktop-Optimization-Tool", + "waf": "Performance" }, { - "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", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "If OneDrive is used and included in a golden image, be sure to follow the configuration procedure reported in the companion article in the 'More Info' section. Not in scope in this AVD checklist, but OneDrive optimizations like 'Known Folder Redirection' and 'Files On-Demand' should be evaluated used to reduce the space used in FSLogix profiles and provide a better user experience. OneDrive today is not supported for Remote Apps.", + "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", - "WAF", - "VM" + "AVD" ], "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" + "subcategory": "Golden Images", + "text": "Determine if Microsoft OneDrive will be part of AVD deployment", + "waf": "Operations" }, { - "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", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "Be sure to review the requirements and configuration procedure contained in the companion article in the 'More Info' column. Since Teams automatic updates will be disabled, it is recommended to check and include Teams latest version in the golden image update process.", + "guid": "b5887953-5d22-4788-9d30-b66c67be5951", + "link": "https://learn.microsoft.com/azure/virtual-desktop/teams-on-AVD", "services": [ - "WAF", - "Defender" + "AVD" ], "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" + "subcategory": "Golden Images", + "text": "Determine if Microsoft Teams will be part of AVD deployment", + "waf": "Performance" }, { - "checklist": "WAF checklist", - "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "AVD can support users with different language and localization requirements in the same host pool. This can be done customizing golden images to ensure users can select whichever language they need. The procedure to configure additional language packs in Windows 11 is documented in the reference article.", + "guid": "7c336f3b-822a-498e-8cd1-667d1150df4a", + "link": "https://learn.microsoft.com/azure/virtual-desktop/windows-11-language-packs", "services": [ - "SAP", - "WAF", - "VNet" + "AVD" ], - "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" + "severity": "Low", + "subcategory": "Golden Images", + "text": "Assess the requirement to support multiple languages", + "waf": "Reliability" }, { - "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", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "It is highly recommended to use separate storage accounts/shares to store MSIX packages. If necessary, storage can scale out independently and not being impacted by profile I/O activities. Azure offers multiple storage options that can be used for MISX app attach. We recommend using Azure Files or Azure NetApp Files as those options offer the best value between cost and management overhead. ", + "guid": "90083845-c587-4cb3-a1ec-16a1d076ef9f", + "link": "https://docs.microsoft.com/azure/virtual-desktop/app-attach-file-share", "services": [ - "SAP", - "WAF" + "Storage", + "Cost", + "AVD" ], - "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" + "severity": "Medium", + "subcategory": "MSIX & AppAttach", + "text": "Do not use the same storage account/share as FSLogix profiles", + "waf": "Performance" }, { - "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", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "In the referenced article, we reported few but important performance considerations for MSIX usage in AVD context, be sure to carefully review.", + "guid": "241addce-5793-477b-adb3-751ab2ac1fad", + "link": "https://docs.microsoft.com/azure/virtual-desktop/app-attach-file-share", "services": [ - "SAP", - "Monitor", - "WAF", - "AKV" + "AVD" ], "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", - "waf": "Security" + "subcategory": "MSIX & AppAttach", + "text": "Review performance considerations for MSIX", + "waf": "Performance" }, { - "category": "Automation", - "checklist": "SAP Checklist", - "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", - "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", - "service": "SAP", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "MSIX app attach requires read-only permissions to access the file share. If you're storing your MSIX applications in Azure Files, then for your session hosts, you'll need to assign all session host VMs both storage account role-based access control (RBAC) and file share New Technology File System (NTFS) permissions on the share.", + "guid": "66e15d4d-5a2a-4db2-a3e2-326bf225ca41", + "link": "https://docs.microsoft.com/azure/virtual-desktop/app-attach-file-share", "services": [ - "SAP" + "RBAC", + "Storage", + "VM", + "AVD" ], "severity": "Medium", - "subcategory": "ACSS", - "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" + "subcategory": "MSIX & AppAttach", + "text": "Check proper session host permissions for MSIX share", + "waf": "Security" }, { - "category": "Automation", - "checklist": "SAP 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", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "3rd-party software vendor must provide a MSIX package, it is not recommended for customer to attempt the conversion procedure without proper support from the application owner.", + "guid": "bd362caa-ab79-4b19-adab-81932c9fc9d1", + "link": "https://docs.microsoft.com/azure/virtual-desktop/app-attach-faq", "services": [ - "SAP" + "AVD" ], - "severity": "Medium", - "subcategory": "SDAF", - "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", + "severity": "Low", + "subcategory": "MSIX & AppAttach", + "text": "MSIX packages for 3rd-party applications", + "waf": "Cost" + }, + { + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "MSIX app attach doesn't support auto-update for MSIX applications, so they should be disabled.", + "guid": "bb88037f-5e6b-4fbb-aed5-03547cc447e8", + "link": "https://docs.microsoft.com/azure/virtual-desktop/app-attach-faq", + "services": [ + "AVD" + ], + "severity": "Low", + "subcategory": "MSIX & AppAttach", + "text": "Disable auto-update for MSIX packages", "waf": "Operations" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", - "service": "SAP", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "In order to leverage MSIX & App Attach, guest OS image for AVD Host pool must be Windows 10/11 Enterprise or Windows 10/11 Enterprise Multi-session, version 2004 or later.", + "guid": "26128a71-f0f1-4cac-9d9e-f1d5e832e42e", + "link": "https://docs.microsoft.com/azure/virtual-desktop/app-attach-faq", "services": [ - "SAP", - "Backup", - "ASR" + "AVD" ], "severity": "Medium", - "subcategory": "Backup and restore", - "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", + "subcategory": "MSIX & AppAttach", + "text": "Review operating systems support", "waf": "Reliability" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", - "service": "SAP", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "Once selected the VM SKU that will be used for Host Pool deployment, it is recommended to use Gen2 type of the SKU for higher security and improved capabilities.", + "guid": "e4633254-3185-40a1-b120-bd563a1c8e9d", + "link": "https://docs.microsoft.com/azure/virtual-machines/generation-2", "services": [ - "SAP", - "Backup", - "ASR" + "VM", + "AVD" ], "severity": "Medium", - "subcategory": "Disaster recovery", - "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" + "subcategory": "Session Host", + "text": "Evaluate the usage of Gen2 VM for Host Pool deployment", + "waf": "Performance" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "b651423c-8552-42db-a545-5cb50c05527a", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "SAP", + "category": "Compute", + "checklist": "Azure Virtual Desktop Review", + "description": "MMR redirects the media content from Session Host to your local machine for faster processing and rendering. It only works when you play media content on Microsoft Edge or Google Chrome. See linked URL for more details.", + "guid": "adecb27f-dc40-40f5-aca2-0090f633b1c9", + "link": "https://learn.microsoft.com/azure/virtual-desktop/multimedia-redirection", "services": [ - "Storage", - "ASR", - "SQL", - "SAP", - "Backup" + "AVD" ], - "severity": "High", - "subcategory": "Disaster recovery", - "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" + "severity": "Low", + "subcategory": "Session Host", + "text": "Consider using MMR (MultiMedia Redirection) to get better video performance on browser", + "waf": "Performance" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "A host pool is a collection of Azure virtual machines that register to Azure Virtual Desktop as session hosts. A host pool can be one of two types: Personal and Pooled. Which type to use, and how many, is a key design decision that must be documented and validated. See companion article in 'More Info' column for more details.", + "guid": "8468c55a-775c-46ee-a5b8-6ad8844ce3b2", + "link": "https://learn.microsoft.com/azure/virtual-desktop/terminology#host-pools", "services": [ - "SAP", - "ASR" + "VM", + "AVD" ], - "severity": "Medium", - "subcategory": "Disaster recovery", - "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" + "severity": "High", + "subcategory": "Capacity Planning", + "text": "Determine the Host Pool type to use", + "waf": "Cost" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", - "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "Use your design criteria to determine the number of Host Pools to deploy. This will be based on factors such as different OS images, multi-region support, guest VM hardware differences (such as GPU support or no), different user expectations and uptime requirements (examples might be 'Executives', 'Office Workers', 'Developers', etc.), and Host Pool RDP settings (such as drive redirection support). These will determine the number of host pools as well as how many hosts will be in each pool.", + "guid": "4e98495f-d3c0-4af2-aa59-a793395a32a7", + "link": "https://learn.microsoft.com/azure/virtual-desktop/terminology?WT.mc_id=Portal-fx#host-pools", "services": [ - "SAP", - "ExpressRoute", - "VPN", - "ASR" + "VM", + "AVD" ], "severity": "High", - "subcategory": "Disaster recovery", - "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" + "subcategory": "Capacity Planning", + "text": "Estimate the number of different Host Pools to deploy ", + "waf": "Performance" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "Confirm that the difference between automatic and direct assignment is well understood and the selected option is appropriate for the scenario in question. Automatic is the default setting.", + "guid": "b38b875b-a1cf-4204-a901-3a5d3ce474db", + "link": "https://docs.microsoft.com/azure/virtual-desktop/configure-host-pool-personal-desktop-assignment-type", "services": [ - "SAP", - "ACR", - "AKV", - "ASR" + "AVD" ], "severity": "Low", - "subcategory": "Disaster recovery", - "text": "Replicate key vault contents like certificates, secrets, or keys across regions so you can decrypt data in the DR region.", - "waf": "Reliability" + "subcategory": "Capacity Planning", + "text": "For Personal Host Pool type, select the proper assignment type", + "waf": "Operations" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "Check which one to use and available options, autoscale ignores existing load-balancing algorithms.", + "guid": "cbd8682a-6abc-4a2a-9fda-1dbf3dc95d48", + "link": "https://docs.microsoft.com/azure/virtual-desktop/host-pool-load-balancing", "services": [ - "SAP", - "VNet", - "ASR" + "AVD" + ], + "severity": "Low", + "subcategory": "Capacity Planning", + "text": "For Pooled Host Pool type, select the best load balancing method", + "waf": "Performance" + }, + { + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "The number of cores increase, the system's synchronization overhead also increases. Especially for multiple user's sign-in simultaneously. Make sure not to use a VM that is too large for the session host", + "guid": "b3724959-4943-4577-a3a9-e10ff6345f24", + "link": "https://learn.microsoft.com/windows-server/remote/remote-desktop-services/virtual-machine-recs", + "services": [ + "VM", + "AVD" ], "severity": "Medium", - "subcategory": "Disaster recovery", - "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" + "subcategory": "Capacity Planning", + "text": "For Pooled Host Pool type, VMs shouldn't have more than 32 cores", + "waf": "Performance" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "AVD does not support assigning both the RemoteApp and Desktop Application Group (DAG) in a single host pool to the same set of users. Doing so will cause a single user to have two user sessions in a single host pool. Users aren't supposed to have two active sessions at the same time in the same host pool using the same profile.", + "guid": "b384b7ed-1cdd-457e-a2cd-c8d4d55bc144", + "link": "https://learn.microsoft.com/azure/virtual-desktop/terminology?WT.mc_id=Portal-fx#application-groups", "services": [ - "SAP", "Storage", - "ASR" + "AVD" ], - "severity": "Low", - "subcategory": "Disaster recovery", - "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": "High", + "subcategory": "Capacity Planning", + "text": "Do not use the same Host Pool to offer both full desktops (DAG) and Remote Apps to the same set of users", + "waf": "Security" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "There is a limit of 500 Application Groups that can be created in AVD for each Microsoft Entra ID (former Azure AD) tenant. The limit can be increased (see the companion link for details) but it is not recommended.", + "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": [ - "SAP", - "ASR" + "Entra", + "AVD", + "ACR" ], - "severity": "High", - "subcategory": "Disaster recovery", - "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", + "severity": "Medium", + "subcategory": "Capacity Planning", + "text": "Estimate the number of Application Groups required across all Host Pools in the Microsoft Entra ID tenant", "waf": "Reliability" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", - "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "Applications are grouped under Application Groups as containers for publishing and assigning permissions: we recommend that you do not publish more than 50 applications per application group.", + "guid": "fa9f2895-473d-439b-ab8e-5a5cf92c7f32", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/wvd/windows-virtual-desktop#considerations", "services": [ - "SAP", - "VNet", - "ASR" + "AVD" ], - "severity": "High", - "subcategory": "Disaster recovery", - "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", + "severity": "Low", + "subcategory": "Capacity Planning", + "text": "Estimate the number of Applications for each Application Group", "waf": "Reliability" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "FSLogix is not required for Personal Host Pools since each VM is statically assigned to a single user, then no immediate needs for a roaming profile solution. In some usage scenarios FSLogix can help. For example, a VM can be re-assigned, or user moved to another desktop, or roaming profile can be used to save user profile in a different location for DR purposes.", + "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": [ - "SAP", - "Entra", + "Storage", "VM", - "ASR" + "AVD" ], - "severity": "High", - "subcategory": "Disaster recovery", - "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/", + "severity": "Low", + "subcategory": "Capacity Planning", + "text": "Evaluate the usage of FSLogix for Personal Host Pools", "waf": "Reliability" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP 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", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "Use the link provided to set a starting point for SKU decision, then validate using a performance test. Ensure a minimum of four cores for Production is selected per Session Host (multi-session)", + "guid": "e1112dbd-7ba0-412e-9b94-ef6e047d2ea2", + "link": "https://docs.microsoft.com/windows-server/remote/remote-desktop-services/virtual-machine-recs", "services": [ - "SAP", - "ASR" + "VM", + "AVD" ], "severity": "High", - "subcategory": "High availability", - "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" + "subcategory": "Capacity Planning", + "text": "Run workload performance test to determine the best Azure VM SKU and size to use", + "waf": "Performance" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "It is critical to check AVD capacity and limits reported in the referenced article. Additional limits and thresholds apply for network, compute, storage and service management. ", + "guid": "992b1cd6-d2f5-44b2-a769-e3a691e8838a", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/wvd/windows-virtual-desktop#considerations", "services": [ - "SAP", - "ASR" + "Storage", + "AVD" ], "severity": "High", - "subcategory": "High availability", - "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", + "subcategory": "Capacity Planning", + "text": "Verify AVD scalability limits for the environment", "waf": "Reliability" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "Host Pools with GPU require special configuration, please be sure to review the referenced article.", + "guid": "c936667e-13c0-4056-94b1-e945a459837e", + "link": "https://docs.microsoft.com/azure/virtual-desktop/configure-vm-gpu", "services": [ - "SAP", - "Storage", - "VM", - "ASR" + "AVD" ], - "severity": "High", - "subcategory": "High availability", - "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" + "severity": "Low", + "subcategory": "Capacity Planning", + "text": "Determine if Session Hosts will require GPU", + "waf": "Performance" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", - "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "Whenever is possible, it is recommended to leverage VM SKUs with Accelerated Networking feature. This feature does require specific VM SKU/size and OS versions, please see the list and requirement in the companion article.", + "guid": "b47a393a-0803-4272-a479-8b1578b219a4", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", "services": [ - "SAP", - "Storage", - "ASR" + "VM", + "AVD" ], - "severity": "High", - "subcategory": "High availability", - "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" + "severity": "Low", + "subcategory": "Capacity Planning", + "text": "Use Azure VM SKUs able to leverage Accelerated Networking", + "waf": "Performance" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", - "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "For proper planning and deployment, it is important to assess the maximum number of concurrent and total users for each Host Pool. Additionally, users from different regions may require different Host Pools to ensure the best user experience.", + "guid": "bb91a33d-90ca-4e2c-a881-3706f7c0cb9f", + "link": "https://learn.microsoft.com/azure/virtual-desktop/overview", "services": [ - "SAP", - "ASR" + "AVD" ], - "severity": "High", - "subcategory": "High availability", - "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" + "severity": "Medium", + "subcategory": "Clients & Users", + "text": "Assess how many users will connect to AVD and from which regions", + "waf": "Performance" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP 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", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "The dependencies on resources external to the AVD pool should be assessed and reviewed, for example Active Directory, external file shares or other storage, on-premises services and resources, network infrastructure components like VPN and or ExpressRoute, external services and 3rd-party components. For all these resources, latency from the AVD Host Pool needs to be evaluated and connectivity considered. Additionally, BCDR considerations need to be applied to these dependencies as well.", + "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": [ - "SAP", - "LoadBalancer", - "ASR" + "VPN", + "Storage", + "AVD", + "ExpressRoute" ], - "severity": "High", - "subcategory": "High availability", - "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" + "severity": "Medium", + "subcategory": "Clients & Users", + "text": "Assess external dependencies for each Host Pool", + "waf": "Performance" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "AVD offers a variety of client types (fat, thin, web) to connect over different platforms (Windows, MacOS, iOS, Android). Review limitations of each client and compare multiple options when possible.", + "guid": "a1f6d565-99e5-458b-a37d-4985e1112dbd", + "link": "https://learn.microsoft.com/azure/virtual-desktop/users/connect-windows", "services": [ - "SAP", - "LoadBalancer", - "ASR" + "AVD" ], - "severity": "High", - "subcategory": "High availability", - "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" + "severity": "Low", + "subcategory": "Clients & Users", + "text": "Review user client OS used and AVD client type", + "waf": "Performance" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "Depending on the user locations, and AVD region deployment, users may have a non-optimal experience, hence is important to test as soon as possible in a small PoC environment. Run the 'Azure Virtual Desktop Experience Estimator' tool to select the best Azure region to deploy Host Pools. Beyond 150ms latency, user experience may be not optimal.", + "guid": "d2f54b29-769e-43a6-a1e8-838ac936667e", + "link": "https://azure.microsoft.com/services/virtual-desktop/assessment/", "services": [ - "SAP", - "ASR" + "AVD" ], "severity": "High", - "subcategory": "High availability", - "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" + "subcategory": "Clients & Users", + "text": "Run a PoC to validate end-to-end user experience and impact of network latency", + "waf": "Performance" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP 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", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "RDP settings can currently only be configured at the host pool level, not per user/group. If different settings are required for different set of users, it is recommended to create multiple Host Pools.", + "guid": "3b365a5c-7acb-4e48-abe5-4cd79f2e8776", + "link": "https://docs.microsoft.com/azure/virtual-desktop/customize-rdp-properties", "services": [ - "SAP", - "ASR", - "VM", - "Entra" + "AVD" ], - "severity": "High", - "subcategory": "High availability", - "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" + "severity": "Low", + "subcategory": "Clients & Users", + "text": "Assess and document RDP settings for all user groups", + "waf": "Security" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "cbe05bbe-209d-4490-ba47-778424d11678", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "AVD is a non-regional service, Host Pools can be created in any region, automatic redirection from closest front-end will happen automatically.", + "guid": "42e52f47-21d9-428c-8b1b-d521e44a29a9", + "link": "https://azure.microsoft.com/global-infrastructure/services/?products=virtual-desktop", "services": [ - "RBAC", - "VM", - "ASR", - "Entra", - "SAP" + "AVD" ], "severity": "High", - "subcategory": "High availability", - "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" + "subcategory": "General", + "text": "Determine in which Azure regions AVD Host Pools will be deployed.", + "waf": "Performance" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", - "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "AVD must store metadata to support the service; this is stored in the specified geography. However, this is independent of the regions where Host Pools are located.", + "guid": "bad37ead-53cc-47ce-8d7a-aab3571449ab", + "link": "https://docs.microsoft.com/azure/virtual-desktop/data-locations", "services": [ - "SAP", - "ASR" + "AVD" ], "severity": "Medium", - "subcategory": "High availability", - "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", + "subcategory": "General", + "text": "Determine metadata location for AVD service", "waf": "Reliability" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "9674e7c7-7796-4181-8920-09f4429543ba", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", + "category": "Foundation", + "checklist": "Azure Virtual Desktop Review", + "description": "Check for specific VM SKUs, especially if you need GPU or high-specs SKUs, and eventually Azure NetApp Files if used.", + "guid": "8053d89e-89dc-47b3-9be2-a1a27f7a9e91", + "link": "https://docs.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", "services": [ - "SAP", + "Storage", "VM", - "ASR" + "AVD" ], - "severity": "High", - "subcategory": "High availability", - "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", + "severity": "Low", + "subcategory": "General", + "text": "Check Azure quotas and availability for specific VM sizes and types in the selected regions", "waf": "Reliability" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "category": "Identity", + "checklist": "Azure Virtual Desktop Review", + "description": "AD DCs in Azure are recommended (at least two in different AZ) to reduce latency for users logging into AVD session hosts, and eventually for Azure NetApp Files and AD integration. A DC need to be able to talk to DCs for ALL child domains. As alternative, on-premise connectivity must be used to reach AD DCs.", + "guid": "c14aea7e-65e8-4d9a-9aec-218e6436b073", + "link": "https://docs.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", "services": [ - "SAP", - "ASR", - "Entra" + "Entra", + "Storage", + "VNet", + "AVD" ], - "severity": "High", - "subcategory": "High availability", - "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.", + "severity": "Medium", + "subcategory": "Active Directory", + "text": "Create at least two Active Directory Domain Controllers (DCs) in Azure VNet environment close to AVD Host Pool", "waf": "Reliability" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "category": "Identity", + "checklist": "Azure Virtual Desktop Review", + "description": "Recommended to create a separate OU per Host Pool under a separate OU hierarchy. These OUs will contain machine accounts of AVD Session Hosts. ", + "guid": "6db55f57-9603-4334-adf9-cc23418db612", + "link": "https://docs.microsoft.com/azure/virtual-desktop/create-host-pools-azure-marketplace", "services": [ - "SAP", - "ACR", - "ASR" + "Entra", + "AVD" ], - "severity": "High", - "subcategory": "High availability", - "text": "Use one proximity placement group per SAP SID. Groups don't span across Availability Zones or Azure regions", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Active Directory", + "text": "Create a specific OU in Active Directory for each Host Pool", + "waf": "Operations" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP 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", + "category": "Identity", + "checklist": "Azure Virtual Desktop Review", + "description": "Carefully review, and potentially block/filter inheritance of GPOs to the OUs containing AVD Host Pools. ", + "guid": "7126504b-b47a-4393-a080-327294798b15", + "link": "https://docs.microsoft.com/previous-versions/windows/desktop/Policy/group-policy-hierarchy", "services": [ - "SAP", - "ASR", - "Entra" + "Entra", + "AVD" ], - "severity": "High", - "subcategory": "High availability", - "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" + "severity": "Medium", + "subcategory": "Active Directory", + "text": "Review Domain GPOs that will be applied to OU and impacting Host Pool Session Hosts functionalities", + "waf": "Operations" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "ed46b937-913e-4018-9c62-8393ab037e53", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", - "service": "SAP", + "category": "Identity", + "checklist": "Azure Virtual Desktop Review", + "description": "If Active Directory Domain GPOs are used, it is recommended to configure FSLogix using the built-in provided GPO ADMX template referenced in the companion article in the 'More Info' column", + "guid": "2226a8e3-50a4-4ac3-8bd6-ee150553051f", + "link": "https://learn.microsoft.com/fslogix/how-to-use-group-policy-templates", "services": [ - "SAP", - "ASR", - "VM", - "Entra" + "Entra", + "AVD" ], "severity": "Medium", - "subcategory": "High availability", - "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" + "subcategory": "Active Directory", + "text": "Configure FSLogix settings using the built-in provided GPO ADMX template", + "waf": "Operations" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP 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", + "category": "Identity", + "checklist": "Azure Virtual Desktop Review", + "description": "It is recommended to have a specific dedicated account with minimal permissions, and without the default 10 joins limitation. Review the companion article for more details.", + "guid": "347dc560-28a7-41ff-b1cd-15dd2f0d5e77", + "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#session-hosts", "services": [ - "SAP", - "Storage", + "Entra", "VM", - "ASR" + "AVD" ], "severity": "Medium", - "subcategory": "High availability", - "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" + "subcategory": "Active Directory", + "text": "Create a dedicated user account with only permissions to join VM to the domain", + "waf": "Security" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP 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", + "category": "Identity", + "checklist": "Azure Virtual Desktop Review", + "description": "Avoid granting access per user, instead use AD groups and replicate them using Active Directory Connector (ADC) in Microsoft Entra ID (former Azure AD). ", + "guid": "2d41e361-1cc5-47b4-a4b1-410d43958a8c", + "link": "https://docs.microsoft.com/azure/virtual-desktop/manage-app-groups", "services": [ - "SAP", - "ASR" + "Entra", + "AVD" ], "severity": "Medium", - "subcategory": "High availability", - "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" + "subcategory": "Active Directory", + "text": "Create a domain user group for each set of users that will be granted access to each Host Pool Application Group (DAG or RAG)", + "waf": "Security" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", + "category": "Identity", + "checklist": "Azure Virtual Desktop Review", + "description": "If Azure Files Active Directory (AD) integration is used, as part of the configuration procedure, an AD account to represent the storage account (file share) will be created. You can choose to register as a computer account or service logon account, see FAQ for details. For computer accounts, there is a default password expiration age set in AD at 30 days. Similarly, the service logon account may have a default password expiration age set on the AD domain or Organizational Unit (OU). For both account types, we recommend you check the password expiration age configured in your AD environment and plan to update the password of your storage account identity of the AD account before the maximum password age. You can consider creating a new AD Organizational Unit (OU) in AD and disabling password expiration policy on computer accounts or service logon accounts accordingly.", + "guid": "2289b3d6-b57c-4fc6-9546-1e1a3e3453a3", + "link": "https://docs.microsoft.com/azure/storage/files/storage-files-identity-ad-ds-enable", "services": [ - "SAP", + "Entra", "Storage", - "ASR" + "AVD", + "AzurePolicy" ], "severity": "High", - "subcategory": "Storage", - "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" + "subcategory": "Active Directory", + "text": "Review your organization password expiration policy for accounts used by Azure Files AD integration", + "waf": "Security" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", - "service": "SAP", + "category": "Identity", + "checklist": "Azure Virtual Desktop Review", + "description": "You can configure this using Active Directory Connect (ADC) or Azure AD Domain Services (for hybrid or cloud organizations). Microsoft Entra ID is the new name for Azure Active Directory (Azure AD).", + "guid": "5119bf8e-8f58-4542-a7d9-cec166cd072a", + "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#identity", "services": [ - "SAP", - "Storage", - "ASR" + "Entra", + "AVD" ], "severity": "High", - "subcategory": "Storage", - "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", + "subcategory": "Active Directory", + "text": "A Windows Server Active Directory forest/domain must be in sync with Microsoft Entra ID", "waf": "Reliability" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", - "service": "SAP", + "category": "Identity", + "checklist": "Azure Virtual Desktop Review", + "description": "If Azure Files is used and pre-requisites can be satisfied, it is recommended to configure (Microsoft Entra ID) Kerberos authentication. This configuration will allow to store FSLogix profiles that can be accessed by hybrid user identities from Azure AD-joined session hosts without requiring network line-of-sight to domain controllers.", + "guid": "e777fd5e-c5f1-4d6e-8fa9-fc210b88e338", + "link": "https://learn.microsoft.com/azure/storage/files/storage-files-identity-auth-hybrid-identities-enable", "services": [ - "SAP", + "Entra", "Storage", - "ASR" + "AVD" ], - "severity": "High", - "subcategory": "Storage", - "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" + "severity": "Medium", + "subcategory": "Microsoft Entra ID", + "text": "Configure Azure Files share for Microsoft Entra ID (former Azure AD) Kerberos authentication on Microsoft Entra ID Joined scenario", + "waf": "Security" }, { - "category": "Business Continuity and Disaster Recovery", - "checklist": "SAP Checklist", - "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", - "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", - "service": "SAP", + "category": "Identity", + "checklist": "Azure Virtual Desktop Review", + "description": "An Azure subscription must be parented to the same Microsoft Entra ID (former Azure AD) tenant, that contains a virtual network that either contains or is connected to the Windows Server Active Directory Domain Services or Microsoft Entra ID Domain Services instance.", + "guid": "6ceb5443-5125-4922-9442-93bb628537a5", + "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#identity", "services": [ - "SAP", - "Storage", - "ASR" + "Entra", + "VNet", + "AVD", + "Subscriptions" ], "severity": "High", - "subcategory": "Storage", - "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.", + "subcategory": "Requirements", + "text": "A Microsoft Entra ID tenant must be available with at least one subscription linked", "waf": "Reliability" }, { - "category": "Cost Optimization", - "checklist": "SAP 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", - "services": [ - "SAP", - "Cost" - ], - "severity": "Medium", - "subcategory": " ", - "text": "Automate SAP System Start-Stop to manage costs.", - "waf": "Cost" - }, - { - "category": "Cost Optimization", - "checklist": "SAP Checklist", - "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", + "category": "Identity", + "checklist": "Azure Virtual Desktop Review", + "description": "Azure Virtual Desktop supports different types of identities depending on which configuration you choose. Please review the supported scenarios mentioned in the 'More Info' article and document the design decision accordingly in the 'Comment' column. Critically, external identities (B2B or B2C) are not supported. Be sure to review also the list of supported scenarios in https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#supported-identity-scenarios.", + "guid": "b4ce4781-7557-4a1f-8043-332ae199d44c", + "link": "https://learn.microsoft.com/azure/virtual-desktop/authentication", "services": [ - "SAP", - "Storage", - "Cost", - "VM" + "Entra", + "AVD" ], - "severity": "Low", - "subcategory": " ", - "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", + "subcategory": "Requirements", + "text": "Review and document your identity scenario", + "waf": "Security" }, { - "category": "Cost Optimization", - "checklist": "SAP Checklist", - "guid": "9877f353-2591-4e8b-8381-e9043fed1010", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", + "category": "Identity", + "checklist": "Azure Virtual Desktop Review", + "description": "Users need accounts that are in Microsoft Entra ID (former Azure AD). If you're also using AD DS or Azure AD Domain Services in your deployment of Azure Virtual Desktop, these accounts will need to be hybrid identities, which means the user accounts are synchronized. If you're using Microsoft Entra ID with AD DS, you'll need to configure Azure AD Connect to synchronize user identity data between AD DS and Microsoft Entra ID. If you're using Microsoft Entra ID with Azure AD Domain Services, user accounts are synchronized one way from Microsoft Entra ID to Azure AD Domain Services. This synchronization process is automatic. AVD also supports Microsoft Entra ID native accounts with some restrictions. External identities (B2B or B2C) are not supported.", + "guid": "f9b141a8-98a5-435e-9378-97e71ca7da7b", + "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#supported-identity-scenarios", "services": [ - "SAP", - "Storage", - "Cost", - "VM" + "Entra", + "AVD" ], - "severity": "Low", - "subcategory": " ", - "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": "Medium", + "subcategory": "Requirements", + "text": "Assess User Account types and requirements", + "waf": "Security" }, { - "category": "Identity and Access", - "checklist": "SAP Checklist", - "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", - "service": "SAP", + "category": "Identity", + "checklist": "Azure Virtual Desktop Review", + "description": "AVD supports SSO using either Active Directory Federation Services (AD FS) or Microsoft Entra ID (former Azure AD) authentication. The latter is recommended, please check the requirements and limitation in the 'More Info' article. Using AD FS could be a viable choice if already present in the customer environment, it is not recommended to deploy a brand new ADFS infrastructure just for AVD SSO implementation.", + "guid": "5f9f680a-ba07-4429-bbf7-93d7071561f4", + "link": "https://learn.microsoft.com/azure/virtual-desktop/authentication#single-sign-on-sso", "services": [ - "RBAC", - "SAP", "Entra", - "Subscriptions" + "AVD" ], - "severity": "High", - "subcategory": "Identity", - "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" + "severity": "Medium", + "subcategory": "Requirements", + "text": "If Single-Sign On (SSO) is a requirement, review the supported scenarios and prerequisites", + "waf": "Reliability" }, { - "category": "Identity and Access", - "checklist": "SAP Checklist", - "guid": "45911475-e39e-4530-accc-d979366bcda2", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", + "category": "Identity", + "checklist": "Azure Virtual Desktop Review", + "description": "VMs can be Windows Active Directory (AD) domain-joined, Hybrid AD-joined, Microsoft Entra ID (former Azure AD) Joined or Azure AD Domain Services joined. Be sure to review supported scenarios, limitations and requirements from the referenced article.", + "guid": "ea962a15-9394-46da-a7cc-3923266b2258", + "link": "https://learn.microsoft.com/azure/virtual-desktop/prerequisites?tabs=portal#supported-identity-scenarios", "services": [ - "SAP", - "Entra" + "Entra", + "VM", + "AVD" ], - "severity": "Medium", - "subcategory": "Identity", - "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", + "severity": "High", + "subcategory": "Requirements", + "text": "Select the proper AVD Session Host domain join type", "waf": "Security" }, { - "category": "Identity and Access", - "checklist": "SAP Checklist", - "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", + "category": "Identity", + "checklist": "Azure Virtual Desktop Review", + "description": "Compare self-managed Windows Active Directory Domain Services, Microsoft Entra ID (former Azure AD), and managed Azure AD Domain Services (AAD-DS)", + "guid": "6f4a1651-bddd-4ea8-a487-cdeb4861bc3b", + "link": "https://docs.microsoft.com/azure/active-directory-domain-services/compare-identity-solutions", "services": [ - "SAP", - "Entra" + "Entra", + "AVD" ], - "severity": "Medium", - "subcategory": "Identity", - "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" + "severity": "Low", + "subcategory": "Requirements", + "text": "Before using Azure AD Domain Services (AAD-DS) for AVD, be sure to review the limitations.", + "waf": "Reliability" }, { - "category": "Identity and Access", - "checklist": "SAP Checklist", - "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "AVD provides administrative templates for Intune and Active Directory GPO. Using these templates it is possible to centrally control several AVD configuration settings: Graphics related data logging, Screen capture protection, RDP Shortpath for managed networks, Watermarking. See companion article in 'More Info' colum for details. NOTE: FSLogix has its own separate template.", + "guid": "5549524b-36c0-4f1a-892b-ab3ca78f5db2", + "link": "https://learn.microsoft.com/azure/virtual-desktop/administrative-template", "services": [ - "SAP", - "Entra" + "Entra", + "AVD", + "Monitor" ], - "severity": "Medium", - "subcategory": "Identity", - "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" + "severity": "Low", + "subcategory": "Management", + "text": "Use built-in provided administrative templates for AVD settings configuration", + "waf": "Operations" }, { - "category": "Identity and Access", - "checklist": "SAP Checklist", - "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", - "service": "SAP", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "Determine if a configuration management tool is already in place to manage Host Pool VM configuration after initial deployment, For example SCCM/SCOM, Intune/ConfigurationManager, 3rd-party solutions.", + "guid": "3334fdf9-1c23-4418-8b65-285269440b4b", + "link": "https://learn.microsoft.com/azure/virtual-desktop/management", "services": [ - "SAP", - "Entra" + "VM", + "AVD", + "Monitor" ], - "severity": "Medium", - "subcategory": "Identity", - "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" + "severity": "Low", + "subcategory": "Management", + "text": "Plan AVD Session Hosts configuration management strategy", + "waf": "Operations" }, { - "category": "Identity and Access", - "checklist": "SAP Checklist", - "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "We recommend using Microsoft Intune, if requirements can be satisfied, to manage your Azure Virtual Desktop environment. Review supported scenarios and requirements to enable Intune for AVD Session Host management in the referenced article in the “More Info” column. Document your choice in the 'Comment' column. In that article, review the different requirements and capabilities for single-session https://learn.microsoft.com/mem/intune/fundamentals/windows-virtual-desktop and multi-session https://learn.microsoft.com/mem/intune/fundamentals/windows-virtual-desktop-multi-session AVD.", + "guid": "63a08be1-6004-4b4a-a79b-f3239faae113", + "link": "https://learn.microsoft.com/mem/intune/fundamentals/azure-virtual-desktop", "services": [ - "SAP", - "Entra" + "AVD", + "Monitor" ], "severity": "Medium", - "subcategory": "Identity", - "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" + "subcategory": "Management", + "text": "Evaluate Intune for AVD Session Hosts management", + "waf": "Operations" }, { - "category": "Identity and Access", - "checklist": "SAP Checklist", - "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", - "service": "SAP", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "The scaling tool provides a low-cost automation option for customers who want to optimize their session host VM costs. You can use the scaling tool to schedule VMs to start and stop based on Peak and Off-Peak business hours, scale out VMs based on number of sessions per CPU core, scale in VMs during Off-Peak hours, leaving the minimum number of session host VMs running. Not available yet for Personal Host Pool type.", + "guid": "7138b820-102c-4e16-be30-1e6e872e52e3", + "link": "https://learn.microsoft.com/azure/virtual-desktop/autoscale-scenarios", "services": [ - "SAP", - "AKV", - "Entra" + "VM", + "AVD", + "Cost", + "Monitor" ], "severity": "Medium", - "subcategory": "Identity", - "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" + "subcategory": "Management", + "text": "Assess the requirements for host pool auto-scaling capability", + "waf": "Reliability" }, { - "category": "Identity and Access", - "checklist": "SAP 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", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "Start VM On Connect lets you reduce costs by enabling end users to turn on their session host virtual machines (VMs) only when they need them. You can then turn off VMs when they're not needed. You can configure Start VM on Connect for personal or pooled host pools using the Azure portal or PowerShell. Start VM on Connect is a host pool wide setting.", + "guid": "55f612fe-f215-4f0d-a956-10e7dd96bcbc", + "link": "https://learn.microsoft.com/azure/virtual-desktop/start-virtual-machine-connect", "services": [ - "SAP", - "AKV", - "Entra" + "VM", + "AVD", + "Cost", + "Monitor" ], - "severity": "Medium", - "subcategory": "Identity", - "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" + "severity": "Low", + "subcategory": "Management", + "text": "Consider the usage of Start VM on Connect for Personal Host Pools", + "waf": "Cost" }, { - "category": "Identity and Access", - "checklist": "SAP 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", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "'Start VM On Connect' provides a smart way to automatically start previously stopped Session Hosts but does not provide a mechanism to shut down when not in used. Administrators are encouraged to configure additional policies to sign users out of their sessions and run Azure automation scripts to de-allocate VMs. Users should be not allowed to shut down their Personal Hosts since will not be able to de-allocate Azure VMs, then billing will still be active with no cost reduction.", + "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": [ - "SAP", - "Entra" + "VM", + "AVD", + "AzurePolicy", + "Monitor", + "Cost" ], - "severity": "Medium", - "subcategory": "Identity", - "text": "Implement SSO by using OAuth for SAP NetWeaver to allow third-party or custom applications to access SAP NetWeaver OData services.", - "waf": "Security" + "severity": "Low", + "subcategory": "Management", + "text": "Evaluate the implementation of an ad-hoc mechanism to shut down Personal AVD Session Hosts", + "waf": "Cost" }, { - "category": "Identity and Access", - "checklist": "SAP Checklist", - "guid": "a747c350-8d4c-449c-93af-393dbca77c48", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", - "service": "SAP", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "Azure Virtual Desktop billing is mainly based on cost associated to compute, networking and storage resources consumed by Host Pools. In addition to this, costs can be generated by dependent resources, for example VPN or ExpressRoute or vWAN, Active Directory Domain Controllers, DNS, etc. There is no direct cost associated to AVD objects like workspaces, host pools or application groups. To make AVD associated costs more evident and grouped by Host Pool, it is recommended to use 'cm-resource-parent' tag. ", + "guid": "51bcafca-476a-48fa-9b91-9645a7679f20", + "link": "https://learn.microsoft.com/azure/virtual-desktop/tag-virtual-desktop-resources", "services": [ - "SAP", - "Entra" + "Storage", + "DNS", + "AVD", + "VPN", + "Monitor", + "Cost", + "ExpressRoute", + "VWAN" ], - "severity": "Medium", - "subcategory": "Identity", - "text": "Implement SSO to SAP HANA", - "waf": "Security" + "severity": "Low", + "subcategory": "Management", + "text": "Review and adopt suggested Azure Tags for Azure Virtual Desktop", + "waf": "Cost" }, { - "category": "Identity and Access", - "checklist": "SAP Checklist", - "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", - "service": "SAP", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "Azure Advisor analyzes your configurations and telemetry to offer personalized recommendations to solve common problems. With these recommendations, you can optimize your Azure resources for reliability, security, operational excellence, performance, and cost.", + "guid": "611dd68c-5a4b-4252-8e44-a59a9c2399c4", + "link": "https://learn.microsoft.com/azure/virtual-desktop/azure-advisor-recommendations", "services": [ - "SAP", - "Entra" + "Entra", + "Cost", + "AVD", + "Monitor" ], - "severity": "Medium", - "subcategory": "Identity", - "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" + "severity": "Low", + "subcategory": "Management", + "text": "Periodically check Azure Advisor recommendations for AVD", + "waf": "Operations" }, { - "category": "Identity and Access", - "checklist": "SAP Checklist", - "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", - "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", - "service": "SAP", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "Customers have several options: Microsoft Configuration Manager, this article explains how to automatically apply updates to a Azure Virtual Desktop session hosts running Windows 10/11: https://learn.microsoft.com/azure/virtual-desktop/configure-automatic-updates, Microsoft Intune: https://docs.microsoft.com/mem/intune/fundamentals/windows-virtual-desktop-multi-session, Azure Update Management and WSUS for Windows Server OS only (client OS not supported: https://learn.microsoft.com/azure/automation/update-management/operating-system-requirements), 3rd Party tools. Outside an emergency security patching situation, it is recommended to move away from an 'in-place' update strategy patching strategy and adopt a re-imaging approach.", + "guid": "04722da2-9c2b-41cd-922f-54b29bade3aa", + "link": "https://learn.microsoft.com/mem/intune/fundamentals/azure-virtual-desktop-multi-session", "services": [ - "SAP", - "Entra" + "AVD", + "Monitor" ], "severity": "Medium", - "subcategory": "Identity", - "text": "For applications that access SAP, you might want to use principal propagation to establish SSO.", - "waf": "Security" + "subcategory": "Management", + "text": "Plan for a Session Host emergency patching and update strategy", + "waf": "Operations" }, { - "category": "Identity and Access", - "checklist": "SAP 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", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "The Scheduled Agent Updates feature lets you create up to two maintenance windows per Host Pool to update AVD components at a convenient time. It is recommended to specify maintenance windows then upgrading Session Hosts will not happen during peak business hours. Scheduled Agent Updates is disabled by default. This means that, unless you enable this setting, the agent can get updated at any time by the agent update flighting service.", + "guid": "c067939b-e5ca-4698-b9ce-3bd91843e73f", + "link": "https://learn.microsoft.com/azure/virtual-desktop/scheduled-agent-updates", "services": [ - "SAP", - "Entra" + "AVD", + "Monitor" ], - "severity": "Medium", - "subcategory": "Identity", - "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" + "severity": "Low", + "subcategory": "Management", + "text": "Configure the Scheduled Agent Updates feature", + "waf": "Reliability" }, { - "category": "Identity and Access", - "checklist": "SAP Checklist", - "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", - "service": "SAP", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "Host pools are a collection of one or more identical virtual machines within Azure Virtual Desktop environment. We highly recommend you create a validation host pool where service updates are applied first. This allows you to monitor service updates before the service applies them to your standard or non-validation environment.", + "guid": "d1e8c38e-c936-4667-913c-005674b1e944", + "link": "https://docs.microsoft.com/azure/virtual-desktop/create-validation-host-pool", "services": [ - "SAP", - "Entra" + "VM", + "AVD", + "Monitor" ], "severity": "Medium", - "subcategory": "Identity", - "text": "Implement SSO to SAP BTP", - "waf": "Security" + "subcategory": "Management", + "text": "Create a validation (canary) Host Pool", + "waf": "Operations" }, { - "category": "Identity and Access", - "checklist": "SAP 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", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "An AVD Host Pool can be deployed in several ways: Azure Portal, ARM templates, Azure CLI tool, Powershell, manual VM creation with registration token, Terraform, 3rd-party tools. It is important to adopt proper method/s to support automatic deployment through automation and CI/CD tools.", + "guid": "a459c373-e7ed-4616-83b3-65a917ecbe48", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/wvd/eslz-platform-automation-and-devops", "services": [ - "SAP", - "Entra" + "VM", + "AVD", + "Monitor" ], "severity": "Medium", - "subcategory": "Identity", - "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" + "subcategory": "Management", + "text": "Determine Host Pool deployment strategy", + "waf": "Operations" }, { - "category": "Management Group and Subscriptions", - "checklist": "SAP 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", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "After you register a VM to a host pool within the Azure Virtual Desktop service, the agent regularly refreshes the VM's token whenever the VM is active. The certificate for the registration token is valid for 90 days. Because of this 90-day limit, we recommend VMs to be online for 20 minutes every 90 days so that the machine can refresh its tokens and update the agent and side-by-side stack components.", + "guid": "ebe54cd7-df2e-48bb-ac35-81559bb9153e", + "link": "https://docs.microsoft.com/azure/virtual-desktop/faq", "services": [ - "SAP", - "AzurePolicy", - "Subscriptions" + "VM", + "AVD", + "Monitor" ], "severity": "Medium", - "subcategory": "Subscriptions", - "text": "enforce existing Management Group policies to SAP Subscriptions", - "training": "https://learn.microsoft.com/training/modules/enterprise-scale-organization/4-management-group-subscription-organization", + "subcategory": "Management", + "text": "Turn on Session Host VMs at least every 90 days for token refresh", "waf": "Operations" }, { - "category": "Management Group and Subscriptions", - "checklist": "SAP Checklist", - "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "Azure Virtual Desktop Insights is a dashboard built on Azure Monitor Workbooks that helps IT professionals understand their Azure Virtual Desktop environments. Read the referenced article to learn how to set up Azure Monitor for Azure Virtual Desktop to monitor your AVD environments.", + "guid": "63cfff1c-ac59-49ef-8d5a-83dd4de36c1c", + "link": "https://learn.microsoft.com/azure/virtual-desktop/insights", "services": [ - "SAP", - "Subscriptions" + "AVD", + "Monitor" ], "severity": "High", - "subcategory": "Subscriptions", - "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" + "subcategory": "Monitoring", + "text": "Enable monitoring for AVD", + "waf": "Reliability" }, { - "category": "Management Group and Subscriptions", - "checklist": "SAP Checklist", - "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "Azure Virtual Desktop uses Azure Monitor and Log Analytics for monitoring and alerts like many other Azure services. This lets admins identify issues through a single interface. The service creates activity logs for both user and administrative actions. Each activity log falls under the following categories: Management, Feed, Connections, Host Registration, Errors, Checkpoints. ", + "guid": "81770afb-c4c0-4e43-a186-58d2857ed671", + "link": "https://docs.microsoft.com/azure/virtual-desktop/diagnostics-log-analytics", "services": [ - "SAP", - "Subscriptions" + "VM", + "AVD", + "Monitor" ], - "severity": "High", - "subcategory": "Subscriptions", - "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" + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Enable diagnostic settings for Workspaces, Host Pools, Application Groups and Host VMs to Log Analytics workspace", + "waf": "Reliability" }, { - "category": "Management Group and Subscriptions", - "checklist": "SAP Checklist", - "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", - "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", - "service": "SAP", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "See the referenced article and this additional one to setup proper monitoring and alerting for storage: https://docs.microsoft.com/azure/storage/files/storage-troubleshooting-files-performance. ", + "guid": "2463cffe-179c-4599-be0d-5973dd4ce32c", + "link": "https://docs.microsoft.com/azure/storage/files/storage-files-monitoring?tabs=azure-portal", "services": [ - "SAP", - "VM", - "Subscriptions" + "Storage", + "AVD", + "Monitor" ], - "severity": "High", - "subcategory": "Subscriptions", - "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" + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Create alerts on the profile storage to be alerted in case of high usage and throttling", + "waf": "Reliability" }, { - "category": "Management Group and Subscriptions", - "checklist": "SAP Checklist", - "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", - "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", - "service": "SAP", + "category": "Monitoring and Management", + "checklist": "Azure Virtual Desktop Review", + "description": "You can use Azure Service Health to monitor service issues and health advisories for Azure Virtual Desktop. Azure Service Health can notify you with different types of alerts (for example, email or SMS), help you understand the effect of an issue, and keep you updated as the issue resolves.", + "guid": "18813706-f7c4-4c0d-9e51-4548d2457ed6", + "link": "https://docs.microsoft.com/azure/virtual-desktop/set-up-service-alerts", "services": [ - "SAP", - "Subscriptions" + "AVD", + "Monitor" ], - "severity": "Low", - "subcategory": "Subscriptions", - "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": "Medium", + "subcategory": "Monitoring", + "text": "Configure Azure Service Health for AVD alerts ", + "waf": "Reliability" }, { - "category": "Management Group and Subscriptions", - "checklist": "SAP Checklist", - "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", - "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", - "service": "SAP", + "category": "Networking", + "checklist": "Azure Virtual Desktop Review", + "description": "If required to connect to on-premises environment, assess the current connectivity option or plan for the required connectivity (ExpressRoute, Azure S2S or 3rd-party NVA VPN). ", + "guid": "dd399cfd-7b28-4dc8-9555-6202bfe4563b", + "link": "https://docs.microsoft.com/azure/architecture/reference-architectures/hybrid-networking/", "services": [ - "SAP", - "VM", - "Subscriptions" + "VPN", + "AVD", + "NVA", + "ExpressRoute" ], - "severity": "High", - "subcategory": "Subscriptions", - "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" + "severity": "Medium", + "subcategory": "Networking", + "text": "Determine if hybrid connectivity is required to connect to on-premises environment", + "waf": "Reliability" }, { - "category": "Management Group and Subscriptions", - "checklist": "SAP Checklist", - "guid": "e6e20617-3686-4af4-9791-f8935ada4332", - "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", - "service": "SAP", + "category": "Networking", + "checklist": "Azure Virtual Desktop Review", + "description": "AVD Host Pools can be deployed in either Azure Virtual WAN or traditional 'Hub & Spoke' network topologies. It is recommended to deploy each Host Pool in a separate 'spoke' VNet, using 'hub' is not recommended.", + "guid": "c8639648-a652-4d6c-85e5-02965388e5de", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/wvd/eslz-network-topology-and-connectivity", "services": [ - "SAP", - "Subscriptions" + "VNet", + "AVD", + "VWAN" ], - "severity": "High", - "subcategory": "Subscriptions", - "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" + "severity": "Medium", + "subcategory": "Networking", + "text": "Determine Azure Virtual Network (VNet) placement for each AVD Host Pool", + "waf": "Performance" }, { - "category": "Management Group and Subscriptions", - "checklist": "SAP Checklist", - "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", - "service": "SAP", + "category": "Networking", + "checklist": "Azure Virtual Desktop Review", + "description": "Evaluate the bandwidth requirements, ensure VPN/ER bandwidth will be enough, ensure proper routing and firewall rules are in place, test end-to-end latency. ", + "guid": "d227dd14-2b06-4c21-a799-9a646f4389a7", + "link": "https://docs.microsoft.com/azure/architecture/reference-architectures/hybrid-networking/", "services": [ - "SAP", - "Cost", - "Subscriptions", - "TrafficManager" + "VPN", + "AVD" ], "severity": "Medium", - "subcategory": "Subscriptions", - "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" + "subcategory": "Networking", + "text": "Assess which on-premises resources are required from AVD Host Pools", + "waf": "Reliability" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", + "category": "Networking", + "checklist": "Azure Virtual Desktop Review", + "description": "Several options are available. You can use Azure Firewall or equivalent 3rd-party NVA, Network Security Group (NSG) and/or Proxy servers. NSG is not able to enable/disable by URL, only ports and protocols. Proxy should be used only as explicit setting in user browser. Details on using Azure Firewall Premium with AVD are reported in the companion article in the 'More Info' column. Be sure to allow proper access to required AVD URLs. Forced Tunneling to on-premises is not recommended.", + "guid": "fc4972cd-3cd2-41bf-9703-6e5e6b4bed3d", + "link": "https://docs.microsoft.com/azure/firewall/protect-windows-virtual-desktop", + "services": [ + "VNet", + "AVD", + "NVA", + "Firewall" + ], + "severity": "Medium", + "subcategory": "Networking", + "text": "Need to control/restrict Internet outbound traffic for AVD hosts?", + "waf": "Security" + }, + { + "category": "Networking", + "checklist": "Azure Virtual Desktop Review", + "description": "Required URLs for AVD control plane access by session hosts are documented here: https://docs.microsoft.com/azure/virtual-desktop/safe-url-list. A check tool is available to verify connectivity from the session hosts: https://docs.microsoft.com/azure/virtual-desktop/safe-url-list#required-url-check-tool. Forced Tunneling to on-premises is not recommended.", + "guid": "65c7acbe-45bb-4e60-ad89-f2e87778424d", + "link": "https://docs.microsoft.com/azure/virtual-desktop/safe-url-list", "services": [ - "SAP", - "Monitor", - "Backup" + "AVD" ], "severity": "High", - "subcategory": "BCDR", - "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", + "subcategory": "Networking", + "text": "Ensure AVD control plane endpoints are accessible", "waf": "Reliability" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", - "service": "SAP", + "category": "Networking", + "checklist": "Azure Virtual Desktop Review", + "description": "Consider the usage of Azure Defender Endpoint or similar 3rd-party agents to control user web navigation, see the Security section for more details.", + "guid": "73676ae4-6691-4e88-95ad-a42223e13810", + "link": "https://learn.microsoft.com/microsoft-365/security/defender-endpoint/onboard-windows-multi-session-device?view=o365-worldwide", "services": [ - "Storage", - "Monitor", - "VM", - "Entra", - "SAP" + "AVD", + "Defender" ], "severity": "Medium", - "subcategory": "BCDR", - "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" + "subcategory": "Networking", + "text": "Need to control/restrict Internet outbound traffic only for users on AVD hosts? ", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", + "category": "Networking", + "checklist": "Azure Virtual Desktop Review", + "description": "Custom UDR and NSG can be applied to AVD Host Pool subnets, for example to redirect to Azure Firewall or NVA, or to filter/block network traffic. In this case is recommended to carefully review to ensure optimal path for outbound traffic to AVD control plane is used. Service Tags can now be used with UDR and NSG, then AVD management plane traffic can be easily allowed: https://learn.microsoft.com/azure/virtual-desktop/safe-url-list.", + "guid": "523181a9-4174-4158-93ff-7ae7c6d37431", + "link": "https://docs.microsoft.com/azure/firewall/protect-windows-virtual-desktop", "services": [ - "SAP", - "Monitor" + "VNet", + "AVD", + "NVA", + "Firewall" ], - "severity": "High", - "subcategory": "Management", - "text": "Ensure time-zone matches between the operating system and the SAP system.", - "waf": "Operations" + "severity": "Low", + "subcategory": "Networking", + "text": "Review custom UDR and NSG for AVD Host Pool subnets", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "c3c7abc0-716c-4486-893c-40e181d65539", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", - "service": "SAP", + "category": "Networking", + "checklist": "Azure Virtual Desktop Review", + "description": "Network traffic from AVD Session Host VMs to AVD control plane should be as direct as possible. Redirecting this traffic through a Proxy or Firewall with deep packet inspection and/or SSL termination could cause serious issues and bad customer experience. It is recommended to bypass Proxy and Firewall just for the AVD control plane. User generated traffic surfing the web instead, should be filtered by Firewall and/or redirected to a Proxy. For details and guidelines, please see the companion article in the 'More Info' column.", + "guid": "cc6edca0-aeca-4566-9e92-cf246f1465af", + "link": "https://learn.microsoft.com/azure/virtual-desktop/proxy-server-support", "services": [ - "SAP", - "Monitor", - "Entra" + "VM", + "AVD" ], - "severity": "Medium", - "subcategory": "Management", - "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", + "severity": "High", + "subcategory": "Networking", + "text": "Do not use Proxy servers, SSL termination and Deep Packet Inspection for AVD control plane traffic", "waf": "Reliability" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "a491dfc4-9353-4213-9217-eef0949f9467", - "link": "https://azure.microsoft.com/pricing/offers/dev-test/", - "service": "SAP", + "category": "Networking", + "checklist": "Azure Virtual Desktop Review", + "description": "It is recommended to assess and review networking bandwidth requirements for users, based on the specific workload type. The referenced article provide general estimations and recommendations, but specific measure are required for proper sizing. ", + "guid": "516785c6-fa96-4c96-ad88-408f372734c8", + "link": "https://learn.microsoft.com/azure/virtual-desktop/rdp-bandwidth", "services": [ - "SAP", - "Monitor", - "Cost" + "VM", + "AVD" ], "severity": "Low", - "subcategory": "Management", - "text": "Consider running dev/test systems in a snooze model to save and optimize Azure run costs.", - "waf": "Cost" + "subcategory": "Networking", + "text": "Check the network bandwidth required for each user and in total for the VM SKU", + "waf": "Performance" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", - "link": "https://learn.microsoft.com/azure/lighthouse/overview", - "service": "SAP", + "category": "Networking", + "checklist": "Azure Virtual Desktop Review", + "description": "If Azure Files SMB share will be used to store user profiles via FSLogix, the usage of Private Endpoint (PE) for private access to the storage is recommended. AVD Session Hosts will access the storage using a private IP in the same VNet, a separate subnet is recommended. This feature has an additional cost that must be evaluated. If PE will not be used, at least Service Endpoint is recommended (no cost associated).", + "guid": "ec27d589-9178-426d-8df2-ff60020f30a6", + "link": "https://learn.microsoft.com/azure/storage/files/storage-files-networking-endpoints", "services": [ - "SAP", - "Monitor", - "Entra" + "PrivateLink", + "Storage", + "AVD", + "VNet", + "Cost" ], "severity": "Medium", - "subcategory": "Management", - "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" + "subcategory": "Networking", + "text": "Evaluate usage Private Endpoint for Azure Files share", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP 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", + "category": "Networking", + "checklist": "Azure Virtual Desktop Review", + "description": "Connections to Azure Virtual Desktop can use TCP or UDP. RDP Shortpath is a feature of AVD that establishes a direct UDP-based transport between a supported Windows Remote Desktop client and session host. if clients have line of sight to AVD session hosts from internal network (VPN usage is not recommended), this feature can provide lower latency and best performances as explained in https://learn.microsoft.com/azure/virtual-desktop/rdp-shortpath?tabs=managed-networks#key-benefits.", + "guid": "b2074747-d01a-4f61-b1aa-92ad793d9ff4", + "link": "https://docs.microsoft.com/azure/virtual-desktop/shortpath", "services": [ - "SAP", - "Monitor", - "VM" + "VPN", + "AVD" ], "severity": "Medium", - "subcategory": "Management", - "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" - }, - { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", - "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", - "service": "SAP", - "services": [ - "SAP", - "Monitor" - ], - "severity": "Low", - "subcategory": "Management", - "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" + "subcategory": "Networking", + "text": "Evaluate usage of RDP ShortPath for clients connecting from managed internal networks", + "waf": "Performance" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "14591147-5e39-4e53-89cc-cd979366bcda", - "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", - "service": "SAP", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "Security mechanisms provided by GPO should be used, if available. For example, it is possible to impose desktop screen lock and idle session disconnection time. Existing GPOs applied to on-premises environment should be reviewed and eventually applied also to secure also AVD Hosts when joined to the domain.", + "guid": "a135e337-897e-431c-97d6-8cb6a22ac19f", + "link": "https://learn.microsoft.com/azure/virtual-desktop/security-guide#establish-maximum-inactive-time-and-disconnection-policies", "services": [ - "SAP", - "SQL", - "Monitor" + "AVD" ], "severity": "Medium", - "subcategory": "Monitoring", - "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" + "subcategory": "Active Directory", + "text": "Review Active Directory GPO to secure RDP sessions", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", - "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", - "service": "SAP", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "Microsoft Defender for Endpoint supports Azure Virtual Desktop for Windows 10/11 Enterprise multi-session. Check article for onboarding non-persistent virtual desktop infrastructure (VDI) devices: https://docs.microsoft.com/windows/security/threat-protection/microsoft-defender-atp/configure-endpoints-vdi", + "guid": "b1172576-9ef6-4691-a483-5ac932223ece", + "link": "https://learn.microsoft.com/microsoft-365/security/defender-endpoint/deployment-vdi-microsoft-defender-antivirus", "services": [ - "SAP", - "Monitor", - "VM", - "Entra" + "AVD", + "Defender" ], "severity": "High", - "subcategory": "Monitoring", - "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" + "subcategory": "Host Configuration", + "text": "Ensure anti-virus and anti-malware solutions are used", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "SAP", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "Disks in Azure are already encrypted at rest by default with Microsoft managed keys. Host VM OS disk encryption is possible and supported using Azure Disk Encryption (ADE - BitLocker) and Disk Encryption Set (DES - Server Side Encryption), the latter is recommended. Encryption of FSLogix storage using Azure Files can be done using SSE on Azure Storage. For OneDrive encryption, see this article: https://docs.microsoft.com/compliance/assurance/assurance-encryption-for-microsoft-365-services.", + "guid": "0fd32907-98bc-4178-adc5-a06ca7144351", + "link": "https://learn.microsoft.com/azure/virtual-machines/disk-encryption-overview", "services": [ - "SAP", - "AzurePolicy", - "Monitor" + "AKV", + "Storage", + "VM", + "AVD" ], - "severity": "Medium", - "subcategory": "Monitoring", - "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" + "severity": "Low", + "subcategory": "Host Configuration", + "text": "Assess disk encryption requirements for AVD Session Hosts", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", - "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", - "service": "SAP", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "Trusted launch are Gen2 Azure VMs with enhanced security features aimed to protect against “bottom of the stack” threats through attack vectors such as rootkits, boot kits, and kernel-level malware. Recommended to enable and leverage Secure Boot, Virtual TPM (vTPM) and Integrity Monitoring.", + "guid": "36a5a67f-bb9e-4d5b-9547-8c4479816b28", + "link": "https://learn.microsoft.com/azure/virtual-desktop/security-guide#azure-virtual-desktop-support-for-trusted-launch", "services": [ - "SAP", - "Monitor", - "NetworkWatcher" + "VM", + "AVD", + "Monitor" ], "severity": "Medium", - "subcategory": "Monitoring", - "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" + "subcategory": "Host Configuration", + "text": "Enable Trusted launch in Azure Gen2 VM Session Hosts", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "73686af4-6791-4f89-95ad-a43324e13811", - "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", - "service": "SAP", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "Trusted Launch and Gen2 VM are not only security and performance enhancing features but also system requirements for Windows 11. When building an AVD environment based on Windows 11, it is essential to enable these features.", + "guid": "135d3899-4b31-44d3-bc8f-028871a359d8", + "link": "https://learn.microsoft.com/windows/whats-new/windows-11-requirements", "services": [ - "SAP", - "Monitor", - "VM" + "VM", + "AVD" ], - "severity": "Medium", - "subcategory": "Monitoring", - "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" + "severity": "High", + "subcategory": "Host Configuration", + "text": "Enable Trusted Launch and use Gen2 image are system requirements for Windows 11", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "616785d6-fa96-4c96-ad88-518f482734c8", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "Displayed content will be automatically blocked or hidden in screenshots. Keep in mind screen sharing will also be blocked when using Teams or other collaboration software which use screen sharing.", + "guid": "a49dc137-7896-4343-b2bc-1a31bf1d30b6", + "link": "https://learn.microsoft.com/azure/virtual-desktop/screen-capture-protection", "services": [ - "SAP", - "Monitor", - "Subscriptions" + "AVD" ], - "severity": "High", - "subcategory": "Monitoring", - "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" + "severity": "Low", + "subcategory": "Host Configuration", + "text": "Consider enabling screen capture protection to prevent sensitive information from being captured", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", - "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", - "service": "SAP", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "If not absolutely required, redirecting drives, printers, and USB devices to a user's local device in a remote desktop session should be disabled or highly restricted. Restrict Windows Explorer access by hiding local and remote drive mappings is also a secure measure to adopt preventing users from discovering unwanted information about system configuration and users.", + "guid": "7ce2cd20-85b4-4f82-828e-6558736ede6a", + "link": "https://learn.microsoft.com/azure/virtual-desktop/security-guide#other-security-tips-for-session-hosts", "services": [ - "SAP", - "Storage", - "Monitor", - "ASR" + "AVD" ], "severity": "Medium", - "subcategory": "Monitoring", - "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" + "subcategory": "Host Configuration", + "text": "Restrict device redirection and drive mapping", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", - "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", - "service": "SAP", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "When choosing a deployment model, you can either provide remote users access to entire virtual desktops or only select applications. Remote applications, or RemoteApps, provide a seamless experience as the user works with apps on their virtual desktop. RemoteApps reduce risk by only letting the user work with a subset of the remote machine exposed by the application.", + "guid": "4e25d70e-3924-44f4-b66f-d6cdd4f4a973", + "link": "https://learn.microsoft.com/microsoft-365/security/defender-endpoint/web-protection-overview", "services": [ - "SAP", - "Sentinel", - "Monitor" + "AVD" ], "severity": "Medium", - "subcategory": "Monitoring", - "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", + "subcategory": "Management", + "text": "When possible, prefer Remote Apps over Full Desktops (DAG)", "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", - "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", - "service": "SAP", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "Web content filtering feature provided by Web Protection capability in Microsoft Defender for Endpoint, can be used to to control user web navigation. If this tool is used, configuration of web filtering for user Internet browsing is recommended. Access by the Guest OS system to required AVD control plane URLs must be guaranteed.", + "guid": "e19dd344-29eb-4722-a237-a151c5bb4e4f", + "link": "https://learn.microsoft.com/microsoft-365/security/defender-endpoint/web-protection-overview", "services": [ - "SAP", - "Monitor", - "Cost" + "AVD", + "Defender" ], "severity": "Medium", - "subcategory": "Monitoring", - "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" + "subcategory": "Management", + "text": "Need to control/restrict user Internet navigation from AVD session hosts?", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", - "service": "SAP", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "We recommend you don't grant your users admin access to virtual desktops. If you need software packages, we recommend you make them available through configuration management utilities.", + "guid": "a0cdb3b5-4eb2-4eb0-9dda-a3592718e2ed", + "link": "https://docs.microsoft.com/azure/virtual-desktop/security-guide", "services": [ - "SAP", - "Monitor", - "VM" + "AVD" ], - "severity": "Low", - "subcategory": "Performance", - "text": "Use inter-VM latency monitoring for latency-sensitive applications.", - "waf": "Performance" + "severity": "High", + "subcategory": "Management", + "text": "Ensure AVD users will not have local administrator privileges on AVD Hosts", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "We recommend you enable Defender for Cloud for the subscriptions, virtual machines, key vaults, and storage accounts used by AVD. With this tool is possible to assess and manage vulnerabilities, assess compliance with common frameworks like PCI, strengthen the overall security of your AVD environment and measure it over time using 'Secure Score': https://learn.microsoft.com/azure/virtual-desktop/security-guide#improve-your-secure-score.", + "guid": "1814387e-5ca9-4c26-a9b3-2ab5bdfc6998", + "link": "https://learn.microsoft.com/azure/virtual-desktop/security-guide#enable-microsoft-defender-for-cloud", "services": [ - "SAP", - "Monitor", - "ASR" + "AKV", + "Storage", + "Defender", + "VM", + "AVD", + "Subscriptions" ], "severity": "Medium", - "subcategory": "Performance", - "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" + "subcategory": "Management", + "text": "Enable Microsoft Defender for Cloud to manage AVD Session Hosts security posture", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "Enabling audit log collection lets you view user and admin activity related to Azure Virtual Desktop and store in a central repository like Log Analytics workspace. ", + "guid": "a0916a76-4980-4ad0-b278-ee293c1bc352", + "link": "https://learn.microsoft.com/azure/virtual-desktop/security-guide#collect-audit-logs", "services": [ - "SAP", - "Storage", + "Entra", + "AVD", "Monitor" ], "severity": "Medium", - "subcategory": "Performance", - "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" + "subcategory": "Management", + "text": "Enable diagnostic and audit logging", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "c027f893-f404-41a9-b33d-39d625a14964", - "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", - "service": "SAP", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "Assign the least privilege required by defining administrative, operations, and engineering roles to Azure RBAC roles. To limit access to high privilege roles within your Azure Virtual Desktop landing zone, consider integration with Azure Privileged Identity Management (PIM). Maintaining knowledge of which team is responsible for each particular administrative area helps you determine Azure role-based access control (RBAC) roles and configuration.", + "guid": "baaab757-1849-4ab8-893d-c9fc9d1bb73b", + "link": "https://docs.microsoft.com/azure/virtual-desktop/rbac", "services": [ - "SAP", - "Monitor" + "Entra", + "RBAC", + "AVD" ], "severity": "Low", - "subcategory": "Performance", - "text": "Consider collecting full database statistics for non-HANA databases after migration. For example, implement SAP note 1020260 - Delivery of Oracle statistics.", - "waf": "Performance" + "subcategory": "Management", + "text": "Assess the requirement to use custom RBAC roles for AVD management", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", - "service": "SAP", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "AVD users should not have permission to install application. If required, Windows Defender Application Control (WDAC) can be used to control which drivers and applications are allowed to run on their Windows clients. ", + "guid": "b9ea80c8-0628-49fc-ae63-125aa4c0a284", + "link": "https://learn.microsoft.com/azure/virtual-desktop/security-guide#windows-defender-application-control", "services": [ - "SAP", - "Storage", - "Monitor" + "AVD", + "Defender" ], "severity": "Medium", - "subcategory": "Performance", - "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" + "subcategory": "Management", + "text": "Restrict users from installing un-authorized applications", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "SAP 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", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "Enabling MFA and CA lets you manage risks before you grant users access to your AVD environment. When deciding which users to grant access to, we recommend you also consider who the user is, how they sign in, and which device they're using. Additional details and configuration procedures are provided in the companion article. Microsoft Entra ID is the new name for Azure Active Directory (Azure AD).", + "guid": "916d697d-8ead-4ed2-9bdd-186f1ac252b9", + "link": "https://learn.microsoft.com/azure/virtual-desktop/set-up-mfa", "services": [ - "SAP", - "SQL", - "Monitor" + "Entra", + "AVD" ], "severity": "Medium", - "subcategory": "Performance", - "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" - }, - { - "category": "Management and Monitoring", - "checklist": "SAP Checklist", - "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", - "services": [ - "SAP", - "Monitor", - "ASR" - ], - "severity": "High", - "subcategory": "Reliability", - "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" + "subcategory": "Microsoft Entra ID", + "text": "Evaluate the usage of Multi-Factor Authentication (MFA) and Conditional Access (CA) for AVD users", + "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "SAP", + "category": "Security", + "checklist": "Azure Virtual Desktop Review", + "description": "If Zero Trust is a requirement, review the companion article in the 'More Info' column. It provides steps to apply the principles of Zero Trust to an Azure Virtual Desktop deployment.", + "guid": "221102d0-90af-49fc-b2b7-8d3fe397e43", + "link": "https://learn.microsoft.com/security/zero-trust/azure-infrastructure-avd", "services": [ - "SAP", - "AzurePolicy", - "AppGW", - "WAF" + "AVD" ], "severity": "Medium", - "subcategory": "App 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/", + "subcategory": "Zero Trust", + "text": "Review and Apply Zero Trust principles and guidance", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP 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", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "If used, make sure to check the list of best practices and recommendations described in the referenced article.", + "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": [ - "DNS", - "SAP", - "VM" + "Storage", + "AVD" ], "severity": "Medium", - "subcategory": "DNS", - "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" + "subcategory": "Azure Files", + "text": "Check best-practices for Azure Files", + "waf": "Performance" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP 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", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "SMB Multichannel enables clients to use multiple network connections that provide increased performance while lowering the cost of ownership. Increased performance is achieved through bandwidth aggregation over multiple NICs and utilizing Receive Side Scaling (RSS) support for NICs to distribute the IO load across multiple CPUs.", + "guid": "5784b6ca-5e9e-4bcf-8b54-c95459ea7369", + "link": "https://learn.microsoft.com/azure/storage/files/storage-files-smb-multichannel-performance", "services": [ - "DNS", - "SAP", - "VNet" + "Storage", + "Cost", + "AVD", + "ACR" + ], + "severity": "Low", + "subcategory": "Azure Files", + "text": "Enable SMB multichannel when using a premium file share to host FSLogix profile containers.", + "waf": "Performance" + }, + { + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "If a second region is required for DR purposes verify NetApp availability in there as well.", + "guid": "4a359836-ee79-4d6c-9d3a-364a5b7abae3", + "link": "https://azure.microsoft.com/global-infrastructure/services/", + "services": [ + "Storage", + "AVD" ], "severity": "Medium", - "subcategory": "DNS", - "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" + "subcategory": "Azure NetApp Files", + "text": "If NetApp Files storage is required, check storage service availability in your specific region.", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "a3592829-e6e2-4061-9368-6af46791f893", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", - "service": "SAP", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "CA option is a recommended setting in the FSLogix scenario, as it enables a more resilient SMB session between the Session Host and NetApp Files.", + "guid": "a2661898-866a-4c8d-9d1f-8cfc86e88024", + "link": "https://learn.microsoft.com/azure/virtual-desktop/create-fslogix-profile-container", "services": [ - "SAP", - "ACR", - "VNet" + "Storage", + "AVD" ], "severity": "Medium", - "subcategory": "Hybrid", - "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", + "subcategory": "Azure NetApp Files", + "text": "If NetApp Files storage is used enable CA (Continuous Availability) option to increase resiliency", "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", - "service": "SAP", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "An Active Directory Site should be created for the Azure virtual network environment where Azure NetApp Files (ANF) subnet will be created, and that site name should be specified in the ANF connection property when executing the join procedure as explained in the reference article.", + "guid": "6647e977-db49-48a8-bc35-743f17499d42", + "link": "https://docs.microsoft.com/azure/azure-netapp-files/create-active-directory-connections", "services": [ - "SAP", - "NVA" + "Storage", + "VNet", + "AVD" ], "severity": "High", - "subcategory": "Hybrid", - "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" + "subcategory": "Azure NetApp Files", + "text": "If Azure NetApp Files storage is used, check Active Directory Site name setting in the Active Directory Connection configuration", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", - "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", - "service": "SAP", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "Possible options: Standard HDD, Standard SSD, or Premium SSD. Ephemeral disks are not supported, Ultra-Disks not recommended. Recommended to evaluate Premium for OS disk if user density is not low, and if Cloud Cache will be used. ", + "guid": "3611c818-b0a0-4bc5-80e4-3a18a9cd289c", + "link": "https://docs.microsoft.com/azure/virtual-machines/disks-types", "services": [ - "SAP", - "VWAN", - "ACR" + "Storage", + "AVD" ], "severity": "Medium", - "subcategory": "Hybrid", - "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" + "subcategory": "Capacity Planning", + "text": "Determine which type of managed disk will be used for the Session Hosts", + "waf": "Performance" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", - "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", - "service": "SAP", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "Possible options are: Azure NetApp Files, Azure Files, VM based File Server. File-server it is not recommended. Azure Files Premium typically a good starting point. NetApp usually required for large scale / high-performant environment. For a detailed comparison see the article in the 'More Info' column.", + "guid": "ed6b17db-8255-4462-b2ae-e4553afc8339", + "link": "https://docs.microsoft.com/azure/virtual-desktop/store-fslogix-profile", "services": [ - "SAP", - "NVA", - "VNet" + "Storage", + "VM", + "AVD" ], - "severity": "Medium", - "subcategory": "Hybrid", - "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", + "subcategory": "Capacity Planning", + "text": "Determine which storage backend solution will be used for FSLogix Profiles", + "waf": "Performance" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", - "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", - "service": "SAP", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "Every Host Pool should use a separate set of storage accounts/volumes (at least one) and shares. Users should have a different profile for each Host Pool since settings and configurations are specific to each Host Pool. Additionally, accessing different Host Pools at the same time can cause errors on the shared user profile VHD/X. Usage of different storage accounts/volumes for multiple shares is also recommended to scale independently.", + "guid": "2fad62bd-5004-453c-ace4-64d862e7f5a4", + "link": "https://learn.microsoft.com/azure/virtual-desktop/store-fslogix-profile", "services": [ - "SAP", - "VWAN", - "NVA", - "VNet" + "Storage", + "AVD" ], - "severity": "Medium", - "subcategory": "Hybrid", - "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" + "severity": "High", + "subcategory": "Capacity Planning", + "text": "Do not share storage and profiles between different Host Pools", + "waf": "Performance" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP 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", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "As a starting point for estimating profile container storage performance requirements we recommend to assume 10 IOPS per user in the steady state and 50 IOPS per user during sign-in/sign-out. Space requirements is simply obtained based on the maximum profiles size in FSLogix per the total number of users for each Host Pool. Multiple storage accounts can be used for the same Host Pool if required.", + "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": [ - "SAP", - "VNet", - "VM" + "Storage", + "AVD" ], "severity": "High", - "subcategory": "IP plan", - "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" + "subcategory": "Capacity Planning", + "text": "Verify storage scalability limits and Host Pool requirements", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP 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", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "Avoid introducing additional latency and costs associated with cross-region network traffic where possible.", + "guid": "8aad53cc-79e2-4e86-9673-57c549675c5e", + "link": "https://docs.microsoft.com/azure/virtual-desktop/fslogix-containers-azure-files", "services": [ - "SAP", - "VNet", - "ASR" + "Storage", + "Cost", + "AVD" ], "severity": "High", - "subcategory": "IP plan", - "text": "Consider reserving IP address on DR side when configuring ASR", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "Operations" + "subcategory": "Capacity Planning", + "text": "For optimal performance, the storage solution and the FSLogix profile container should be in the same Azure region.", + "waf": "Performance" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP 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", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "The recommendation in Azure Virtual Desktop is to use Profile Container without Office Container (ODFC) split unless you are planning for specific Business Continuity and Disaster Recovery (BCDR) scenarios as described in the Disaster Recovery section below. https://docs.microsoft.com/fslogix/profile-container-office-container-cncpt ", + "guid": "df47d2d9-2881-4b1c-b5d1-e54a29759e39", + "link": "https://learn.microsoft.com/fslogix/concepts-container-types#when-to-use-profile-and-odfc-containers", "services": [ - "SAP", - "VNet" + "Storage", + "ASR", + "AVD" ], "severity": "High", - "subcategory": "IP plan", - "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" + "subcategory": "FSLogix", + "text": "Do not use Office Containers (ODFC) if not strictly required and justified", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "6e154e3a-a359-4282-ae6e-206173686af4", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", - "service": "SAP", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "Make sure to configure the following antivirus exclusions for FSLogix Profile Container virtual hard drives, as documented in the referenced article in the 'More Info' column.", + "guid": "83f63047-22ee-479d-9b5c-3632054b69ba", + "link": "https://learn.microsoft.com/fslogix/overview-prerequisites#configure-antivirus-file-and-folder-exclusions", "services": [ - "SAP", "Storage", - "VNet" + "AVD" ], "severity": "Medium", - "subcategory": "IP plan", - "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" + "subcategory": "FSLogix", + "text": "Configure the recommended antivirus exclusions for FSLogix (includes not scanning VHD(x) files on connect).", + "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP 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", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "Profile containers have a default max size of 30GB. If large Profile Containers are anticipated, and customers wants to try to keep them small, consider using OneDrive to host Office 365 files outside the FSLogix profile.", + "guid": "01e6a84d-e5df-443d-8992-481718d5d1e5", + "link": "https://docs.microsoft.com/fslogix/profile-container-configuration-reference", "services": [ - "SAP", - "Firewall" + "Storage", + "AVD" ], - "severity": "Medium", - "subcategory": "Internet", - "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": "High", + "subcategory": "FSLogix", + "text": "Review and confirm configured maximum profile size in FSLogix", + "waf": "Cost" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", - "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", - "service": "SAP", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "Defaults and recommended settings are reported in the companion article in the 'More Info' column. If not recommended keys and/or values must be used, be sure to review with a Microsoft AVD expert and clearly document your choices.", + "guid": "d34aad5e-8c78-4e1d-9666-7313c405674c", + "link": "https://learn.microsoft.com/fslogix/concepts-configuration-examples", "services": [ - "SAP", - "AppGW", - "WAF" + "AKV", + "Storage", + "AVD", + "ACR" ], - "severity": "Medium", - "subcategory": "Internet", - "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": "High", + "subcategory": "FSLogix", + "text": "Review FSLogix registry keys and determine which ones to apply", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "Concurrent or multiple connections are not recommended in Azure Virtual Desktop. Concurrent connections are also not supported by Session Hosts running in an Azure Virtual Desktop Host Pool. OneDrive, if used, doesn't support concurrent or multiple connections using the same container, under any circumstance. For multiple connections, usage of the same profile disk is not recommended.", + "guid": "5e985b85-9c77-43e7-b261-623b775a917e", + "link": "https://learn.microsoft.com/fslogix/concepts-multi-concurrent-connections", "services": [ - "AzurePolicy", - "ACR", - "SAP", - "WAF", - "FrontDoor" + "Storage", + "AVD" ], - "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/training/paths/secure-application-delivery/", - "waf": "Security" + "severity": "High", + "subcategory": "FSLogix", + "text": "Avoid usage of concurrent or multiple connections", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", - "service": "SAP", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "Cloud Cache uses OS drive as local cache storage and may generate lot of pressure on the VM disk. Depending on the VM SKU and size used, the VM temporary drive can be a viable and performant solution where to relocate Cloud Cache cached content. Before adopting this solution, tests should be executed to confirm performance and stability. More details on Cloud Cache can be found here: https://learn.microsoft.com/fslogix/concepts-fslogix-cloud-cache. ", + "guid": "b2d1215a-e114-4ba3-9df5-85ecdcd9bd3b", + "link": "https://docs.microsoft.com/fslogix/cloud-cache-configuration-reference", "services": [ - "AzurePolicy", - "AppGW", - "SAP", - "WAF", - "FrontDoor" + "Storage", + "VM", + "AVD" ], - "severity": "Medium", - "subcategory": "Internet", - "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", + "subcategory": "FSLogix", + "text": "If FSLogix Cloud Cache is used, consider moving the cache directory to the VM temporary drive.", + "waf": "Performance" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "5ada4332-4e13-4811-9231-81aa41742694", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", + "category": "Storage", + "checklist": "Azure Virtual Desktop Review", + "description": "REDIRECTION.XML file is used to control what folders are redirected out of the profile container to the 'C:' drive. Exclusions should be the exception and should never be used unless the specific exclusion is completely understood by the person configuring the exclusion. Exclusions should always be fully tested in the environment where they are intended to be implemented. Configuring exclusions may impact functionality, stability and performance.", + "guid": "0b50ca97-b1d2-473c-b4d9-6e98b0f912de", + "link": "https://docs.microsoft.com/fslogix/manage-profile-content-cncpt#redirectionsxml", "services": [ - "SAP", - "LoadBalancer", - "AppGW", - "WAF" + "Storage", + "AVD" ], "severity": "Medium", - "subcategory": "Internet", - "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" + "subcategory": "FSLogix", + "text": "Review the usage of FSLogix redirection.", + "waf": "Cost" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "SAP", + "category": "Operations Management", + "checklist": "Identity Review Checklist", + "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", + "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", + "service": "Entra", "services": [ - "SAP", - "VWAN", - "ACR" + "Entra" ], "severity": "Medium", - "subcategory": "Internet", - "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" + "subcategory": "Entra ID", + "text": "Use long-live revocable token, cache your token and acquire your silently using Microsoft Identity Library", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", - "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", - "service": "SAP", + "category": "Operations Management", + "checklist": "Identity Review Checklist", + "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", + "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", + "service": "AAD B2C", "services": [ - "Storage", - "ACR", - "VNet", - "SAP", - "Backup", - "PrivateLink" + "Entra" ], "severity": "Medium", - "subcategory": "Internet", - "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" + "subcategory": "AAD B2C", + "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", - "service": "SAP", + "category": "Operations Management", + "checklist": "Identity Review 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", "services": [ - "SAP", - "VM" + "Entra" ], - "severity": "High", - "subcategory": "Segmentation", - "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", + "severity": "Medium", + "subcategory": "AAD B2C", + "text": "Custom brand assets should be hosted on a CDN", "waf": "Performance" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", - "service": "SAP", + "category": "Operations Management", + "checklist": "Identity Review Checklist", + "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", + "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", + "service": "AAD B2C", "services": [ - "SAP", - "LoadBalancer" + "Entra" ], - "severity": "Medium", - "subcategory": "Segmentation", - "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" + "severity": "Low", + "subcategory": "AAD B2C", + "text": "Have multiple identiy providers (i.e., login with your microsoft, google, facebook accounts)", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "6791f893-5ada-4433-84e1-3811523181aa", - "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", - "service": "SAP", + "category": "Operations Management", + "checklist": "Identity Review 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", + "services": [ + "Entra", + "VM" + ], + "severity": "Medium", + "subcategory": "Windows Server AD", + "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" + }, + { + "category": "Operations Management", + "checklist": "Identity Review 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", "services": [ - "SAP", - "VNet", - "VM" + "Entra" ], "severity": "Medium", - "subcategory": "Segmentation", - "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" + "subcategory": "Windows Server AD", + "text": "Don't replicate! Replication can create issues with directory synchronization", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "category": "Operations Management", + "checklist": "Identity Review 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", "services": [ - "SAP", - "VNet" + "Entra" ], - "severity": "High", - "subcategory": "Segmentation", - "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" + "severity": "Medium", + "subcategory": "Windows Server AD", + "text": "Have active-active for multi-regions", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "fa96c96a-d885-418f-9827-34c886ba2802", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "category": "Operations Management", + "checklist": "Identity Review Checklist", + "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", "services": [ - "SAP" + "Entra" ], "severity": "Medium", - "subcategory": "Segmentation", - "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" + "subcategory": "Entra Domain Services", + "text": "Add Azure AD Domain service stamps to additional regions and locations", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "category": "Operations Management", + "checklist": "Identity Review Checklist", + "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", "services": [ - "SAP" + "Entra" ], - "severity": "High", - "subcategory": "Segmentation", - "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" + "severity": "Medium", + "subcategory": "Entra Domain Services", + "text": "Use Replica Sets for DR", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "category": "Operations Management", + "checklist": "CosmosDB Review 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": [ - "SAP", - "Cost", - "VNet" + "CosmosDB" ], - "severity": "High", - "subcategory": "Segmentation", - "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", + "subcategory": "Best Practices", + "text": "FTA Resiliency Playbook", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "402a9846-d515-4061-aff8-cd30088693fa", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", - "service": "SAP", + "category": "Operations Management", + "checklist": "CosmosDB Review Checklist", + "guid": "de39ac0e-7c28-4dc9-9565-7202bff4564b", + "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#slas", + "service": "CosmosDB", "services": [ - "SAP", - "LoadBalancer" + "CosmosDB" ], "severity": "High", - "subcategory": "Segmentation", - "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" + "subcategory": "High Availability", + "text": "Leverage Availablity Zones where regionally applicable and ofcourse if the service offers it", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "SAP Checklist", - "guid": "87585797-5551-4d53-bb7d-a94ee415734d", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", - "service": "SAP", + "category": "Operations Management", + "checklist": "CosmosDB Review Checklist", + "guid": "0d934a34-8b26-43e7-bd60-513a3649906e", + "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#replica-outages", + "service": "CosmosDB", "services": [ - "SAP", - "VNet" + "CosmosDB" ], "severity": "Medium", - "subcategory": "Segmentation", - "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" + "subcategory": "High Availability", + "text": "Run multiple replicas of the database (>1 ) in Prod", + "waf": "Reliability" }, { - "category": "Operational Excellence", - "checklist": "SAP Checklist", - "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", + "category": "Operations Management", + "checklist": "CosmosDB Review 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", "services": [ - "SAP", - "Backup", - "VM" + "CosmosDB", + "ACR" ], - "severity": "High", - "subcategory": " ", - "text": "Review SAP HANA database backups for Azure VMs.", - "waf": "Cost" + "severity": "Medium", + "subcategory": "High Availability", + "text": "Leverage Multi-Region Writes", + "waf": "Reliability" }, { - "category": "Operational Excellence", - "checklist": "SAP Checklist", - "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", + "category": "Operations Management", + "checklist": "CosmosDB Review 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", "services": [ - "SAP", - "Monitor", - "ASR" + "CosmosDB", + "ACR" ], "severity": "Medium", - "subcategory": " ", - "text": "Review Site Recovery built-in monitoring, where used for SAP.", - "waf": "Cost" + "subcategory": "High Availability", + "text": "Distribute your data globally", + "waf": "Reliability" }, { - "category": "Operational Excellence", - "checklist": "SAP Checklist", - "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", - "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", - "service": "SAP", + "category": "Operations Management", + "checklist": "CosmosDB Review 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", "services": [ - "SAP", - "Monitor" + "CosmosDB" ], "severity": "High", - "subcategory": " ", - "text": "Review the Monitoring the SAP HANA System Landscape guidance.", - "waf": "Operations" + "subcategory": "High Availability", + "text": "Choose from several well-defined consistency models", + "waf": "Reliability" }, { - "category": "Operational Excellence", - "checklist": "SAP Checklist", - "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", - "service": "SAP", + "category": "Operations Management", + "checklist": "CosmosDB Review 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": [ - "SAP", - "Backup", - "VM" + "CosmosDB" ], "severity": "Medium", - "subcategory": " ", - "text": "Review Oracle Database in Azure Linux VM backup strategies.", - "waf": "Operations" + "subcategory": "High Availability", + "text": "Enable Service managed failover", + "waf": "Reliability" }, { - "category": "Operational Excellence", - "checklist": "SAP 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", + "category": "Operations Management", + "checklist": "CosmosDB Review 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": [ - "SAP", - "SQL", + "Backup", + "CosmosDB", "Storage" ], "severity": "Medium", - "subcategory": " ", - "text": "Review the use of Azure Blob Storage with SQL Server 2016.", - "waf": "Operations" + "subcategory": "Backup Strategy", + "text": "Enable Automatic Backups", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Reliability" }, { - "category": "Operational Excellence", - "checklist": "SAP Checklist", - "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", - "service": "SAP", + "category": "Operations Management", + "checklist": "CosmosDB Review 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": [ - "SAP", "Backup", - "VM" + "CosmosDB" ], "severity": "Medium", - "subcategory": " ", - "text": "Review the use of Automated Backup v2 for Azure VMs.", - "waf": "Operations" - }, - { - "category": "Operational Excellence", - "checklist": "SAP Checklist", - "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", - "service": "SAP", - "services": [ - "SAP" - ], - "severity": "High", - "subcategory": " ", - "text": "Enabling Write accelerator for M series when using premium disks(V1)", - "waf": "Operations" + "subcategory": "Backup Strategy", + "text": "Perform Periodic Backups", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "Reliability" }, { - "category": "Performant", - "checklist": "SAP 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", + "category": "Operations Management", + "checklist": "CosmosDB Review 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", "services": [ - "SAP" + "Backup", + "CosmosDB" ], "severity": "Medium", - "subcategory": " ", - "text": "Test availability zone latency.", - "waf": "Performance" + "subcategory": "Backup Strategy", + "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" }, { - "category": "Performant", + "category": "Automation", "checklist": "SAP Checklist", - "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", - "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", + "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", + "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", "service": "SAP", "services": [ "SAP" ], "severity": "Medium", - "subcategory": " ", - "text": "Activate SAP EarlyWatch Alert for all SAP components.", - "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", - "waf": "Performance" + "subcategory": "ACSS", + "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" }, { - "category": "Performant", + "category": "Automation", "checklist": "SAP 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", + "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": [ "SAP" ], "severity": "Medium", - "subcategory": " ", - "text": "Review SAP application server to database server latency using SAP ABAPMeter report /SSA/CAT.", - "training": "https://me.sap.com/notes/0002879613", - "waf": "Performance" - }, - { - "category": "Performant", - "checklist": "SAP Checklist", - "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", - "service": "SAP", - "services": [ - "SAP", - "SQL", - "Monitor" - ], - "severity": "Medium", - "subcategory": " ", - "text": "Review SQL Server performance monitoring using CCMS.", - "waf": "Performance" + "subcategory": "SDAF", + "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" }, { - "category": "Performant", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", - "link": "https://me.sap.com/notes/500235", + "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", "service": "SAP", "services": [ - "SAP", - "VM" + "Backup", + "ASR", + "SAP" ], "severity": "Medium", - "subcategory": " ", - "text": "Test network latency between SAP application layer VMs and DBMS VMs (NIPING).", - "training": "https://me.sap.com/notes/1100926/E", - "waf": "Performance" + "subcategory": "Backup and restore", + "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" }, { - "category": "Performant", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", - "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", + "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", "service": "SAP", "services": [ - "SAP", - "Monitor" + "Backup", + "ASR", + "SAP" ], "severity": "Medium", - "subcategory": " ", - "text": "Review SAP HANA studio alerts.", - "waf": "Performance" + "subcategory": "Disaster recovery", + "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" }, { - "category": "Performant", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", - "link": "https://me.sap.com/notes/1969700", + "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" ], - "severity": "Medium", - "subcategory": " ", - "text": "Perform SAP HANA health checks using HANA_Configuration_Minichecks.", - "waf": "Performance" + "severity": "High", + "subcategory": "Disaster recovery", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", "service": "SAP", "services": [ - "SAP", - "VM" + "ASR", + "SAP" ], "severity": "Medium", - "subcategory": "Governance", - "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" + "subcategory": "Disaster recovery", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "08951710-79a2-492a-adbc-06d7a401545b", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "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", "SAP" ], - "severity": "Medium", - "subcategory": "Governance", - "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" + "severity": "High", + "subcategory": "Disaster recovery", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", "service": "SAP", "services": [ - "SAP", - "SQL" + "AKV", + "ACR", + "ASR", + "SAP" ], "severity": "Low", - "subcategory": "Governance", - "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" + "subcategory": "Disaster recovery", + "text": "Replicate key vault contents like certificates, secrets, or keys across regions so you can decrypt data in the DR region.", + "waf": "Reliability" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", "service": "SAP", "services": [ - "SAP", - "SQL" + "VNet", + "ASR", + "SAP" ], - "severity": "High", - "subcategory": "Governance", - "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" + "severity": "Medium", + "subcategory": "Disaster recovery", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "cf65de8e-1309-4ccc-b579-266bcca275fa", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", + "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", "service": "SAP", "services": [ - "AKV", "Storage", - "SQL", - "SAP", - "Backup" + "ASR", + "SAP" ], - "severity": "High", - "subcategory": "Secrets", - "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" + "severity": "Low", + "subcategory": "Disaster recovery", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", - "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", "service": "SAP", "services": [ - "SAP", - "Storage", - "AKV" - ], - "severity": "Medium", - "subcategory": "Secrets", - "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" + "ASR", + "SAP" + ], + "severity": "High", + "subcategory": "Disaster recovery", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", - "link": "https://learn.microsoft.com/azure/key-vault/general/overview", + "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", + "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", "service": "SAP", "services": [ - "SAP", - "AKV" + "ASR", + "VNet", + "SAP" ], "severity": "High", - "subcategory": "Secrets", - "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" + "subcategory": "Disaster recovery", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "829e2edb-2173-4676-aff6-691b4935ada4", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", "service": "SAP", "services": [ - "AzurePolicy", - "AKV", - "RBAC", - "SAP", - "Subscriptions" + "Entra", + "ASR", + "VM", + "SAP" ], - "severity": "Medium", - "subcategory": "Secrets", - "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" + "severity": "High", + "subcategory": "Disaster recovery", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "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": [ - "SAP", - "AzurePolicy", - "AKV" + "ASR", + "SAP" ], - "severity": "Medium", - "subcategory": "Secrets", - "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" + "severity": "High", + "subcategory": "High availability", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", - "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", + "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", "service": "SAP", "services": [ - "RBAC", - "SAP", - "AzurePolicy", - "AKV" + "ASR", + "SAP" ], "severity": "High", - "subcategory": "Secrets", - "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" + "subcategory": "High availability", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "a4777842-4d11-4678-9d2f-a56c56ad4840", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", + "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", "service": "SAP", "services": [ - "SAP", "Storage", - "Defender", - "AKV" + "VM", + "ASR", + "SAP" ], "severity": "High", - "subcategory": "Secrets", - "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" + "subcategory": "High availability", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP 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", + "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", + "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", "service": "SAP", "services": [ - "RBAC", - "SAP", - "Defender", - "AKV" + "Storage", + "ASR", + "SAP" ], "severity": "High", - "subcategory": "Secrets", - "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" + "subcategory": "High availability", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "1309cccd-5792-466b-aca2-75faa1abfe9d", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", + "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", + "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", "service": "SAP", "services": [ - "SAP", - "AKV" + "ASR", + "SAP" ], - "severity": "Low", - "subcategory": "Secrets", - "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" + "severity": "High", + "subcategory": "High availability", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", - "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", + "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": [ - "SAP", - "AKV" + "LoadBalancer", + "ASR", + "SAP" ], - "severity": "Medium", - "subcategory": "Secrets", - "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" + "severity": "High", + "subcategory": "High availability", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "4935ada4-2223-4ece-a1b1-23181a541741", - "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", + "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", "service": "SAP", "services": [ - "SAP", - "AKV" + "LoadBalancer", + "ASR", + "SAP" ], "severity": "High", - "subcategory": "Secrets", - "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" + "subcategory": "High availability", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", - "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", + "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", "service": "SAP", "services": [ - "SAP", - "AKV" + "ASR", + "SAP" ], "severity": "High", - "subcategory": "Secrets", - "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" + "subcategory": "High availability", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "209d490d-a477-4784-84d1-16785d2fa56c", - "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", + "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": [ - "RBAC", - "SAP", - "Subscriptions" + "Entra", + "ASR", + "VM", + "SAP" ], "severity": "High", - "subcategory": "Security", - "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" + "subcategory": "High availability", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", - "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", + "guid": "cbe05bbe-209d-4490-ba47-778424d11678", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", "service": "SAP", "services": [ - "SAP", - "NVA", - "PrivateLink" + "Entra", + "ASR", + "VM", + "RBAC", + "SAP" ], "severity": "High", - "subcategory": "Security", - "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" + "subcategory": "High availability", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "e124ba34-df68-45ed-bce9-bd3bb0cdb3b5", - "link": "https://learn.microsoft.com/en-us/training/modules/secure-vms-with-azure-security-center/?source=recommendations", + "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", + "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", "service": "SAP", "services": [ - "SAP", - "Storage", - "VM" + "ASR", + "SAP" ], - "severity": "Low", - "subcategory": "Security", - "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" + "severity": "Medium", + "subcategory": "High availability", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "5eb2ec14-eeaa-4359-8829-e2edb2173676", - "link": "https://learn.microsoft.com/microsoft-365/security/defender-endpoint/microsoft-defender-endpoint?view=o365-worldwide", + "guid": "9674e7c7-7796-4181-8920-09f4429543ba", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", "service": "SAP", "services": [ - "SAP", - "Defender" + "ASR", + "VM", + "SAP" ], - "severity": "Low", - "subcategory": "Security", - "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" + "severity": "High", + "subcategory": "High availability", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", "service": "SAP", "services": [ - "SAP", - "VNet" + "Entra", + "ASR", + "SAP" ], "severity": "High", - "subcategory": "Security", - "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" + "subcategory": "High availability", + "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" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "491ca1c4-3d40-42c0-9d85-b8933999590b", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", + "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", "service": "SAP", "services": [ - "SAP", - "WAF" + "ACR", + "ASR", + "SAP" ], - "severity": "Low", - "subcategory": "Security", - "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" + "severity": "High", + "subcategory": "High availability", + "text": "Use one proximity placement group per SAP SID. Groups don't span across Availability Zones or Azure regions", + "waf": "Reliability" }, { - "category": "Security, Governance and Compliance", + "category": "Business Continuity and Disaster Recovery", "checklist": "SAP Checklist", - "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", - "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", + "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": [ - "SAP", - "Monitor", - "AKV" + "Entra", + "ASR", + "SAP" ], - "severity": "Medium", - "subcategory": "Security", - "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" - }, - { - "category": "Application Deployment", - "checklist": "Azure Spring Apps Review", - "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", - "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", - "service": "Spring Apps", - "services": [], - "severity": "Medium", - "subcategory": "DevOps", - "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", + "severity": "High", + "subcategory": "High availability", + "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" }, { - "category": "BC and DR", - "checklist": "Azure Spring Apps Review", - "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", + "category": "Business Continuity and Disaster Recovery", + "checklist": "SAP Checklist", + "guid": "ed46b937-913e-4018-9c62-8393ab037e53", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", + "service": "SAP", "services": [ + "Entra", "ASR", - "FrontDoor", - "TrafficManager" + "VM", + "SAP" ], "severity": "Medium", - "subcategory": "Disaster Recovery", - "text": "Azure Spring Apps instances could be created in multiple regions for your applications and traffic could be routed by Traffic Manager/Front Door.", + "subcategory": "High availability", + "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" }, { - "category": "BC and DR", - "checklist": "Azure Spring Apps Review", - "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", - "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", - "service": "Spring Apps", + "category": "Business Continuity and Disaster Recovery", + "checklist": "SAP 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", "services": [ - "ACR" + "Storage", + "VM", + "ASR", + "SAP" ], "severity": "Medium", - "subcategory": "High Availability", - "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" - }, - { - "category": "BC and DR", - "checklist": "Azure Spring Apps Review", - "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", - "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", - "service": "Spring Apps", - "services": [], - "severity": "Medium", - "subcategory": "High Availability", - "text": "Use more than 1 app instance for your apps", + "subcategory": "High availability", + "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" }, { - "category": "Operations", - "checklist": "Azure Spring Apps Review", - "guid": "7504c230-6035-4183-95a5-85762acc6075", - "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", - "service": "Spring Apps", + "category": "Business Continuity and Disaster Recovery", + "checklist": "SAP 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", "services": [ - "Monitor" + "ASR", + "SAP" ], "severity": "Medium", - "subcategory": "Monitoring", - "text": "Monitor Azure Spring Apps with logs, metrics and tracing. Integrate ASA with application insights and track failures and create workbooks.", - "waf": "Reliability" - }, - { - "category": "Operations", - "checklist": "Azure Spring Apps Review", - "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": [], - "severity": "Medium", - "subcategory": "Scalability", - "text": "Set up autoscaling in Spring Cloud Gateway", + "subcategory": "High availability", + "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" }, { - "category": "Operations", - "checklist": "Azure Spring Apps Review", - "guid": "97411607-b6fd-4335-99d1-9885faf4e392", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", - "service": "Spring Apps", - "services": [], - "severity": "Low", - "subcategory": "Scalability", - "text": "Enable autoscale for the apps with Standard consumption & dedicated plan.", + "category": "Business Continuity and Disaster Recovery", + "checklist": "SAP Checklist", + "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", + "services": [ + "Storage", + "ASR", + "SAP" + ], + "severity": "High", + "subcategory": "Storage", + "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" }, { - "category": "Operations", - "checklist": "Azure Spring Apps Review", - "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", - "link": "https://learn.microsoft.com/azure/spring-apps/overview", - "service": "Spring Apps", - "services": [], - "severity": "Medium", - "subcategory": "Support", - "text": "Use Enterprise plan for commercial support of spring boot for mission critical apps. With other tiers you get OSS support.", + "category": "Business Continuity and Disaster Recovery", + "checklist": "SAP Checklist", + "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", + "service": "SAP", + "services": [ + "Storage", + "ASR", + "SAP" + ], + "severity": "High", + "subcategory": "Storage", + "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" }, { - "category": "Operations Management", - "checklist": "Identity Review Checklist", - "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", - "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", - "service": "Entra", + "category": "Business Continuity and Disaster Recovery", + "checklist": "SAP Checklist", + "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", + "service": "SAP", "services": [ - "Entra" + "Storage", + "ASR", + "SAP" ], - "severity": "Medium", - "subcategory": "Entra ID", - "text": "Use long-live revocable token, cache your token and acquire your silently using Microsoft Identity Library", + "severity": "High", + "subcategory": "Storage", + "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" }, { - "category": "Operations Management", - "checklist": "Identity Review Checklist", - "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", - "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", - "service": "AAD B2C", + "category": "Business Continuity and Disaster Recovery", + "checklist": "SAP Checklist", + "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", + "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", + "service": "SAP", "services": [ - "Entra" + "Storage", + "ASR", + "SAP" ], - "severity": "Medium", - "subcategory": "AAD B2C", - "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", + "severity": "High", + "subcategory": "Storage", + "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" }, { - "category": "Operations Management", - "checklist": "Identity Review 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", + "category": "Cost Optimization", + "checklist": "SAP 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", "services": [ - "Entra" + "Cost", + "SAP" ], "severity": "Medium", - "subcategory": "AAD B2C", - "text": "Custom brand assets should be hosted on a CDN", - "waf": "Performance" + "subcategory": " ", + "text": "Automate SAP System Start-Stop to manage costs.", + "waf": "Cost" }, { - "category": "Operations Management", - "checklist": "Identity Review Checklist", - "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", - "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", - "service": "AAD B2C", + "category": "Cost Optimization", + "checklist": "SAP Checklist", + "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", "services": [ - "Entra" + "Storage", + "VM", + "Cost", + "SAP" ], "severity": "Low", - "subcategory": "AAD B2C", - "text": "Have multiple identiy providers (i.e., login with your microsoft, google, facebook accounts)", - "waf": "Reliability" + "subcategory": " ", + "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" }, { - "category": "Operations Management", - "checklist": "Identity Review 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", + "category": "Cost Optimization", + "checklist": "SAP Checklist", + "guid": "9877f353-2591-4e8b-8381-e9043fed1010", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", "services": [ + "Storage", "VM", - "Entra" + "Cost", + "SAP" ], - "severity": "Medium", - "subcategory": "Windows Server AD", - "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" + "severity": "Low", + "subcategory": " ", + "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" }, { - "category": "Operations Management", - "checklist": "Identity Review 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", + "category": "Identity and Access", + "checklist": "SAP Checklist", + "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", + "service": "SAP", "services": [ - "Entra" + "Entra", + "RBAC", + "Subscriptions", + "SAP" ], - "severity": "Medium", - "subcategory": "Windows Server AD", - "text": "Don't replicate! Replication can create issues with directory synchronization", - "waf": "Reliability" + "severity": "High", + "subcategory": "Identity", + "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" }, { - "category": "Operations Management", - "checklist": "Identity Review 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", + "category": "Identity and Access", + "checklist": "SAP Checklist", + "guid": "45911475-e39e-4530-accc-d979366bcda2", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", "services": [ - "Entra" + "Entra", + "SAP" ], "severity": "Medium", - "subcategory": "Windows Server AD", - "text": "Have active-active for multi-regions", - "waf": "Reliability" + "subcategory": "Identity", + "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" }, { - "category": "Operations Management", - "checklist": "Identity Review Checklist", - "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", + "category": "Identity and Access", + "checklist": "SAP Checklist", + "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", "services": [ - "Entra" + "Entra", + "SAP" ], "severity": "Medium", - "subcategory": "Entra Domain Services", - "text": "Add Azure AD Domain service stamps to additional regions and locations", - "waf": "Reliability" + "subcategory": "Identity", + "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" }, { - "category": "Operations Management", - "checklist": "Identity Review Checklist", - "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", + "category": "Identity and Access", + "checklist": "SAP Checklist", + "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", "services": [ - "Entra" + "Entra", + "SAP" ], "severity": "Medium", - "subcategory": "Entra Domain Services", - "text": "Use Replica Sets for DR", - "waf": "Reliability" + "subcategory": "Identity", + "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" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "guid": "974a759c-763e-47d2-9161-3a7649907e0e", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ASB_v1.docx", + "category": "Identity and Access", + "checklist": "SAP Checklist", + "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", + "service": "SAP", "services": [ - "ServiceBus" + "Entra", + "SAP" ], "severity": "Medium", - "subcategory": "Best Practices", - "text": "Leverage FTA Handbook", - "waf": "Reliability" + "subcategory": "Identity", + "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" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "description": "This will be turned on automatically for a new SB namespace created from the portal with the Premium SKUs in a zone-enabled region. Both the Service Bus metadata and the messages data are replicated across datacenters in the availability zones configuration", - "guid": "338ee253-c17d-432e-aaaa-b7571549ab81", - "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-outages-disasters#availability-zones", + "category": "Identity and Access", + "checklist": "SAP Checklist", + "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", "services": [ - "ServiceBus", - "ACR" + "Entra", + "SAP" ], - "severity": "High", - "subcategory": "Best Practices", - "text": "Leverage Availability Zones if regionally applicable", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Identity", + "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" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "description": "If enabled, Implements namespace metadata replication to a secondary region. Does not replicate queue/topic message data. Premium sku only.", - "guid": "53d89f89-d17b-484b-93b5-a67f7b9ed5b3", - "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-outages-disasters#geo-disaster-recovery", + "category": "Identity and Access", + "checklist": "SAP Checklist", + "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", + "service": "SAP", "services": [ - "ServiceBus", - "Storage", - "ASR" + "Entra", + "AKV", + "SAP" ], "severity": "Medium", - "subcategory": "Geo-Disaster Recovery", - "text": "Plan for Metadata replication during regional failure", - "waf": "Reliability" + "subcategory": "Identity", + "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" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "description": "If an outage cannot be tolerated, do not use the build-in metadata replication option. Leverage a replication pattern to replicate Service Bus messages across two or more sets of cross-region namespaces", - "guid": "1f38c403-a822-4c24-93cf-0f18ac699ef1", - "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-federation-overview", + "category": "Identity and Access", + "checklist": "SAP 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", "services": [ - "ServiceBus", - "ACR", - "ASR" + "Entra", + "AKV", + "SAP" ], "severity": "Medium", - "subcategory": "Geo-Disaster Recovery", - "text": "Plan for Message replication during regional failure", - "waf": "Reliability" + "subcategory": "Identity", + "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" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "description": "Azure Service Bus uses a message broker to handle messages that are sent to a Service Bus queue or topic. By default, all messages that are sent to a queue or topic are handled by the same message broker process. This architecture can place a limitation on the overall throughput of the message queue. However, you can also partition a queue or topic when it is created", - "guid": "d5a83de4-de32-4c18-a147-0607c5c0e4e6", - "link": "https://learn.microsoft.com/azure/architecture/best-practices/data-partitioning-strategies#partitioning-azure-service-bus", + "category": "Identity and Access", + "checklist": "SAP 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", "services": [ - "ServiceBus", - "Storage" + "Entra", + "SAP" ], "severity": "Medium", - "subcategory": "Best Practices", - "text": "For applications which require high throughput, use Patritioning ", - "waf": "Reliability" + "subcategory": "Identity", + "text": "Implement SSO by using OAuth for SAP NetWeaver to allow third-party or custom applications to access SAP NetWeaver OData services.", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "guid": "14658d24-58ed-4671-99b8-21102df26ee4", - "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-outages-disasters", + "category": "Identity and Access", + "checklist": "SAP Checklist", + "guid": "a747c350-8d4c-449c-93af-393dbca77c48", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", + "service": "SAP", "services": [ - "ServiceBus" + "Entra", + "SAP" ], "severity": "Medium", - "subcategory": "Best Practices", - "text": "Evaluate Premier-tier benefits of Azure Service Bus", - "waf": "Reliability" + "subcategory": "Identity", + "text": "Implement SSO to SAP HANA", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "guid": "11e6f883-e52f-4472-8dd6-8c5b5c2521e5", - "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-messaging-exceptions", + "category": "Identity and Access", + "checklist": "SAP Checklist", + "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", + "service": "SAP", "services": [ - "ServiceBus" + "Entra", + "SAP" ], - "severity": "High", - "subcategory": "Best Practices", - "text": "Ensure that Service Bus Messaging Exceptions are handled properly", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Identity", + "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" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "guid": "4a69b9d3-39ac-44e7-a68d-1d75657202b4", - "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", + "category": "Identity and Access", + "checklist": "SAP Checklist", + "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", + "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", + "service": "SAP", "services": [ - "ServiceBus", - "Storage", - "PrivateLink" + "Entra", + "SAP" ], "severity": "Medium", - "subcategory": "Best Practices", - "text": "Connect to Service Bus with the Advanced Messaging Queue Protocol (AMQP) and use Service Endpoints or Private Endpoints when possible.", - "waf": "Reliability" + "subcategory": "Identity", + "text": "For applications that access SAP, you might want to use principal propagation to establish SSO.", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "guid": "f4564b4d-974a-4759-a763-e7d261613a76", - "link": "https://learn.microsoft.com/azure/service-bus-messaging/service-bus-performance-improvements?tabs=net-standard-sdk-2", + "category": "Identity and Access", + "checklist": "SAP 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", "services": [ - "ServiceBus" + "Entra", + "SAP" ], - "severity": "High", - "subcategory": "Best Practices", - "text": "Review the Best Practices for performance improvements using Service Bus Messaging", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Identity", + "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" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "guid": "49907e0e-338e-4e25-9c17-d32e8aaab757", - "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/operational-excellence", + "category": "Identity and Access", + "checklist": "SAP Checklist", + "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", + "service": "SAP", "services": [ - "ServiceBus" + "Entra", + "SAP" ], "severity": "Medium", - "subcategory": "Best Practices", - "text": "Implement geo-replication on the sender and receiver side to protect against outages and disasters", - "waf": "Reliability" + "subcategory": "Identity", + "text": "Implement SSO to SAP BTP", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "guid": "1549ab81-53d8-49f8-ad17-b84b33b5a67f", - "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", + "category": "Identity and Access", + "checklist": "SAP 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", "services": [ - "ServiceBus", - "Storage", - "ASR" + "Entra", + "SAP" ], "severity": "Medium", - "subcategory": "Best Practices", - "text": "If you need mission-critical messaging with queues and topics, Service Bus Premium is recommended with Geo-Disaster Recovery.", - "waf": "Reliability" + "subcategory": "Identity", + "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" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "guid": "7b9ed5b3-1f38-4c40-9a82-2c2463cf0f18", - "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", + "category": "Management Group and Subscriptions", + "checklist": "SAP 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", "services": [ - "ServiceBus" + "Subscriptions", + "AzurePolicy", + "SAP" ], "severity": "Medium", - "subcategory": "Best Practices", - "text": "Implement high availability for the Service Bus namespace", - "waf": "Reliability" + "subcategory": "Subscriptions", + "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" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "guid": "ac699ef1-d5a8-43de-9de3-2c1881470607", - "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", + "category": "Management Group and Subscriptions", + "checklist": "SAP Checklist", + "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "services": [ - "ServiceBus" + "Subscriptions", + "SAP" ], "severity": "High", - "subcategory": "Best Practices", - "text": "Ensure related messages are delivered in guaranteed order", - "waf": "Reliability" + "subcategory": "Subscriptions", + "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" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "guid": "c5c0e4e6-1465-48d2-958e-d67139b82110", - "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", + "category": "Management Group and Subscriptions", + "checklist": "SAP Checklist", + "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "services": [ - "ServiceBus" + "Subscriptions", + "SAP" ], - "severity": "Low", - "subcategory": "Best Practices", - "text": "Evaluate different Java Messaging Service (JMS) features through the JMS API", - "waf": "Reliability" + "severity": "High", + "subcategory": "Subscriptions", + "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" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "guid": "2df26ee4-11e6-4f88-9e52-f4722dd68c5b", - "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", + "category": "Management Group and Subscriptions", + "checklist": "SAP Checklist", + "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", + "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", + "service": "SAP", "services": [ - "ServiceBus" + "VM", + "Subscriptions", + "SAP" + ], + "severity": "High", + "subcategory": "Subscriptions", + "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" + }, + { + "category": "Management Group and Subscriptions", + "checklist": "SAP Checklist", + "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", + "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", + "service": "SAP", + "services": [ + "Subscriptions", + "SAP" ], "severity": "Low", - "subcategory": "Best Practices", - "text": "Use .NET Nuget packages to communicate with Service Bus messaging entities", - "waf": "Reliability" + "subcategory": "Subscriptions", + "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" }, { - "category": "Operations Management", - "checklist": "Service Bus Review Checklist", - "guid": "5c2521e5-4a69-4b9d-939a-c4e7c68d1d75", - "link": "https://learn.microsoft.com/azure/well-architected/service-guides/service-bus/reliability#checklist", + "category": "Management Group and Subscriptions", + "checklist": "SAP Checklist", + "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", + "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", + "service": "SAP", "services": [ - "ServiceBus" + "VM", + "Subscriptions", + "SAP" ], - "severity": "Medium", - "subcategory": "Best Practices", - "text": "Implement resilience for transient fault handling when sending or receiving messages", - "waf": "Reliability" + "severity": "High", + "subcategory": "Subscriptions", + "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" }, { - "category": "Security", - "checklist": "Service Bus Review 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", + "category": "Management Group and Subscriptions", + "checklist": "SAP Checklist", + "guid": "e6e20617-3686-4af4-9791-f8935ada4332", + "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", + "service": "SAP", "services": [ - "ServiceBus" + "Subscriptions", + "SAP" ], - "severity": "Low", - "subcategory": "Data Protection", - "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", + "subcategory": "Subscriptions", + "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" }, { - "category": "Security", - "checklist": "Service Bus Review 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", + "category": "Management Group and Subscriptions", + "checklist": "SAP Checklist", + "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", + "service": "SAP", "services": [ - "ServiceBus" + "TrafficManager", + "Cost", + "Subscriptions", + "SAP" ], "severity": "Medium", - "subcategory": "Data Protection", - "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" + "subcategory": "Subscriptions", + "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" }, { - "category": "Security", - "checklist": "Service Bus Review 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", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", "services": [ - "AzurePolicy", - "Entra", - "RBAC", - "TrafficManager", - "ServiceBus" + "Monitor", + "Backup", + "SAP" ], - "severity": "Medium", - "subcategory": "Identity and Access Management", - "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", + "subcategory": "BCDR", + "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" }, { - "category": "Security", - "checklist": "Service Bus Review 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", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", + "service": "SAP", "services": [ - "AKV", + "Entra", "Storage", "VM", - "Entra", - "ServiceBus", - "AppSvc" + "Monitor", + "SAP" ], "severity": "Medium", - "subcategory": "Identity and Access Management", - "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" + "subcategory": "BCDR", + "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" }, { - "category": "Security", - "checklist": "Service Bus Review 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", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", "services": [ - "RBAC", - "Storage", - "Entra", - "ServiceBus", - "Subscriptions" + "Monitor", + "SAP" ], "severity": "High", - "subcategory": "Identity and Access Management", - "text": "Use least privilege data plane RBAC", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", - "waf": "Security" + "subcategory": "Management", + "text": "Ensure time-zone matches between the operating system and the SAP system.", + "waf": "Operations" }, { - "category": "Security", - "checklist": "Service Bus Review 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", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "c3c7abc0-716c-4486-893c-40e181d65539", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", + "service": "SAP", "services": [ - "ServiceBus", + "Entra", "Monitor", - "VNet" + "SAP" ], "severity": "Medium", - "subcategory": "Monitoring", - "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" + "subcategory": "Management", + "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" }, { - "category": "Security", - "checklist": "Service Bus Review 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", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "a491dfc4-9353-4213-9217-eef0949f9467", + "link": "https://azure.microsoft.com/pricing/offers/dev-test/", + "service": "SAP", "services": [ - "ServiceBus", - "VNet", - "PrivateLink" + "Monitor", + "Cost", + "SAP" ], - "severity": "Medium", - "subcategory": "Networking", - "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" + "severity": "Low", + "subcategory": "Management", + "text": "Consider running dev/test systems in a snooze model to save and optimize Azure run costs.", + "waf": "Cost" }, { - "category": "Security", - "checklist": "Service Bus Review 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", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", + "link": "https://learn.microsoft.com/azure/lighthouse/overview", + "service": "SAP", "services": [ - "ServiceBus" + "Entra", + "Monitor", + "SAP" ], "severity": "Medium", - "subcategory": "Networking", - "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" + "subcategory": "Management", + "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" }, { - "category": "Governance", - "checklist": "Azure API Management Review", - "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", - "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", - "service": "APIM", + "category": "Management and Monitoring", + "checklist": "SAP 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", "services": [ - "APIM", - "AzurePolicy" + "Monitor", + "VM", + "SAP" ], "severity": "Medium", - "subcategory": "Development best practices", - "text": "Implement an error handling policy at the global level", + "subcategory": "Management", + "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" }, { - "category": "Governance", - "checklist": "Azure API Management Review", - "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", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", + "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", + "service": "SAP", "services": [ - "APIM", - "AzurePolicy" + "Monitor", + "SAP" ], - "severity": "Medium", - "subcategory": "Development best practices", - "text": "Ensure all APIs policies include a element.", + "severity": "Low", + "subcategory": "Management", + "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" }, { - "category": "Governance", - "checklist": "Azure API Management Review", - "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", - "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", - "service": "APIM", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "14591147-5e39-4e53-89cc-cd979366bcda", + "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", + "service": "SAP", "services": [ - "APIM", - "AzurePolicy", - "ACR" + "Monitor", + "SQL", + "SAP" ], "severity": "Medium", - "subcategory": "Development best practices", - "text": "Use Policy Fragments to avoid repeating same policies definitions across multiple APIs", + "subcategory": "Monitoring", + "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" }, { - "category": "Governance", - "checklist": "Azure API Management Review", - "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", - "link": "https://learn.microsoft.com/azure/api-management/monetization-support", - "service": "APIM", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", + "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", + "service": "SAP", "services": [ - "APIM" + "Entra", + "Monitor", + "VM", + "SAP" ], - "severity": "Medium", - "subcategory": "Monetization", - "text": "If you are planning to monetize your APIs, review the 'monetization support' article for best practices", + "severity": "High", + "subcategory": "Monitoring", + "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" }, { - "category": "Governance", - "checklist": "Azure API Management Review", - "guid": "a7d0840a-c8c4-4e83-adec-5ca578eb4049", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", - "service": "APIM", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "SAP", "services": [ - "APIM", - "Monitor" + "Monitor", + "AzurePolicy", + "SAP" ], - "severity": "High", + "severity": "Medium", "subcategory": "Monitoring", - "text": "Enable Diagnostics Settings to export logs to Azure Monitor", + "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" }, { - "category": "Governance", - "checklist": "Azure API Management Review", - "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", - "service": "APIM", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", + "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", + "service": "SAP", "services": [ - "APIM", - "Monitor" + "NetworkWatcher", + "Monitor", + "SAP" ], "severity": "Medium", "subcategory": "Monitoring", - "text": "Enable Application Insights for more detailed telemetry", + "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" }, { - "category": "Governance", - "checklist": "Azure API Management Review", - "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", - "service": "APIM", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "73686af4-6791-4f89-95ad-a43324e13811", + "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", + "service": "SAP", "services": [ - "APIM", - "Monitor" + "Monitor", + "VM", + "SAP" ], - "severity": "High", + "severity": "Medium", "subcategory": "Monitoring", - "text": "Configure alerts on the most critical metrics", + "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" }, { - "category": "Identity and Access Management", - "checklist": "Azure API Management Review", - "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", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "616785d6-fa96-4c96-ad88-518f482734c8", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", "services": [ - "APIM", - "AKV", - "Entra" + "Monitor", + "Subscriptions", + "SAP" ], "severity": "High", - "subcategory": "Data protection", - "text": "Ensure that custom SSL certificates are stored an Azure Key Vault so they can be securely accessed and updated", - "waf": "Security" + "subcategory": "Monitoring", + "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" }, { - "category": "Identity and Access Management", - "checklist": "Azure API Management Review", - "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", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", + "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", + "service": "SAP", "services": [ - "APIM", - "Entra" + "Monitor", + "Storage", + "ASR", + "SAP" ], - "severity": "High", - "subcategory": "Identity", - "text": "Protect incoming requests to APIs (data plane) with Azure AD", - "waf": "Security" + "severity": "Medium", + "subcategory": "Monitoring", + "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" }, { - "category": "Identity and Access Management", - "checklist": "Azure API Management Review", - "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", - "service": "APIM", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", + "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", + "service": "SAP", "services": [ - "APIM", - "Entra" + "Sentinel", + "Monitor", + "SAP" ], "severity": "Medium", - "subcategory": "Identity", - "text": "Use Microsoft Entra ID to authenticate users in the Developer Portal", + "subcategory": "Monitoring", + "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" }, { - "category": "Identity and Access Management", - "checklist": "Azure API Management Review", - "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", - "service": "APIM", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", + "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", + "service": "SAP", "services": [ - "APIM", - "Entra" + "Monitor", + "Cost", + "SAP" ], "severity": "Medium", - "subcategory": "Privileged access", - "text": "Create appropriate groups to control the visibility of the products", - "waf": "Security" + "subcategory": "Monitoring", + "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" }, { - "category": "Management", - "checklist": "Azure API Management Review", - "guid": "06862505-2d9a-4874-9491-2837b00a3475", - "link": "https://learn.microsoft.com/azure/api-management/backends", - "service": "APIM", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", + "service": "SAP", "services": [ - "APIM" + "Monitor", + "VM", + "SAP" + ], + "severity": "Low", + "subcategory": "Performance", + "text": "Use inter-VM latency monitoring for latency-sensitive applications.", + "waf": "Performance" + }, + { + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", + "services": [ + "Monitor", + "ASR", + "SAP" ], "severity": "Medium", - "subcategory": "Best practices", - "text": "Use Backends feature to eliminate redundant API backend configurations", - "waf": "Operations" + "subcategory": "Performance", + "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" }, { - "category": "Management", - "checklist": "Azure API Management Review", - "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", - "service": "APIM", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", "services": [ - "APIM", - "AzurePolicy" + "Monitor", + "Storage", + "SAP" ], "severity": "Medium", - "subcategory": "Best practices", - "text": "Use Named Values to store common values that can be used in policies", - "waf": "Operations" + "subcategory": "Performance", + "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" }, { - "category": "Management", - "checklist": "Azure API Management Review", - "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", - "service": "APIM", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "c027f893-f404-41a9-b33d-39d625a14964", + "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", + "service": "SAP", "services": [ - "APIM", - "ACR", - "ASR" + "Monitor", + "SAP" + ], + "severity": "Low", + "subcategory": "Performance", + "text": "Consider collecting full database statistics for non-HANA databases after migration. For example, implement SAP note 1020260 - Delivery of Oracle statistics.", + "waf": "Performance" + }, + { + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", + "service": "SAP", + "services": [ + "Monitor", + "Storage", + "SAP" ], "severity": "Medium", - "subcategory": "Business continuity and disaster recovery", - "text": "For DR, leverage the premium tier with deployments scaled across two or more regions for 99.99% SLA", - "waf": "Reliability" + "subcategory": "Performance", + "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" }, { - "category": "Management", - "checklist": "Azure API Management Review", - "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", - "link": "https://learn.microsoft.com/azure/api-management/high-availability", - "service": "APIM", + "category": "Management and Monitoring", + "checklist": "SAP 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", "services": [ - "APIM", - "ASR" + "Monitor", + "SQL", + "SAP" ], "severity": "Medium", - "subcategory": "Business continuity and disaster recovery", - "text": "Deploy at least one unit in two or more availability zones for an increased SLA of 99.99%", - "waf": "Reliability" + "subcategory": "Performance", + "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" }, { - "category": "Management", - "checklist": "Azure API Management Review", - "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", + "category": "Management and Monitoring", + "checklist": "SAP Checklist", + "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", "services": [ - "APIM", - "Backup", - "ASR" + "Monitor", + "ASR", + "SAP" ], "severity": "High", - "subcategory": "Business continuity and disaster recovery", - "text": "Ensure there is an automated backup routine", - "waf": "Reliability" + "subcategory": "Reliability", + "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" }, { - "category": "Management", - "checklist": "Azure API Management Review", - "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", - "link": "https://learn.microsoft.com/azure/api-management/retry-policy", - "service": "APIM", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "SAP", "services": [ - "APIM", - "AzurePolicy" + "AppGW", + "WAF", + "AzurePolicy", + "SAP" ], "severity": "Medium", - "subcategory": "Failover and Caching", - "text": "Use Policies to add a fail-over backend URL and caching to reduce failing calls.", - "waf": "Reliability" + "subcategory": "App 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" }, { - "category": "Management", - "checklist": "Azure API Management Review", - "guid": "f96ddac5-77ec-4fa9-8833-4327f052059e", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-cache-external", + "category": "Network Topology and Connectivity", + "checklist": "SAP 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", "services": [ - "APIM", - "AzurePolicy" + "DNS", + "VM", + "SAP" ], "severity": "Medium", - "subcategory": "Performance and scalability", - "text": "Consider using a external cache policy for APIs that can benefit from caching", - "training": "https://learn.microsoft.com/training/modules/improve-api-performance-with-apim-caching-policy/" + "subcategory": "DNS", + "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" }, { - "category": "Management", - "checklist": "Azure API Management Review", - "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", - "service": "APIM", + "category": "Network Topology and Connectivity", + "checklist": "SAP 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", "services": [ - "APIM", - "AzurePolicy", - "EventHubs" + "DNS", + "VNet", + "SAP" ], - "severity": "Low", - "subcategory": "Performance and scalability", - "text": "If you need to log at high performance levels, consider Event Hubs policy", + "severity": "Medium", + "subcategory": "DNS", + "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" }, { - "category": "Management", - "checklist": "Azure API Management Review", - "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", - "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", - "service": "APIM", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "a3592829-e6e2-4061-9368-6af46791f893", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", + "service": "SAP", "services": [ - "APIM", - "AzurePolicy" + "ACR", + "VNet", + "SAP" ], "severity": "Medium", - "subcategory": "Performance and scalability", - "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" + "subcategory": "Hybrid", + "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" }, { - "category": "Management", - "checklist": "Azure API Management Review", - "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", - "service": "APIM", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", + "service": "SAP", "services": [ - "APIM" + "NVA", + "SAP" ], - "severity": "Medium", - "subcategory": "Performance and scalability", - "text": "Configure autoscaling to scale out the number of instances when the load increases", + "severity": "High", + "subcategory": "Hybrid", + "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" }, { - "category": "Management", - "checklist": "Azure API Management Review", - "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", - "service": "APIM", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", + "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", + "service": "SAP", "services": [ - "APIM" + "VWAN", + "ACR", + "SAP" ], "severity": "Medium", - "subcategory": "Performance and scalability", - "text": "Deploy self-hosted gateways where Azure doesn't have a region close to the backend APIs.", - "waf": "Performance" + "subcategory": "Hybrid", + "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" }, { - "category": "Management", - "checklist": "Azure API Management Review", - "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", - "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", - "service": "APIM", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", + "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", + "service": "SAP", "services": [ - "APIM" + "VNet", + "NVA", + "SAP" ], "severity": "Medium", - "subcategory": "Premium Tier", - "text": "Use the premium tier for production workloads.", - "waf": "Reliability" + "subcategory": "Hybrid", + "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" }, { - "category": "Management", - "checklist": "Azure API Management Review", - "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", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", + "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", + "service": "SAP", "services": [ - "APIM", - "AzurePolicy" + "VWAN", + "VNet", + "NVA", + "SAP" ], "severity": "Medium", - "subcategory": "Request Routing", - "text": "In multi-region model, use Policies to route the requests to regional backends based on availability or latency.", - "waf": "Reliability" + "subcategory": "Hybrid", + "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" }, { - "category": "Management", - "checklist": "Azure API Management Review", - "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", + "category": "Network Topology and Connectivity", + "checklist": "SAP 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", "services": [ - "APIM", - "Entra" + "VNet", + "VM", + "SAP" ], "severity": "High", - "subcategory": "Resource Limits", - "text": "Be aware of APIM's limits", - "waf": "Reliability" + "subcategory": "IP plan", + "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" }, { - "category": "Management", - "checklist": "Azure API Management Review", - "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", - "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", - "service": "APIM", + "category": "Network Topology and Connectivity", + "checklist": "SAP 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", "services": [ - "APIM" + "VNet", + "ASR", + "SAP" ], "severity": "High", - "subcategory": "Self-Hosted", - "text": "Ensure that the self-hosted gateway deployments are resilient.", - "waf": "Reliability" + "subcategory": "IP plan", + "text": "Consider reserving IP address on DR side when configuring ASR", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Operations" }, { "category": "Network Topology and Connectivity", - "checklist": "Azure API Management Review", - "guid": "7519e385-a88b-4d34-966b-6269d686e890", - "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", - "service": "APIM", + "checklist": "SAP 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", "services": [ - "APIM", - "FrontDoor", - "Entra" + "VNet", + "SAP" + ], + "severity": "High", + "subcategory": "IP plan", + "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" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "6e154e3a-a359-4282-ae6e-206173686af4", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", + "service": "SAP", + "services": [ + "Storage", + "VNet", + "SAP" ], "severity": "Medium", - "subcategory": "Connectivity", - "text": "Use Azure Front Door in front of APIM for multi-region deployment", - "waf": "Performance" + "subcategory": "IP plan", + "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" }, { "category": "Network Topology and Connectivity", - "checklist": "Azure API Management Review", - "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", + "checklist": "SAP 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", "services": [ - "APIM", - "VNet" + "Firewall", + "SAP" ], "severity": "Medium", - "subcategory": "Security", - "text": "Deploy the service within a Virtual Network (VNet)", + "subcategory": "Internet", + "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" }, { "category": "Network Topology and Connectivity", - "checklist": "Azure API Management Review", - "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", + "checklist": "SAP Checklist", + "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", + "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", + "service": "SAP", "services": [ - "APIM", - "Monitor", - "VNet", - "Entra" + "AppGW", + "WAF", + "SAP" ], "severity": "Medium", - "subcategory": "Security", - "text": "Deploy network security groups (NSG) to your subnets to restrict or monitor traffic to/from APIM.", + "subcategory": "Internet", + "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" }, { "category": "Network Topology and Connectivity", - "checklist": "Azure API Management Review", - "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", + "checklist": "SAP Checklist", + "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "SAP", "services": [ - "APIM", - "Entra", - "VNet", - "PrivateLink" + "AzurePolicy", + "FrontDoor", + "ACR", + "SAP", + "WAF" ], "severity": "Medium", - "subcategory": "Security", - "text": "Deploy Private Endpoints to filter incoming traffic when APIM is not deployed to a VNet.", + "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/training/paths/secure-application-delivery/", "waf": "Security" }, { "category": "Network Topology and Connectivity", - "checklist": "Azure API Management Review", - "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", + "checklist": "SAP Checklist", + "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", + "service": "SAP", "services": [ - "APIM" + "AppGW", + "AzurePolicy", + "FrontDoor", + "SAP", + "WAF" ], - "severity": "High", - "subcategory": "Security", - "text": "Disable Public Network Access", + "severity": "Medium", + "subcategory": "Internet", + "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" }, { - "category": "Platform automation and DevOps", - "checklist": "Azure API Management Review", - "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", - "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", - "service": "APIM", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "5ada4332-4e13-4811-9231-81aa41742694", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "SAP", "services": [ - "APIM" + "LoadBalancer", + "AppGW", + "WAF", + "SAP" ], "severity": "Medium", - "subcategory": "Automation", - "text": "Simplify management with PowerShell automation scripts", - "waf": "Operations" + "subcategory": "Internet", + "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" }, { - "category": "Platform automation and DevOps", - "checklist": "Azure API Management Review", - "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", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "SAP", "services": [ - "APIM", - "Entra" + "VWAN", + "ACR", + "SAP" ], "severity": "Medium", - "subcategory": "Best practices", - "text": "Configure APIM via Infrastructure-as-code. Review DevOps best practices from the Cloud Adaption Framework APIM Landing Zone Accelerator", - "waf": "Operations" + "subcategory": "Internet", + "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" }, { - "category": "Platform automation and DevOps", - "checklist": "Azure API Management Review", - "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", - "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", - "service": "APIM", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", + "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", + "service": "SAP", "services": [ - "APIM", - "Entra" + "PrivateLink", + "Backup", + "Storage", + "ACR", + "SAP", + "VNet" ], "severity": "Medium", - "subcategory": "Best practices", - "text": "Promote usage of Visual Studio Code APIM extension for faster API development", - "waf": "Operations" + "subcategory": "Internet", + "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" }, { - "category": "Platform automation and DevOps", - "checklist": "Azure API Management Review", - "guid": "354f1c03-8112-4965-85ad-c0074bddf231", - "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", - "service": "APIM", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", + "service": "SAP", "services": [ - "APIM" + "VM", + "SAP" ], - "severity": "Medium", - "subcategory": "DevOps", - "text": "Implement DevOps and CI/CD in your workflow", - "waf": "Operations" + "severity": "High", + "subcategory": "Segmentation", + "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" }, { - "category": "Security", - "checklist": "Azure API Management Review", - "guid": "b6439493-426a-45f3-9697-cf65baee208d", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", - "service": "APIM", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", + "service": "SAP", "services": [ - "APIM" + "LoadBalancer", + "SAP" ], "severity": "Medium", - "subcategory": "APIs", - "text": "Secure APIs using client certificate authentication", + "subcategory": "Segmentation", + "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" }, { - "category": "Security", - "checklist": "Azure API Management Review", - "guid": "2a67d143-1033-4c0a-8732-680896478f08", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", - "service": "APIM", + "category": "Network Topology and Connectivity", + "checklist": "SAP 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" + ], + "severity": "Medium", + "subcategory": "Segmentation", + "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" + }, + { + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "services": [ - "APIM" + "VNet", + "SAP" ], - "severity": "Medium", - "subcategory": "APIs", - "text": "Secure backend services using client certificate authentication", - "waf": "Security" + "severity": "High", + "subcategory": "Segmentation", + "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" }, { - "category": "Security", - "checklist": "Azure API Management Review", - "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", - "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", - "service": "APIM", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "fa96c96a-d885-418f-9827-34c886ba2802", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "services": [ - "APIM" + "SAP" ], "severity": "Medium", - "subcategory": "APIs", - "text": "Review 'Recommendations to mitigate OWASP API Security Top 10 threats' article and check what is applicable to your APIs", - "waf": "Security" + "subcategory": "Segmentation", + "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" }, { - "category": "Security", - "checklist": "Azure API Management Review", - "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", - "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", - "service": "APIM", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "services": [ - "APIM" + "SAP" ], - "severity": "Medium", - "subcategory": "APIs", - "text": "Use Authorizations feature to simplify management of OAuth 2.0 token for your backend APIs", - "waf": "Security" + "severity": "High", + "subcategory": "Segmentation", + "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" }, { - "category": "Security", - "checklist": "Azure API Management Review", - "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", - "service": "APIM", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "services": [ - "APIM" + "VNet", + "Cost", + "SAP" ], "severity": "High", - "subcategory": "Ciphers", - "text": "Use the latest TLS version when encrypting information in transit. Disable outdated and unnecessary protocols and ciphers when possible.", - "waf": "Security" + "subcategory": "Segmentation", + "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" }, { - "category": "Security", - "checklist": "Azure API Management Review", - "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", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "402a9846-d515-4061-aff8-cd30088693fa", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", + "service": "SAP", "services": [ - "APIM", - "AKV" + "LoadBalancer", + "SAP" ], "severity": "High", - "subcategory": "Data protection", - "text": "Ensure that secrets (Named values) are stored an Azure Key Vault so they can be securely accessed and updated", - "waf": "Security" + "subcategory": "Segmentation", + "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" }, { - "category": "Security", - "checklist": "Azure API Management Review", - "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", + "category": "Network Topology and Connectivity", + "checklist": "SAP Checklist", + "guid": "87585797-5551-4d53-bb7d-a94ee415734d", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", + "service": "SAP", "services": [ - "APIM", - "Entra" + "VNet", + "SAP" ], "severity": "Medium", - "subcategory": "Identities", - "text": "Use managed identities to authenticate to other Azure resources whenever possible", + "subcategory": "Segmentation", + "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" }, { - "category": "Security", - "checklist": "Azure API Management Review", - "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", + "category": "Operational Excellence", + "checklist": "SAP Checklist", + "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", "services": [ - "APIM", - "AppGW", - "WAF", - "Entra" + "Backup", + "VM", + "SAP" ], "severity": "High", - "subcategory": "Network", - "text": "Use web application firewall (WAF) by deploying Application Gateway in front of APIM", - "waf": "Security" + "subcategory": " ", + "text": "Review SAP HANA database backups for Azure VMs.", + "waf": "Cost" }, { - "category": "BC and DR", - "checklist": "Azure App Service Review", - "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", + "category": "Operational Excellence", + "checklist": "SAP Checklist", + "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", "services": [ - "AppSvc" + "Monitor", + "ASR", + "SAP" ], - "severity": "Low", - "subcategory": "High Availability", - "text": "Refer to baseline highly available zone-redundant web application architecture for best practices", - "waf": "Reliability" + "severity": "Medium", + "subcategory": " ", + "text": "Review Site Recovery built-in monitoring, where used for SAP.", + "waf": "Cost" }, { - "category": "BC and DR", - "checklist": "Azure App Service Review", - "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", - "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", - "service": "App Services", + "category": "Operational Excellence", + "checklist": "SAP Checklist", + "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", + "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", + "service": "SAP", "services": [ - "AppSvc", - "Backup" + "Monitor", + "SAP" ], - "severity": "Medium", - "subcategory": "High Availability", - "text": "Use Premium and Standard tiers. These tiers support staging slots and automated backups.", - "waf": "Reliability" + "severity": "High", + "subcategory": " ", + "text": "Review the Monitoring the SAP HANA System Landscape guidance.", + "waf": "Operations" }, { - "category": "BC and DR", - "checklist": "Azure App Service Review", - "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", - "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", - "service": "App Services", + "category": "Operational Excellence", + "checklist": "SAP Checklist", + "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", + "service": "SAP", "services": [ - "AppSvc" + "Backup", + "VM", + "SAP" ], - "severity": "High", - "subcategory": "High Availability", - "text": "Leverage Availability Zones where regionally applicable (requires Premium v2 or v3 tier)", - "waf": "Reliability" + "severity": "Medium", + "subcategory": " ", + "text": "Review Oracle Database in Azure Linux VM backup strategies.", + "waf": "Operations" }, { - "category": "Operations", - "checklist": "Azure App Service Review", - "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Services", + "category": "Operational Excellence", + "checklist": "SAP 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", "services": [ - "Monitor", - "AppSvc" + "Storage", + "SQL", + "SAP" ], "severity": "Medium", - "subcategory": "Monitoring", - "text": "Implement health checks", - "waf": "Reliability" + "subcategory": " ", + "text": "Review the use of Azure Blob Storage with SQL Server 2016.", + "waf": "Operations" }, { - "category": "Operations", - "checklist": "Azure App Service Review", - "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", - "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", - "service": "App Services", + "category": "Operational Excellence", + "checklist": "SAP Checklist", + "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", + "service": "SAP", "services": [ - "AppSvc", - "Backup" + "Backup", + "VM", + "SAP" ], - "severity": "High", - "subcategory": "Multi-tenant service", - "text": "Refer to backup and restore best practices for Azure App Service", - "waf": "Reliability" + "severity": "Medium", + "subcategory": " ", + "text": "Review the use of Automated Backup v2 for Azure VMs.", + "waf": "Operations" }, { - "category": "BC and DR", - "checklist": "Azure App Service Review", - "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", + "category": "Operational Excellence", + "checklist": "SAP Checklist", + "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", + "service": "SAP", "services": [ - "AppSvc" + "SAP" ], "severity": "High", - "subcategory": "High Availability", - "text": "Implement Azure App Service reliability best practices", - "waf": "Reliability" + "subcategory": " ", + "text": "Enabling Write accelerator for M series when using premium disks(V1)", + "waf": "Operations" }, { - "category": "BC and DR", - "checklist": "Azure App Service Review", - "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", + "category": "Performant", + "checklist": "SAP 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", "services": [ - "AppSvc" + "SAP" ], - "severity": "Low", - "subcategory": "High Availability", - "text": "Familiarize with how to move an App Service app to another region During a disaster", - "waf": "Reliability" + "severity": "Medium", + "subcategory": " ", + "text": "Test availability zone latency.", + "waf": "Performance" }, { - "category": "BC and DR", - "checklist": "Azure App Service Review", - "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", - "service": "App Services", + "category": "Performant", + "checklist": "SAP Checklist", + "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", + "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", + "service": "SAP", "services": [ - "AppSvc" + "SAP" ], - "severity": "High", - "subcategory": "High Availability", - "text": "Familiarize with reliability support in Azure App Service", - "waf": "Reliability" + "severity": "Medium", + "subcategory": " ", + "text": "Activate SAP EarlyWatch Alert for all SAP components.", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", + "waf": "Performance" }, { - "category": "BC and DR", - "checklist": "Azure App Service Review", - "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "App Services", + "category": "Performant", + "checklist": "SAP 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", "services": [ - "AppSvc" + "SAP" ], "severity": "Medium", - "subcategory": "High Availability", - "text": "Ensure \"Always On\" is enabled for Function Apps running on a app service plan", - "waf": "Reliability" + "subcategory": " ", + "text": "Review SAP application server to database server latency using SAP ABAPMeter report /SSA/CAT.", + "training": "https://me.sap.com/notes/0002879613", + "waf": "Performance" }, { - "category": "Operations", - "checklist": "Azure App Service Review", - "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Services", + "category": "Performant", + "checklist": "SAP Checklist", + "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", + "service": "SAP", "services": [ "Monitor", - "AppSvc" + "SQL", + "SAP" ], "severity": "Medium", - "subcategory": "Monitoring", - "text": "Monitor App Service instances using Health checks", - "waf": "Reliability" + "subcategory": " ", + "text": "Review SQL Server performance monitoring using CCMS.", + "waf": "Performance" }, { - "category": "Operations", - "checklist": "Azure App Service Review", - "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", - "service": "App Services", + "category": "Performant", + "checklist": "SAP Checklist", + "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", + "link": "https://me.sap.com/notes/500235", + "service": "SAP", "services": [ - "Monitor", - "AppSvc" + "VM", + "SAP" ], "severity": "Medium", - "subcategory": "Monitoring", - "text": "Monitor availability and responsiveness of web app or website using Application Insights availability tests", - "waf": "Reliability" + "subcategory": " ", + "text": "Test network latency between SAP application layer VMs and DBMS VMs (NIPING).", + "training": "https://me.sap.com/notes/1100926/E", + "waf": "Performance" }, { - "category": "Operations", - "checklist": "Azure App Service Review", - "guid": "b4e3f2d5-a5c6-4d7e-8b2f-c5d9e7a8f0ea", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", - "service": "App Services", + "category": "Performant", + "checklist": "SAP Checklist", + "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", + "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", + "service": "SAP", "services": [ "Monitor", - "AppSvc" + "SAP" ], - "severity": "Low", - "subcategory": "Monitoring", - "text": "Use Application Insights Standard test to monitor availability and responsiveness of web app or website", - "waf": "Reliability" + "severity": "Medium", + "subcategory": " ", + "text": "Review SAP HANA studio alerts.", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Performant", + "checklist": "SAP Checklist", + "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", + "link": "https://me.sap.com/notes/1969700", + "service": "SAP", "services": [ - "AKV", - "AppSvc" + "SAP" ], - "severity": "High", - "subcategory": "Data Protection", - "text": "Use Key Vault to store secrets", + "severity": "Medium", + "subcategory": " ", + "text": "Perform SAP HANA health checks using HANA_Configuration_Minichecks.", + "waf": "Performance" + }, + { + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "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", + "SAP" + ], + "severity": "Medium", + "subcategory": "Governance", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "guid": "08951710-79a2-492a-adbc-06d7a401545b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "service": "SAP", "services": [ - "AKV", - "AppSvc", - "Entra" + "SAP" ], - "severity": "High", - "subcategory": "Data Protection", - "text": "Use Managed Identity to connect to Key Vault", + "severity": "Medium", + "subcategory": "Governance", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", "services": [ - "AKV", - "AppSvc" + "SQL", + "SAP" ], - "severity": "High", - "subcategory": "Data Protection", - "text": "Use Key Vault to store TLS certificate.", + "severity": "Low", + "subcategory": "Governance", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", "services": [ - "AppSvc", - "Subscriptions" + "SQL", + "SAP" ], - "severity": "Medium", - "subcategory": "Data Protection", - "text": "Isolate systems that process sensitive information", + "severity": "High", + "subcategory": "Governance", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP 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", "services": [ - "AppSvc", - "TrafficManager" + "AKV", + "Backup", + "SQL", + "Storage", + "SAP" ], - "severity": "Medium", - "subcategory": "Data Protection", - "text": "Do not store sensitive data on local disk", + "severity": "High", + "subcategory": "Secrets", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "SAP", "services": [ - "AppSvc", - "Entra" + "AKV", + "Storage", + "SAP" ], "severity": "Medium", - "subcategory": "Identity and Access Control", - "text": "Use an established Identity Provider for authentication", + "subcategory": "Secrets", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview", + "service": "SAP", "services": [ - "AppSvc", - "Entra" + "AKV", + "SAP" ], "severity": "High", - "subcategory": "Identity and Access Control", - "text": "Deploy from a trusted environment", + "subcategory": "Secrets", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "guid": "829e2edb-2173-4676-aff6-691b4935ada4", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "SAP", "services": [ - "AppSvc", - "Entra" + "AKV", + "AzurePolicy", + "RBAC", + "Subscriptions", + "SAP" ], - "severity": "High", - "subcategory": "Identity and Access Control", - "text": "Disable basic authentication", + "severity": "Medium", + "subcategory": "Secrets", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "SAP", "services": [ "AKV", - "AppSvc", - "Entra" + "AzurePolicy", + "SAP" ], - "severity": "High", - "subcategory": "Identity and Access Control", - "text": "Use Managed Identity to connect to resources", + "severity": "Medium", + "subcategory": "Secrets", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", + "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", + "service": "SAP", "services": [ - "ACR", - "AppSvc", - "Entra" + "RBAC", + "AKV", + "AzurePolicy", + "SAP" ], "severity": "High", - "subcategory": "Identity and Access Control", - "text": "Pull containers using a Managed Identity", + "subcategory": "Secrets", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP 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", "services": [ - "Monitor", - "AppSvc", - "Entra" + "AKV", + "Storage", + "Defender", + "SAP" ], - "severity": "Medium", - "subcategory": "Logging and Monitoring", - "text": "Send App Service runtime logs to Log Analytics", + "severity": "High", + "subcategory": "Secrets", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP 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", "services": [ - "Monitor", - "AppSvc", - "Entra" + "RBAC", + "AKV", + "Defender", + "SAP" ], - "severity": "Medium", - "subcategory": "Logging and Monitoring", - "text": "Send App Service activity logs to Log Analytics", + "severity": "High", + "subcategory": "Secrets", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP 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", "services": [ - "Monitor", - "NVA", - "VNet", - "AppSvc", - "Firewall" + "AKV", + "SAP" ], - "severity": "Medium", - "subcategory": "Network Security", - "text": "Outbound network access should be controlled", + "severity": "Low", + "subcategory": "Secrets", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", + "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", + "service": "SAP", "services": [ - "PrivateLink", - "Storage", - "NVA", - "VNet", - "AppSvc", - "Firewall" + "AKV", + "SAP" ], - "severity": "Low", - "subcategory": "Network Security", - "text": "Ensure a stable IP for outbound communications towards internet addresses", + "severity": "Medium", + "subcategory": "Secrets", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "guid": "4935ada4-2223-4ece-a1b1-23181a541741", + "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", + "service": "SAP", "services": [ - "AppSvc", - "PrivateLink" + "AKV", + "SAP" ], "severity": "High", - "subcategory": "Network Security", - "text": "Inbound network access should be controlled", + "subcategory": "Secrets", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", + "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", + "service": "SAP", "services": [ - "Monitor", - "FrontDoor", - "AppGW", - "WAF", - "AppSvc" + "AKV", + "SAP" ], "severity": "High", - "subcategory": "Network Security", - "text": "Use a WAF in front of App Service", + "subcategory": "Secrets", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "guid": "209d490d-a477-4784-84d1-16785d2fa56c", + "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", + "service": "SAP", "services": [ - "WAF", - "AppSvc", - "PrivateLink" + "RBAC", + "Subscriptions", + "SAP" ], "severity": "High", - "subcategory": "Network Security", - "text": "Avoid for WAF to be bypassed", + "subcategory": "Security", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", + "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", + "service": "SAP", "services": [ - "AzurePolicy", - "AppSvc" + "PrivateLink", + "NVA", + "SAP" ], - "severity": "Medium", - "subcategory": "Network Security", - "text": "Set minimum TLS policy to 1.2", + "severity": "High", + "subcategory": "Security", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP 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", "services": [ - "WAF", - "AppSvc" + "Storage", + "VM", + "SAP" ], - "severity": "High", - "subcategory": "Network Security", - "text": "Use HTTPS only", + "severity": "Low", + "subcategory": "Security", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP 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", "services": [ - "Storage", - "AppSvc" + "Defender", + "SAP" ], - "severity": "High", - "subcategory": "Network Security", - "text": "Wildcards must not be used for CORS", + "severity": "Low", + "subcategory": "Security", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "services": [ - "AppSvc" + "VNet", + "SAP" ], "severity": "High", - "subcategory": "Network Security", - "text": "Turn off remote debugging", + "subcategory": "Security", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP 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", "services": [ - "Defender", - "AppSvc" + "WAF", + "SAP" ], - "severity": "Medium", - "subcategory": "Network Security", - "text": "Enable Defender for Cloud - Defender for App Service", + "severity": "Low", + "subcategory": "Security", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "Security, Governance and Compliance", + "checklist": "SAP Checklist", + "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", + "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", + "service": "SAP", "services": [ - "WAF", - "AppGW", - "NVA", - "EventHubs", - "VNet", - "DDoS", - "AppSvc" + "AKV", + "Monitor", + "SAP" ], "severity": "Medium", - "subcategory": "Network Security", - "text": "Enable DDOS Protection Standard on the WAF VNet", + "subcategory": "Security", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "BC and DR", + "checklist": "Redis Resiliency checklist", + "guid": "65285269-440b-44be-9d3e-0844276d4bdc", + "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-zone-redundancy", + "service": "Redis", "services": [ - "PrivateLink", - "ACR", - "AppSvc", - "VNet" + "ACR" ], - "severity": "Medium", - "subcategory": "Network Security", - "text": "Pull containers over a Virtual Network", - "waf": "Security" + "severity": "High", + "subcategory": "High Availability", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "BC and DR", + "checklist": "Redis Resiliency 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", "services": [ - "AppSvc" + "Storage" ], "severity": "Medium", - "subcategory": "Penetration Testing", - "text": "Conduct a penetration test", - "waf": "Security" + "subcategory": "High Availability", + "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" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "BC and DR", + "checklist": "Redis Resiliency 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", "services": [ - "AppSvc" + "Storage" ], "severity": "Medium", - "subcategory": "Vulnerability Management", - "text": "Deploy validated code", - "waf": "Security" + "subcategory": "High Availability", + "text": "Use Geo-redundant storage account to persist Azure Cache for Redis data, or zonally redundant where geo-redundancy is not available", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Azure App Service Review", - "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", + "category": "BC and DR", + "checklist": "Redis Resiliency checklist", + "guid": "a8c26c9b-32ab-45bd-bc69-98a135e33789", + "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-geo-replication", + "service": "Redis", "services": [ - "AppSvc" + "ASR" ], - "severity": "High", - "subcategory": "Vulnerability Management", - "text": "Use up-to-date platforms, languages, protocols and frameworks", - "waf": "Security" + "severity": "Medium", + "subcategory": "High Availability", + "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" }, { "category": "Foundation", @@ -22632,8 +20279,8 @@ "guid": "aa359271-8e6e-4205-8725-769e46691e88", "link": "https://learn.microsoft.com/azure/azure-arc/servers/prerequisites#azure-subscription-and-service-limits", "services": [ - "Arc", - "Entra" + "Entra", + "Arc" ], "severity": "Medium", "subcategory": "Capacity Planning", @@ -22732,9 +20379,9 @@ "guid": "9bf39d95-d44c-47c8-a19c-a1f6d5215ae5", "link": "https://learn.microsoft.com/azure/azure-arc/servers/security-overview#identity-and-access-control", "services": [ + "Entra", "RBAC", - "Arc", - "Entra" + "Arc" ], "severity": "Medium", "subcategory": "Access", @@ -22747,9 +20394,9 @@ "guid": "14ba34d4-585e-4111-89bd-7ba012f7b94e", "link": "https://learn.microsoft.com/azure/active-directory/managed-identities-azure-resources/tutorial-windows-vm-access-nonaad", "services": [ - "Arc", + "Entra", "AKV", - "Entra" + "Arc" ], "severity": "Low", "subcategory": "Access", @@ -22763,8 +20410,8 @@ "guid": "35ac9322-23e1-4380-8523-081a94174158", "link": "https://learn.microsoft.com/azure/azure-arc/servers/prerequisites#azure-subscription-and-service-limits", "services": [ - "Arc", "Entra", + "Arc", "Subscriptions" ], "severity": "High", @@ -22779,9 +20426,9 @@ "guid": "33ee7ad6-c6d3-4733-865c-7acbe44bbe60", "link": "https://learn.microsoft.com/azure/azure-arc/servers/prerequisites#required-permissions", "services": [ + "Entra", "RBAC", - "Arc", - "Entra" + "Arc" ], "severity": "Medium", "subcategory": "Requirements", @@ -22795,9 +20442,9 @@ "guid": "9d79f2e8-7778-4424-a516-775c6fa95b96", "link": "https://learn.microsoft.com/azure/azure-arc/servers/onboard-service-principal#create-a-service-principal-for-onboarding-at-scale", "services": [ + "Entra", "RBAC", - "Arc", - "Entra" + "Arc" ], "severity": "Medium", "subcategory": "Security", @@ -22811,9 +20458,9 @@ "guid": "ad88408e-3727-434b-a76b-a28f21459013", "link": "https://learn.microsoft.com/azure/azure-arc/servers/onboard-service-principal#create-a-service-principal-for-onboarding-at-scale", "services": [ + "Entra", "RBAC", - "Arc", - "Entra" + "Arc" ], "severity": "Medium", "subcategory": "Security", @@ -22827,9 +20474,9 @@ "guid": "65d38e53-f9cc-4bd8-9826-6abca264f9a1", "link": "https://learn.microsoft.com/azure/azure-arc/servers/prerequisites#required-permissions", "services": [ + "Entra", "RBAC", - "Arc", - "Entra" + "Arc" ], "severity": "Medium", "subcategory": "Security", @@ -22955,654 +20602,1104 @@ "waf": "Operations" }, { - "category": "Management and Monitoring", - "checklist": "Azure Arc Review", - "guid": "89c93555-6d02-4bfe-9564-b0d834a34872", - "link": "https://learn.microsoft.com/azure/azure-arc/servers/learn/tutorial-enable-vm-insights", + "category": "Management and Monitoring", + "checklist": "Azure Arc Review", + "guid": "89c93555-6d02-4bfe-9564-b0d834a34872", + "link": "https://learn.microsoft.com/azure/azure-arc/servers/learn/tutorial-enable-vm-insights", + "services": [ + "Arc", + "Monitor" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Use Azure Monitor for compliance and operational monitoring", + "waf": "Operations" + }, + { + "category": "Management and Monitoring", + "checklist": "Azure Arc Review", + "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" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Create an alert to identify Azure Arc-enabled servers that aren't using the latest version of the Azure connected machine agent", + "waf": "Operations" + }, + { + "category": "Management and Monitoring", + "checklist": "Azure Arc Review", + "description": "Use Update Management in Azure Automation or the new Update Management Center (preview) functionality to ensure update management of servers", + "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" + ], + "severity": "Low", + "subcategory": "Security", + "text": "Use Azure Arc-enabled servers to control software updates deployments to servers", + "waf": "Operations" + }, + { + "category": "Networking", + "checklist": "Azure Arc Review", + "description": "The Connected Machine Agent will by default communicate with Azure services over public Internet connectivity using HTTPS (TCP port 443)", + "guid": "f6e043d2-aa35-4927-88e6-e2050725769e", + "link": "https://learn.microsoft.com/azure/azure-arc/servers/network-requirements?tabs=azure-cloud#details", + "services": [ + "Arc" + ], + "severity": "High", + "subcategory": "Networking", + "text": "Define a connectivity method from the server to Azure", + "waf": "Operations" + }, + { + "category": "Networking", + "checklist": "Azure Arc Review", + "description": "The Connected Machine Agent can be configured to use a proxy server, it is recommended to define the proxy server address using 'azcmagent config set proxy.url' command on the local system.", + "guid": "46691e88-35ac-4932-823e-13800523081a", + "link": "https://learn.microsoft.com/azure/azure-arc/servers/manage-agent#update-or-remove-proxy-settings", + "services": [ + "Arc" + ], + "severity": "Medium", + "subcategory": "Networking", + "text": "Is a proxy server a required for communication over the Public Internet", + "waf": "Operations" + }, + { + "category": "Networking", + "checklist": "Azure Arc Review", + "description": "The Connected Machine Agent can use a Private Link for communication with Azure Services over an existing ExpressRoute or VPN connection", + "guid": "94174158-33ee-47ad-9c6d-3733165c7acb", + "link": "https://learn.microsoft.com/azure/azure-arc/servers/private-link-security", + "services": [ + "VPN", + "Arc", + "PrivateLink", + "ExpressRoute" + ], + "severity": "Medium", + "subcategory": "Networking", + "text": "Is a private (not public Internet) connection required?", + "waf": "Operations" + }, + { + "category": "Networking", + "checklist": "Azure Arc Review", + "description": "Firewall configuration might be required for the agent to communicate with Azure, use the link to see ServiceTags and/or URL's required", + "guid": "e44bbe60-9d79-4f2e-a777-8424c516775c", + "link": "https://learn.microsoft.com/azure/azure-arc/servers/network-requirements?tabs=azure-cloud#service-tags", + "services": [ + "Arc" + ], + "severity": "High", + "subcategory": "Networking", + "text": "Will Firewall configurations be needed in order to ensure communication with Azure Services?", + "waf": "Security" + }, + { + "category": "Networking", + "checklist": "Azure Arc Review", + "description": "Use available automation tool for the system in question to regularly update the Azure endpoints", + "guid": "6fa95b96-ad88-4408-b372-734b876ba28f", + "link": "https://www.microsoft.com/download/details.aspx?id=56519", + "services": [ + "Arc" + ], + "severity": "Low", + "subcategory": "Networking", + "text": "Can the Firewall or Proxy rules be automated updated if Service Tags or IP addresses change", + "waf": "Security" + }, + { + "category": "Networking", + "checklist": "Azure Arc Review", + "description": "Configure Servers to use Transport Layer Security (TLS) version 1.2", + "guid": "21459013-65d3-48e5-9f9c-cbd868266abc", + "link": "https://learn.microsoft.com/azure/azure-arc/servers/network-requirements?tabs=azure-cloud#transport-layer-security-12-protocol", + "services": [ + "Arc" + ], + "severity": "High", + "subcategory": "Networking", + "text": "Always use secure communication for Azure where possible", + "waf": "Security" + }, + { + "category": "Networking", + "checklist": "Azure Arc Review", + "description": "All extensions (like log analytics etc.) have separate network requirements, be sure to include all in the network design.", + "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", + "Arc", + "Monitor" + ], + "severity": "Low", + "subcategory": "Networking", + "text": "Include communication for Azure Arc-enabled Servers extensions in the design (firewall/proxy/private link)", + "waf": "Security" + }, + { + "category": "Security, Governance and Compliance", + "checklist": "Azure Arc Review", + "guid": "ac6aae01-e6a8-44de-9df4-7d2d92881b1c", + "link": "https://learn.microsoft.com/azure/governance/policy/", + "services": [ + "Arc", + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Management", + "text": "Use Azure Policy to implement a governance model for hybrid connected servers", + "waf": "Security" + }, + { + "category": "Security, Governance and Compliance", + "checklist": "Azure Arc Review", + "guid": "5c2a3649-4b69-4bad-98aa-d53cc78e1d76", + "link": "https://learn.microsoft.com/azure/governance/machine-configuration/overview", + "services": [ + "Arc" + ], + "severity": "Medium", + "subcategory": "Management", + "text": "Consider using Machine configurations for in guest OS configurations", + "waf": "Operations" + }, + { + "category": "Security, Governance and Compliance", + "checklist": "Azure Arc Review", + "guid": "667357c4-4967-44c5-bd85-b859c7733be2", + "link": "https://learn.microsoft.com/azure/governance/machine-configuration/machine-configuration-create", + "services": [ + "Arc", + "AzurePolicy" + ], + "severity": "Medium", + "subcategory": "Management", + "text": "Evaluate the need for custom Guest Configuration policies", + "waf": "Operations" + }, + { + "category": "Security, Governance and Compliance", + "checklist": "Azure Arc Review", + "guid": "49674c5e-d85b-4859-a773-3be2a1a27b77", + "link": "https://learn.microsoft.com/azure/automation/change-tracking/overview", + "services": [ + "Arc", + "Monitor" + ], + "severity": "Medium", + "subcategory": "Monitoring", + "text": "Consider using change tracking for tracking changes made on the servers", + "waf": "Operations" + }, + { + "category": "Security, Governance and Compliance", + "checklist": "Azure Arc Review", + "guid": "d5d1e54a-2965-49e3-a58f-d78289c93555", + "link": "https://learn.microsoft.com/azure/azure-arc/servers/data-residency", + "services": [ + "Arc" + ], + "severity": "Medium", + "subcategory": "Requirements", + "text": "Make sure to use an Azure region for storing the metadata approved by the organization", + "waf": "Security" + }, + { + "category": "Security, Governance and Compliance", + "checklist": "Azure Arc Review", + "guid": "195abb91-a4ed-490d-ae2c-c84c37b6b780", + "link": "https://learn.microsoft.com/azure/key-vault/general/basic-concepts", + "services": [ + "AKV", + "Arc" + ], + "severity": "Medium", + "subcategory": "Secrets", + "text": "Use Azure Key Vault for certificate management on servers", + "waf": "Security" + }, + { + "category": "Security, Governance and Compliance", + "checklist": "Azure Arc Review", + "description": "Consider using a short-lived Azure AD service principal client secrets.", + "guid": "6d02bfe4-564b-40d8-94a3-48726ee79d6b", + "link": "https://learn.microsoft.com/azure/active-directory/develop/howto-create-service-principal-portal#option-2-create-a-new-application-secret", + "services": [ + "Entra", + "AKV", + "Arc", + "Storage" + ], + "severity": "High", + "subcategory": "Secrets", + "text": "What is the acceptable life time of the secret used by SP's", + "waf": "Security" + }, + { + "category": "Security, Governance and Compliance", + "checklist": "Azure Arc Review", + "description": "A private key is saved to the disk, ensure this is protected using disk encryption", + "guid": "a1a27b77-5a91-4be1-b388-ff394c2bd463", + "link": "https://learn.microsoft.com/azure/azure-arc/servers/security-overview#using-disk-encryption", + "services": [ + "AKV", + "Arc" + ], + "severity": "Medium", + "subcategory": "Secrets", + "text": "Secure the public key for Azure Arc-enabled Servers", + "waf": "Security" + }, + { + "category": "Security, Governance and Compliance", + "checklist": "Azure Arc Review", + "description": "Local administrator is required to install the Connected Machine Agent on Windows and Linux systems", + "guid": "29659e39-58fd-4782-a9c9-35556d02bfe4", + "link": "https://learn.microsoft.com/azure/azure-arc/servers/onboard-portal#install-manually", + "services": [ + "Arc" + ], + "severity": "High", + "subcategory": "Security", + "text": "Ensure there is local administrator access for executing the agent installation", + "waf": "Security" + }, + { + "category": "Security, Governance and Compliance", + "checklist": "Azure Arc Review", + "description": "Members of the local administrator group on Windows and users with root privileges on Linux, have permissions to manage the agent via command line.", + "guid": "564b0d83-4a34-4872-9ee7-9d6b5c2a3649", + "link": "https://learn.microsoft.com/azure/azure-arc/servers/security-overview#agent-security-and-permissions", + "services": [ + "Arc" + ], + "severity": "Medium", + "subcategory": "Security", + "text": "Limit the amount of users with local administrator rights to the servers", + "waf": "Security" + }, + { + "category": "Security, Governance and Compliance", + "checklist": "Azure Arc Review", + "guid": "4b69bad3-8aad-453c-a78e-1d76667357c4", + "link": "https://learn.microsoft.com/azure/azure-arc/servers/managed-identity-authentication", + "services": [ + "Entra", + "Arc" + ], + "severity": "Medium", + "subcategory": "Security", + "text": "Consider using and restricting access to managed identities for applications.", + "waf": "Security" + }, + { + "category": "Security, Governance and Compliance", + "checklist": "Azure Arc Review", + "description": "Use Defender for Endpoint or another AV and EDR solution to protect endpoints", + "guid": "5a91be1f-388f-4f39-9c2b-d463cbbbc868", + "link": "https://learn.microsoft.com/azure/security-center/security-center-get-started", + "services": [ + "Arc", + "Defender" + ], + "severity": "Medium", + "subcategory": "Security", + "text": "Enable Defender for Servers for all servers to secure hybrid workloads from threats", + "waf": "Security" + }, + { + "category": "Security, Governance and Compliance", + "checklist": "Azure Arc Review", + "guid": "cbafe6c4-6589-4d45-9a92-7c3974d1102c", + "services": [ + "Arc" + ], + "severity": "Medium", + "subcategory": "Security", + "text": "Define controls to detect security misconfigurations and track compliance", + "waf": "Security" + }, + { + "category": "Security, Governance and Compliance", + "checklist": "Azure Arc Review", + "guid": "cbbbc868-195a-4bb9-8a4e-d90dae2cc84c", + "link": "https://learn.microsoft.com/azure/azure-arc/servers/security-overview#extension-allowlists-and-blocklists", + "services": [ + "Arc" + ], + "severity": "Medium", + "subcategory": "Security", + "text": "Use allow- or block-lists to control what extensions can be installed on the Azure Arc-enabled servers", + "waf": "Security" + }, + { + "category": "BCDR", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Ensure that your backups are protected against attacks. This should include encryption of the backups to protect against loss of confidentiality. For regular Azure service backup, backup data is automatically encrypted using Azure platform-managed keys. You can also choose to encrypt the backup using a customer-managed key. In this case, ensure this customer-managed key in the key vault is also in the backup scope.", + "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": [ + "AKV", + "Backup", + "SQL" + ], + "severity": "Medium", + "subcategory": "Azure Key Vault", + "text": "Protect your backup data with encryption and store keys safely in Azure Key Vault", + "waf": "Security" + }, + { + "category": "BCDR", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Azure SQL Database uses SQL Server technology to create full backups every week, differential backup every 12-24 hours, and transaction log backup every 5 to 10 minutes. By default, SQL Database stores data in geo-redundant storage blobs that are replicated to a paired region.", + "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", + "SQL", + "Storage" + ], + "severity": "Medium", + "subcategory": "Backup", + "text": "Configure Azure SQL Database automated backups", + "waf": "Security" + }, + { + "category": "BCDR", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "By default, SQL Database stores data in geo-redundant storage blobs that are replicated to a paired region. For SQL Database, the backup storage redundancy can be configured at the time of database creation or can be updated for an existing database; the changes made to an existing database apply to future backups only.", + "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" + ], + "severity": "Low", + "subcategory": "Backup", + "text": "Enable geo-redundant backup storage to protect against single region failure and data loss", + "waf": "Security" + }, + { + "category": "Code", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Malicious code can potentially circumvent security controls. Before deploying custom code to production, it is essential to review what's being deployed. Use a database tool like Azure Data Studio that supports source control. Implement tools and logic for code analysis, vulnerability and credential scanning.", + "guid": "7ca9f006-d2a9-4652-951c-de8e4ac5e76e", + "link": "https://learn.microsoft.com/azure/azure-sql/database/transparent-data-encryption-byok-create-server", + "services": [ + "SQL" + ], + "severity": "Medium", + "subcategory": "Source Control and Code Review", + "text": "Use Source Control systems to store, maintain and review application code deployed inside Azure SQLDB Database", + "waf": "Security" + }, + { + "category": "Data Discovery and Classification", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "In case of classification requirements Purview is the preferred option. Only use SQL Data Discovery & Classification in case Purview is not an option. Discover columns that potentially contain sensitive data. What is considered sensitive data heavily depends on the customer, compliance regulation, etc., and needs to be evaluated by the users in charge of that data. Classify the columns to use advanced sensitivity-based auditing and protection scenarios. Review results of automated discovery and finalize the classification if necessary.", + "guid": "d401509b-2629-4484-9a7f-af0d29a7778f", + "link": "https://learn.microsoft.com/azure/azure-sql/database/data-discovery-and-classification-overview?view=azuresql#faq---advanced-classification-capabilities", + "services": [ + "SQL" + ], + "severity": "Low", + "subcategory": "Data Discovery and Classification", + "text": "Plan and configure Data Discovery & Classification to protect the sensitive data", + "waf": "Security" + }, + { + "category": "Data Masking", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Usage of this feature is recommended only if column encryption is not an option and there is a specific requirement to preserve data types and formats. Dynamic data masking limits sensitive data exposure by masking it to non-privileged users. Dynamic data masking helps prevent unauthorized access to sensitive data by enabling customers to designate how much of the sensitive data to reveal with minimal impact on the application layer.", + "guid": "9391fd50-135e-453e-90a7-c1a23f88cc13", + "link": "https://learn.microsoft.com/azure/azure-sql/database/dynamic-data-masking-overview", + "services": [ + "SQL" + ], + "severity": "Low", + "subcategory": "Data Masking", + "text": "Use Data Masking to prevent unauthorized non-admin users data access if no encryption is possible", + "waf": "Security" + }, + { + "category": "Defender", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "SQL Advanced Threat Detection (ATP) provides a layer of security that detects potential vulnerabilities and anomalous activity in databases such as SQL injection attacks and unusual behavior patterns. When a potential threat is detected Threat Detection sends an actionable real-time alert by email and in Microsoft Defender for Cloud, which includes clear investigation and remediation steps for the specific threat.", + "guid": "4e52d73f-5d37-428f-b3a2-e6997e835979", + "link": "https://learn.microsoft.com/azure/azure-sql/database/threat-detection-configure", + "services": [ + "EventHubs", + "SQL", + "Defender" + ], + "severity": "High", + "subcategory": "Advanced Threat Protection", + "text": "Review and complete Advanced Threat Protection (ATP) configuration", + "waf": "Security" + }, + { + "category": "Defender", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Enable Microsoft Defender for Azure SQL at the subscription level to automatically onboard and protect all existing and future servers and databases. When you enable on the subscription level, all databases in Azure SQL Database and Azure SQL Managed Instance are protected. You can then disable them individually if you choose. If you want to manually manage which databases are protected, disable at the subscription level and enable each database that you want protected.", + "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", + "SQL", + "Defender" + ], + "severity": "High", + "subcategory": "Defender for Azure SQL", + "text": "Enable Microsoft Defender for Azure SQL", + "waf": "Security" + }, + { + "category": "Defender", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Microsoft Defender for Azure SQL ATP detects anomalous activities indicating unusual and potentially harmful attempts to access or exploit databases. Alerts can be configured and generated and will be reported in the Defender for console.", + "guid": "ca342fdf-d25a-4427-b105-fcd50ff8a0ea", + "link": "https://learn.microsoft.com/azure/azure-sql/database/threat-detection-configure", + "services": [ + "SQL", + "Defender", + "Monitor" + ], + "severity": "High", + "subcategory": "Defender for Azure SQL", + "text": "Prepare a security response plan to promptly react to Microsoft Defender for Azure SQL alerts", + "waf": "Security" + }, + { + "category": "Defender", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Azure SQLDB vulnerability assessment is a service that provides visibility into your security state. Vulnerability assessment includes actionable steps to resolve security issues and enhance your database security. It can help you to monitor a dynamic database environment where changes are difficult to track and improve your SQL security posture.", + "guid": "a6101ae7-534c-45ab-86fd-b34c55ea21ca", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/sql-azure-vulnerability-assessment-overview", + "services": [ + "SQL", + "Defender", + "Monitor" + ], + "severity": "High", + "subcategory": "Vulnerability Assessment", + "text": "Configure Vulnerability Assessment (VA) findings and review recommendations", + "waf": "Security" + }, + { + "category": "Defender", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Microsoft Defender for Cloud provides vulnerability assessment for your Azure SQL Databases. Vulnerability assessment scans your databases for software vulnerabilities and provides a list of findings. You can use the findings to remediate software vulnerabilities and disable findings.", + "guid": "c8c5f112-1e50-4f77-9264-8195b4cd61ac", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/sql-azure-vulnerability-assessment-find?view=azuresql", "services": [ - "Arc", - "Monitor" + "SQL", + "Defender" ], - "severity": "Medium", - "subcategory": "Monitoring", - "text": "Use Azure Monitor for compliance and operational monitoring", - "waf": "Operations" + "severity": "High", + "subcategory": "Vulnerability Assessment", + "text": "Regularly review of Vulnerability Assessment (VA) findings and recommendations and prepare a plan to fix", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "Azure Arc Review", - "guid": "5df47d2d-9288-41b1-ad5d-1e54a29659e3", - "link": "https://learn.microsoft.com/azure/azure-arc/servers/plan-at-scale-deployment#phase-3-manage-and-operate", + "category": "Encryption", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Always Encrypted with Secure Enclaves expands confidential computing capabilities of Always Encrypted by enabling in-place encryption and richer confidential queries. Always Encrypted with Secure Enclaves addresses these limitations by allowing some computations on plaintext data inside a secure enclave on the server side. Usage of this feature is recommended for the cases where you need to limit administrator access and need your queries to support more than equality matching of encrypted columns.", + "guid": "65d7e54a-10a6-4094-b673-9ff3809c9277", + "link": "https://learn.microsoft.com/sql/relational-databases/security/encryption/always-encrypted-enclaves", "services": [ - "Arc", - "Monitor" + "SQL" ], "severity": "Medium", - "subcategory": "Monitoring", - "text": "Create an alert to identify Azure Arc-enabled servers that aren't using the latest version of the Azure connected machine agent", - "waf": "Operations" + "subcategory": "Always Encrypted", + "text": "If protecting sensitive PII data from admin users is a key requirement, but Column Encryption limitations cannot be tolerated, consider the adoption of Always Encrypted with Secure Enclaves", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "Azure Arc Review", - "description": "Use Update Management in Azure Automation or the new Update Management Center (preview) functionality to ensure update management of servers", - "guid": "ae2cc84c-37b6-4b78-8cba-fe6c46589d45", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/manage/hybrid/server/best-practices/arc-update-management", + "category": "Encryption", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "With Azure SQL Database, you can apply symmetric encryption to a column of data by using Transact-SQL. This approach is called column encryption, because you can use it to encrypt specific columns with different encryption keys. Doing so gives you more granular encryption capability than TDE, which encrypts data in pages. Using Always Encrypted to ensure sensitive data isn't exposed in plaintext in Azure SQL Database or SQL Managed Instance, even in memory/in use. Always Encrypted protects the data from Database Administrators (DBAs) and cloud admins (or bad actors who can impersonate high-privileged but unauthorized users) and gives you more control over who can access your data.", + "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": [ - "Arc", - "Monitor" + "AKV", + "Storage", + "SQL" ], "severity": "Low", - "subcategory": "Security", - "text": "Use Azure Arc-enabled servers to control software updates deployments to servers", - "waf": "Operations" + "subcategory": "Column Encryption", + "text": "To protect sensitive PII data from non-admin users in specific table columns, consider using Column Encryption", + "waf": "Security" }, { - "category": "Networking", - "checklist": "Azure Arc Review", - "description": "The Connected Machine Agent will by default communicate with Azure services over public Internet connectivity using HTTPS (TCP port 443)", - "guid": "f6e043d2-aa35-4927-88e6-e2050725769e", - "link": "https://learn.microsoft.com/azure/azure-arc/servers/network-requirements?tabs=azure-cloud#details", + "category": "Encryption", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Enabled by default, Transparent data encryption (TDE) helps to protect the database files against information disclosure by performing real-time encryption and decryption of the database, associated backups, and transaction log files 'at rest', without requiring changes to the application.", + "guid": "c614ac47-bebf-4061-b0a1-43e0c6b5e00d", + "link": "https://learn.microsoft.com/azure/azure-sql/database/transparent-data-encryption-byok-create-server", "services": [ - "Arc" + "Backup", + "Storage", + "SQL" ], "severity": "High", - "subcategory": "Networking", - "text": "Define a connectivity method from the server to Azure", - "waf": "Operations" + "subcategory": "Transparent Data Encryption", + "text": "Ensure Transparent Data Encryption (TDE) is kept enabled", + "waf": "Security" }, { - "category": "Networking", - "checklist": "Azure Arc Review", - "description": "The Connected Machine Agent can be configured to use a proxy server, it is recommended to define the proxy server address using 'azcmagent config set proxy.url' command on the local system.", - "guid": "46691e88-35ac-4932-823e-13800523081a", - "link": "https://learn.microsoft.com/azure/azure-arc/servers/manage-agent#update-or-remove-proxy-settings", + "category": "Encryption", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "If separation of duties in the management of keys and data within the organization is required, leverage Customer Managed Keys (CMK) for Transparent Data Encryption (TDE) for your Azure SQLDB and use Azure Key Vault to store (refer to its checklist). Leverage this feature when you have strict security requirements which cannot be met by the managed service keys.", + "guid": "2edb4165-4f54-47cc-a891-5c82c2f21e25", + "link": "https://learn.microsoft.com/azure/azure-sql/database/transparent-data-encryption-byok-overview", "services": [ - "Arc" + "AKV", + "SQL" ], "severity": "Medium", - "subcategory": "Networking", - "text": "Is a proxy server a required for communication over the Public Internet", - "waf": "Operations" + "subcategory": "Transparent Data Encryption", + "text": "Use customer-managed keys (CMK) in Azure Key Vault (AKV) if you need increased transparency and granular control over the TDE protection", + "waf": "Security" }, { - "category": "Networking", - "checklist": "Azure Arc Review", - "description": "The Connected Machine Agent can use a Private Link for communication with Azure Services over an existing ExpressRoute or VPN connection", - "guid": "94174158-33ee-47ad-9c6d-3733165c7acb", - "link": "https://learn.microsoft.com/azure/azure-arc/servers/private-link-security", + "category": "Encryption", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "The minimal Transport Layer Security (TLS) version setting allows customers to choose which version of TLS their SQL database uses. It's possible to change the minimum TLS version by using the Azure portal, Azure PowerShell, and the Azure CLI.", + "guid": "7754b605-57fd-4bcb-8213-52c39d8e8225", + "link": "https://learn.microsoft.com/azure/azure-sql/database/connectivity-settings?source=recommendations&view=azuresql&tabs=azure-portal#minimal-tls-version", "services": [ - "VPN", - "Arc", - "ExpressRoute", - "PrivateLink" + "SQL" ], - "severity": "Medium", - "subcategory": "Networking", - "text": "Is a private (not public Internet) connection required?", - "waf": "Operations" + "severity": "High", + "subcategory": "Transport Layer Security", + "text": "Enforce minimum TLS version to the latest available", + "waf": "Security" }, { - "category": "Networking", - "checklist": "Azure Arc Review", - "description": "Firewall configuration might be required for the agent to communicate with Azure, use the link to see ServiceTags and/or URL's required", - "guid": "e44bbe60-9d79-4f2e-a777-8424c516775c", - "link": "https://learn.microsoft.com/azure/azure-arc/servers/network-requirements?tabs=azure-cloud#service-tags", + "category": "Identity", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Use Azure Active Directory (Azure AD) authentication for centralized identity management. Use SQL Authentication only if really necessary and document as exceptions.", + "guid": "c9b8b6bf-2c6b-453d-b400-de9a43a549d7", + "link": "https://learn.microsoft.com/azure/azure-sql/database/authentication-aad-overview", "services": [ - "Arc" + "Entra", + "SQL" ], - "severity": "High", - "subcategory": "Networking", - "text": "Will Firewall configurations be needed in order to ensure communication with Azure Services?", + "severity": "Medium", + "subcategory": "Azure Active Directory", + "text": "Leverage Azure AD authentication for connections to Azure SQL Databases", "waf": "Security" }, { - "category": "Networking", - "checklist": "Azure Arc Review", - "description": "Use available automation tool for the system in question to regularly update the Azure endpoints", - "guid": "6fa95b96-ad88-4408-b372-734b876ba28f", - "link": "https://www.microsoft.com/download/details.aspx?id=56519", + "category": "Identity", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Using Azure AD groups simplifies permission management and both the group owner, and the resource owner can add/remove members to/from the group. Create a separate group for Azure AD administrators for each logical server. Monitor Azure AD group membership changes using Azure AD audit activity reports.", + "guid": "29820254-1d14-4778-ae90-ff4aeba504a3", + "link": "https://learn.microsoft.com/azure/azure-sql/database/security-best-practice?view=azuresql#central-management-for-identities", "services": [ - "Arc" + "Entra", + "SQL", + "Monitor" ], - "severity": "Low", - "subcategory": "Networking", - "text": "Can the Firewall or Proxy rules be automated updated if Service Tags or IP addresses change", + "severity": "Medium", + "subcategory": "Azure Active Directory", + "text": "Create a separate Azure AD group with two admin accounts for each Azure SQL Database logical server", "waf": "Security" }, { - "category": "Networking", - "checklist": "Azure Arc Review", - "description": "Configure Servers to use Transport Layer Security (TLS) version 1.2", - "guid": "21459013-65d3-48e5-9f9c-cbd868266abc", - "link": "https://learn.microsoft.com/azure/azure-arc/servers/network-requirements?tabs=azure-cloud#transport-layer-security-12-protocol", + "category": "Identity", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Ensure that distinct system and user assigned managed identities, that are dedicated to the function, with least permissions assigned, are used for communication from Azure services and applications to the Azure SQLDB databases.", + "guid": "df3a09ee-03bb-4198-8637-d141acf5f289", + "link": "https://learn.microsoft.com/azure/azure-sql/database/security-best-practice?view=azuresql#minimize-the-use-of-password-based-authentication-for-applications", "services": [ - "Arc" + "Entra", + "SQL" ], - "severity": "High", - "subcategory": "Networking", - "text": "Always use secure communication for Azure where possible", + "severity": "Medium", + "subcategory": "Azure Active Directory", + "text": "Minimize the use of password-based authentication for applications", "waf": "Security" }, { - "category": "Networking", - "checklist": "Azure Arc Review", - "description": "All extensions (like log analytics etc.) have separate network requirements, be sure to include all in the network design.", - "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", + "category": "Identity", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "System or User assigned managed identities enable Azure SQLDB to authenticate to other cloud services (e.g. Azure Key Vault) without storing credentials in code. Once enabled, all necessary permissions can be granted via Azure role-based-access-control to the specific Azure SQLDB instance. Do not share user assigned managed identities across multiple services if not strictly required.", + "guid": "69891194-5074-4e30-8f69-4efc3c580900", + "link": "https://learn.microsoft.com/azure/active-directory/managed-identities-azure-resources/overview", "services": [ - "Arc", - "Monitor", - "PrivateLink" + "Entra", + "AKV", + "SQL", + "RBAC", + "ACR" ], "severity": "Low", - "subcategory": "Networking", - "text": "Include communication for Azure Arc-enabled Servers extensions in the design (firewall/proxy/private link)", + "subcategory": "Managed Identities", + "text": "Assign Azure SQL Database a managed identity for outbound resource access", "waf": "Security" }, { - "category": "Security, Governance and Compliance", - "checklist": "Azure Arc Review", - "guid": "ac6aae01-e6a8-44de-9df4-7d2d92881b1c", - "link": "https://learn.microsoft.com/azure/governance/policy/", + "category": "Identity", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Use an Azure AD integrated authentication that eliminates the use of passwords. Password-based authentication methods are a weaker form of authentication. Credentials can be compromised or mistakenly given away. Use single sign-on authentication using Windows credentials. Federate the on-premises AD domain with Azure AD and use integrated Windows authentication (for domain-joined machines with Azure AD).", + "guid": "88287d4a-8bb8-4640-ad78-03f51354d003", + "link": "https://learn.microsoft.com/azure/azure-sql/database/authentication-aad-configure?view=azuresql&tabs=azure-powershell#active-directory-integrated-authentication", "services": [ - "Arc", - "AzurePolicy" + "Entra", + "SQL" ], "severity": "Medium", - "subcategory": "Management", - "text": "Use Azure Policy to implement a governance model for hybrid connected servers", + "subcategory": "Passwords", + "text": "Minimize the use of password-based authentication for users", "waf": "Security" }, { - "category": "Security, Governance and Compliance", - "checklist": "Azure Arc Review", - "guid": "5c2a3649-4b69-4bad-98aa-d53cc78e1d76", - "link": "https://learn.microsoft.com/azure/governance/machine-configuration/overview", + "category": "Ledger", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "The hash of the latest block in the database ledger is called the database digest. It represents the state of all ledger tables in the database at the time when the block was generated. Generating a database digest is efficient, because it involves computing only the hashes of the blocks that were recently appended. Azure Confidential Ledger is one of the supported store, it can be used and supports automatic generation and storage of database digests. Azure Ledger provides advanced security features like Blockchain Ledger Proof and Confidential Hardware Enclaves. Use it only if advanced security features are required, otherwise revert to Azure storage.", + "guid": "0e853380-50ba-4bce-b2fd-5c7391c85ecc", + "link": "https://learn.microsoft.com/azure/architecture/guide/technology-choices/multiparty-computing-service#confidential-ledger-and-azure-blob-storage", "services": [ - "Arc" + "Storage", + "SQL" ], "severity": "Medium", - "subcategory": "Management", - "text": "Consider using Machine configurations for in guest OS configurations", - "waf": "Operations" + "subcategory": "Database Digest", + "text": "Use Azure Confidential Ledger to store database digests only if advanced security features are required", + "waf": "Security" }, { - "category": "Security, Governance and Compliance", - "checklist": "Azure Arc Review", - "guid": "667357c4-4967-44c5-bd85-b859c7733be2", - "link": "https://learn.microsoft.com/azure/governance/machine-configuration/machine-configuration-create", + "category": "Ledger", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "The hash of the latest block in the database ledger is called the database digest. It represents the state of all ledger tables in the database at the time when the block was generated. Generating a database digest is efficient, because it involves computing only the hashes of the blocks that were recently appended. Azure Blob Storage with Immutable Storage feature can be used and supports automatic generation and storage of database digests. To prevent tampering of your digest files, configure and lock a retention policy for your container.", + "guid": "afefb2d3-95da-4ac9-acf5-33d18b32ef9a", + "link": "https://learn.microsoft.com/sql/relational-databases/security/ledger/ledger-digest-management", "services": [ - "Arc", + "Storage", + "SQL", "AzurePolicy" ], "severity": "Medium", - "subcategory": "Management", - "text": "Evaluate the need for custom Guest Configuration policies", - "waf": "Operations" + "subcategory": "Database Digest", + "text": "If Azure storage account is used to store database digests, ensure security is properly configured", + "waf": "Security" }, { - "category": "Security, Governance and Compliance", - "checklist": "Azure Arc Review", - "guid": "49674c5e-d85b-4859-a773-3be2a1a27b77", - "link": "https://learn.microsoft.com/azure/automation/change-tracking/overview", + "category": "Ledger", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Ledger provides a form of data integrity called forward integrity, which provides evidence of data tampering on data in your ledger tables. The database verification process takes as input one or more previously generated database digests. It then recomputes the hashes stored in the database ledger based on the current state of the ledger tables. If the computed hashes don't match the input digests, the verification fails. The failure indicates that the data has been tampered with. The verification process reports all inconsistencies that it detects.", + "guid": "f8d4ffda-8aac-4cc6-b72b-c81cb8625420", + "link": "https://learn.microsoft.com/sql/relational-databases/security/ledger/ledger-database-verification", "services": [ - "Arc", - "Monitor" + "Storage", + "SQL" ], "severity": "Medium", - "subcategory": "Monitoring", - "text": "Consider using change tracking for tracking changes made on the servers", - "waf": "Operations" + "subcategory": "Integrity", + "text": "Schedule the Ledger verification process regularly to verify data integrity", + "waf": "Security" }, { - "category": "Security, Governance and Compliance", - "checklist": "Azure Arc Review", - "guid": "d5d1e54a-2965-49e3-a58f-d78289c93555", - "link": "https://learn.microsoft.com/azure/azure-arc/servers/data-residency", + "category": "Ledger", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "The Ledger feature provides tamper-evidence capabilities in your database. You can cryptographically attest to other parties, such as auditors or other business parties, that your data hasn't been tampered with. Ledger helps protect data from any attacker or high-privileged user, including database administrators (DBAs), system administrators, and cloud administrators.", + "guid": "2563f498-e2d3-42ea-9e7b-5517881a06a2", + "link": "https://learn.microsoft.com/sql/relational-databases/security/ledger/ledger-overview", "services": [ - "Arc" + "SQL" ], "severity": "Medium", - "subcategory": "Requirements", - "text": "Make sure to use an Azure region for storing the metadata approved by the organization", + "subcategory": "Ledger", + "text": "If cryptographic proof of data integrity is a critical requirement, Ledger feature should be considered", "waf": "Security" }, { - "category": "Security, Governance and Compliance", - "checklist": "Azure Arc Review", - "guid": "195abb91-a4ed-490d-ae2c-c84c37b6b780", - "link": "https://learn.microsoft.com/azure/key-vault/general/basic-concepts", + "category": "Ledger", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Depending on the type of tampering, there are cases where you can repair the ledger without losing data. In the article contained in the --More Info-- column, different scenarios and recovery techniques are described.", + "guid": "804fc554-6554-4842-91c1-713b32f99902", + "link": "https://learn.microsoft.com/sql/relational-databases/security/ledger/ledger-how-to-recover-after-tampering", "services": [ - "Arc", - "AKV" + "SQL" ], "severity": "Medium", - "subcategory": "Secrets", - "text": "Use Azure Key Vault for certificate management on servers", + "subcategory": "Recovery", + "text": "Prepare a response plan to investigate and repair a database after a tampering event", "waf": "Security" }, { - "category": "Security, Governance and Compliance", - "checklist": "Azure Arc Review", - "description": "Consider using a short-lived Azure AD service principal client secrets.", - "guid": "6d02bfe4-564b-40d8-94a3-48726ee79d6b", - "link": "https://learn.microsoft.com/azure/active-directory/develop/howto-create-service-principal-portal#option-2-create-a-new-application-secret", + "category": "Logging", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Azure SQL Database Auditing tracks database events and writes them to an audit log in your Azure storage account. Auditing helps you understand database activity and gain insight into discrepancies and anomalies that could indicate business concerns or suspected security violations as well as helps you meet regulatory compliance. By default auditing policy includes all actions (queries, stored procedures and successful and failed logins) against the databases, which may result in high volume of audit logs. It's recommended for customers to configure auditing for different types of actions and action groups using PowerShell.", + "guid": "4082e31d-35f4-4a49-8507-d3172cc930a6", + "link": "https://learn.microsoft.com/azure/azure-sql/database/auditing-overview", "services": [ - "Arc", "Storage", - "AKV", - "Entra" + "SQL", + "AzurePolicy" ], - "severity": "High", - "subcategory": "Secrets", - "text": "What is the acceptable life time of the secret used by SP's", + "severity": "Medium", + "subcategory": "Auditing", + "text": "Ensure that Azure SQL Database Auditing is enabled at the server level", "waf": "Security" }, { - "category": "Security, Governance and Compliance", - "checklist": "Azure Arc Review", - "description": "A private key is saved to the disk, ensure this is protected using disk encryption", - "guid": "a1a27b77-5a91-4be1-b388-ff394c2bd463", - "link": "https://learn.microsoft.com/azure/azure-arc/servers/security-overview#using-disk-encryption", + "category": "Logging", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Azure SQL Database Auditing logs can be written to external storage accounts, Log Analytics workspace or Event Hub. Be sure to protect the target repository using backups and secured configuration. Use Azure SQL Database Managed Identity to access the storage and set an explicit retention period. Do not grant permissions to administrators to the audit log repository. Use a different target storage for --Enabling Auditing of Microsoft support operations--. ", + "guid": "9b64bc50-b60f-4035-bf7a-28c4806dfb46", + "link": "https://learn.microsoft.com/azure/azure-sql/database/auditing-overview", "services": [ - "Arc", - "AKV" + "Entra", + "Backup", + "Storage", + "SQL", + "Monitor", + "EventHubs" ], - "severity": "Medium", - "subcategory": "Secrets", - "text": "Secure the public key for Azure Arc-enabled Servers", + "severity": "Low", + "subcategory": "Auditing", + "text": "Ensure that Azure SQL Database Auditing logs are backed up and secured in the selected repository type", "waf": "Security" }, { - "category": "Security, Governance and Compliance", - "checklist": "Azure Arc Review", - "description": "Local administrator is required to install the Connected Machine Agent on Windows and Linux systems", - "guid": "29659e39-58fd-4782-a9c9-35556d02bfe4", - "link": "https://learn.microsoft.com/azure/azure-arc/servers/onboard-portal#install-manually", + "category": "Logging", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "The Azure Monitor activity log is a platform log in Azure that provides insight into subscription-level events. The activity log includes information like when a resource is modified. It is recommended to send this activity log to the same external storage repository as the Azure SQL Database Audit Log (storage account, Log Analytics workspace, Event Hub).", + "guid": "fcd34708-87ac-4efc-aaf6-57a47f76644a", + "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", "services": [ - "Arc" + "Storage", + "SQL", + "Subscriptions", + "Monitor", + "EventHubs" ], - "severity": "High", - "subcategory": "Security", - "text": "Ensure there is local administrator access for executing the agent installation", + "severity": "Medium", + "subcategory": "Auditing", + "text": "Ensure that Azure SQL Database Activity Log is collected and integrated with Auditing logs", "waf": "Security" }, { - "category": "Security, Governance and Compliance", - "checklist": "Azure Arc Review", - "description": "Members of the local administrator group on Windows and users with root privileges on Linux, have permissions to manage the agent via command line.", - "guid": "564b0d83-4a34-4872-9ee7-9d6b5c2a3649", - "link": "https://learn.microsoft.com/azure/azure-arc/servers/security-overview#agent-security-and-permissions", + "category": "Logging", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Forward any logs from Azure SQL to your Security Information and Event Management (SIEM) and Security Orchestration Automation and Response (SOAR). Ensure that you are monitoring different types of Azure assets for potential threats and anomalies. Focus on getting high-quality alerts to reduce false positives for analysts to sort through. Alerts can be sourced from log data, agents, or other data.", + "guid": "f96e127e-9572-453a-b325-ff89ae9f6b44", + "link": "https://learn.microsoft.com/azure/azure-sql/database/auditing-overview", "services": [ - "Arc" + "SQL", + "Monitor" ], "severity": "Medium", - "subcategory": "Security", - "text": "Limit the amount of users with local administrator rights to the servers", + "subcategory": "SIEM/SOAR", + "text": "Ensure that Azure SQL Database Auditing logs are being presented in to your organizations SIEM/SOAR", "waf": "Security" }, { - "category": "Security, Governance and Compliance", - "checklist": "Azure Arc Review", - "guid": "4b69bad3-8aad-453c-a78e-1d76667357c4", - "link": "https://learn.microsoft.com/azure/azure-arc/servers/managed-identity-authentication", + "category": "Logging", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Forward any logs from Azure SQL to your Security Information and Event Management (SIEM) and Security Orchestration Automation and Response (SOAR), which can be used to set up custom threat detections. Ensure that you are monitoring different types of Azure assets for potential threats and anomalies. Focus on getting high-quality alerts to reduce false positives for analysts to sort through. Alerts can be sourced from log data, agents, or other data.", + "guid": "41503bf8-73da-4a10-af9f-5f7fceb5456f", + "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", "services": [ - "Arc", - "Entra" + "SQL", + "Monitor" ], "severity": "Medium", - "subcategory": "Security", - "text": "Consider using and restricting access to managed identities for applications.", + "subcategory": "SIEM/SOAR", + "text": "Ensure that Azure SQL Database Activity Log data is presented in to your SIEM/SOAR", "waf": "Security" }, { - "category": "Security, Governance and Compliance", - "checklist": "Azure Arc Review", - "description": "Use Defender for Endpoint or another AV and EDR solution to protect endpoints", - "guid": "5a91be1f-388f-4f39-9c2b-d463cbbbc868", - "link": "https://learn.microsoft.com/azure/security-center/security-center-get-started", + "category": "Logging", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Security Operation Center (SOC) team should create an incident response plan (playbooks or manual responses) to investigate and mitigate tampering, malicious activities, and other anomalous behaviors.", + "guid": "19ec7c97-c563-4e1d-82f0-54d6ec12e754", + "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", "services": [ - "Arc", - "Defender" + "EventHubs", + "SQL" ], "severity": "Medium", - "subcategory": "Security", - "text": "Enable Defender for Servers for all servers to secure hybrid workloads from threats", + "subcategory": "SIEM/SOAR", + "text": "Ensure that you have response plans for malicious or aberrant audit logging events", "waf": "Security" }, { - "category": "Security, Governance and Compliance", - "checklist": "Azure Arc Review", - "guid": "cbafe6c4-6589-4d45-9a92-7c3974d1102c", + "category": "Networking", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "When you create a logical server from the Azure portal for Azure SQL Database, the result is a public endpoint that is visible and reachable over the public network (Public Access). You can then limit connectivity based on firewall rules and Service Endpoint. You can also configure private connectivity only limiting connections to internal networks using Private Endpoint (Private Access). Private Access using Private Endpoint should be the default unless a business case or performance/technical reason applies that cannot support it. Usage of Private Endpoints has performance implications that need to be considered and assessed.", + "guid": "2c6d356a-1784-475b-a42c-ec187dc8c925", + "link": "https://learn.microsoft.com/azure/azure-sql/database/network-access-controls-overview", "services": [ - "Arc" + "PrivateLink", + "SQL" ], - "severity": "Medium", - "subcategory": "Security", - "text": "Define controls to detect security misconfigurations and track compliance", + "severity": "High", + "subcategory": "Connectivity", + "text": "Review Public vs. Private Access connectivity methods and select the appropriate one for the workload", "waf": "Security" }, { - "category": "Security, Governance and Compliance", - "checklist": "Azure Arc Review", - "guid": "cbbbc868-195a-4bb9-8a4e-d90dae2cc84c", - "link": "https://learn.microsoft.com/azure/azure-arc/servers/security-overview#extension-allowlists-and-blocklists", + "category": "Networking", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "IMPORTANT: Connections to private endpoint only support Proxy as the connection policy. When using private endpoints connections are proxied via the Azure SQL Database gateway to the database nodes. Clients will not have a direct connection.", + "guid": "557b3ce5-bada-4296-8d52-a2d447bc1718", + "link": "https://learn.microsoft.com/azure/azure-sql/database/connectivity-architecture", "services": [ - "Arc" + "PrivateLink", + "SQL", + "AzurePolicy" ], - "severity": "Medium", - "subcategory": "Security", - "text": "Use allow- or block-lists to control what extensions can be installed on the Azure Arc-enabled servers", + "severity": "Low", + "subcategory": "Connectivity", + "text": "Keep default Azure SQL Database Connection Policy if not differently required and justified", "waf": "Security" }, { - "category": "Operations Management", - "checklist": "MySQL Review Checklist", - "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", - "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", - "service": "Azure MySQL", + "category": "Networking", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "This option configures the firewall to allow all connections from Azure, including connections from the subscriptions of other customers. If you select this option, make sure that your login and user permissions limit access to authorized users only. If not strictly required, keep this setting to OFF.", + "guid": "f48efacf-4405-4e8d-9dd0-16c5302ed082", + "link": "https://learn.microsoft.com/azure/azure-sql/database/network-access-controls-overview", "services": [ - "SQL" + "SQL", + "Subscriptions" ], - "severity": "Medium", - "subcategory": "Best Practices", - "text": "Leverage Flexible Server", - "waf": "Reliability" + "severity": "High", + "subcategory": "Connectivity", + "text": "Ensure Allow Azure Services and Resources to Access this Server setting is disabled in Azure SQL Database firewall", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "MySQL Review 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", + "category": "Networking", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Azure SQL Database has a new built-in feature that allows native integration with external REST endpoints. This means that integration of Azure SQL Database with Azure Functions, Azure Logic Apps, Cognitive Services, Event Hubs, Event Grid, Azure Containers, API Management and in general any REST or even GraphQL endpoint. If not properly restricted, code inside an Azure SQL Database database could leverage this mechanism to exfiltrate data. If not strictly required, it is recommended to block or restrict this feature using Outbound Firewall Rules.", + "guid": "cb3274a7-e36d-46f6-8de5-46d30c8dde8e", + "link": "https://learn.microsoft.com/sql/relational-databases/system-stored-procedures/sp-invoke-external-rest-endpoint-transact-sql", "services": [ - "SQL" + "EventHubs", + "SQL", + "APIM" ], - "severity": "High", - "subcategory": "Best Practices", - "text": "Leverage Availability Zones where regionally applicable", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Outbound Control", + "text": "Block or restrict outbound REST API calls to external endpoints", + "waf": "Security" }, - { - "category": "Operations Management", - "checklist": "MySQL Review 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", + { + "category": "Networking", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Outbound firewall rules limit network traffic from the Azure SQL Database logical server to a customer defined list of Azure Storage accounts and Azure SQL Database logical servers. Any attempt to access storage accounts or databases not in this list is denied.", + "guid": "a566dd3d-314e-4a94-9378-102c42d82b38", + "link": "https://learn.microsoft.com/azure/azure-sql/database/outbound-firewall-rule-overview", "services": [ + "Storage", "SQL" ], "severity": "Medium", - "subcategory": "Best Practices", - "text": "Leverage Data-in replication for cross-region DR scenarios", - "waf": "Reliability" + "subcategory": "Outbound Control", + "text": "If outbound network access is required, it is recommended to configure outbound networking restrictions using built-in Azure SQL Database control feature", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Azure Data Explorer Review 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", + "category": "Networking", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Private Endpoint is created inside a subnet in an Azure Virtual Network. Proper security configuration must be applied also to the containing network environment, including NSG/ASG, UDR, firewall, monitoring and auditing.", + "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": [ - "Cost", - "Storage" + "PrivateLink", + "SQL", + "Monitor", + "VNet", + "Firewall" ], - "subcategory": "Replication", - "text": "Leverage External Tables and Continuous data export overview to reduce costs", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Private Access", + "text": "If Private Access connectivity is used, ensure that you are using the Private Endpoint, Azure Virtual Network, Azure Firewall, and Azure Network Security Group checklists", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Azure Data Explorer Review 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", + "category": "Networking", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "When adding a Private Endpoint connection, public routing to your logical server isn't blocked by default. In the --Firewall and virtual networks-- pane, the setting --Deny public network access-- is not selected by default. To disable public network access, ensure that you select --Deny public network access--.", + "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": [ - "Storage" + "PrivateLink", + "SQL", + "VNet" ], - "subcategory": "Replication", - "text": "To share data, explore Leader-follower cluster configuration", - "waf": "Reliability" + "severity": "High", + "subcategory": "Private Access", + "text": "If Private Endpoint (Private Access) is used, consider disabling Public Access connectivity", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Azure Data Explorer Review 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", + "category": "Networking", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Network Security Group (NSG) and Application Security Group (ASG) can be now applied to subnet containing Private Endpoints to restrict connections to Azure SQLDB based on internal source IP ranges.", + "guid": "8600527e-e8c4-4424-90ef-1f0dca0224f2", + "link": "https://learn.microsoft.com/azure/private-link/private-endpoint-overview#network-security-of-private-endpoints", "services": [ - "ASR" + "PrivateLink", + "SQL", + "VNet" ], - "subcategory": "Replication", - "text": "To protect against regional failure, create Multiple independent clusters, preferably in two Azure Paired regions", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Private Access", + "text": "If Private Endpoint (Private Access) is used, apply NSG and eventually ASG to limit incoming source IP address ranges", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Azure Data Explorer Review 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", + "category": "Networking", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "A Managed Instance (SQL MI) can be isolated inside a virtual network to prevent external access. Applications and tools that are in the same or peered virtual network in the same region could access it directly. Applications and tools that are in different region could use virtual-network-to-virtual-network connection or ExpressRoute circuit peering to establish connection. Customer should use Network Security Groups (NSG), and eventually internal firewalls, to restrict access over port 1433 only to resources that require access to a managed instance.", + "guid": "18123ef4-a0a6-45e3-87fe-7f454f65d975", + "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/connectivity-architecture-overview", "services": [ - "RBAC", - "Storage" + "VNet", + "SQL", + "ExpressRoute" ], - "subcategory": "Replication", - "text": "Replicate all management activities such as creating new tables or managing user roles on each cluster.", - "waf": "Reliability" - }, - { - "category": "BC and DR", - "checklist": "Azure Data Explorer Review Checklist", - "guid": "18ca6017-0265-4f4b-a46a-393af7f31728", - "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-create-solution", - "service": "Azure Data Explorer", - "services": [], - "subcategory": "Replication", - "text": "Ingest data into each cluster in parallel", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Private Access", + "text": "Apply Network Security Groups (NSG) and firewall rules to restrict access to Azure SQL Managed Instance internal subnet", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Azure Data Explorer Review 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", + "category": "Networking", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Azure Virtual Network Service Endpoint is preferred solution if you want to establish a direct connection to the Azure SQL Database backend nodes using Redirect policy. This will allow access in high performance mode and is the recommended approach from a performance perspective.", + "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": [ - "ACR" + "VNet", + "SQL", + "AzurePolicy" ], - "subcategory": "DR Configuration", - "text": "For critical application with no tolerance for outages, create Active-Active-Active (always-on) configuration", - "waf": "Reliability" + "severity": "High", + "subcategory": "Public Access", + "text": "If Public Access connectivity is used, leverage Service Endpoint to restrict access from selected Azure Virtual Networks", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Azure Data Explorer Review 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", + "category": "Networking", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "The Azure SQL Database firewall allows you to specify IP address ranges from which communications are accepted. This approach is fine for stable IP addresses that are outside the Azure private network.", + "guid": "a73e32da-b3f4-4960-b5ec-2f42a557bf31", + "link": "https://learn.microsoft.com/azure/azure-sql/database/network-access-controls-overview", "services": [ - "ACR" + "Storage", + "SQL" ], - "subcategory": "DR Configuration", - "text": "For critical applications, create Active-Active configuration in two paired regions", - "waf": "Reliability" - }, - { - "category": "BC and DR", - "checklist": "Azure Data Explorer Review 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", - "services": [], - "subcategory": "DR Configuration", - "text": "For applications, which required only read during failure, create Active-Hot standby configuration", - "waf": "Reliability" + "severity": "Medium", + "subcategory": "Public Access", + "text": "If Public Access connectivity is used, ensure that only specific known IPs are added to the firewall", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Azure Data Explorer Review 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", + "category": "Networking", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "We recommend that you use database-level IP firewall rules whenever possible. This practice enhances security and makes your database more portable. Use server-level IP firewall rules for administrators. Also use them when you have many databases that have the same access requirements, and you don't want to configure each database individually.", + "guid": "e0f31ac9-35c8-4bfd-9865-edb60ffc6768", + "link": "https://learn.microsoft.com/azure/azure-sql/database/firewall-configure", "services": [ - "Cost", "Storage", - "AzurePolicy", - "ASR" + "SQL" ], - "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", - "waf": "Reliability" + "severity": "Low", + "subcategory": "Public Access", + "text": "If Public Access connectivity is used and controlled by Azure SQL Database firewall rules, use database-level over server-level IP rules", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "Azure Data Explorer Review 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", + "category": "Networking", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "A Managed Instance (SQL MI) can be isolated inside a virtual network to prevent external access. The Managed Instance public endpoint is not enabled by default, must be explicitly enabled, only if strictly required. If company policy disallows the use of public endpoints, use Azure Policy to prevent enabling public endpoints in the first place.", + "guid": "b8435656-143e-41a8-9922-61d34edb751a", + "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/public-endpoint-overview", "services": [ + "VNet", + "SQL", "AzurePolicy" ], - "subcategory": "IaC", - "text": "Wrap DevOps and source control around all your code", - "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", - "waf": "Reliability" - }, - { - "category": "Operations Management", - "checklist": "Azure Data Explorer Review Checklist", - "guid": "1559ab91-53e8-4908-ae28-b84c33b6b780", - "link": "https://learn.microsoft.com/azure/data-explorer/devops", - "service": "Azure Data Explorer", - "services": [], - "subcategory": "IaC", - "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" - }, - { - "category": "Operations Management", - "checklist": "Azure Data Explorer Review Checklist", - "guid": "8b9fe5c4-1049-4d40-9a82-2c3474d00f18", - "link": "https://learn.microsoft.com/azure/data-explorer/devops", - "service": "Azure Data Explorer", - "services": [], - "subcategory": "IaC", - "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": "High", + "subcategory": "Public Access", + "text": "Do not enable Azure SQL Managed Instance public endpoint", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Redis Resiliency checklist", - "guid": "65285269-440b-44be-9d3e-0844276d4bdc", - "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-zone-redundancy", - "service": "Redis", + "category": "Networking", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "A Managed Instance (SQL MI) public endpoint is not enabled by default, must be explicitly enabled, only if strictly required. In this case, it is recommended to apply a Network Security Groups (NSG) to restrict access to port 3342 only to trusted source IP addresses.", + "guid": "057dd298-8726-4aa6-b590-1f81d2e30421", + "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/public-endpoint-overview", "services": [ - "ACR" + "VNet", + "SQL" ], "severity": "High", - "subcategory": "High Availability", - "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" + "subcategory": "Public Access", + "text": "Restrict access if Azure SQL Managed Instance public endpoint is required", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Redis Resiliency 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", + "category": "Privileged Access", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Most operations, support, and troubleshooting performed by Microsoft personnel and sub-processors do not require access to customer data. In those rare circumstances where such access is required, Customer Lockbox for Microsoft Azure provides an interface for customers to review and approve or reject customer data access requests. In support scenarios where Microsoft needs to access customer data, Azure SQL Database supports Customer Lockbox to provide an interface for you to review and approve or reject customer data access requests.", + "guid": "37b6eb0f-553d-488f-8a8a-cb9bf97388ff", + "link": "https://learn.microsoft.com/azure/security/fundamentals/customer-lockbox-overview", "services": [ - "Storage" + "SQL" ], - "severity": "Medium", - "subcategory": "High Availability", - "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": "Low", + "subcategory": "Lockbox", + "text": "Review and enable Customer Lockbox for Azure SQL Database access by Microsoft personnel", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Redis Resiliency 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", + "category": "Privileged Access", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "The principle of least privilege states that users shouldn't have more privileges than needed to complete their tasks. High-privileged database and server users can perform many configuration and maintenance activities on the database and can also drop databases in Azure SQL instance. Tracking database owners and privileged accounts is important to avoid having excessive permission.", + "guid": "5fe5281f-f0f9-4842-a682-8baf18bd8316", + "link": "https://learn.microsoft.com/azure/azure-sql/database/security-best-practice?view=azuresql#implement-principle-of-least-privilege", "services": [ - "Storage" + "SQL" ], "severity": "Medium", - "subcategory": "High Availability", - "text": "Use Geo-redundant storage account to persist Azure Cache for Redis data, or zonally redundant where geo-redundancy is not available", - "waf": "Reliability" + "subcategory": "Permissions", + "text": "Ensure that users are assigned the minimum level of access necessarily to complete their job functions", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Redis Resiliency checklist", - "guid": "a8c26c9b-32ab-45bd-bc69-98a135e33789", - "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-geo-replication", - "service": "Redis", + "category": "Privileged Access", + "checklist": "Azure SQLDB Security Checklist (Preview)", + "description": "Identities (both Users and SPNs) should be scoped to the least amount of access needed to perform the function. A higher number of tightly scoped SPNs should be used, instead of having one SPN with multiple sets of unrelated permissions. For example, if there are three external web applications hosted on-prem that make queries to the Azure SQL Database, they should not all use the same SPN for these activities. Instead, they should each have their own tightly scoped SPN.", + "guid": "7b5b55e5-4750-4920-be97-eb726c256a5c", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/sql-database-security-baseline#im-3-use-azure-ad-single-sign-on-sso-for-application-access", "services": [ - "ASR" + "Entra", + "SQL" ], - "severity": "Medium", - "subcategory": "High Availability", - "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" - }, - { - "category": "Operations Management", - "checklist": "Stream Analytics Review Checklist", - "guid": "32e52e36-11c8-418b-8a0b-c511e43a18a9", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-stream_analytics_v1.docx", - "services": [], - "severity": "High", - "subcategory": "High Availablity ", - "text": "Leverage FTA Resiliency Handbook for Stream Analytics", - "waf": "Reliability" - }, - { - "category": "Operations Management", - "checklist": "Stream Analytics Review Checklist", - "description": "Azure Stream Analytics provides high availability (99.9% SLA) for jobs and clusters within a region, the details of which are transparent to the end customer. If failures occur within the service, per the documentation �Azure Stream Analytics guarantees exactly once event processing and at-least-once delivery of events, so events are never lost.�", - "guid": "cd289ced-6b17-4db8-8554-62f2aee4553a", - "link": "https://azure.microsoft.com/en-in/products/stream-analytics", - "services": [], - "severity": "Medium", - "subcategory": "High Availablity ", - "text": "Understand High Availability 99% SLA and use it to plan your DR strategy", - "waf": "Reliability" - }, - { - "category": "Operations Management", - "checklist": "Stream Analytics Review Checklist", - "description": "Azure Stream Analytics resources (jobs, clusters, etc.) are regional and do not provide automatic geo-failover. However, you can achieve geo-redundancy by deploying identical Stream Analytics jobs in multiple Azure regions. Each job connects to local input and output sources. It is the responsibility of your application to both send input data into the two regional inputs and reconcile between the two regional outputs.", - "guid": "fc833934-8b26-42d6-ac5f-512925498e6d", - "link": "https://learn.microsoft.com/azure/stream-analytics/geo-redundancy", - "services": [], - "severity": "Medium", - "subcategory": "Geo Redundancy", - "text": "Plan for Geo Redudancy of the service", - "waf": "Reliability" - }, - { - "category": "Operations Management", - "checklist": "Stream Analytics Review Checklist", - "guid": "b9d37dac-43bc-46cd-8d7a-a9b24604489a", - "link": "https://learn.microsoft.com/azure/stream-analytics/geo-redundancy", - "services": [], - "severity": "Medium", - "subcategory": "Geo Redundancy", - "text": "Depending on your availablity requirement, configure Active/Active configuration or Active/Passive configuration ", - "waf": "Reliability" + "severity": "Low", + "subcategory": "Permissions", + "text": "Ensure that distinct applications will be assigned different credentials with minimal permissions to access Azure SQL Database", + "waf": "Security" }, { "category": "Operations Management", @@ -23669,12233 +21766,11834 @@ "services": [], "severity": "Low", "subcategory": "DevOps", - "text": "When working with Spark Notebooks, make sure to integrate with Git or Azure DevOps", - "waf": "Reliability" - }, - { - "category": "Operations Management", - "checklist": "Azure Synapse Review Checklist", - "guid": "775c6ee9-5b86-4ad8-a44c-e3b2b38b875b", - "link": "https://learn.microsoft.com/azure/synapse-analytics/sql-data-warehouse/backup-and-restore", - "services": [], - "severity": "Medium", - "subcategory": "High Availablity", - "text": "Use Dedicated pools", - "waf": "Reliability" - }, - { - "category": "Operations Management", - "checklist": "Azure Synapse Review Checklist", - "guid": "a1cf2049-9013-4a5d-9ce4-74dbcbd8682a", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/azure-best-practices/analytics/azure-synapse", - "services": [], - "severity": "Medium", - "subcategory": "DR", - "text": "Use Database restore points for Azure Synapse", - "waf": "Reliability" - }, - { - "category": "Operations Management", - "checklist": "Azure Synapse Review Checklist", - "guid": "6abca2a4-fda1-4dae-8dc9-5d48c6c791dc", - "link": "https://learn.microsoft.com/azure/synapse-analytics/sql/on-demand-workspace-overview", - "services": [], - "severity": "Medium", - "subcategory": "High Availablity", - "text": "Use Serverless Pools when required", - "waf": "Reliability" - }, - { - "category": "Operations Management", - "checklist": "Azure Synapse Review Checklist", - "guid": "a0f6c565-89e5-458b-a37d-4974e1112dbd", - "link": "https://learn.microsoft.com/azure/synapse-analytics/quickstart-deployment-template-workspaces", - "services": [ - "Storage" - ], - "severity": "Medium", - "subcategory": "DevOps", - "text": "Use Infrastructure as a Code template to do repeatable deployments", - "waf": "Reliability" - }, - { - "category": "Operations Management", - "checklist": "Azure Synapse Review Checklist", - "guid": "7baf12e7-b94e-4f6e-847d-2da2982b1cd6", - "link": "https://learn.microsoft.com/azure/cosmos-db/synapse-link", - "services": [], - "severity": "Medium", - "subcategory": "High Availablity", - "text": "Make sure to re-eshtablish any Synapse Links", - "training": "https://learn.microsoft.com/azure/active-directory/managed-identities-azure-resources/overview", - "waf": "Reliability" - }, - { - "category": "Business", - "checklist": "Multitenant architecture", - "guid": "41177955-fe8f-430b-ae72-20dc5b6880da", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/overview", - "services": [ - "Entra" - ], - "severity": "High", - "subcategory": "Business", - "text": "Understand what kind of solution you're creating, such as business-to-business (B2B), business-to-consumer (B2C), or your enterprise software, and how tenants are different from users.", - "waf": "Operations" - }, - { - "category": "Business", - "checklist": "Multitenant architecture", - "guid": "2d33d1b7-697c-49f9-b944-afbeac0b2c8f", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", - "services": [], - "severity": "High", - "subcategory": "Business", - "text": "Define your tenants. Understand how many tenants you will support initially, and your growth plans.", - "waf": "Operations" - }, - { - "category": "Business", - "checklist": "Multitenant architecture", - "guid": "a2111b8b-cc66-4aa2-9da6-c09fa23851b6", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/pricing-models", - "services": [], - "severity": "High", - "subcategory": "Business", - "text": "Define your pricing model and ensure it aligns with your tenants' consumption of Azure resources.", - "waf": "Cost" - }, - { - "category": "Business", - "checklist": "Multitenant architecture", - "guid": "331e84a6-2d65-4359-92ff-a1870b062995", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/pricing-models", - "services": [], - "severity": "Medium", - "subcategory": "Business", - "text": "Understand whether you need to separate your tenants into different tiers. Tiers might have different pricing, features, performance promises, geographic locations, and so forth.", - "waf": "Operations" - }, - { - "category": "Business", - "checklist": "Multitenant architecture", - "guid": "90516b37-aab1-46ca-95bb-cc14a6a1608b", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", - "services": [], - "severity": "Medium", - "subcategory": "Business", - "text": "Based on your customers' requirements, decide on the tenancy models that are appropriate for various parts of your solution.", - "waf": "Operations" - }, - { - "category": "Business", - "checklist": "Multitenant architecture", - "guid": "f5d76ae1-7048-4ff5-abba-f1ca799578b9", - "link": "https://learn.microsoft.com/azure/marketplace/plan-saas-offer", - "services": [ - "Entra" - ], - "severity": "Medium", - "subcategory": "Business", - "text": "When you're ready, sell your B2B multitenant solution using the Microsoft Commercial Marketplace.", - "waf": "Operations" - }, - { - "category": "Reliability", - "checklist": "Multitenant architecture", - "guid": "9e7cedd9-1e05-4aeb-a7b3-01fe695a394c", - "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/design-checklist", - "services": [], - "severity": "High", - "subcategory": "Reliability", - "text": "Review the Azure Well-Architected Reliability checklist, which is applicable to all workloads.", - "waf": "Reliability" - }, - { - "category": "Reliability", - "checklist": "Multitenant architecture", - "guid": "e9521a55-2a7c-425c-8f3e-c38fd0c4df75", - "link": "https://learn.microsoft.com/azure/architecture/antipatterns/noisy-neighbor/noisy-neighbor", - "services": [], - "severity": "High", - "subcategory": "Reliability", - "text": "Understand the Noisy Neighbor antipattern. Prevent individual tenants from impacting the system's availability for other tenants.", + "text": "When working with Spark Notebooks, make sure to integrate with Git or Azure DevOps", "waf": "Reliability" }, { - "category": "Reliability", - "checklist": "Multitenant architecture", - "guid": "2b99cb00-9abb-49b6-b11c-f2af9692f09e", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/overview", + "category": "Operations Management", + "checklist": "Azure Synapse Review Checklist", + "guid": "775c6ee9-5b86-4ad8-a44c-e3b2b38b875b", + "link": "https://learn.microsoft.com/azure/synapse-analytics/sql-data-warehouse/backup-and-restore", "services": [], "severity": "Medium", - "subcategory": "Reliability", - "text": "Design your multitenant solution for the level of growth that you expect. But don't overengineer for unrealistic growth.", + "subcategory": "High Availablity", + "text": "Use Dedicated pools", "waf": "Reliability" }, { - "category": "Reliability", - "checklist": "Multitenant architecture", - "guid": "7a634a0e-1c9d-42b1-aac2-5a5378f103f1", - "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/business-metrics", + "category": "Operations Management", + "checklist": "Azure Synapse Review Checklist", + "guid": "a1cf2049-9013-4a5d-9ce4-74dbcbd8682a", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/azure-best-practices/analytics/azure-synapse", "services": [], "severity": "Medium", - "subcategory": "Reliability", - "text": "Define service-level objectives (SLOs) and optionally service-level agreements (SLAs) for your solution. SLAs and SLOs should be based on the requirements of your tenants, as well as the composite SLA of the Azure resources in your architecture.", + "subcategory": "DR", + "text": "Use Database restore points for Azure Synapse", "waf": "Reliability" }, { - "category": "Reliability", - "checklist": "Multitenant architecture", - "guid": "45beeeaf-fc59-4079-8fca-65d5724abaa7", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/compute", + "category": "Operations Management", + "checklist": "Azure Synapse Review Checklist", + "guid": "6abca2a4-fda1-4dae-8dc9-5d48c6c791dc", + "link": "https://learn.microsoft.com/azure/synapse-analytics/sql/on-demand-workspace-overview", "services": [], - "severity": "High", - "subcategory": "Reliability", - "text": "Test the scale of your solution. Ensure that it performs well under all levels of load, and that it scales correctly as the number of tenants increases.", + "severity": "Medium", + "subcategory": "High Availablity", + "text": "Use Serverless Pools when required", "waf": "Reliability" }, { - "category": "Reliability", - "checklist": "Multitenant architecture", - "guid": "2ff55551-984b-4606-95eb-bfb9c8b36761", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/compute", - "services": [], + "category": "Operations Management", + "checklist": "Azure Synapse Review Checklist", + "guid": "a0f6c565-89e5-458b-a37d-4974e1112dbd", + "link": "https://learn.microsoft.com/azure/synapse-analytics/quickstart-deployment-template-workspaces", + "services": [ + "Storage" + ], "severity": "Medium", - "subcategory": "Reliability", - "text": "Apply chaos engineering principles to test the reliability of your solution.", + "subcategory": "DevOps", + "text": "Use Infrastructure as a Code template to do repeatable deployments", "waf": "Reliability" }, { - "category": "Security", - "checklist": "Multitenant architecture", - "guid": "8238c038-8eb2-4a02-8bd5-4908c9442c1c", - "link": "https://learn.microsoft.com/security/zero-trust", + "category": "Operations Management", + "checklist": "Azure Synapse Review Checklist", + "guid": "7baf12e7-b94e-4f6e-847d-2da2982b1cd6", + "link": "https://learn.microsoft.com/azure/cosmos-db/synapse-link", "services": [], - "severity": "High", - "subcategory": "Security", - "text": "Apply the Zero Trust and least privilege principles in all layers of your solution.", - "waf": "Security" - }, - { - "category": "Security", - "checklist": "Multitenant architecture", - "guid": "92160e00-6894-4102-97e0-615d4ed93c01", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/map-requests", - "services": [ - "Entra" - ], - "severity": "High", - "subcategory": "Security", - "text": "Ensure that you can correctly map user requests to tenants. Consider including the tenant context as part of the identity system, or by using another means, like application-level tenant authorization.", - "waf": "Security" + "severity": "Medium", + "subcategory": "High Availablity", + "text": "Make sure to re-eshtablish any Synapse Links", + "training": "https://learn.microsoft.com/azure/active-directory/managed-identities-azure-resources/overview", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Multitenant architecture", - "guid": "3c1538b4-5676-4b85-b451-432befb37b4f", - "link": "https://learn.microsoft.com/azure/security/fundamentals/pen-testing", + "category": "Operations Management", + "checklist": "Azure Data Factory Review Checklist", + "guid": "ab91932c-9fc9-4d1b-a881-37f5e6c0cb9e", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ADF_v1.docx", + "service": "Azure Data Factory", "services": [], "severity": "Medium", - "subcategory": "Security", - "text": "Perform ongoing penetration testing and security code reviews.", - "waf": "Security" + "subcategory": "Best Practices", + "text": "Leverage FTA Resiliency Playbook for Azure Data Factory", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Multitenant architecture", - "guid": "5fca45ce-cf2d-42c0-a62c-aac92ba31498", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/governance-compliance", + "category": "Operations Management", + "checklist": "Azure Data Factory Review Checklist", + "guid": "e503547c-d447-4e82-9138-a7200f1cac6d", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", "services": [], "severity": "High", - "subcategory": "Security", - "text": "Understand your tenants' compliance requirements, including data residency and any compliance or regulatory standards that they require you to meet.", - "waf": "Security" + "subcategory": "Availablity Zone", + "text": "Use zone redundant pipelines in regions that support Availability Zones", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Multitenant architecture", - "guid": "30adb90d-83d4-4a2e-986e-327ffe04e7a5", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/domain-names", + "category": "Operations Management", + "checklist": "Azure Data Factory Review Checklist", + "guid": "9ef1d6e8-32e5-42e3-911c-818b1a0bc511", + "link": "https://learn.microsoft.com/azure/data-factory/source-control", + "service": "Azure Data Factory", "services": [ - "DNS" + "Backup" ], - "severity": "High", - "subcategory": "Security", - "text": "Correctly manage domain names and avoid vulnerabilities like dangling DNS and subdomain takeover attacks.", - "waf": "Security" - }, - { - "category": "Security", - "checklist": "Multitenant architecture", - "guid": "72ded36d-c633-4e0d-bd41-799a29da3481", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/service/overview", - "services": [], "severity": "Medium", - "subcategory": "Security", - "text": "Follow service-specific guidance for multitenancy.", - "waf": "Security" + "subcategory": "DevOps Integration", + "text": "Use DevOps to Backup the ARM templates with Github/Azure DevOps integration ", + "waf": "Reliability" }, { - "category": "Cost Optimization", - "checklist": "Multitenant architecture", - "guid": "db30a9fc-9b1d-40f3-ab90-01f6a3e87fc8", - "link": "https://learn.microsoft.com/azure/architecture/framework/cost/design-checklist", + "category": "Network Topology and Connectivity", + "checklist": "Azure Data Factory Review Checklist", + "guid": "e43a18a9-cd29-49cf-b7b1-7db8255562f2", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", "services": [ - "Cost" + "VM" ], "severity": "Medium", - "subcategory": "Cost Optimization", - "text": "Review the Azure Well-Architected Operational Excellence checklist, which is applicable to all workloads.", - "waf": "Cost" + "subcategory": "Network", + "text": "Make sure you replicate the Self-Hosted Integration Runtime VMs in another region ", + "waf": "Reliability" }, { - "category": "Cost Optimization", - "checklist": "Multitenant architecture", - "guid": "8533af39-52f6-45b6-a9c3-81b2a54a31e0", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/measure-consumption", + "category": "Network Topology and Connectivity", + "checklist": "Azure Data Factory Review Checklist", + "guid": "aee4563a-fd83-4393-98b2-62d6dc5f512a", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", "services": [ - "Cost" + "VNet" ], - "severity": "High", - "subcategory": "Cost Optimization", - "text": "Ensure you can adequately measure per-tenant consumption and correlate it with your infrastructure costs.", - "waf": "Cost" + "severity": "Medium", + "subcategory": "Network", + "text": "Make sure you replicate or duplicate your network in the sister region. You have to make a copy of your Vnet in another region", + "waf": "Reliability" }, { - "category": "Cost Optimization", - "checklist": "Multitenant architecture", - "guid": "c851fd44-7cf1-459c-95a4-f6455d75a981", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/cost-management-allocation", + "category": "Governance and Security", + "checklist": "Azure Data Factory Review Checklist", + "description": "If your ADF Pipelines use Key Vault you don't have to do anything to replicate Key Vault. Key Vault is a managed service and Microsoft takes care of it for you", + "guid": "25498f6d-bad3-47da-a43b-c6ce1d7aa9b2", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "Azure Data Factory", "services": [ - "Cost", - "Monitor" + "AKV" ], - "severity": "Medium", - "subcategory": "Cost Optimization", - "text": "Avoid antipatterns. Antipatterns include failing to track costs, tracking costs with unnecessary precision, real-time measurement, and using monitoring tools for billing.", - "waf": "Cost" - }, - { - "category": "Operational Excellence", - "checklist": "Multitenant architecture", - "guid": "0d475a5a-2c0f-47ab-b1e1-701da68d3407", - "link": "https://learn.microsoft.com/azure/architecture/checklist/data-ops", - "services": [], - "severity": "High", - "subcategory": "Operational Excellence", - "text": "Review the Azure Well-Architected Operational Excellence checklist, which is applicable to all workloads.", - "waf": "Operations" - }, - { - "category": "Operational Excellence", - "checklist": "Multitenant architecture", - "guid": "9f7fa7a9-47fc-4f04-81f6-9f9e87571ed3", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenant-lifecycle", - "services": [], - "severity": "Medium", - "subcategory": "Operational Excellence", - "text": "Use automation to manage the tenant lifecycle, such as onboarding, deployment, provisioning, and configuration.", - "waf": "Operations" + "severity": "Low", + "subcategory": "Integration", + "text": "If using Keyvault integration, use SLA of Keyvault to understand your availablity", + "waf": "Reliability" }, { - "category": "Operational Excellence", - "checklist": "Multitenant architecture", - "guid": "e0bfceed-4f4e-492d-b9f5-898815faa363", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/updates", - "services": [], + "category": "Operations Management", + "checklist": "MySQL Review Checklist", + "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", + "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", + "service": "Azure MySQL", + "services": [ + "SQL" + ], "severity": "Medium", - "subcategory": "Operational Excellence", - "text": "Find the right balance for deploying service updates. Consider both your tenants' requirements and your own operational requirements.", - "waf": "Operations" + "subcategory": "Best Practices", + "text": "Leverage Flexible Server", + "waf": "Reliability" }, { - "category": "Operational Excellence", - "checklist": "Multitenant architecture", - "guid": "a3f80518-d428-4c02-b2cc-dfaef47db7e2", + "category": "Operations Management", + "checklist": "MySQL Review 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", "services": [ - "Monitor" + "SQL" ], "severity": "High", - "subcategory": "Operational Excellence", - "text": "Monitor the health of the overall system, as well as each tenant.", - "waf": "Operations" + "subcategory": "Best Practices", + "text": "Leverage Availability Zones where regionally applicable", + "waf": "Reliability" }, { - "category": "Operational Excellence", - "checklist": "Multitenant architecture", - "guid": "dfb42da5-f871-4953-9e5c-da6fda3f1411", + "category": "Operations Management", + "checklist": "MySQL Review 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", "services": [ - "Monitor" + "SQL" ], "severity": "Medium", - "subcategory": "Operational Excellence", - "text": "Configure and test alerts to notify you when specific tenants are experiencing issues or are exceeding their consumption limits.", - "waf": "Operations" - }, - { - "category": "Operational Excellence", - "checklist": "Multitenant architecture", - "guid": "c0c72a1b-e34d-4b3d-b808-2e49f51ce47e", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/resource-organization", - "services": [], - "severity": "High", - "subcategory": "Operational Excellence", - "text": "Organize your Azure resources for isolation and scale.", - "waf": "Operations" - }, - { - "category": "Operational Excellence", - "checklist": "Multitenant architecture", - "guid": "c5c5e22d-4b51-4cac-a980-f7aac1a4b427", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/deployment-configuration", - "services": [], - "severity": "Medium", - "subcategory": "Operational Excellence", - "text": "Avoid deployment and configuration antipatterns. Antipatterns include running separate versions of the solution for each tenant, hardcoding tenant-specific configurations or logic, and manual deployments.", - "waf": "Operations" - }, - { - "category": "Performance Efficiency", - "checklist": "Multitenant architecture", - "guid": "f0b1fbd8-689c-4ab3-be1d-ad7607d2fbfd", - "link": "https://learn.microsoft.com/azure/architecture/framework/scalability/performance-efficiency", - "services": [], - "severity": "High", - "subcategory": "Performance Efficiency", - "text": "Review the Azure Well-Architected Performance Efficiency checklist, which is applicable to all workloads.", - "waf": "Performance" - }, - { - "category": "Performance Efficiency", - "checklist": "Multitenant architecture", - "guid": "18911c4c-934c-49a8-839a-60c092afce30", - "link": "https://learn.microsoft.com/azure/architecture/antipatterns/noisy-neighbor/noisy-neighbor", - "services": [], - "severity": "High", - "subcategory": "Performance Efficiency", - "text": "If you use shared infrastructure, plan for how you'll mitigate Noisy Neighbor concerns. Ensure that one tenant can't reduce the performance of the system for other tenants.", - "waf": "Performance" + "subcategory": "Best Practices", + "text": "Leverage Data-in replication for cross-region DR scenarios", + "waf": "Reliability" }, { - "category": "Performance Efficiency", - "checklist": "Multitenant architecture", - "guid": "6acf7eb5-24a3-47c7-ae87-1196cd96048e", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/compute", + "category": "Governance", + "checklist": "Azure Key Vault", + "guid": "6d37a33b-531c-4a91-871a-b69d8044f04e", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", "services": [ - "Storage" + "AKV", + "Backup" ], - "severity": "Medium", - "subcategory": "Performance Efficiency", - "text": "Determine how you'll scale your compute, storage, networking, and other Azure resources to match the demands of your tenants.", - "waf": "Performance" - }, - { - "category": "Performance Efficiency", - "checklist": "Multitenant architecture", - "guid": "ea55400d-f97d-45aa-b71b-34224bf91ed4", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/approaches/resource-organization", - "services": [], "severity": "High", - "subcategory": "Performance Efficiency", - "text": "Consider each Azure resource's scale limits. Organize your resources appropriately, in order to avoid resource organization antipatterns. For example, don't over-architect your solution to work within unrealistic scale requirements.", - "waf": "Performance" + "subcategory": "Deployment best practices", + "text": "Familiarize yourself with the Key Vault's best practices such as isolation recommendations, access control, data protection, backup, and logging.", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Azure Event Hub Review", - "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", + "category": "BC and DR", + "checklist": "Azure Key Vault", + "guid": "7ba4d380-7b9e-4a8b-a0c3-2d8e49c11872", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "Key Vault", "services": [ - "EventHubs" + "AKV", + "ACR" ], - "severity": "Low", - "subcategory": "Data Protection", - "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": "Medium", + "subcategory": "High Availability", + "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" }, { - "category": "Security", - "checklist": "Azure Event Hub Review", - "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", + "category": "BC and DR", + "checklist": "Azure Key Vault", + "guid": "17fb86a2-eb45-42a4-9c34-52b92a2a1842", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#data-replication", + "service": "Key Vault", "services": [ - "EventHubs" + "AKV" ], "severity": "Medium", - "subcategory": "Data Protection", - "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" + "subcategory": "High Availability", + "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" }, { - "category": "Security", - "checklist": "Azure Event Hub Review", - "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", + "category": "BC and DR", + "checklist": "Azure Key Vault", + "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": [ - "AzurePolicy", - "Entra", - "RBAC", - "EventHubs", - "TrafficManager" + "AKV", + "AzurePolicy" ], "severity": "Medium", - "subcategory": "Identity and Access Management", - "text": "Avoid using root account when it is not necessary", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", - "waf": "Security" + "subcategory": "High Availability", + "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" }, { - "category": "Security", - "checklist": "Azure Event Hub Review", - "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", + "category": "Management", + "checklist": "Azure Key Vault", + "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": [ "AKV", "Storage", - "VM", - "EventHubs", - "Entra" + "Backup", + "ASR", + "Subscriptions" ], "severity": "Medium", - "subcategory": "Identity and Access Management", - "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" + "subcategory": "Business continuity and disaster recovery", + "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" }, { - "category": "Security", - "checklist": "Azure Event Hub Review", - "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", + "category": "Management", + "checklist": "Azure Key Vault", + "guid": "2df045b1-c0f6-47d3-9a9b-99cf6999684e", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "Key Vault", "services": [ - "RBAC", - "Entra", - "EventHubs" + "AKV", + "ASR" ], "severity": "High", - "subcategory": "Identity and Access Management", - "text": "Use least privilege data plane RBAC", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", - "waf": "Security" + "subcategory": "Business continuity and disaster recovery", + "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" }, { - "category": "Security", - "checklist": "Azure Event Hub Review", - "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", + "category": "Management", + "checklist": "Azure Key Vault", + "guid": "cbfa96b0-5249-4e6f-947c-d0e79509708c", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "Key Vault", "services": [ - "Monitor", - "VNet", - "EventHubs" + "AKV", + "ASR" ], - "severity": "Medium", - "subcategory": "Monitoring", - "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" + "severity": "Low", + "subcategory": "Business continuity and disaster recovery", + "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" }, { - "category": "Security", - "checklist": "Azure Event Hub Review", - "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", + "category": "Management", + "checklist": "Azure Key Vault", + "guid": "e8659d11-7e02-4db0-848c-c6541dbab68c", + "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", + "service": "Key Vault", + "services": [ + "AKV", + "Backup", + "ASR" + ], + "severity": "Low", + "subcategory": "Business continuity and disaster recovery", + "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" + }, + { + "category": "Management", + "checklist": "Azure Key Vault", + "guid": "45c25e29-d0ef-4f07-aa04-0f8c64cbcc04", + "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", + "service": "Key Vault", "services": [ - "PrivateLink", - "VNet", - "EventHubs" + "AKV", + "Backup", + "ASR" ], - "severity": "Medium", - "subcategory": "Networking", - "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" + "severity": "Low", + "subcategory": "Business continuity and disaster recovery", + "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" }, { - "category": "Security", - "checklist": "Azure Event Hub Review", - "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", + "category": "Management", + "checklist": "Azure Key Vault", + "guid": "0f15640b-31e5-4de6-85a7-d2c652fa09d3", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview#purge-protection", + "service": "Key Vault", "services": [ + "AKV", + "ASR", "EventHubs" ], "severity": "Medium", - "subcategory": "Networking", - "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" + "subcategory": "Business continuity and disaster recovery", + "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" }, { "category": "Operations Management", - "checklist": "Azure Event Hub Review", - "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": [ - "EventHubs" - ], - "severity": "Medium", - "subcategory": "Best Practices", - "text": "Leverage FTA Resillency HandBook", + "checklist": "Recovery Services Vault Checklist", + "guid": "cb7da8cf-aa62-4a15-a495-6da97dc3a242", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-plan-capacity-vmware", + "services": [], + "severity": "High", + "subcategory": "Replication", + "text": "Capacity planning is required to make sure you have sufficient bandwidth for replication and an estimated number of CPU cores & disk types that will be needed in Azure for failover", "waf": "Reliability" }, { "category": "Operations Management", - "checklist": "Azure Event Hub Review", - "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", + "checklist": "Recovery Services Vault Checklist", + "guid": "67b23587-05a1-4652-aded-fa8a488cdec4", + "link": "https://learn.microsoft.com/azure/site-recovery/azure-to-azure-how-to-enable-policy", "services": [ - "ACR", - "EventHubs" + "VM", + "ASR", + "AzurePolicy" ], "severity": "High", - "subcategory": "Zone Redudancy", - "text": "Leverage Availability Zones if regionally applicable", + "subcategory": "Replication", + "text": "Use Azure Policy to ensure that all critical Azure VMs are protected with ASR", "waf": "Reliability" }, { "category": "Operations Management", - "checklist": "Azure Event Hub Review", - "guid": "20b56c56-ad58-4519-8f82-735c586bb281", - "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", - "service": "Event Hubs", + "checklist": "Recovery Services Vault Checklist", + "guid": "862bc3bc-14be-4b7f-96e8-d9b3bec228e7", + "link": "https://learn.microsoft.com/azure/site-recovery/recovery-plan-overview", "services": [ - "EventHubs" + "VM" ], "severity": "Medium", - "subcategory": "Best Practices", - "text": "Use the Premium or Dedicated SKUs for predicable performance", + "subcategory": "Replication", + "text": "Define recovery plans to automate the failover sequence for VMs. You can also include automation scripts to reduce manual steps and improve recovery time", "waf": "Reliability" }, { "category": "Operations Management", - "checklist": "Azure Event Hub Review", - "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": [ - "ASR", - "EventHubs" - ], - "severity": "High", - "subcategory": "Geo Redudancy", - "text": "Plan for Geo Disaster Recovery using Active Passive configuration", + "checklist": "Recovery Services Vault Checklist", + "guid": "437b1736-db55-4f67-a613-334bd09dc234", + "link": "https://learn.microsoft.com/azure/backup/backup-azure-immutable-vault-how-to-manage?tabs=recovery-services-vault", + "services": [], + "severity": "Medium", + "subcategory": "Data Protection", + "text": "Enable and LOCK immutability for vaults. This ensures recovery points cannot be deleted before their intended expiry", "waf": "Reliability" }, { "category": "Operations Management", - "checklist": "Azure Event Hub Review", - "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": [ - "ASR", - "EventHubs" - ], + "checklist": "Recovery Services Vault Checklist", + "guid": "19db6128-1265-404b-a47a-493a08042729", + "link": "https://learn.microsoft.com/azure/backup/backup-azure-enhanced-soft-delete-about", + "services": [], "severity": "Medium", - "subcategory": "Geo Redudancy", - "text": "For Business Critical Applications, use Active Active configuration", + "subcategory": "Data Protection", + "text": "Enable 'Always-on soft delete' for vaults protecting critical workloads", "waf": "Reliability" }, { "category": "Operations Management", - "checklist": "Azure Event Hub Review", - "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", - "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", - "service": "Event Hubs", + "checklist": "Recovery Services Vault Checklist", + "guid": "4798b158-8b31-4aa5-9ceb-54445135a227", + "link": "https://learn.microsoft.com/azure/backup/backup-create-recovery-services-vault#set-storage-redundancy", "services": [ - "EventHubs" + "Storage" ], "severity": "Medium", - "subcategory": "Reliability", - "text": "Design Resilient Event Hubs", + "subcategory": "Redudancy", + "text": "When creating Recovery Service Vaults choose the best storage redundancy option for your requirements. Vaults support local, geo and zone redundancy but this setting cannot be changed once the vault is protecting one or more resources", "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Design Review", - "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", - "service": "AVS", + "category": "Compute", + "checklist": "Resiliency Review", + "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": [ - "AVS", - "Entra", - "Subscriptions" + "VM" ], - "severity": "High", - "subcategory": "Identity", - "text": "Ensure ADDS domain controller(s) are deployed in the identity subscription in native Azure", - "waf": "Security" + "severity": "Low", + "subcategory": "VM Scale Sets", + "text": "Enable automatic instance repairs for enhanced VM Scale Sets resiliency", + "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Design Review", - "guid": "75089c20-990d-4927-b105-885576f76fc2", - "service": "AVS", + "category": "Compute", + "checklist": "Resiliency Review", + "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": [ - "AVS", - "Entra" + "Backup", + "VM" ], - "severity": "Medium", - "subcategory": "Identity", - "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" + "severity": "High", + "subcategory": "Virtual Machines", + "text": "Consider Azure Backup to meet your resiliency requirements for Azure VMs", + "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Design Review", - "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", - "service": "AVS", + "category": "Compute", + "checklist": "Resiliency Review", + "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": [ - "AVS", - "Entra" + "VM" ], "severity": "High", - "subcategory": "Identity", - "text": "Ensure that vCenter is connected to ADDS to enable authentication based on 'named user accounts'", - "waf": "Security" + "subcategory": "Virtual Machines", + "text": "Use Premium or Ultra disks for production VMs", + "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Design Review", - "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", - "service": "AVS", + "category": "Compute", + "checklist": "Resiliency Review", + "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": [ - "AVS", - "Entra" + "VM" ], - "severity": "Medium", - "subcategory": "Identity", - "text": "Ensure that the connection from vCenter to ADDS is using a secure protocol (LDAPS)", - "waf": "Security" + "severity": "High", + "subcategory": "Virtual Machines", + "text": "Ensure Managed Disks are used for all VMs", + "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Design Review", - "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", - "service": "AVS", + "category": "Compute", + "checklist": "Resiliency Review", + "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": [ - "AVS", - "Entra" + "SQL", + "Storage", + "VM" ], "severity": "Medium", - "subcategory": "Identity", - "text": "CloudAdmin account in vCenter IdP is used only as an emergency account (break-glass)", - "waf": "Security" + "subcategory": "Virtual Machines", + "text": "Do not use the Temp disk for anything that is not acceptable to be lost", + "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Design Review", - "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", - "service": "AVS", + "category": "Compute", + "checklist": "Resiliency Review", + "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": [ - "AVS", - "Entra" + "Storage", + "VM", + "ACR" ], - "severity": "High", - "subcategory": "Identity", - "text": "Ensure that NSX-Manager is integrated with an external Identity provider (LDAPS)", - "waf": "Security" + "severity": "Medium", + "subcategory": "Virtual Machines", + "text": "Leverage Availability Zones for your VMs in regions where they are supported", + "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Design Review", - "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", - "service": "AVS", + "category": "Compute", + "checklist": "Resiliency Review", + "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": [ - "RBAC", - "AVS", - "Entra" + "VM" ], "severity": "Medium", - "subcategory": "Identity", - "text": "Has an RBAC model been created for use within VMware vSphere", - "waf": "Security" + "subcategory": "Virtual Machines", + "text": "For regions that do not support Availability Zones deploy VMs into Availability Sets", + "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Design Review", - "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", - "service": "AVS", + "category": "Compute", + "checklist": "Resiliency Review", + "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": [ - "RBAC", - "AVS", - "Entra" + "ASR", + "VM" ], - "severity": "Medium", - "subcategory": "Identity", - "text": "RBAC permissions should be granted on ADDS groups and not on specific users", - "waf": "Security" + "severity": "High", + "subcategory": "Virtual Machines", + "text": "Avoid running a production workload on a single VM", + "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Design Review", - "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", - "service": "AVS", + "category": "Compute", + "checklist": "Resiliency Review", + "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": [ - "RBAC", "AVS", - "Entra" + "VM", + "ASR" ], "severity": "High", - "subcategory": "Identity", - "text": "RBAC permissions on the Azure VMware Solution resource in Azure are 'locked down' to a limited set of owners only", - "waf": "Security" + "subcategory": "Virtual Machines", + "text": "For Azure and on-premises VMs (Hyper-V/Phyiscal/VMware) with low RTO requirements use Azure Site Recovery", + "waf": "Reliability" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Design Review", - "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", - "service": "AVS", + "category": "Compute", + "checklist": "Resiliency Review", + "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": [ - "RBAC", - "AVS", - "Entra" + "VM" ], - "severity": "High", - "subcategory": "Identity", - "text": "Ensure all custom roles are scoped with CloudAdmin permitted authorizations", - "waf": "Security" + "severity": "Low", + "subcategory": "Virtual Machines", + "text": "Use Capacity Reservations for critical workloads that require guaranteed capacity", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Design Review", - "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", - "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", - "service": "AVS", + "category": "Compute", + "checklist": "Resiliency Review", + "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": [ - "AVS" + "VM", + "ASR" ], - "severity": "High", - "subcategory": "Architecture", - "text": "Is the correct Azure VMware Solution connectivity model selected for the customer use case at hand", - "waf": "Performance" + "severity": "Medium", + "subcategory": "Virtual Machines", + "text": "Increase quotas in DR region before testing failover with ASR", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Design Review", - "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", - "service": "AVS", + "category": "Compute", + "checklist": "Resiliency Review", + "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": [ - "ExpressRoute", - "VPN", - "Monitor", - "NetworkWatcher", - "AVS" + "VM" ], - "severity": "High", - "subcategory": "Monitoring", - "text": "Ensure ExpressRoute or VPN connections from on-premises to Azure are monitored using 'connection monitor'", - "waf": "Operations" + "severity": "Low", + "subcategory": "Virtual Machines", + "text": "Utilize Scheduled Events to prepare for VM maintenance", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Design Review", - "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", - "service": "AVS", + "category": "Data", + "checklist": "Resiliency Review", + "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": [ - "ExpressRoute", - "Monitor", - "VM", - "NetworkWatcher", - "AVS" + "Storage" ], "severity": "Medium", - "subcategory": "Monitoring", - "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" + "subcategory": "Storage Accounts", + "text": "Choose the most appropriate data redundancy option for Azure Storage based on your requirements", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Design Review", - "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", - "service": "AVS", + "category": "Data", + "checklist": "Resiliency Review", + "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": [ - "NetworkWatcher", - "AVS", - "Monitor", - "VM" + "Storage" ], - "severity": "Medium", - "subcategory": "Monitoring", - "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" + "severity": "Low", + "subcategory": "Storage Accounts", + "text": "Apply a Delete lock to prevent accidental or malicious deletion of storage accounts", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Design Review", - "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", - "service": "AVS", + "category": "Data", + "checklist": "Resiliency Review", + "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": [ - "AVS", - "ARS" + "Storage" ], - "severity": "High", - "subcategory": "Routing", - "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" + "severity": "Low", + "subcategory": "Storage Accounts", + "text": "Enable soft delete for Storage Account Containers", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", - "service": "AVS", + "category": "Data", + "checklist": "Resiliency Review", + "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": [ - "RBAC", - "AVS", - "Entra" + "Storage" ], - "severity": "High", - "subcategory": "Security (identity)", - "text": "Is Privileged Identity Management implemented for roles managing the Azure VMware Solution resource in the Azure Portal (no standing permissions allowed)", - "waf": "Security" + "severity": "Low", + "subcategory": "Storage Accounts", + "text": "Enable soft delete for blobs", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", - "service": "AVS", + "category": "General", + "checklist": "Resiliency Review", + "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": [ - "RBAC", - "AVS", - "Entra" + "Backup" ], - "severity": "High", - "subcategory": "Security (identity)", - "text": "Privileged Identity Management audit reporting should be implemented for the Azure VMware Solution PIM roles", - "waf": "Security" + "severity": "Medium", + "subcategory": "Backup", + "text": "Enable Azure Backup enhanced soft delete for improved data protection and recovery", + "waf": "Reliability" + }, + { + "category": "General", + "checklist": "Resiliency Review", + "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": [ + "Backup" + ], + "severity": "Low", + "subcategory": "Backup", + "text": "Implement multi-user authorization for Azure Backup to ensure secure and controlled access to backup resources", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", - "service": "AVS", + "category": "General", + "checklist": "Resiliency Review", + "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": [ - "AVS", - "Entra" + "Storage", + "Backup" ], - "severity": "Medium", - "subcategory": "Security (identity)", - "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" + "severity": "Low", + "subcategory": "Backup", + "text": "Implement Immutable Storage for your vaults to protect against ransomware and prevent unauthorized modifications to backups", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", - "service": "AVS", + "category": "General", + "checklist": "Resiliency Review", + "description": "Clearly define your organization's business continuity and disaster recovery requirements for your Azure environment. This includes identifying the critical applications, data, and services that need to be protected, as well as specifying the desired recovery objectives and strategies.", + "guid": "72e52e36-11dd-458c-9a4b-1521e43a58a9", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-business-continuity-disaster-recovery", "services": [ - "AVS", - "Entra" + "ASR" ], "severity": "High", - "subcategory": "Security (identity)", - "text": "Limit use of CloudAdmin account to emergency access only", - "waf": "Security" + "subcategory": "Design", + "text": "Define business continuity and disaster recovery requirements", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", - "service": "AVS", + "category": "General", + "checklist": "Resiliency Review", + "description": "Ensure that your Azure architectures are designed with a focus on reliability. Consider implementing fault-tolerant mechanisms, redundancy, and resiliency patterns to minimize the impact of failures and maximize the availability of your applications and services.", + "guid": "c2399c4d-7b67-4d0c-9555-62f2b3e4563a", + "link": "https://learn.microsoft.com/azure/architecture/reliability/architect", + "services": [], + "severity": "High", + "subcategory": "Design", + "text": "Implement reliability best practices in Azure architectures", + "waf": "Reliability" + }, + { + "category": "General", + "checklist": "Resiliency Review", + "description": "IaC configurations can play a role in your disaster recovery plan, particularly in situations where recovery time is not time-sensitive. In the event of infrastructure recreation in a second region, IaC can be used to reproduce the necessary infrastructure.", + "guid": "fe237de2-43b1-46c3-8d7a-a9b7570449aa", + "link": "https://learn.microsoft.com/azure/well-architected/devops/automation-infrastructure", "services": [ "RBAC", - "AVS", - "Entra" + "ASR" ], "severity": "Medium", - "subcategory": "Security (identity)", - "text": "Create custom RBAC roles in vCenter to implement a least-privilege model inside vCenter", - "waf": "Security" + "subcategory": "DevOps", + "text": "Implement Infrastructure as Code (IaC) for Rapid Infrastructure Recovery", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", - "service": "AVS", + "category": "General", + "checklist": "Resiliency Review", + "description": "Azure offers region pairs that are geographically separated and can be used for cross-region replication and disaster recovery. These region pairs provide redundancy and protection against regional or large-scale disasters.", + "guid": "dcb1f7d5-769a-4e56-aba3-8d4a85e2213d", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", "services": [ - "AVS", - "Entra" + "ASR" ], "severity": "Medium", - "subcategory": "Security (identity)", - "text": "Is a process defined to regularly rotate cloudadmin (vCenter) and admin (NSX) credentials", - "waf": "Security" + "subcategory": "Multi-region", + "text": "Plan for cross-region recovery by leveraging region pairs", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", - "service": "AVS", + "category": "Network", + "checklist": "Resiliency Review", + "description": "By deploying an Application Gateway with a minimum instance count of two, you will have at least two instances available under normal circumstances. In the event that one of the instances encounters a problem, the other instance will handle the traffic while a new instance is being created. This approach significantly reduces the risk of service disruption and ensures a seamless experience for your users.", + "guid": "93c76286-37a5-451c-9b04-e4f1854387e5", + "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-autoscaling-zone-redundant#autoscaling-and-high-availability", "services": [ - "AVS", - "VM", - "Entra" + "AppGW" ], - "severity": "High", - "subcategory": "Security (identity)", - "text": "Use a centralized identity provider to be used for workloads (VM's) running on Azure VMware Solution", - "waf": "Security" + "severity": "Medium", + "subcategory": "Application Gateways", + "text": "Deploy Application Gateways with a minimum instance count of 2 to avoid instance provisioning downtime", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", - "service": "AVS", + "category": "Network", + "checklist": "Resiliency Review", + "description": "The v2 SKU offers several advantages and critical new features that enhance the availability and resilience of your application infrastructure. One notable feature supported by the v2 SKU is zone redundancy, which allows an Application Gateway deployment to span multiple Availability Zones.", + "guid": "ced126cd-032a-4f5b-8fc6-998a535e3378", + "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", "services": [ - "AVS" + "Storage", + "AppGW" ], - "severity": "Medium", - "subcategory": "Security (network)", - "text": "Is East-West traffic filtering implemented within NSX-T", - "waf": "Security" + "severity": "High", + "subcategory": "Application Gateways", + "text": "Deploy Azure Application Gateway v2 for zone redundancy support", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", - "service": "AVS", + "category": "Network", + "checklist": "Resiliency Review", + "description": "Azure Front Door provides automatic failover capabilities, ensuring continuity in the event of a primary region becoming unavailable. However, during the failover process, there may be a brief period (typically 20-60 seconds) when clients cannot reach the application. It is essential to review the Azure Front Door service level agreement (SLA) to determine whether relying solely on Front Door meets your business requirements for high availability. ", + "guid": "97e31c67-d68c-4f6a-92a1-194956d697dc", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/app-service-web-app/multi-region#azure-front-door", "services": [ - "AVS", - "AppGW", - "Firewall" + "FrontDoor" ], - "severity": "High", - "subcategory": "Security (network)", - "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" + "severity": "Low", + "subcategory": "Azure Front Door", + "text": "Consider a redundant traffic management solution in conjunction with Azure Front Door", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", - "service": "AVS", + "category": "Network", + "checklist": "Resiliency Review", + "description": "By implementing Traffic Manager, you can configure it to continuously monitor the health of your application endpoints and automatically redirect traffic to an alternate endpoint when necessary. This automation minimizes downtime and provides a more seamless experience for your users during disaster recovery scenarios.", + "guid": "8df03a82-2cd4-463c-abbc-8ac299ebc92a", + "link": "https://learn.microsoft.com/azure/networking/disaster-recovery-dns-traffic-manager", "services": [ - "AVS" + "DNS", + "TrafficManager", + "ASR", + "Monitor" ], - "severity": "High", - "subcategory": "Security (network)", - "text": "Auditing and logging is implemented for inbound internet requests to Azure VMware Solution and Azure VMware Solution based workloads", - "waf": "Security" + "severity": "Low", + "subcategory": "DNS", + "text": "Plan for automated failover using Traffic Manager for DNS Traffic", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", - "service": "AVS", + "category": "Network", + "checklist": "Resiliency Review", + "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": [ - "Monitor", - "AVS" + "DNS", + "ASR", + "ACR" ], - "severity": "Medium", - "subcategory": "Security (network)", - "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": "Low", + "subcategory": "DNS", + "text": "Implement DNS Failover using Azure DNS Private Resolvers", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "334fdf91-c234-4182-a652-75269440b4be", - "service": "AVS", + "category": "Network", + "checklist": "Resiliency Review", + "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": [ - "ExpressRoute", - "VPN", - "VNet", - "AVS", - "DDoS" + "ACR" ], "severity": "Medium", - "subcategory": "Security (network)", - "text": "Is DDoS standard protection enabled on ExR/VPN Gateway subnet in Azure", - "waf": "Security" + "subcategory": "Data Gateways", + "text": "Use on-premises data gateway clusters to ensure high availability for business-critical data", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", - "service": "AVS", + "category": "Network", + "checklist": "Resiliency Review", + "description": "When using ExpressRoute, it's important to design for high availability by incorporating redundancy in both the partner and customer networks. This can include multiple ExpressRoute circuits, redundant connections from your network to Microsoft, and ensuring your on-premises network equipment has redundant connections.", + "guid": "c0e7c28d-c936-4657-802b-ff4564b0d934", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-high-availability-with-expressroute", "services": [ - "AVS" + "ExpressRoute" ], "severity": "Medium", - "subcategory": "Security (network)", - "text": "Use a dedicated privileged access workstation (PAW) to manage Azure VMware Solution, vCenter, NSX manager and HCX manager", - "waf": "Security" + "subcategory": "ExpressRoute", + "text": "Ensure redundancy within both the partner network and customer network when utilizing ExpressRoute for high availability", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", - "service": "AVS", + "category": "Network", + "checklist": "Resiliency Review", + "description": "The primary circuit should handle regular traffic while the backup circuit stays ready to take over if the primary circuit fails. Utilize BGP attributes to influence routing and designate your primary and backup circuits effectively.", + "guid": "a359c373-e7dd-4616-83a3-64a907ebae48", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", "services": [ - "AVS", - "Defender" + "Backup", + "ExpressRoute" ], "severity": "Medium", - "subcategory": "Security (guest/VM)", - "text": "Enable Advanced Threat Detection (Microsoft Defender for Cloud aka ASC) for workloads running on Azure VMware Solution", - "waf": "Security" + "subcategory": "ExpressRoute", + "text": "When using multiple ExpressRoute circuits ensure that routing allows for a primary and backup", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", - "service": "AVS", + "category": "Network", + "checklist": "Resiliency Review", + "description": "S2S VPN connection can provide a cost-effective, resilient backup solution in the event of an ExpressRoute circuit failure. By using S2S VPN as a failover, you can maintain connectivity to your Azure resources without relying solely on ExpressRoute.", + "guid": "ead53cc7-de2e-48aa-ab35-71549ab9153d", + "link": "https://learn.microsoft.com/azure/expressroute/use-s2s-vpn-as-backup-for-expressroute-privatepeering", "services": [ - "Arc", - "AVS" + "VPN", + "Backup", + "Cost", + "ExpressRoute" ], - "severity": "Medium", - "subcategory": "Security (guest/VM)", - "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": "Low", + "subcategory": "ExpressRoute", + "text": "Consider deploying site-to-site VPN as a backup for your ExpressRoute private peering", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", - "service": "AVS", + "category": "Network", + "checklist": "Resiliency Review", + "description": "Standard Load Balancer SKU offers an SLA of 99.99% and a higher level of service availability compared to the Basic Load Balancer SKU.", + "guid": "778468d5-5a78-45d6-be96-c96ad8844cf3", + "link": "https://learn.microsoft.com/azure/load-balancer/skus", "services": [ - "SQL", - "AVS" + "LoadBalancer" ], - "severity": "Low", - "subcategory": "Security (guest/VM)", - "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": "Medium", + "subcategory": "Load Balancers", + "text": "Leverage the Standard SKU for Load Balancers that handle traffic to production applications", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "a3592718-e6e2-4051-9267-6ae46691e883", - "service": "AVS", + "category": "Network", + "checklist": "Resiliency Review", + "description": "By configuring the load balancer with a zone-redundant frontend, it can serve zonal resources in any zone with a single IP address. As long as at least one zone remains healthy within the region, the IP address associated with the frontend can survive one or more zone failures. It is recommended to have multiple zonal resources, such as virtual machines from different zones, in the backend pool of the load balancer. ", + "guid": "b2b38c88-6ba2-4c02-8499-114a5d3ce574", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", "services": [ - "AVS", - "AKV" + "LoadBalancer", + "VM" ], "severity": "Low", - "subcategory": "Security (guest/VM)", - "text": "When in-guest encryption is used, store encryption keys in Azure Key vault when possible", - "waf": "Security" + "subcategory": "Load Balancers", + "text": "For load balancers, consider using a zone-redundant frontend with multiple zonal resources in the backend", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "5ac94222-3e13-4810-9230-81a941741583", - "service": "AVS", + "category": "Network", + "checklist": "Resiliency Review", + "description": "When designing health probes for your Azure Load Balancer, it is important to follow best practices to ensure reliable and accurate monitoring of your backend instances.", + "guid": "dccbd979-2a6b-4cca-8b5f-ea1ebf3dd95d", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-custom-probe-overview#design-guidance", "services": [ - "AVS" + "LoadBalancer", + "Monitor" ], - "severity": "Medium", - "subcategory": "Security (guest/VM)", - "text": "Consider using extended security update support for workloads running on Azure VMware Solution (Azure VMware Solution is eligible for ESU)", - "waf": "Security" + "severity": "Low", + "subcategory": "Load Balancers", + "text": "Select the right protocol, appropriate intervals and timeouts, representative paths and probe responses when defining Load Balancer Health Probes", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", - "service": "AVS", + "category": "Network", + "checklist": "Resiliency Review", + "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": [ - "AVS" + "NVA" ], "severity": "High", - "subcategory": "Governance (platform)", - "text": "Ensure that the appropriate vSAN Data redundancy method is used (RAID specification)", + "subcategory": "NVAs", + "text": "Deploy Network Virtual Appliances (NVAs) in a vendor supported configuration for High Availability", "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "d88408f3-7273-44c8-96ba-280214590146", - "service": "AVS", + "category": "Network", + "checklist": "Resiliency Review", + "description": "By deploying VPN Gateways in an active-active mode, you can distribute VPN traffic across multiple gateways, improving reliability and ensuring continuous connectivity in case of failures or maintenance.", + "guid": "927139b8-2110-42db-b6ea-f11e6f843e53", + "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-highlyavailable", "services": [ - "Storage", - "AVS", - "AzurePolicy" + "VPN", + "ACR" ], - "severity": "High", - "subcategory": "Governance (platform)", - "text": "Ensure that the Failure-to-tolerate policy is in place to meet your vSAN storage needs", + "severity": "Medium", + "subcategory": "VPN Gateways", + "text": "Deploy Azure VPN Gateways in an active-active mode to ensure high availability and redundancy for your VPN connections.", "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", - "service": "AVS", + "category": "Network", + "checklist": "Resiliency Review", + "description": "Zone-redundant SKUs ensure that your VPN gateways are physically and logically separated within a region, providing resiliency and scalability. This deployment configuration safeguards your on-premises network connectivity to Azure from zone-level failures.", + "guid": "f4722d92-8c1b-41cd-921f-54b29b9de39a", + "link": "https://learn.microsoft.com/azure/vpn-gateway/about-zone-redundant-vnet-gateways", "services": [ - "AVS", - "ASR" + "VPN" ], - "severity": "High", - "subcategory": "Governance (platform)", - "text": "Ensure that you have requested enough quota, ensuring you have considered growth and Disaster Recovery requirement", + "severity": "Medium", + "subcategory": "VPN Gateways", + "text": "Use zone-redundant SKUs when deploying VPN Gateways to enhance resilience and protect against zone-level failures", "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", - "service": "AVS", + "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": [ - "AVS" + "WAF" ], - "severity": "Medium", - "subcategory": "Governance (platform)", - "text": "Ensure that access constraints to ESXi are understood, there are access limits which might affect 3rd party solutions.", - "waf": "Operations" + "severity": "High", + "text": "Select the right Logic App hosting plan based on your business & SLO requirements", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", - "service": "AVS", + "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": [ - "AzurePolicy", - "AVS" + "WAF" ], - "severity": "Medium", - "subcategory": "Governance (platform)", - "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": "Protect logic apps from region failures with zone redundancy and availability zones", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", - "service": "AVS", + "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": [ - "Cost", - "AVS" + "WAF" ], - "severity": "Medium", - "subcategory": "Governance (platform)", - "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": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", - "service": "AVS", + "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": [ - "Cost", - "AVS" + "AppSvc", + "WAF" ], - "severity": "Low", - "subcategory": "Governance (platform)", - "text": "Are Azure reserved instances used to optimize cost for using Azure VMware Solution", - "waf": "Cost" + "severity": "High", + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "6691e883-5ac9-4422-83e1-3810523081a9", - "service": "AVS", + "arm-service": "Microsoft.Devices/provisioningServices", + "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", "services": [ - "AVS" + "WAF" ], "severity": "Medium", - "subcategory": "Governance (platform)", - "text": "Consider the use of Azure Private-Link when using other Azure Native Services", - "waf": "Security" + "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", + "waf": "Operations" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", - "service": "AVS", + "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": [ - "AVS" + "WAF" ], "severity": "High", - "subcategory": "Governance (platform)", - "text": "Ensure all required resource reside within the same Azure availability zone(s)", - "waf": "Performance" + "text": "Leverage Availability Zones if regionally applicable (this is automatically enabled).", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", - "service": "AVS", - "services": [ - "AVS", - "Defender", - "VM" + "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": "Medium", - "subcategory": "Governance (guest/VM)", - "text": "Enable Microsoft Defender for Cloud for Azure VMware Solution guest VM workloads", - "waf": "Security" + "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" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", - "service": "AVS", + "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": [ - "Arc", - "AVS", - "VM" + "WAF" ], - "severity": "Medium", - "subcategory": "Governance (guest/VM)", - "text": "Use Azure Arc enabled servers to manage your Azure VMware Solution guest VM workloads", - "waf": "Security" + "severity": "High", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", - "service": "AVS", + "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": [ - "AVS" + "AppSvc", + "WAF" ], "severity": "High", - "subcategory": "Governance (guest/VM)", - "text": "Enable Diagnostic and metric logging on Azure VMware Solution", - "waf": "Operations" + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", - "service": "AVS", + "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": [ - "Monitor", - "AVS", - "VM" + "WAF" ], - "severity": "Medium", - "subcategory": "Governance (guest/VM)", - "text": "Deploy the Log Analytics Agents to Azure VMware Solution guest VM workloads", - "waf": "Operations" + "severity": "High", + "text": "Select the right Logic App hosting plan based on your business & SLO requirements", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "589d457a-927c-4397-9d11-02cad6aae11e", - "service": "AVS", + "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": [ - "AzurePolicy", - "AVS", - "Backup", - "VM" + "WAF" ], - "severity": "Medium", - "subcategory": "Governance (guest/VM)", - "text": "Ensure you have a documented and implemented backup policy and solution for Azure VMware Solution VM workloads", - "waf": "Operations" + "severity": "High", + "text": "Protect logic apps from region failures with zone redundancy and availability zones", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "ee29711b-d352-4caa-ab79-b198dab81932", - "service": "AVS", + "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": [ - "Monitor", - "AVS", - "Defender" + "WAF" ], - "severity": "Medium", - "subcategory": "Compliance", - "text": "Use Microsoft Defender for Cloud for compliance monitoring of workloads running on Azure VMware Solution", - "waf": "Security" + "severity": "High", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", - "service": "AVS", + "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": [ - "AVS", - "Defender" + "AppSvc", + "WAF" ], - "severity": "Medium", - "subcategory": "Compliance", - "text": "Are the applicable compliance baselines added to Microsoft Defender for Cloud", - "waf": "Security" + "severity": "High", + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "checklist": "WAF checklist", + "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", + "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", + "service": "Logic Apps", "services": [ - "AVS" + "WAF" ], - "severity": "High", - "subcategory": "Compliance", - "text": "Was data residency evaluated when selecting Azure regions to use for Azure VMware Solution deployment", - "waf": "Security" + "severity": "Medium", + "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", + "waf": "Operations" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", - "service": "AVS", + "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": [ - "AVS" + "WAF" ], - "severity": "High", - "subcategory": "Compliance", - "text": "Are data processing implications (service provider / service consumer model) clear and documented", - "waf": "Security" + "severity": "Medium", + "text": "Follow reliability support recommendations in Azure Bot Service", + "waf": "Reliability" }, { - "category": "Governance", - "checklist": "Azure VMware Solution Design Review", - "guid": "547c1747-dc56-4068-a714-435cd19dd244", - "service": "AVS", + "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": [ - "AVS" + "WAF" ], "severity": "Medium", - "subcategory": "Compliance", - "text": "Consider using CMK (Customer Managed Key) for vSAN only if needed for compliance reason(s).", - "waf": "Security" + "text": "Deploying bots with local data residency and regional compliance", + "waf": "Reliability" }, { - "category": "Management", - "checklist": "Azure VMware Solution Design Review", - "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", - "service": "AVS", + "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": [ - "Monitor", - "AVS" + "WAF" ], - "severity": "High", - "subcategory": "Monitoring", - "text": "Create dashboards to enable core Azure VMware Solution monitoring insights", - "waf": "Operations" + "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" }, { - "category": "Management", - "checklist": "Azure VMware Solution Design Review", - "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", - "service": "AVS", + "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": [ - "Monitor", - "AVS" + "WAF" ], - "severity": "High", - "subcategory": "Monitoring", - "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": "FTA Resiliency Playbook", + "waf": "Reliability" }, { - "category": "Management", - "checklist": "Azure VMware Solution Design Review", - "guid": "9659e396-80e7-4828-ac93-5657d02bff45", - "service": "AVS", + "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": [ - "Monitor", - "AVS" + "WAF" ], "severity": "High", - "subcategory": "Monitoring", - "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": "Leverage Availablity Zones where regionally applicable and ofcourse if the service offers it", + "waf": "Reliability" }, { - "category": "Management", - "checklist": "Azure VMware Solution Design Review", - "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", - "service": "AVS", + "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": [ - "Monitor", - "AVS" + "WAF" ], - "severity": "High", - "subcategory": "Monitoring", - "text": "Ensure alerts are configured for Azure Service Health alerts and notifications", - "waf": "Operations" + "severity": "Medium", + "text": "Run multiple replicas of the database (>1 ) in Prod", + "waf": "Reliability" }, { - "category": "Management", - "checklist": "Azure VMware Solution Design Review", - "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", - "service": "AVS", + "arm-service": "microsoft.documentdb/databaseAccounts", + "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", "services": [ - "Storage", - "AVS", - "Monitor" + "ACR", + "WAF" ], "severity": "Medium", - "subcategory": "Monitoring", - "text": "Configure Azure VMware Solution logging to be send to an Azure Storage account or Azure EventHub for processing", - "waf": "Operations" + "text": "Leverage Multi-Region Writes", + "waf": "Reliability" }, { - "category": "Management", - "checklist": "Azure VMware Solution Design Review", - "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", - "service": "AVS", + "arm-service": "microsoft.documentdb/databaseAccounts", + "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", "services": [ - "Monitor", - "AVS" + "ACR", + "WAF" ], - "severity": "Low", - "subcategory": "Monitoring", - "text": "If deep insight in VMware vSphere is required: Is vRealize Operations and/or vRealize Network Insights used in the solution?", - "waf": "Operations" + "severity": "Medium", + "text": "Distribute your data globally", + "waf": "Reliability" }, { - "category": "Management", - "checklist": "Azure VMware Solution Design Review", - "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", - "service": "AVS", + "arm-service": "microsoft.documentdb/databaseAccounts", + "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", "services": [ - "Storage", - "AVS", - "AzurePolicy", - "VM" + "WAF" ], "severity": "High", - "subcategory": "Operations", - "text": "Ensure the vSAN storage policy for VM's is NOT the default storage policy as this policy applies thick provisioning", - "waf": "Operations" + "text": "Choose from several well-defined consistency models", + "waf": "Reliability" }, { - "category": "Management", - "checklist": "Azure VMware Solution Design Review", - "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", - "service": "AVS", + "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": [ - "AVS" + "CosmosDB", + "WAF" ], "severity": "Medium", - "subcategory": "Operations", - "text": "Ensure vSphere content libraries are not placed on vSAN as vSAN is a finite resource", - "waf": "Operations" + "text": "Enable Service managed failover", + "waf": "Reliability" }, { - "category": "Management", - "checklist": "Azure VMware Solution Design Review", - "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", - "service": "AVS", + "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", - "AVS", - "Backup" + "CosmosDB", + "WAF" ], "severity": "Medium", - "subcategory": "Operations", - "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" + "text": "Enable Automatic Backups", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Reliability" }, { - "category": "Management", - "checklist": "Azure VMware Solution Design Review", - "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", - "service": "AVS", + "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": [ - "Arc", - "AVS" + "Backup", + "WAF" ], "severity": "Medium", - "subcategory": "Operations", - "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": "Perform Periodic Backups", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "Reliability" }, { - "category": "Management", - "checklist": "Azure VMware Solution Design Review", - "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", - "service": "AVS", + "arm-service": "microsoft.documentdb/databaseAccounts", + "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", "services": [ - "Monitor", - "AVS" + "Backup", + "CosmosDB", + "WAF" ], "severity": "Medium", - "subcategory": "Operations", - "text": "Ensure workloads running on Azure VMware Solution are monitored using Azure Log Analytics and Azure Monitor", - "waf": "Operations" + "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" }, { - "category": "Management", - "checklist": "Azure VMware Solution Design Review", - "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", - "service": "AVS", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "WAF checklist", + "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", "services": [ - "AVS" + "WAF" ], - "severity": "Medium", - "subcategory": "Operations", - "text": "Include workloads running on Azure VMware Solution in existing update management tooling or in Azure Update Management", - "waf": "Operations" + "severity": "High", + "text": "Enable 2 replicas to have 99.9% availability for read operations", + "waf": "Reliability" }, { - "category": "Management", - "checklist": "Azure VMware Solution Design Review", - "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", - "service": "AVS", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "WAF checklist", + "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", "services": [ - "Monitor", - "AVS", - "AzurePolicy" + "WAF" ], "severity": "Medium", - "subcategory": "Operations", - "text": "Use Azure Policy to onboard Azure VMware Solution workloads in the Azure Management, Monitoring and Security solutions", - "waf": "Operations" + "text": "Enable 3 replicas to have 99.9% availability for read/write operations", + "waf": "Reliability" }, { - "category": "Management", - "checklist": "Azure VMware Solution Design Review", - "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", - "service": "AVS", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "WAF checklist", + "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", + "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", + "service": "Cognitive Search", "services": [ - "AVS", - "Defender" + "WAF" ], - "severity": "Medium", - "subcategory": "Security", - "text": "Ensure workloads running on Azure VMware Solution are onboarded to Microsoft Defender for Cloud", - "waf": "Security" + "severity": "High", + "text": "Leverage Availability Zones by enabling read and/or write replicas", + "waf": "Reliability" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Design Review", - "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", - "service": "AVS", + "arm-service": "Microsoft.Search/searchServices", + "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", "services": [ - "AVS", - "Backup" + "ACR", + "WAF" ], "severity": "Medium", - "subcategory": "Backup", - "text": "Ensure backups are not stored on vSAN as vSAN is a finite resource", + "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" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Design Review", - "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", - "service": "AVS", + "arm-service": "Microsoft.Search/searchServices", + "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", "services": [ - "AVS", - "ASR" + "ACR", + "WAF" ], "severity": "Medium", - "subcategory": "Disaster Recovery", - "text": "Have all DR solutions been considered and a solution that is best for your business been decided upon? [SRM/JetStream/Zerto/Veeam/...]", + "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" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Design Review", - "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", - "service": "AVS", + "arm-service": "Microsoft.Search/searchServices", + "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", "services": [ - "AVS", - "ASR" + "TrafficManager", + "WAF" ], "severity": "Medium", - "subcategory": "Disaster Recovery", - "text": "Use Azure Site Recovery when the Disaster Recovery technology is native Azure IaaS", + "text": "Use Azure Traffic Manager to coordinate requests", "waf": "Reliability" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Design Review", - "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", - "service": "AVS", + "arm-service": "Microsoft.Search/searchServices", + "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", + "services": [ + "Storage", + "Backup", + "WAF" + ], + "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" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "AVS", - "ASR" + "WAF" ], - "severity": "High", - "subcategory": "Disaster Recovery", - "text": "Use Automated recovery plans with either of the Disaster solutions, avoid manual tasks as much as possible", + "severity": "Medium", + "text": "Leverage FTA HandBook for Cognitive Services", "waf": "Reliability" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Design Review", - "guid": "8255461e-2aee-4345-9aec-8339248b262d", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "AVS", - "ASR" + "Backup", + "WAF" ], "severity": "Medium", - "subcategory": "Disaster Recovery", - "text": "Use the geopolitical region pair as the secondary disaster recovery environment", + "text": "Backup Your Prompts", "waf": "Reliability" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Design Review", - "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "AVS", - "ASR" + "ASR", + "WAF" ], "severity": "High", - "subcategory": "Disaster Recovery", - "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", + "text": "Business Continuity and Disaster Recovery (BCDR) considerations with Azure OpenAI Service", "waf": "Reliability" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Design Review", - "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "325af625-ca44-4e46-a5e2-223ace8bb123", + "link": "https://github.com/abacaj/chatgpt-backup#backup-your-chatgpt-conversations", + "service": "Cognitive Services", "services": [ - "ExpressRoute", - "AVS", - "NVA", - "ASR" + "Backup", + "WAF" ], "severity": "Medium", - "subcategory": "Disaster Recovery", - "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?", + "text": "Backup Your ChatGPT conversations", "waf": "Reliability" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Design Review", - "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "AVS", - "Backup" + "WAF" ], "severity": "Medium", - "subcategory": "Business Continuity", - "text": "Have all Backup solutions been considered and a solution that is best for your business been decided upon? [ MABS/CommVault/Metallic.io/Veeam/�. ]", + "text": "CI/CD for custom speech", "waf": "Reliability" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Design Review", - "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "AVS", - "Backup" + "WAF" ], - "severity": "Medium", - "subcategory": "Business Continuity", - "text": "Deploy your backup solution in the same region as your Azure VMware Solution private cloud", + "severity": "Low", + "text": "Move a knowledge base using export-import", "waf": "Reliability" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Design Review", - "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", - "service": "AVS", + "arm-service": "Microsoft.App/containerApps", + "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", "services": [ - "AVS", - "Backup" + "WAF" ], - "severity": "Medium", - "subcategory": "Business Continuity", - "text": "Deploy your backup solution outside of vSan, on Azure native components", + "severity": "High", + "text": "Leverage Availability Zones if regionally applicable", "waf": "Reliability" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Design Review", - "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", - "service": "AVS", + "arm-service": "Microsoft.App/containerApps", + "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", "services": [ - "AVS" + "WAF" ], - "severity": "Low", - "subcategory": "Business Continuity", - "text": "Is a process in place to request a restore of the VMware components managed by the Azure Platform?", + "severity": "High", + "text": "Use more than one replica and enable Zone Redundancy.", "waf": "Reliability" }, { - "category": "Platform Automation", - "checklist": "Azure VMware Solution Design Review", - "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", - "service": "AVS", + "arm-service": "Microsoft.App/containerApps", + "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", "services": [ - "AVS" + "WAF" ], - "severity": "Low", - "subcategory": "Deployment strategy", - "text": "For manual deployments, all configuration and deployments must be documented", - "waf": "Operations" + "severity": "High", + "text": "For cross-region DR, deploy container apps in multiple regions and follow active/active or active/passive application guidance.", + "waf": "Reliability" }, { - "category": "Platform Automation", - "checklist": "Azure VMware Solution Design Review", - "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", - "service": "AVS", + "arm-service": "Microsoft.App/containerApps", + "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", "services": [ - "AVS" + "TrafficManager", + "FrontDoor", + "WAF" ], - "severity": "Low", - "subcategory": "Deployment strategy", - "text": "For manual deployments, consider implementing resource locks to prevent accidental actions on your Azure VMware Solution Private Cloud", - "waf": "Operations" + "severity": "High", + "text": "Use Front Door or Traffic Manager to route traffic to the closest region", + "waf": "Reliability" }, { - "category": "Platform Automation", - "checklist": "Azure VMware Solution Design Review", - "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "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", "services": [ - "AVS" + "WAF" ], - "severity": "Low", - "subcategory": "Automated Deployment", - "text": "For automated deployments, deploy a minimal private cloud and scale as needed", - "waf": "Operations" + "severity": "High", + "text": "Select the right Function hosting plan based on your business & SLO requirements", + "waf": "Reliability" }, { - "category": "Platform Automation", - "checklist": "Azure VMware Solution Design Review", - "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "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", "services": [ - "AVS" + "WAF" ], - "severity": "Low", - "subcategory": "Automated Deployment", - "text": "For automated deployments, request or reserve quota prior to starting the deployment", - "waf": "Operations" + "severity": "High", + "text": "Leverage Availability Zones where regionally applicable (not available for Consumption tier)", + "waf": "Reliability" }, { - "category": "Platform Automation", - "checklist": "Azure VMware Solution Design Review", - "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "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", "services": [ - "AzurePolicy", - "AVS" + "WAF" ], - "severity": "Low", - "subcategory": "Automated Deployment", - "text": "For automated deployment, ensure that relevant resource locks are created through the automation or through Azure Policy for proper governance", - "waf": "Operations" + "severity": "Medium", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "category": "Platform Automation", - "checklist": "Azure VMware Solution Design Review", - "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "checklist": "WAF checklist", + "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "Azure Functions", "services": [ - "AVS", - "AKV" + "AppSvc", + "WAF" ], - "severity": "Low", - "subcategory": "Automated Connectivity", - "text": "Implement human understandable names for ExR authorization keys to allow for easy identification of the keys purpose/use", - "waf": "Operations" + "severity": "High", + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "waf": "Reliability" }, { - "category": "Platform Automation", - "checklist": "Azure VMware Solution Design Review", - "guid": "255461e2-aee3-4553-afc8-339248b262d6", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "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", "services": [ - "ExpressRoute", - "AVS", - "AKV" + "AppSvc", + "WAF" ], - "severity": "Low", - "subcategory": "Automated Connectivity", - "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": "Ensure 'Always On' is enabled for all Function Apps running on App Service Plan", + "waf": "Reliability" }, { - "category": "Platform Automation", - "checklist": "Azure VMware Solution Design Review", - "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "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", "services": [ - "AVS" + "Storage", + "WAF" ], - "severity": "Low", - "subcategory": "Automated Connectivity", - "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": "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" }, { - "category": "Platform Automation", - "checklist": "Azure VMware Solution Design Review", - "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "checklist": "WAF checklist", + "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "Azure Functions", "services": [ - "AVS" + "WAF" ], - "severity": "Low", - "subcategory": "Automated Connectivity", - "text": "When performing automated configuration of NSX-T segments with a single Tier-1 gateway, use Azure Portal APIs instead of NSX-Manager APIs", + "severity": "Medium", + "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Function App code", "waf": "Operations" }, { - "category": "Platform Automation", - "checklist": "Azure VMware Solution Design Review", - "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", - "service": "AVS", + "checklist": "WAF checklist", + "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", + "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", + "service": "SAP", "services": [ - "AVS", - "Subscriptions" + "SAP", + "WAF" ], "severity": "Medium", - "subcategory": "Automated Scale", - "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" + "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" }, { - "category": "Platform Automation", - "checklist": "Azure VMware Solution Design Review", - "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", - "service": "AVS", + "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", "services": [ - "Storage", - "AVS", - "AzurePolicy" + "SAP", + "WAF" ], "severity": "Medium", - "subcategory": "Automated Scale", - "text": "When intending to use automated scale-in, be sure to take storage policy requirements into account before performing such action", - "waf": "Performance" + "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" }, { - "category": "Platform Automation", - "checklist": "Azure VMware Solution Design Review", - "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", - "service": "AVS", + "checklist": "WAF checklist", + "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", + "service": "SAP", "services": [ - "AVS" + "SAP", + "WAF" ], "severity": "Medium", - "subcategory": "Automated Scale", - "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": "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" }, { - "category": "Platform Automation", - "checklist": "Azure VMware Solution Design Review", - "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", - "service": "AVS", + "checklist": "WAF checklist", + "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", + "service": "SAP", "services": [ - "AVS" + "Backup", + "WAF" ], "severity": "Medium", - "subcategory": "Automated Scale", - "text": "Consider and validate scaling operations on 3rd party solutions used in the architecture (supported or not)", - "waf": "Performance" + "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" }, { - "category": "Platform Automation", - "checklist": "Azure VMware Solution Design Review", - "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", - "service": "AVS", + "checklist": "WAF checklist", + "guid": "b651423c-8552-42db-a545-5cb50c05527a", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "service": "SAP", "services": [ - "AVS" + "Backup", + "SQL", + "Storage", + "ASR", + "SAP", + "WAF" ], - "severity": "Medium", - "subcategory": "Automated Scale", - "text": "Define and enforce scale in/out maximum limits for your environment in the automations", - "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" }, { - "category": "Platform Automation", - "checklist": "Azure VMware Solution Design Review", - "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", - "service": "AVS", + "checklist": "WAF checklist", + "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", "services": [ - "Monitor", - "AVS" + "SAP", + "WAF" ], "severity": "Medium", - "subcategory": "Automated Scale", - "text": "Implement monitoring rules to monitor automated scaling operations and monitor success and failure to enable appropriate (automated) responses", - "waf": "Operations" + "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" }, { - "category": "Migration", - "checklist": "Azure VMware Solution Design Review", - "guid": "c5972cd4-cd21-4b07-9036-f5e6b4bfd3d5", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", + "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": [ - "AVS", - "VM" + "VPN", + "ASR", + "ExpressRoute", + "WAF" ], "severity": "High", - "subcategory": "Architecture", - "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/", + "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" }, { - "category": "Migration", - "checklist": "Azure VMware Solution Design Review", - "guid": "be1f38cf-03a8-422b-b463-cbbbc8ac299e", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", + "checklist": "WAF checklist", + "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "SAP", "services": [ - "AVS" + "AKV", + "ACR", + "WAF" ], - "severity": "High", - "subcategory": "Architecture", - "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/", + "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" }, { - "category": "Migration", - "checklist": "Azure VMware Solution Design Review", - "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", - "service": "AVS", + "checklist": "WAF checklist", + "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", + "service": "SAP", "services": [ - "AVS", - "VPN" + "VNet", + "SAP", + "ASR", + "WAF" ], "severity": "Medium", - "subcategory": "Networking", - "text": "If using a VPN connection for migrations, adjust your MTU size accordingly.", - "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" }, { - "category": "Migration", - "checklist": "Azure VMware Solution Design Review", - "guid": "e614658d-d457-4e92-9139-b821102cad6e", - "service": "AVS", + "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", "services": [ - "AVS" + "SAP", + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Networking", - "text": "For low connectivity regions connecting into Azure (500Mbps or less), considering deploying the HCX WAN optimization appliance", - "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" }, { - "category": "Migration", - "checklist": "Azure VMware Solution Design Review", - "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", - "service": "AVS", + "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", "services": [ - "AVS" + "WAF" ], - "severity": "Medium", - "subcategory": "Process", - "text": "Ensure that migrations are started from the on-premises appliance and NOT from the Cloud appliance (do NOT perform a reverse migration)", + "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" + }, + { + "checklist": "WAF checklist", + "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", + "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", + "service": "SAP", + "services": [ + "VNet", + "WAF" + ], + "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" }, { - "category": "Data Storage", - "checklist": "Azure VMware Solution Design Review", - "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", - "service": "AVS", + "checklist": "WAF checklist", + "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", + "service": "SAP", "services": [ - "Storage", - "AVS", - "VM" + "Entra", + "ASR", + "VM", + "WAF" ], - "severity": "Medium", - "subcategory": "Architecture", - "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.", + "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" }, { - "category": "Data Storage", - "checklist": "Azure VMware Solution Design Review", - "guid": "bff4564b-0d93-44a3-98b2-63e7dd60513a", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", - "service": "AVS", + "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", "services": [ - "ExpressRoute", - "AVS", - "Storage" + "SAP", + "WAF" ], - "severity": "Medium", - "subcategory": "Architecture", - "text": "Ensure that a dedicated ExpressRoute Gateway is being used for external data storage solutions", + "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" }, { - "category": "Data Storage", - "checklist": "Azure VMware Solution Design Review", - "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", + "checklist": "WAF checklist", + "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", + "service": "SAP", "services": [ - "ExpressRoute", - "AVS", - "Storage" + "SAP", + "WAF" ], - "severity": "Medium", - "subcategory": "Architecture", - "text": "Ensure that FastPath is enabled on the ExpressRoute Gateway that is being used for external data storage solutions", + "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" }, { - "category": "Stretched Cluster", - "checklist": "Azure VMware Solution Design Review", - "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", + "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", "services": [ - "AVS", - "ASR" + "Storage", + "VM", + "WAF" ], "severity": "High", - "subcategory": "Architecture", - "text": "If using stretched cluster, ensure that your selected Disaster Recovery solution is supported by the vendor", + "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" }, { - "category": "Stretched Cluster", - "checklist": "Azure VMware Solution Design Review", - "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "AVS", + "checklist": "WAF checklist", + "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", + "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", + "service": "SAP", "services": [ - "AVS" + "SAP", + "Storage", + "WAF" ], "severity": "High", - "subcategory": "Architecture", - "text": "If using stretched cluster, ensure that the SLA provided will meet your requirements", + "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" }, { - "category": "Stretched Cluster", - "checklist": "Azure VMware Solution Design Review", - "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", - "service": "AVS", + "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", "services": [ - "ExpressRoute", - "AVS" + "SAP", + "WAF" ], "severity": "High", - "subcategory": "Architecture", - "text": "If using stretched cluster, ensure that both ExpressRoute circuits are connected to your connectivity hub.", + "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" }, { - "category": "Stretched Cluster", - "checklist": "Azure VMware Solution Design Review", - "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", - "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", - "service": "AVS", + "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", "services": [ - "ExpressRoute", - "AVS" + "LoadBalancer", + "SAP", + "WAF" ], "severity": "High", - "subcategory": "Architecture", - "text": "If using stretched cluster, ensure that both ExpressRoute circuits have GlobalReach enabled.", + "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" }, { - "category": "Stretched Cluster", - "checklist": "Azure VMware Solution Design Review", - "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", - "service": "AVS", + "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", "services": [ - "AVS" + "LoadBalancer", + "WAF" ], "severity": "High", - "subcategory": "Architecture", - "text": "Have site disaster tolerance settings been properly considered and changed for your business if needed.", + "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" }, { - "category": "Operations Management", - "checklist": "Recovery Services Vault Checklist", - "guid": "cb7da8cf-aa62-4a15-a495-6da97dc3a242", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-plan-capacity-vmware", - "services": [], + "checklist": "WAF checklist", + "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "SAP", + "services": [ + "WAF" + ], "severity": "High", - "subcategory": "Replication", - "text": "Capacity planning is required to make sure you have sufficient bandwidth for replication and an estimated number of CPU cores & disk types that will be needed in Azure for failover", + "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" }, { - "category": "Operations Management", - "checklist": "Recovery Services Vault Checklist", - "guid": "67b23587-05a1-4652-aded-fa8a488cdec4", - "link": "https://learn.microsoft.com/azure/site-recovery/azure-to-azure-how-to-enable-policy", + "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", "services": [ - "AzurePolicy", + "Entra", + "SAP", "VM", - "ASR" + "WAF" ], "severity": "High", - "subcategory": "Replication", - "text": "Use Azure Policy to ensure that all critical Azure VMs are protected with ASR", + "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" }, { - "category": "Operations Management", - "checklist": "Recovery Services Vault Checklist", - "guid": "862bc3bc-14be-4b7f-96e8-d9b3bec228e7", - "link": "https://learn.microsoft.com/azure/site-recovery/recovery-plan-overview", + "checklist": "WAF checklist", + "guid": "cbe05bbe-209d-4490-ba47-778424d11678", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", "services": [ - "VM" + "Entra", + "RBAC", + "VM", + "WAF" ], - "severity": "Medium", - "subcategory": "Replication", - "text": "Define recovery plans to automate the failover sequence for VMs. You can also include automation scripts to reduce manual steps and improve recovery time", - "waf": "Reliability" - }, - { - "category": "Operations Management", - "checklist": "Recovery Services Vault Checklist", - "guid": "437b1736-db55-4f67-a613-334bd09dc234", - "link": "https://learn.microsoft.com/azure/backup/backup-azure-immutable-vault-how-to-manage?tabs=recovery-services-vault", - "services": [], - "severity": "Medium", - "subcategory": "Data Protection", - "text": "Enable and LOCK immutability for vaults. This ensures recovery points cannot be deleted before their intended expiry", + "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" }, { - "category": "Operations Management", - "checklist": "Recovery Services Vault Checklist", - "guid": "19db6128-1265-404b-a47a-493a08042729", - "link": "https://learn.microsoft.com/azure/backup/backup-azure-enhanced-soft-delete-about", - "services": [], + "checklist": "WAF checklist", + "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", + "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", + "service": "SAP", + "services": [ + "WAF" + ], "severity": "Medium", - "subcategory": "Data Protection", - "text": "Enable 'Always-on soft delete' for vaults protecting critical workloads", + "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" }, { - "category": "Operations Management", - "checklist": "Recovery Services Vault Checklist", - "guid": "4798b158-8b31-4aa5-9ceb-54445135a227", - "link": "https://learn.microsoft.com/azure/backup/backup-create-recovery-services-vault#set-storage-redundancy", + "checklist": "WAF checklist", + "guid": "9674e7c7-7796-4181-8920-09f4429543ba", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", "services": [ - "Storage" + "VM", + "WAF" ], - "severity": "Medium", - "subcategory": "Redudancy", - "text": "When creating Recovery Service Vaults choose the best storage redundancy option for your requirements. Vaults support local, geo and zone redundancy but this setting cannot be changed once the vault is protecting one or more resources", + "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" }, { - "category": "BC and DR", - "checklist": "IoT Hub Review", - "guid": "ac1d6380-f866-4bbd-a9b4-b1ee5d7908b8", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#availability-zones", - "service": "IoT", - "services": [], + "checklist": "WAF checklist", + "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", + "services": [ + "Entra", + "SAP", + "WAF" + ], "severity": "High", - "subcategory": "High Availability", - "text": "Leverage Availability Zones if regionally applicable (this is automatically enabled)", + "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" }, { - "category": "BC and DR", - "checklist": "IoT Hub Review", - "guid": "35f651e8-0124-4ef7-8c57-658e38609e6e", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", - "service": "IoT", - "services": [], - "severity": "Medium", - "subcategory": "High Availability", - "text": "Be aware of Microsoft-initiated failovers. These are exercised by Microsoft in rare situations to fail over all the IoT hubs from an affected region to the corresponding geo-paired region.", + "checklist": "WAF checklist", + "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", + "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" }, { - "category": "BC and DR", - "checklist": "IoT Hub Review", - "guid": "4ed3e490-dc06-4a1e-b467-5d0239d85540", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#cross-region-dr", - "service": "IoT", - "services": [], + "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", + "services": [ + "Entra", + "SAP", + "WAF" + ], "severity": "High", - "subcategory": "High Availability", - "text": "Consider a Cross-Region DR strategy for critical workloads", + "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" }, { - "category": "BC and DR", - "checklist": "IoT Hub Review", - "guid": "a11ecab0-db47-46f7-9aa7-17764e7e45a1", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", - "service": "IoT", - "services": [], - "severity": "High", - "subcategory": "High Availability", - "text": "Learn how to trigger a manual failover.", + "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", + "services": [ + "Entra", + "VM", + "WAF" + ], + "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" }, { - "category": "BC and DR", - "checklist": "IoT Hub Review", - "guid": "f9db8dfb-1194-460b-aedd-34dd6a69db22", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#failback", - "service": "IoT", - "services": [], - "severity": "High", - "subcategory": "High Availability", - "text": "Learn how to fail back after a failover.", + "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", + "services": [ + "Storage", + "VM", + "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" }, { - "category": "Responsible AI", - "checklist": "Azure OpenAI Review", - "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": [], - "severity": "High", - "subcategory": "Metaprompting", - "text": "Follow Metaprompting guardrails for resonsible AI", - "waf": "Operational Excellence" + "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", + "services": [ + "SAP", + "WAF" + ], + "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" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", - "link": "https://github.com/Azure-Samples/AI-Gateway", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", "services": [ - "APIM", - "Entra" + "Storage", + "WAF" ], "severity": "High", - "subcategory": "Load Balancing", - "text": "Consider Gateway patterns with APIM or solutions like AI central for better rate limiting, load balancing, authentication and logging", - "waf": "Operational Excellence" + "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" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "WAF checklist", + "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", + "service": "SAP", "services": [ - "Monitor" + "SAP", + "Storage", + "WAF" ], "severity": "High", - "subcategory": "Monitoring", - "text": "Enable monitoring for your AOAI instances", - "waf": "Operational Excellence" + "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" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "697cb391-ed16-4b2d-886f-0a0241addde6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", + "service": "SAP", "services": [ - "Monitor", - "AKV", - "Subscriptions" + "SAP", + "Storage", + "ASR", + "WAF" ], "severity": "High", - "subcategory": "Alerts", - "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": "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" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", + "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", + "service": "SAP", "services": [ - "Monitor" + "SAP", + "Storage", + "WAF" ], "severity": "High", - "subcategory": "Monitoring", - "text": "Monitor token usage to prevent service disruptions due to capacity", - "waf": "Operational Excellence" + "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" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", + "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", "services": [ - "Monitor" + "SAP", + "Cost", + "WAF" ], "severity": "Medium", - "subcategory": "Observability", - "text": "observe metrics like processed inference tokens, generated completion tokens monitor for rate limit", - "waf": "Operational Excellence" + "text": "Automate SAP System Start-Stop to manage costs.", + "waf": "Cost" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "WAF checklist", + "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", "services": [ - "APIM" + "Storage", + "VM", + "SAP", + "Cost", + "WAF" ], "severity": "Low", - "subcategory": "Observability", - "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" + "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" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", - "link": "https://github.com/Azure-Samples/openai-enterprise-iac", - "service": "Azure OpenAI", - "services": [], - "severity": "High", - "subcategory": "Infrastructure Deployment", - "text": "Use Infrastructure as code to deploy the Azure OpenAI Service, model deployments, and all related resources", - "waf": "Operational Excellence" + "checklist": "WAF checklist", + "guid": "9877f353-2591-4e8b-8381-e9043fed1010", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", + "services": [ + "Storage", + "VM", + "SAP", + "Cost", + "WAF" + ], + "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" }, - { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "4350d092-d234-4292-a752-8537a551c5bf", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "Azure OpenAI", + { + "checklist": "WAF checklist", + "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", + "service": "SAP", "services": [ - "Entra" + "RBAC", + "Subscriptions", + "WAF" ], "severity": "High", - "subcategory": "Authentication", - "text": "Use Microsoft Entra Authentication with Managed Identity instead of API Key", + "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" }, { - "category": "Responsible AI", - "checklist": "Azure OpenAI Review", - "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": [], - "severity": "High", - "subcategory": "Evaluation", - "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" - }, - { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "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": [], - "severity": "High", - "subcategory": "Hosting model", - "text": "Evaluate usage of Provisioned throughput model ", - "waf": "Performance" + "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", + "services": [ + "Entra", + "SAP", + "WAF" + ], + "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", + "waf": "Security" }, { - "category": "Responsible AI", - "checklist": "Azure OpenAI Review", - "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", - "service": "Azure OpenAI", - "services": [], - "severity": "High", - "subcategory": "Content Safety", - "text": "Review and implement Azure AI content safety", - "waf": "Operational Excellence" + "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", + "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.", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "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": [], - "severity": "High", - "subcategory": "Throughput definition", - "text": "Define and evaluate the throughput of the system based on tokens & response per minute and align with requirements", - "waf": "Performance" + "checklist": "WAF checklist", + "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", + "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/8-exercise-integrate-azure-active-directory-sap-netweaver", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", - "service": "Azure OpenAI", - "services": [], + "checklist": "WAF checklist", + "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", + "service": "SAP", + "services": [ + "SAP", + "WAF" + ], "severity": "Medium", - "subcategory": "Latency improvement", - "text": "Improve latency of the system by limiting token sizes, streaming options", - "waf": "Performance" + "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" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", "services": [ - "ServiceBus", - "Storage" + "SAP", + "WAF" ], "severity": "Medium", - "subcategory": "Elasticity segregation", - "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" + "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" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "5bda4332-4f24-4811-9331-82ba51752694", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", - "services": [], - "severity": "High", - "subcategory": "Benchmarking", - "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" + "checklist": "WAF checklist", + "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", + "service": "SAP", + "services": [ + "SAP", + "AKV", + "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", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "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": [], + "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", + "services": [ + "SAP", + "AKV", + "WAF" + ], "severity": "Medium", - "subcategory": "Elasticity ", - "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": "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" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", - "service": "Azure OpenAI", - "services": [], - "severity": "High", - "subcategory": "Model choice", - "text": "Choose the right model for the right task. Pick models with right tradeoff between speed, quality of response and output complexity", - "waf": "Performance" + "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", + "services": [ + "SAP", + "WAF" + ], + "severity": "Medium", + "text": "Implement SSO by using OAuth for SAP NetWeaver to allow third-party or custom applications to access SAP NetWeaver OData services.", + "waf": "Security" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "e9951904-8384-45c9-a6cb-2912156a1147", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", - "services": [], + "checklist": "WAF checklist", + "guid": "a747c350-8d4c-449c-93af-393dbca77c48", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", + "service": "SAP", + "services": [ + "SAP", + "WAF" + ], "severity": "Medium", - "subcategory": "Fine tuning", - "text": "Have a baseline for performance without fine-tuning for knowing whether or not fine-tuning has improved model performance", - "waf": "Performance" + "text": "Implement SSO to SAP HANA", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Azure OpenAI Review", - "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", + "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", "services": [ - "ACR" + "Entra", + "SAP", + "WAF" ], - "severity": "Low", - "subcategory": "Multi-region architecture", - "text": "Deploy multiple OAI instances across regions", - "waf": "Reliability" + "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" }, { - "category": "BC and DR", - "checklist": "Azure OpenAI Review", - "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", + "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", "services": [ - "APIM", - "Entra" + "SAP", + "WAF" ], - "severity": "High", - "subcategory": "Load balancing", - "text": "Implement retry & healthchecks with Gateway pattern like APIM", - "waf": "Reliability" + "severity": "Medium", + "text": "For applications that access SAP, you might want to use principal propagation to establish SSO.", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Azure OpenAI Review", - "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": [], + "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", + "services": [ + "Entra", + "SAP", + "WAF" + ], "severity": "Medium", - "subcategory": "Quotas", - "text": "Ensure having adequate quotas of TPM & RPM for the workload", - "waf": "Reliability" + "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" }, { - "category": "Responsible AI", - "checklist": "Azure OpenAI Review", - "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", - "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", - "service": "Azure OpenAI", - "services": [], + "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", + "services": [ + "SAP", + "WAF" + ], "severity": "Medium", - "subcategory": "UX best practice", - "text": "Review the considerations in HAI toolkit guidance and apply those interaction practices for the slution", - "waf": "Operational Excellence" + "text": "Implement SSO to SAP BTP", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Azure OpenAI Review", - "guid": "7f154e3a-a369-4282-ae7e-316183687a04", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", - "service": "Azure OpenAI", + "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", "services": [ - "ACR" + "Entra", + "SAP", + "WAF" ], "severity": "Medium", - "subcategory": "Load balancing", - "text": "Deploy separate fine tuned models across regions if finetuning is employed", - "waf": "Reliability" + "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" }, { - "category": "BC and DR", - "checklist": "Azure OpenAI Review", - "guid": "77a1f893-5bda-4433-84f2-4811633182ba", - "link": "https://learn.microsoft.com/azure/backup/backup-overview", - "service": "Azure OpenAI", + "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", "services": [ - "Backup", - "ASR" + "SAP", + "Subscriptions", + "AzurePolicy", + "WAF" ], "severity": "Medium", - "subcategory": "Data Backup and Disaster Recovery", - "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": "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" }, { - "category": "BC and DR", - "checklist": "Azure OpenAI Review", - "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": [], + "checklist": "WAF checklist", + "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", + "services": [ + "SAP", + "Subscriptions", + "WAF" + ], "severity": "High", - "subcategory": "SLA considerations", - "text": "Azure AI search service tiers should be choosen to have a SLA ", - "waf": "Reliability" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", - "link": "https://learn.microsoft.com/purview/purview", - "service": "Azure OpenAI", - "services": [], - "severity": "Low", - "subcategory": "Data Sensitivity", - "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" + "checklist": "WAF checklist", + "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "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": [], + "checklist": "WAF checklist", + "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", + "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", + "service": "SAP", + "services": [ + "VM", + "Subscriptions", + "WAF" + ], "severity": "High", - "subcategory": "Encryption at Rest", - "text": "Encrypt data used for RAG with SSE/Disk encryption with optional BYOK", - "waf": "Security" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", - "link": "https://learn.microsoft.com/azure/search/search-security-overview", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", + "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", + "service": "SAP", "services": [ - "ACR" + "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" + }, + { + "checklist": "WAF checklist", + "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", + "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", + "service": "SAP", + "services": [ + "VM", + "Subscriptions", + "WAF" ], "severity": "High", - "subcategory": "Transit Encryption", - "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" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "7b94ef6e-047d-42ea-8992-b1cd6e2054b2", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "e6e20617-3686-4af4-9791-f8935ada4332", + "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", + "service": "SAP", "services": [ - "RBAC" + "WAF" ], "severity": "High", - "subcategory": "Access Control", - "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" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", - "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", - "service": "Azure OpenAI", - "services": [], + "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", + "services": [ + "TrafficManager", + "Cost", + "WAF" + ], "severity": "Medium", - "subcategory": "Data Masking and Redaction", - "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" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", "services": [ - "Sentinel", - "Defender", - "Monitor" + "Backup", + "WAF" ], "severity": "High", - "subcategory": "Threat Detection and Monitoring", - "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" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "WAF checklist", + "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", + "service": "SAP", "services": [ - "AzurePolicy" + "Entra", + "Storage", + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "Data Retention and Disposal", - "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" - }, - { - "category": "Responsible AI", - "checklist": "Azure OpenAI Review", - "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", - "service": "Azure OpenAI", - "services": [], - "severity": "High", - "subcategory": "Jail break Safety", - "text": "Implement Prompt shields and groundedness detection using Content Safety ", - "waf": "Operational Excellence" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", - "link": "https://learn.microsoft.com/azure/compliance/", - "service": "Azure OpenAI", - "services": [], + "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", + "services": [ + "SAP", + "WAF" + ], "severity": "High", - "subcategory": "Data Privacy and Compliance", - "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" + "text": "Ensure time-zone matches between the operating system and the SAP system.", + "waf": "Operations" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", - "service": "Azure OpenAI", - "services": [], + "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", + "services": [ + "Entra", + "WAF" + ], "severity": "Medium", - "subcategory": "Employee Awareness and Training", - "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" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", - "service": "Azure OpenAI", - "services": [], - "severity": "High", - "subcategory": "Environment segregation", - "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" + "checklist": "WAF checklist", + "guid": "a491dfc4-9353-4213-9217-eef0949f9467", + "link": "https://azure.microsoft.com/pricing/offers/dev-test/", + "service": "SAP", + "services": [ + "Cost", + "WAF" + ], + "severity": "Low", + "text": "Consider running dev/test systems in a snooze model to save and optimize Azure run costs.", + "waf": "Cost" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", - "service": "Azure OpenAI", - "services": [], + "checklist": "WAF checklist", + "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", + "link": "https://learn.microsoft.com/azure/lighthouse/overview", + "service": "SAP", + "services": [ + "Entra", + "SAP", + "WAF" + ], "severity": "Medium", - "subcategory": "Index Segregation", - "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" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", - "service": "Azure OpenAI", + "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", "services": [ - "RBAC", - "AzurePolicy" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "Sensitive Data in Separate Instances", - "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" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", - "service": "Azure OpenAI", - "services": [], - "severity": "High", - "subcategory": "Embedding and Vector handling", - "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" + "checklist": "WAF checklist", + "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", + "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", + "service": "SAP", + "services": [ + "SAP", + "WAF" + ], + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "3571449a-b805-43d8-af89-dc7b33be2a1a", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "14591147-5e39-4e53-89cc-cd979366bcda", + "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", + "service": "SAP", "services": [ - "RBAC" + "SAP", + "Monitor", + "SQL", + "WAF" ], - "severity": "High", - "subcategory": "Access control", - "text": "Apply RBAC to th data stores having embeddings and vectors and scope access based on role's access requirements", - "waf": "Security" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "WAF checklist", + "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", + "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", + "service": "SAP", "services": [ - "PrivateLink" + "Entra", + "VM", + "Monitor", + "SAP", + "WAF" ], "severity": "High", - "subcategory": "Network security", - "text": "Configure private endpoint for AI services to restrict service access within your network", - "waf": "Security" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "SAP", "services": [ - "VNet", - "Firewall" + "AzurePolicy", + "WAF" ], - "severity": "High", - "subcategory": "Network security", - "text": "Enforce strict inbound and outbound traffic control with Azure Firewall and UDRs and limit the external integration points", - "waf": "Security" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", - "service": "Azure OpenAI", - "services": [], - "severity": "High", - "subcategory": "Control Network Access", - "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" + "checklist": "WAF checklist", + "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", + "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", + "service": "SAP", + "services": [ + "NetworkWatcher", + "SAP", + "Monitor", + "WAF" + ], + "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", + "waf": "Operations" }, { - "category": "Cost Optimization", - "checklist": "Azure OpenAI Review", - "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", - "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", - "service": "Azure OpenAI", + "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", "services": [ - "Cost" + "SAP", + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "Token Optimization", - "text": "Use prompt compression tools like LLMLingua or gprtrim", - "waf": "Cost Optimization" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "616785d6-fa96-4c96-ad88-518f482734c8", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", "services": [ - "AKV", - "Entra" + "SAP", + "Subscriptions", + "WAF" ], "severity": "High", - "subcategory": "Secure APIs and Endpoints", - "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": "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "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": [], + "checklist": "WAF checklist", + "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", + "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", + "service": "SAP", + "services": [ + "Storage", + "ASR", + "WAF" + ], "severity": "Medium", - "subcategory": "Implement Strong Authentication", - "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" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "93555620-2bfe-4456-9b0d-834a348b263e", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", + "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", + "service": "SAP", "services": [ - "Monitor" + "SAP", + "Sentinel", + "Monitor", + "WAF" ], "severity": "Medium", - "subcategory": "Use Network Monitoring", - "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": "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", - "service": "Azure OpenAI", - "services": [], + "checklist": "WAF checklist", + "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", + "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", + "service": "SAP", + "services": [ + "Cost", + "WAF" + ], "severity": "Medium", - "subcategory": "Security Audits and Penetration Testing", - "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" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", - "service": "Azure OpenAI", - "services": [], + "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", + "services": [ + "Monitor", + "VM", + "WAF" + ], "severity": "Low", - "subcategory": "Infrastructure Deployment", - "text": "Azure AI Services are properly tagged for better management", - "waf": "Operational Excellence" + "text": "Use inter-VM latency monitoring for latency-sensitive applications.", + "waf": "Performance" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "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": [], - "severity": "Low", - "subcategory": "Infrastructure Deployment", - "text": "Azure AI Service accounts follows organizational naming conventions", - "waf": "Operational Excellence" + "checklist": "WAF checklist", + "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", - "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", - "service": "Azure OpenAI", - "services": [], - "severity": "High", - "subcategory": "Diagnostics Logging", - "text": "Diagnostic logs in Azure AI services resources should be enabled", - "waf": "Operational Excellence" + "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", + "services": [ + "SAP", + "Storage", + "WAF" + ], + "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" }, { - "category": "Identity and Access Management", - "checklist": "Azure OpenAI Review", - "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", - "link": "https://learn.microsoft.com/azure/ai-services/authentication", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "c027f893-f404-41a9-b33d-39d625a14964", + "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", + "service": "SAP", "services": [ - "Entra" + "SAP", + "WAF" ], - "severity": "High", - "subcategory": "Entra ID based access", - "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" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", + "service": "SAP", "services": [ - "AKV", - "Entra" + "SAP", + "Storage", + "WAF" ], - "severity": "High", - "subcategory": "Secure Key Management", - "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" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Azure OpenAI", + "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", "services": [ - "AKV" + "SAP", + "SQL", + "WAF" ], - "severity": "High", - "subcategory": "Key Rotation and Expiration", - "text": "Regularly rotate and expire keys stored in Azure Key Vault to minimize the risk of unauthorized access.", - "waf": "Security" + "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" }, { - "category": "Cost Optimization", - "checklist": "Azure OpenAI Review", - "guid": "adfe27be-e297-401a-a352-baaab79b088d", - "link": "https://github.com/openai/tiktoken", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", "services": [ - "Cost" + "SAP", + "Monitor", + "ASR", + "WAF" ], "severity": "High", - "subcategory": "Token Optimization", - "text": "Use tiktoken to understand token sizes for token optimizations in conversational mode", - "waf": "Cost Optimization" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", - "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", - "service": "Azure OpenAI", - "services": [], - "severity": "High", - "subcategory": "Secure coding practice", - "text": "Follow secure coding practices to prevent common vulnerabilities such as injection attacks, cross-site scripting (XSS), or security misconfigurations", + "checklist": "WAF checklist", + "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "SAP", + "services": [ + "AppGW", + "AzurePolicy", + "WAF" + ], + "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/", "waf": "Security" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "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": [], - "severity": "High", - "subcategory": "Patching and updates", - "text": "Setup a process to regularly update and patch the LLM libraries and other system components", - "waf": "Security" + "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", + "services": [ + "DNS", + "SAP", + "VM", + "WAF" + ], + "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" }, { - "category": "Responsible AI", - "checklist": "Azure OpenAI Review", - "guid": "e29711b1-352b-4eee-879b-588defc4972c", - "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", - "service": "Azure OpenAI", + "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", "services": [ - "AzurePolicy" + "DNS", + "SAP", + "VNet", + "WAF" ], - "severity": "High", - "subcategory": "Governance", - "text": "Adhere to Azure OpenAI or other LLMs terms of use, policies and guidance and allowed use cases", - "waf": "Operational Excellence" + "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" }, { - "category": "Cost Optimization", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "WAF checklist", + "guid": "a3592829-e6e2-4061-9368-6af46791f893", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", + "service": "SAP", "services": [ - "Cost" + "SAP", + "ACR", + "VNet", + "WAF" ], "severity": "Medium", - "subcategory": "Cost familiarization", - "text": "Understand difference in cost of base models and fine tuned models and token step sizes", - "waf": "Cost Optimization" + "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" }, { - "category": "Cost Optimization", - "checklist": "Azure OpenAI Review", - "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", + "service": "SAP", "services": [ - "Cost" + "SAP", + "NVA", + "WAF" ], "severity": "High", - "subcategory": "Batch processing", - "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": "It is not supported to deploy any NVA between SAP application and SAP Database server", + "training": "https://me.sap.com/notes/2731110", + "waf": "Performance" }, { - "category": "Cost Optimization", - "checklist": "Azure OpenAI Review", - "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", + "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", + "service": "SAP", "services": [ - "Cost", - "Monitor" + "VWAN", + "ACR", + "SAP", + "WAF" ], "severity": "Medium", - "subcategory": "Cost monitoring", - "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": "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" }, { - "category": "Cost Optimization", - "checklist": "Azure OpenAI Review", - "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", + "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", "services": [ - "Cost" + "VNet", + "NVA", + "WAF" ], "severity": "Medium", - "subcategory": "Token limit", - "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" - }, - { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", - "link": "https://learn.microsoft.com/azure/search/search-reliability", - "service": "Azure OpenAI", - "services": [], - "severity": "Medium", - "subcategory": "AI Search Reliability", - "text": "Review the guidance provided on setting up AI search for Reliability", - "waf": "Operational Excellence" + "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" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "3266b225-86f4-4a16-92bd-ddea8a487cde", - "link": "https://learn.microsoft.com/azure/search/vector-search-index-size?tabs=portal-vector-quota", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", + "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", + "service": "SAP", "services": [ - "Storage" + "NVA", + "SAP", + "VNet", + "WAF", + "VWAN" ], "severity": "Medium", - "subcategory": "AI Search Vector Limits", - "text": "Plan and manage AI Search Vector storage", - "waf": "Operational Excellence" - }, - { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "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": [], - "severity": "Medium", - "subcategory": "DevOps", - "text": "Apply LLMOps practices to automate the lifecycle management of your GenAI applications", - "waf": "Operational Excellence" + "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" }, { - "category": "Cost Optimization", - "checklist": "Azure OpenAI Review", - "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", + "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", "services": [ - "Cost" + "SAP", + "VM", + "WAF" ], "severity": "High", - "subcategory": "Costing Model", - "text": "Evaluate usage of billing models - PAYG vs PTU", - "waf": "Cost Optimization" - }, - { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "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": [], - "severity": "Medium", - "subcategory": "DevOps", - "text": "Evaluate the quality of prompts and applications when switching between model versions", - "waf": "Operational Excellence" + "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" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "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", + "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", "services": [ - "Monitor" + "ASR", + "WAF" ], - "severity": "Medium", - "subcategory": "Development", - "text": "Evaluate, monitor and refine your GenAI apps for features like groundedness, relevance, accuracy, coherence, fluency, �", - "waf": "Operational Excellence" - }, - { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "294798b1-578b-4219-a46c-eb5443513592", - "service": "Azure OpenAI", - "services": [], - "severity": "Medium", - "subcategory": "Development", - "text": "Evaluate your Azure AI Search results based on different search parameters", - "waf": "Operational Excellence" + "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" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "2744293b-b628-4537-a551-19b08e8f5854", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", - "service": "Azure OpenAI", - "services": [], - "severity": "Medium", - "subcategory": "Development", - "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" + "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", + "services": [ + "WAF" + ], + "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" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "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": [], + "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", + "services": [ + "Storage", + "VNet", + "WAF" + ], "severity": "Medium", - "subcategory": "Development", - "text": "Use prompt engineering techniques to improve the accuracy of LLM responses", - "waf": "Operational Excellence" + "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" }, { - "category": "Governance and Security", - "checklist": "Azure OpenAI Review", - "guid": "e737897e-71ca-47da-acfa-962a1594946d", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", - "service": "Azure OpenAI", - "services": [], + "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", + "services": [ + "Firewall", + "WAF" + ], "severity": "Medium", - "subcategory": "Security Audits and Penetration Testing", - "text": "Red team your GenAI applications", + "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" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", - "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", - "service": "Azure OpenAI", - "services": [], + "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": [ + "SAP", + "AppGW", + "WAF" + ], "severity": "Medium", - "subcategory": "End user feedback", - "text": "Provide end users with scoring options for LLM responses and track these scores. ", - "waf": "Operational Excellence" + "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" }, { - "category": "Cost Optimization", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "WAF checklist", + "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "SAP", "services": [ - "Cost" + "FrontDoor", + "ACR", + "AzurePolicy", + "WAF" ], - "severity": "High", - "subcategory": "Quota Management", - "text": "Consider Quota management practices", - "waf": "Cost Optimization" + "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" }, { - "category": "Operations Management", - "checklist": "Azure OpenAI Review", - "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", - "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", - "service": "Azure OpenAI", + "checklist": "WAF checklist", + "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", + "service": "SAP", "services": [ - "APIM", - "LoadBalancer", - "ACR", - "Entra" + "FrontDoor", + "AppGW", + "AzurePolicy", + "WAF" ], "severity": "Medium", - "subcategory": "Load Balancing", - "text": "Use Load balancer solutions like APIM based gateway for balancing load and capacity across services and regions", - "waf": "Operational Excellence" + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "When you are creating a SQL Server on Azure VM, carefully consider the type of workload necessary. If you are migrating an existing environment, collect a performance baseline to determine your SQL Server on Azure VM requirements. If this is a new VM, then create your new SQL Server VM based on your vendor requirements.", - "guid": "1fc3fc14-eea6-4e69-b8d9-a3eec218e687", - "link": "https://learn.microsoft.com/sql/dma/dma-sku-recommend-sql-db?view=sql-server-ver16", + "checklist": "WAF checklist", + "guid": "5ada4332-4e13-4811-9231-81aa41742694", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "SAP", "services": [ - "SQL", - "VM" + "LoadBalancer", + "AppGW", + "WAF" ], - "severity": "High", - "subcategory": "VM Size", - "text": "Collect the target workload's performance characteristics and use them to determine the appropriate VM size for your business.", - "waf": "Performance" + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "The memory optimized virtual machine sizes are a primary target for SQL Server VMs and the recommended choice by Microsoft. The memory optimized virtual machines offer stronger memory-to-CPU ratios and medium-to-large cache options.Consider Ebdsv5-series series first for most SQL Server workloads.", - "guid": "e04abe1f-8d39-4fda-9776-8424c116775c", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-vm-size?view=azuresql#memory-optimized", + "checklist": "WAF checklist", + "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "SAP", "services": [ - "SQL", - "VM" + "VWAN", + "ACR", + "SAP", + "WAF" ], "severity": "Medium", - "subcategory": "VM Size", - "text": "Use memory optimized virtual machine sizes for the best performance of SQL Server workloads.", + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "To find the most effective configuration for SQL Server workloads on an Azure VM, start by measuring the storage performance of your business application. Once storage requirements are known, select a virtual machine that supports the necessary IOPS and throughput with the appropriate memory-to-vCore ratio.", - "guid": "2ea55b56-ad48-4408-be72-734b476ba18f", - "link": "https://learn.microsoft.com/azure/virtual-machines/premium-storage-performance#counters-to-measure-application-performance-requirements", + "checklist": "WAF checklist", + "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", + "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", + "service": "SAP", "services": [ - "SQL", + "PrivateLink", + "Backup", "Storage", - "VM" + "ACR", + "VNet", + "WAF" ], "severity": "Medium", - "subcategory": "Storage", - "text": "Determine storage bandwidth and latency requirements for SQL Server data, log, and tempdb files before choosing the disk type.", - "waf": "Performance" + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "This provides more dedicated disk IOPS and throughput on the disk level and also allows you to configure the Azure disk host caching setting for each disk to the optimal setting for that data type.", - "guid": "dbf590ce-65de-48e0-9f9c-cbd468266abc", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", + "checklist": "WAF checklist", + "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", + "service": "SAP", "services": [ - "SQL", - "Storage" + "SAP", + "VM", + "WAF" ], "severity": "High", - "subcategory": "Storage", - "text": "Place data, log, and tempdb files on separate drives", + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Premium SSD is always recommend as a minimum for SQL Server in order to obtain better performance and lower latency. P30 and P40 are recommended because disk caching is not supported for disks 4 TiB and larger ( P50 and above) and they provide the optimal price to performance ratio", - "guid": "e6a84de5-df43-4d19-a248-1718d5d1e5f6", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", + "checklist": "WAF checklist", + "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", + "service": "SAP", "services": [ - "SQL", - "Storage" + "LoadBalancer", + "WAF" ], - "severity": "High", - "subcategory": "Storage", - "text": "For the data drive, use premium P30 and P40 or smaller disks to ensure the availability of cache support", - "waf": "Performance" + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Log files have primarily write-heavy operations. Therefore, they do not benefit from the ReadOnly cache. Hence evaluate your price vs performance vs capacity and chose the right storage disk.", - "guid": "25659d35-58fd-4772-99c9-31112d027fe4", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", + "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": [ - "Cost", - "SQL", - "Storage" + "VM", + "SAP", + "VNet", + "WAF" ], - "severity": "High", - "subcategory": "Storage", - "text": "For the log drive plan for capacity and test performance versus cost while evaluating the premium P30 - P80 disks", - "waf": "Performance" + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Placing TempDB on the D drive can help performance. Consider the size required and always test performance.", - "guid": "12f70983-f630-4472-8ee6-9d6b5c2622f5", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", + "checklist": "WAF checklist", + "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "services": [ - "SQL", - "Storage", - "VM" + "SAP", + "VNet", + "WAF" ], - "severity": "Medium", - "subcategory": "Storage", - "text": "Place tempdb on the local ephemeral SSD (default D:\\) drive for most SQL Server workloads that are not part of Failover Cluster Instance (FCI) after choosing the optimal VM size.", + "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", "waf": "Performance" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Striping Data and Log disk can increase bandwidth. Ensure that VM size also matches expected output", - "guid": "4b69bad3-4aad-45e8-a78e-1d76667313c4", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", + "checklist": "WAF checklist", + "guid": "fa96c96a-d885-418f-9827-34c886ba2802", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "services": [ - "SQL", - "Storage", - "VM" + "SAP", + "WAF" ], - "severity": "High", - "subcategory": "Storage", - "text": "Stripe multiple Azure data disks using Storage Spaces to increase I/O bandwidth", + "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", "waf": "Performance" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Your storage caching policy varies depending on the type of SQL Server data files that are hosted on the drive.Enable Read-only caching for the disks hosting SQL Server data files.Reads from cache will be faster than the uncached reads from the data disk.Set the caching policy to None for disks hosting the transaction log. There is no performance benefit to enabling caching for the Transaction log disk.", - "guid": "05674b5e-985b-4859-a773-e7e261623b77", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", + "checklist": "WAF checklist", + "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "services": [ - "SQL", - "Storage", - "AzurePolicy" + "SAP", + "WAF" ], "severity": "High", - "subcategory": "Storage", - "text": "Set host caching to read-only for data file disks and none for log file disks.", + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Check that you storage is in the same region as your VM. For exaplme if your VM is in EAST US 2 ensure your storage is in East US 2.", - "guid": "5a917e1f-348e-4f35-9c27-d42e8bbac868", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", + "checklist": "WAF checklist", + "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "services": [ - "SQL", - "Storage", - "VM" + "SAP", + "VNet", + "Cost", + "WAF" ], "severity": "High", - "subcategory": "Storage", - "text": "Provision the storage account in the same region as the SQL Server VM", - "waf": "Performance" + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "SQL Server uses extents to store data. These are 64KB in size. Therefore, on a SQL Server machine, the NTFS allocation unit size for hosting SQL database files should be 64 KB.", - "guid": "155abb91-63e9-4908-ae28-c84c33b6b780", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql#storage", + "checklist": "WAF checklist", + "guid": "402a9846-d515-4061-aff8-cd30088693fa", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", + "service": "SAP", "services": [ - "SQL", - "Storage" + "LoadBalancer", + "WAF" ], "severity": "High", - "subcategory": "Storage", - "text": "Format your data disk to use 64 KB block size (allocation unit size) for all data files placed on a drive other than the temporary D:\\ drive", + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "It is recommended that you determine BCDR needs and requirements ensuring that you are able to meet you SLAs of the environment.", - "guid": "8b9fe5c4-2049-4d41-9a92-3c3474d11028", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/business-continuity-high-availability-disaster-recovery-hadr-overview?view=azuresql#azure-only-disaster-recovery-solutions", + "checklist": "WAF checklist", + "guid": "87585797-5551-4d53-bb7d-a94ee415734d", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", + "service": "SAP", "services": [ - "SQL", - "VM" + "SAP", + "VNet", + "WAF" ], "severity": "Medium", - "subcategory": "HADR", - "text": "Determine HA/DR requirements for each VM to be migrated.", - "waf": "Reliability" + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "When depoying High Availability you need to use availability sets or availability zones to avoid unexpected outages.", - "guid": "ac6aae01-e6a8-44de-9df4-3d1992481718", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/business-continuity-high-availability-disaster-recovery-hadr-overview?view=azuresql#high-availability-nodes-in-an-availability-set", + "checklist": "WAF checklist", + "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", "services": [ - "SQL", - "VM" + "SAP", + "Backup", + "VM", + "WAF" ], "severity": "High", - "subcategory": "HADR", - "text": "Place your VMs in an availability set or different availability zones.", - "waf": "Reliability" + "text": "Review SAP HANA database backups for Azure VMs.", + "waf": "Cost" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Prefered option when deploying an Availability Group. The recommended solution is to use multi-subnets when deploying Always on Availability Groups.", - "guid": "d5d1e5f6-2565-49d3-958f-d77249c93111", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/availability-group-azure-portal-configure?view=azuresql&tabs=azure-cli", + "checklist": "WAF checklist", + "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", "services": [ - "SQL", - "VNet", - "VM", - "LoadBalancer" + "SAP", + "Monitor", + "ASR", + "WAF" ], "severity": "Medium", - "subcategory": "HADR", - "text": "Deploy your SQL Server VMs to multiple subnets whenever possible to avoid the dependency on an Azure Load Balancer or a distributed network name (DNN) to route traffic to your HADR solution. ( If one is implementing FCI or AG)", - "waf": "Reliability" + "text": "Review Site Recovery built-in monitoring, where used for SAP.", + "waf": "Cost" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "High availability and disaster recovery (HADR) features, such as the Always On availability group and the failover cluster instance rely on underlying Windows Server Failover Cluster technology. Review the best practices for modifying your HADR settings to better support the cloud environment.", - "guid": "2d027fe4-12f7-4098-9f63-04722ee69d6b", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql-vm#hadr-configuration", + "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", "services": [ - "SQL", - "ASR" + "SAP", + "Monitor", + "WAF" ], "severity": "High", - "subcategory": "HADR", - "text": "Change the cluster to less aggressive parameters to avoid unexpected outages from transient network failures or Azure platform maintenance. ( If one is implementing FCI or AG)", - "waf": "Reliability" + "text": "Review the Monitoring the SAP HANA System Landscape guidance.", + "waf": "Operations" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Ensure that quorum is set correct for the number of instances deployed.", - "guid": "5c2622f5-4b69-4bad-94aa-d5e8c78e1d76", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/hadr-cluster-best-practices?view=azuresql-vm&tabs=windows2012#quorum-voting", + "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", "services": [ - "SQL" + "Backup", + "VM", + "WAF" ], - "severity": "High", - "subcategory": "HADR", - "text": "Configure cluster quorum voting to use 3 or more odd number of votes. Don't assign votes to DR regions. ( If one is implementing FCI or AG)", - "waf": "Reliability" + "severity": "Medium", + "text": "Review Oracle Database in Azure Linux VM backup strategies.", + "waf": "Operations" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "On Azure virtual machines, clusters use a load balancer to hold an IP address that needs to be on one cluster node at a time. In this solution, the load balancer holds the IP address for the virtual network name (VNN) listener for the Always On availability group when the SQL Server VMs are in a single subnet.", - "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", + "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", "services": [ - "VM", + "Storage", "SQL", - "VNet", - "LoadBalancer" + "WAF" ], - "severity": "High", - "subcategory": "HADR", - "text": "When using the virtual network name (VNN) and Azure Load Balancer to connect to your HADR solution, specify MultiSubnetFailover = true in the connection string, even if your cluster only spans one subnet. ( If one is implementing FCI or AG)", - "waf": "Reliability" + "severity": "Medium", + "text": "Review the use of Azure Blob Storage with SQL Server 2016.", + "waf": "Operations" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "SQL Server, Azure SQL Database, and Azure SQL Managed Instance support row and page compression for rowstore tables and indexes, and support columnstore and columnstore archival compression for columnstore tables and indexes.", - "guid": "61623b77-5a91-47e1-b348-ef354c27d42e", - "link": "https://learn.microsoft.com/sql/relational-databases/data-compression/data-compression?view=sql-server-ver16", + "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", "services": [ - "SQL", - "Storage" + "Backup", + "VM", + "WAF" ], - "severity": "Low", - "subcategory": "SQL Server", - "text": "Enable database page compression where appropriate.", - "waf": "Performance" + "severity": "Medium", + "text": "Review the use of Automated Backup v2 for Azure VMs.", + "waf": "Operations" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "By default, data and log files are initialized to overwrite any existing data left on the disk from previously deleted files. Data and log files are first initialized by zeroing the files (filling with zeros).In SQL Server, for data files only, instant file initialization (IFI) allows for faster execution of the previously mentioned file operations, since it reclaims used disk space without filling that space with zeros. Instead, disk content is overwritten as new data is written to the files.", - "guid": "8bbac868-155a-4bb9-863e-9908ae28c84c", - "link": "https://learn.microsoft.com/sql/relational-databases/databases/database-instant-file-initialization?view=sql-server-ver16", + "checklist": "WAF checklist", + "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", + "service": "SAP", "services": [ - "SQL", - "Storage" + "WAF" ], "severity": "High", - "subcategory": "SQL Server", - "text": "Enable instant file initialization for data files.", + "text": "Enabling Write accelerator for M series when using premium disks(V1)", "waf": "Operations" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Recommended for best performance and availability migrate all databases to data and log disks", - "guid": "33b6b780-8b9f-4e5c-9204-9d413a923c34", - "link": "https://learn.microsoft.com/sql/relational-databases/databases/move-database-files?view=sql-server-ver16", + "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", "services": [ - "SQL" + "WAF" ], "severity": "Medium", - "subcategory": "SQL Server", - "text": "Move all databases to data disks, including system databases.", - "waf": "Operations" + "text": "Test availability zone latency.", + "waf": "Performance" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Part of the SQL Server Feature checklist in the link that is recommended when SQL Server Instance is in an Azure VM.", - "guid": "b824546c-e1ae-4e34-93ae-c8239248725d", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/performance-guidelines-best-practices-checklist?view=azuresql-vm#sql-server-features", + "checklist": "WAF checklist", + "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", + "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", + "service": "SAP", "services": [ - "SQL", - "Storage", - "VM" + "SAP", + "WAF" ], - "severity": "Low", - "subcategory": "SQL Server", - "text": "Move SQL Server error log and trace file directories to data disks.", - "waf": "Operations" + "severity": "Medium", + "text": "Activate SAP EarlyWatch Alert for all SAP components.", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", + "waf": "Performance" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Part of the SQL Server Feature checklist in the link that is recommended when SQL Server Instance is in an Azure VM.", - "guid": "d68c5b5c-2925-4394-a69a-9d2799c42bb6", - "link": "https://learn.microsoft.com/sql/database-engine/configure-windows/server-memory-server-configuration-options#use-", + "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", "services": [ - "SQL", - "VM" + "SAP", + "WAF" ], - "severity": "High", - "subcategory": "SQL Server", - "text": "Set max SQL Server memory limit to leave enough memory for the Operating System.", + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Part of the SQL Server Feature checklist in the link that is recommended when SQL Server Instance is in an Azure VM.", - "guid": "8d1d7555-6246-4b43-a563-b4dc74a748b6", - "link": "https://learn.microsoft.com/sql/database-engine/configure-windows/enable-the-lock-pages-in-memory-option-windows", + "checklist": "WAF checklist", + "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", + "service": "SAP", "services": [ + "Monitor", "SQL", - "VM" + "WAF" ], - "severity": "High", - "subcategory": "SQL Server", - "text": "Enable lock pages in memory.", + "severity": "Medium", + "text": "Review SQL Server performance monitoring using CCMS.", "waf": "Performance" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Part of the SQL Server Feature checklist in the link that is recommended when SQL Server Instance is in an Azure VM.", - "guid": "633ad2a0-916a-4664-a8fa-d0e278ee293c", - "link": "https://learn.microsoft.com/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store", + "checklist": "WAF checklist", + "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", + "link": "https://me.sap.com/notes/500235", + "service": "SAP", "services": [ - "SQL", - "VM" + "SAP", + "VM", + "WAF" ], - "severity": "Low", - "subcategory": "SQL Server", - "text": "Enable Query Store on all production SQL Server databases following best practices.", + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Part of the SQL Server Feature checklist in the link that is recommended when SQL Server Instance is in an Azure VM.", - "guid": "1bc352ba-aab7-4571-a49a-b8093dc9ec9d", - "link": "https://learn.microsoft.com/sql/relational-databases/databases/tempdb-database#optimizing-tempdb-performance-in-sql-server", + "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", "services": [ - "SQL", - "VM" + "SAP", + "Monitor", + "WAF" ], - "severity": "High", - "subcategory": "SQL Server", - "text": "Ensure that all tempdb best practices are followed.", + "severity": "Medium", + "text": "Review SAP HANA studio alerts.", "waf": "Performance" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Part of the SQL Server Feature checklist in the link that is recommended when SQL Server Instance is in an Azure VM.", - "guid": "1bb73b36-a5a6-47fb-a9ed-5b35478c3479", - "link": "https://docs.microsoft.com/azure/governance/management-groups/how-to/protect-resource-hierarchy#setting---require-authorization", + "checklist": "WAF checklist", + "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", + "link": "https://me.sap.com/notes/1969700", + "service": "SAP", "services": [ - "SQL", - "VM" + "SAP", + "WAF" ], - "severity": "High", - "subcategory": "SQL Server", - "text": "Schedule SQL Server Agent jobs to run DBCC CHECKDB, index reorganize, index rebuild, and update statistics jobs.", - "waf": "Operations" + "severity": "Medium", + "text": "Perform SAP HANA health checks using HANA_Configuration_Minichecks.", + "waf": "Performance" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Part of the SQL Server Feature checklist in the link that is recommended when SQL Server Instance is in an Azure VM.", - "guid": "816b2863-cffe-41ca-a599-ef0d5a73dd4c", - "link": "https://docs.microsoft.com/azure/governance/management-groups/how-to/protect-resource-hierarchy#setting---require-authorization", + "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", "services": [ - "SQL", - "VM" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "SQL Server", - "text": "Limit autogrowth of the database and Disable autoshrink", - "waf": "Operations" + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Constrained vCPU virtual machines (VMs) are a type of VM where the vCPU count can be constrained to a half or a quarter of the original VM size. This allows customers to reduce the cost of software licensing while maintaining the same memory, storage, and I/O bandwidth", - "guid": "e36c1c81-770a-4fbc-9c0d-43918648d285", - "link": "https://learn.microsoft.com/azure/virtual-machines/constrained-vcpu", + "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", "services": [ - "Cost", - "SQL", - "Storage", - "VM" + "SAP", + "WAF" ], - "severity": "Low", - "subcategory": "Cost Optimization", - "text": "Optimize SQL Server License cost with Constrained vCPU VM's", - "training": "https://learn.microsoft.com/azure/active-directory/managed-identities-azure-resources/overview", - "waf": "Cost" + "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", + "waf": "Security" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Azure Hybrid Benefit allows you to exchange your existing licenses for discounted rates on Azure SQL Database and Azure SQL Managed Instance. Y", - "guid": "7ed67178-b824-4546-ae1a-ee3453aec823", - "link": "https://azure.microsoft.com/en-ca/pricing/hybrid-benefit/", + "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", "services": [ - "Cost", - "SQL" + "SAP", + "SQL", + "WAF" ], "severity": "Low", - "subcategory": "Cost Optimization", - "text": "Leverage Azure Hybrid benefit to maximize the value of your on premises licenses in the cloud", - "waf": "Cost" + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "The SQL Server IaaS Agent extension (SqlIaasExtension) runs on SQL Server on Azure Windows Virtual Machines (VMs) to automate management and administration tasks.", - "guid": "9248725d-d68c-45b5-a292-5394a69a9d27", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/sql-agent-extension-automatic-registration-all-vms?view=azuresql-vm&tabs=azure-cli", + "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", "services": [ "SQL", - "VM" + "WAF" ], - "severity": "Medium", - "subcategory": "Azure", - "text": "Register with the SQL IaaS Agent Extension to unlock a number of feature benefits.", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", - "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Accelerated Networking provides consistent ultra-low network latency via Azure's in-house programmable hardware and technologies", - "guid": "99c42bb6-8d1d-4755-9624-6b438563b4dc", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", + "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", "services": [ + "Backup", "SQL", - "VM" + "Storage", + "SAP", + "WAF" ], "severity": "High", - "subcategory": "Azure", - "text": "Ensure Accelerated Networking is enabled on the virtual machine.", - "waf": "Operations" + "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" }, { - "category": "SQL Server on Azure VM", - "checklist": "SQL Migration Review", - "description": "Microsoft Defender detects anomalous activities indicating unusual and potentially harmful attempts to access or exploit databases on the SQL server.", - "guid": "74a748b6-633a-4d2a-8916-a66498fad0e2", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/secure-score-security-controls", + "checklist": "WAF checklist", + "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "SAP", "services": [ - "SQL", - "Defender", - "VM" + "Storage", + "WAF" ], - "severity": "High", - "subcategory": "Azure", - "text": "Leverage Microsoft Defender for Cloud to improve the overall security posture of your virtual machine deployment.", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "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", "waf": "Security" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "There are some PaaS limitations that are introduced in SQL Managed Instance and some behavior changes compared to SQL Server. It is important to review and understand these differences.", - "guid": "78ee293c-1bc3-452b-aaab-7571849ab809", - "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/transact-sql-tsql-differences-sql-server?view=azuresql", + "checklist": "WAF checklist", + "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview", + "service": "SAP", "services": [ - "SQL", - "EventHubs" + "AKV", + "WAF" ], "severity": "High", - "subcategory": "Pre Migration", - "text": "Review the major differences between SQL Server and Managed Instance", - "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", - "waf": "Operations" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "SQL Managed Instance has characteristics and resource limits that depend on the underlying infrastructure and architecture. It is important to review these limits.", - "guid": "3dc9ec9d-1bb7-43b3-9a5a-67fba9ed5b35", - "link": "https://docs.microsoft.com/azure/azure-sql/managed-instance/resource-limits", + "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", "services": [ - "SQL" + "RBAC", + "Subscriptions", + "AzurePolicy", + "WAF" ], - "severity": "High", - "subcategory": "Pre Migration", - "text": "Review capacity limits for SQL MI", - "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", - "waf": "Performance" + "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", + "waf": "Security" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "The instance settings between managed instance and your source SQL Server can be different . It is important to review those differences that can impact performance.", - "guid": "8bc178bd-c5a0-46ca-9144-351e19dd3442", - "link": "https://medium.com/azure-sqldb-managed-instance/compare-environment-settings-on-sql-server-and-azure-sql-that-may-impact-performance-e90c21fa9b08", + "checklist": "WAF checklist", + "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "SAP", "services": [ - "SQL" + "AKV", + "AzurePolicy", + "WAF" ], - "severity": "High", - "subcategory": "Pre Migration", - "text": "Compare instance settings on SQL Server and Azure SQL MI that may impact performance", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", - "waf": "Performance" + "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", + "waf": "Security" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "Assess on-premises SQL Server instance(s) migrating to Azure SQL Managed Instance. The assessment workflow helps you to detect issues that block the migration itself and also partially supported and unsupported features", - "guid": "9eb72281-37a1-451c-9bb4-e4f1814287d5", - "link": "https://docs.microsoft.com/azure/dms/ads-sku-recommend", + "checklist": "WAF checklist", + "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", + "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", + "service": "SAP", "services": [ - "SQL" + "RBAC", + "AzurePolicy", + "WAF" ], "severity": "High", - "subcategory": "Pre Migration", - "text": "Run Data Migration assistant or Azure Data Studio Migration Extension to detect compatibility issues that can impact database functionality on Managed Instance", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", - "waf": "Operations" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "The SKU recommendation feature can evaluate the source SQL Server performance and utilization characteristics to recommend a right-sized Azure SQL Managed Instance to assist with your migration journey.", - "guid": "ca8c26c9-b32a-4b5b-afc6-898a135e3378", - "link": "https://learn.microsoft.com/azure/dms/ads-sku-recommend", + "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", "services": [ - "SQL" + "SAP", + "Storage", + "Defender", + "WAF" ], "severity": "High", - "subcategory": "Pre Migration", - "text": "Select the right compute resources for your workload by leveraging the SKU recommendation tools.", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", - "waf": "Performance" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "Review Unsupported Features, Migration Blockers and Breaking Changes for each database from the Assessment", - "guid": "97e31c67-d68c-4b69-82ac-19f906d697c8", - "link": "https://learn.microsoft.com/azure/dms/ads-sku-recommend", + "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", "services": [ - "SQL" + "SAP", + "RBAC", + "Defender", + "WAF" ], "severity": "High", - "subcategory": "Pre Migration", - "text": "Review and address the issues highlighted in DMA/Azure Data Studio", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", - "waf": "Operations" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "The SQL Managed Instance default DNS zone .database.windows.net can be changed with your own. However, the managed instance hostname part of its FQDN should remain the same.", - "guid": "eaded26b-dd18-46f0-ac25-1b999a68af87", - "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/frequently-asked-questions-faq?view=azuresql-mi#can-a-managed-instance-have-the-same-name-as-a-sql-server-on-premises-instance", + "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", "services": [ - "DNS", - "SQL" + "SAP", + "WAF" ], - "severity": "High", - "subcategory": "Pre Migration", - "text": "Plan for connection string changes as changing a managed instance name is not supported", - "training": "https://learn.microsoft.com/learn/modules/create-custom-azure-roles-with-rbac/", - "waf": "Operations" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "There are addional requirements in configuring a vnet and subnet hosting the managed instance.", - "guid": "c9a7f821-b8eb-48c0-aa77-e25e4d5aeaa8", - "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/vnet-existing-add-subnet?view=azuresql-mi", + "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", "services": [ - "SQL", - "VNet" + "AKV", + "WAF" ], "severity": "Medium", - "subcategory": "Pre Migration", - "text": "Review managed instance VNet requirements", - "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", - "waf": "Operations" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "Though it's possible to deploy managed instances to a subnet with a number of IP addresses that's less than the output of the subnet formula, always consider using bigger subnets instead. Using a bigger subnet can help avoid future issues stemming from a lack of IP addresses, such as the inability to create additional instances within the subnet or scale existing instances.", - "guid": "dc4e2436-bb33-46d7-85f1-7960eee0b9b5", - "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/vnet-subnet-determine-size?view=azuresql-mi", + "checklist": "WAF checklist", + "guid": "4935ada4-2223-4ece-a1b1-23181a541741", + "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", + "service": "SAP", "services": [ - "SQL", - "VNet" + "AKV", + "WAF" ], "severity": "High", - "subcategory": "Deployment", - "text": "Ensure managed instance subnet has sufficient IP addresses available", - "training": "https://learn.microsoft.com/learn/modules/azure-active-directory/", - "waf": "Operations" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "SQL Managed Instance has characteristics and resource limits that depend on the underlying infrastructure and architecture. SQL Managed Instance can be deployed on multiple hardware configurations.", - "guid": "c8defc4d-721d-431d-850f-b707ae9eab40", - "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/resource-limits?view=azuresql-mi#service-tier-characteristics", + "checklist": "WAF checklist", + "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", + "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", + "service": "SAP", "services": [ - "SQL" + "SAP", + "AKV", + "WAF" ], "severity": "High", - "subcategory": "Pre Migration", - "text": "Plan between General Purpose and Business Critical tiers of MI", - "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", - "waf": "Performance" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "The auto-failover groups feature allows you to manage the replication and failover of user databases in a managed instance to a managed instance in another Azure region. Auto-failover groups are designed to simplify deployment and management of geo-replicated databases at scale.", - "guid": "ed329079-8bc1-478b-bc5a-06ca7144351e", - "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/auto-failover-group-sql-mi?view=azuresql-mi&tabs=azure-powershell", + "checklist": "WAF checklist", + "guid": "209d490d-a477-4784-84d1-16785d2fa56c", + "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", + "service": "SAP", "services": [ - "SQL" + "SAP", + "RBAC", + "Subscriptions", + "WAF" ], "severity": "High", - "subcategory": "Pre Migration", - "text": "Based on your RPO/RTO's , determine if Auto failover Group needs to be implemented. If so, plan for the deployment attributes of the second instance.", - "training": "https://learn.microsoft.com/learn/paths/implement-windows-server-iaas-virtual-machine-identity/", - "waf": "Reliability" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "There are multiple ways to connect your application to the managed instance. Review and understand the pros and cons and decide on the best approach for your application.", - "guid": "5d226886-d30b-466c-97be-595190f83845", - "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/connect-application-instance?view=azuresql-mi", + "checklist": "WAF checklist", + "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", + "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", + "service": "SAP", "services": [ - "SQL" + "PrivateLink", + "SAP", + "NVA", + "WAF" ], - "severity": "Low", - "subcategory": "Pre Migration", - "text": "Review the Connectivity Design between Database and Application, test & validate it", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", - "waf": "Operations" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "Compare migration options to choose the path that's appropriate to your business needs.", - "guid": "c586cb29-1ec1-46a1-b076-ef9f141acdce", - "link": "https://learn.microsoft.com/azure/azure-sql/migration-guides/managed-instance/sql-server-to-managed-instance-overview?view=azuresql-mi#migration-tools", + "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", "services": [ - "SQL" + "Storage", + "VM", + "WAF" ], - "severity": "Medium", - "subcategory": "Pre Migration", - "text": "Plan for the Migration Method. Depending on the DB Size and Application downtime window, select the preferred Migration Method.", - "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", - "waf": "Operations" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "After you verify that data is the same on both source and target, you can cut over from the source to the target environment. It's important to plan the cutover process with business / application teams to ensure minimal interruption during cutover doesn't affect business continuity.", - "guid": "579377bc-db37-451a-a2ac-1fad66e15d4d", - "link": "https://learn.microsoft.com/azure/dms/tutorial-sql-server-managed-instance-online#performing-migration-cutover", + "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", "services": [ - "SQL" + "Defender", + "WAF" ], - "severity": "Medium", - "subcategory": "Pre Migration", - "text": "Plan the cutover process with business / application teams to ensure minimal interruption during cutover and it does not affect business continuity.", - "training": "https://learn.microsoft.com/azure/architecture/example-scenario/identity/adds-extend-domain", - "waf": "Reliability" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "A time zone of a managed instance can be set during instance creation only. The default time zone is UTC", - "guid": "4a2adb1c-3d23-426a-b225-ca44e1695fdd", - "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/timezones-overview?view=azuresql#set-a-time-zone", + "checklist": "WAF checklist", + "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "services": [ - "SQL" + "SAP", + "VNet", + "WAF" ], "severity": "High", - "subcategory": "Deployment", - "text": "Ensure you customize your time zone setting at the instance creation time. One cannot change it later.", - "training": "https://learn.microsoft.com/azure/role-based-access-control/overview", - "waf": "Operations" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "Server-level collation in Azure SQL Managed Instance can be specified when the instance is created and cannot be changed later.Default server-level collation is SQL_Latin1_General_CP1_CI_AS.", - "guid": "deace4cb-1deb-44c6-90c3-fc14eebb3693", - "link": "https://learn.microsoft.com/sql/relational-databases/collations/set-or-change-the-server-collation?view=sql-server-ver16", + "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", "services": [ - "SQL" + "SAP", + "WAF" ], - "severity": "High", - "subcategory": "Deployment", - "text": "Ensure you select the right collation setting at the instance creation time. One cannot change it later", - "waf": "Operations" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "When you're migrating a database protected by Transparent Data Encryption (TDE) to Azure SQL Managed Instance using the native restore option, the corresponding certificate from the SQL Server instance needs to be migrated before database restore.", - "guid": "829e3eec-2183-4687-a007-7a2b5945bda4", - "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/tde-certificate-migrate?view=azuresql-mi&tabs=azure-powershell", + "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": [ - "SQL", - "VM" + "SAP", + "AKV", + "Monitor", + "WAF" ], "severity": "Medium", - "subcategory": "Deployment", - "text": "For TDE Enabled Database, corresponding certificate from the on-premises or Azure VM SQL Server needs to be migrated before database restore", - "waf": "Operations" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "System databases can be restored only from backups that are created on the version of SQL Server that the server instance is currently running. This is not the case when you are migrating to SQL Managed Instance.Azure PowerShell and DBATools PowerShell libraries enable you to easily script and automate and customize all parts of the migration process.", - "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", + "arm-service": "Microsoft.AppPlatform/Spring", + "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", "services": [ - "SQL", - "Backup" + "WAF" ], - "severity": "Low", - "subcategory": "Migration", - "text": "Restore of system databases is not supported. To migrate instance-level objects (stored in master or msdb databases), we recommend to script them out and run T-SQL scripts on the destination instance.", - "waf": "Operations" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "When using migration options that continuously replicate / sync data changes from source to the target, the source data and schema can change and drift from the target. During data sync, ensure that all changes on the source are captured and applied to the target during the migration process.", - "guid": "e3d3e084-3276-4d4b-bc01-5bcf219e4a1e", + "arm-service": "Microsoft.AppPlatform/Spring", + "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", "services": [ - "SQL" + "TrafficManager", + "FrontDoor", + "WAF" ], - "severity": "High", - "subcategory": "Migration", - "text": "Ensure that all changes on the source are captured and applied to the target during the migration process.", - "waf": "Operations" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "Ensure that the application is able to succesffuly connect to the managed instance post migration of the databases.", - "guid": "b5887952-5d22-4688-9d30-b66c57be5951", - "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/connect-application-instance?view=azuresql-mi", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "WAF checklist", + "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", + "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", + "service": "Spring Apps", "services": [ - "SQL" + "ACR", + "WAF" ], "severity": "Medium", - "subcategory": "Migration", - "text": "Test Application Connectivity to MI and Databases", - "waf": "Operations" + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "High availability is a fundamental part of SQL Managed Instance platform that works transparently for your database applications. Failovers from primary to secondary nodes in case of node degradation or fault detection, or during regular monthly software updates are an expected occurrence for all applications using SQL Managed Instance in Azure.", - "guid": "90f83845-c586-4cb2-a1ec-16a1d076ef9f", - "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/user-initiated-failover?view=azuresql", + "arm-service": "Microsoft.AppPlatform/Spring", + "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", "services": [ - "SQL" + "WAF" ], - "severity": "High", - "subcategory": "Post Migration", - "text": "Consider executing a manual failover on SQL Managed Instance to test for fault and failover resiliency.", - "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "severity": "Medium", + "text": "Use more than 1 app instance for your apps", "waf": "Reliability" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "Ensuring that your applications are failover resilient prior to deploying to production will help mitigate the risk of application faults in production and will contribute to application availability for your customers.", - "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", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "WAF checklist", + "guid": "7504c230-6035-4183-95a5-85762acc6075", + "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", + "service": "Spring Apps", "services": [ - "SQL", - "LoadBalancer", - "EventHubs" + "Monitor", + "WAF" ], - "severity": "High", - "subcategory": "Post Migration", - "text": "If failover groups have been implemented, Test Manual Failover and Failback and test application connectivity behavior during failover/failback", + "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" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "This provides more dedicated disk IOPS and throughput", - "guid": "aa359272-8e6e-4205-8726-76ae46691e88", - "link": "https://techcommunity.microsoft.com/t5/azure-sql-blog/storage-performance-best-practices-and-considerations-for-azure/ba-p/305525", + "arm-service": "Microsoft.AppPlatform/Spring", + "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", "services": [ - "SQL", - "Storage" + "WAF" ], - "severity": "High", - "subcategory": "Post Migration", - "text": "Optimize Storage Performance for General Purpose Managed Instance", - "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", - "waf": "Performance" + "severity": "Medium", + "text": "Set up autoscaling in Spring Cloud Gateway", + "waf": "Reliability" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "Many organizations have policies that require that certificates or encryption keys be created and managed internally. If your organization has a similar policy, this architecture might apply to you. If your customers require internal management of these items, the architecture also might apply to you.", - "guid": "35ad9422-23e1-4381-8523-081a94174158", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/data/sql-managed-instance-cmk", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "WAF checklist", + "guid": "97411607-b6fd-4335-99d1-9885faf4e392", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", + "service": "Spring Apps", "services": [ - "SQL", - "AzurePolicy", - "AKV", - "Backup" + "WAF" ], "severity": "Low", - "subcategory": "Post Migration", - "text": "Enable Customer managed TDE for taking your own copy only full backups", - "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", - "waf": "Security" + "text": "Enable autoscale for the apps with Standard consumption & dedicated plan.", + "waf": "Reliability" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "The maintenance window feature provides you with the ability to onboard Azure SQL resource to prescheduled time blocks outside of business hours.", - "guid": "33ef7ad7-c6d3-4733-865c-7acbe44bbe60", - "link": "https://learn.microsoft.com/azure/azure-sql/database/planned-maintenance?view=azuresql", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "WAF checklist", + "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", + "link": "https://learn.microsoft.com/azure/spring-apps/overview", + "service": "Spring Apps", "services": [ - "SQL" + "WAF" ], "severity": "Medium", - "subcategory": "Post Migration", - "text": "Plan for Azure maintenance events", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "Operations" + "text": "Use Enterprise plan for commercial support of spring boot for mission critical apps. With other tiers you get OSS support.", + "waf": "Reliability" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "By using the long-term retention (LTR) feature, you can store specified SQL Database and SQL Managed Instance full backups in Azure Blob storage with configured redundancy for up to 10 years.", - "guid": "9d89f2e8-7778-4424-b516-785c6fa96b96", - "link": "https://learn.microsoft.com/azure/azure-sql/database/long-term-retention-overview?view=azuresql-mi", + "checklist": "WAF checklist", + "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", + "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", + "service": "Entra", "services": [ - "ARS", - "SQL", - "Storage", - "Backup" + "Entra", + "WAF" ], - "severity": "Low", - "subcategory": "Post Migration", - "text": "Configure Long Term backup retention, view backups and restore from backups", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", + "severity": "Medium", + "text": "Use long-live revocable token, cache your token and acquire your silently using Microsoft Identity Library", "waf": "Reliability" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "By using Azure Hybrid Benefit, you can achieve cost savings, modernise and maintain a flexible hybrid environment while optimising business applications.", - "guid": "ad88408f-3727-434c-a76b-a28021459014", - "link": "https://azure.microsoft.com/en-gb/pricing/hybrid-benefit/#overview", + "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", "services": [ - "Cost", - "SQL" + "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", + "waf": "Reliability" + }, + { + "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", + "services": [ + "WAF" + ], + "severity": "Medium", + "text": "Custom brand assets should be hosted on a CDN", + "waf": "Performance" + }, + { + "checklist": "WAF checklist", + "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", - "subcategory": "Post Migration", - "text": "Take advantage of Azure Hybrid Benefit and Azure Reservations where applicable.", - "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", - "waf": "Cost" + "text": "Have multiple identiy providers (i.e., login with your microsoft, google, facebook accounts)", + "waf": "Reliability" }, { - "category": "SQL Managed Instance", - "checklist": "SQL Migration Review", - "description": "If you don't have threat protection Advanced Threat Protection is part of the Microsoft Defender for SQL offering, which is a unified package for advanced SQL security capabilities.", - "guid": "65d38e53-f9cc-4bd8-9926-6acca274faa1", - "link": "https://learn.microsoft.com/azure/azure-sql/database/threat-detection-overview?view=azuresql", + "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", "services": [ - "SQL", - "Defender" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "Post Migration", - "text": "Leverage Microsoft Defender for Cloud to improve the overall security posture", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "Security" + "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" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "1fc2fc14-eea6-4e69-b8d9-a3edc218e687", - "link": "https://polite-sea-0995b240f.2.azurestaticapps.net/technical-delivery-playbook/azure-services/analytics/purview/", - "service": "Purview", - "services": [], + "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", + "services": [ + "WAF" + ], "severity": "Medium", - "subcategory": "Best Practices", - "text": "Leverage FTA Resillency Handbook", + "text": "Don't replicate! Replication can create issues with directory synchronization", "waf": "Reliability" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "ab067acb-49e5-4b96-8332-4ecf8cc13318", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", + "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", "services": [ - "ASR" + "WAF" ], - "severity": "High", - "subcategory": "Disaster Recovery", - "text": "Plan for Data Center level outage", + "severity": "Medium", + "text": "Have active-active for multi-regions", "waf": "Reliability" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review 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", + "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", "services": [ - "ASR" + "Entra", + "WAF" ], "severity": "Medium", - "subcategory": "Disaster Recovery", - "text": "Practice Failover for BCDR", + "text": "Add Azure AD Domain service stamps to additional regions and locations", "waf": "Reliability" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "97b15b8a-219a-44ab-bb57-879024d22678", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", + "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", "services": [ - "Backup" + "WAF" ], - "severity": "High", - "subcategory": "Backup and Restore ", - "text": "Plan a backup strategy and take regular backups", + "severity": "Medium", + "text": "Use Replica Sets for DR", "waf": "Reliability" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "6d20b56c-56a9-4581-89bf-8d8e5c586b7d", - "link": "https://learn.microsoft.com/purview/manage-kafka-dotnet", - "service": "Purview", + "arm-service": "Microsoft.ServiceBus/namespaces", + "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", "services": [ - "EventHubs" + "ServiceBus", + "WAF" ], "severity": "Low", - "subcategory": "Purview Accounts Replications", - "text": "Use Microsoft Purview's Event Hubs to subscribe and create entities to another account", - "waf": "Reliability" + "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" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "8cdc15ac-c075-4ee9-a130-a8889579e76b", - "link": "https://learn.microsoft.com/purview/deployment-best-practices", - "service": "Purview", - "services": [], + "arm-service": "Microsoft.ServiceBus/namespaces", + "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", + "services": [ + "ServiceBus", + "WAF" + ], "severity": "Medium", - "subcategory": "Data catalog", - "text": "Follow Purview accounts architectures and deployment best practices", - "waf": "Reliability" + "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" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "896e710a-7da7-4be9-a56d-14d3c49d997c", - "link": "https://learn.microsoft.com/purview/concept-best-practices-collections", - "service": "Purview", - "services": [], + "arm-service": "Microsoft.ServiceBus/namespaces", + "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", + "services": [ + "Entra", + "AzurePolicy", + "TrafficManager", + "RBAC", + "ServiceBus", + "WAF" + ], "severity": "Medium", - "subcategory": "Data catalog", - "text": "Follow Collection Architectures and best practices", - "waf": "Reliability" + "text": "Avoid using root account when it is not necessary", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", + "waf": "Security" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "b3d1325a-a225-4c6f-9e06-85edddea8a4b", - "link": "https://learn.microsoft.com/purview/concept-best-practices-asset-lifecycle", - "service": "Purview", - "services": [], + "arm-service": "Microsoft.ServiceBus/namespaces", + "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", + "services": [ + "Entra", + "AKV", + "Storage", + "VM", + "AppSvc", + "ServiceBus", + "WAF" + ], "severity": "Medium", - "subcategory": "Data catalog", - "text": "Follow Assest lifecycle best practices", - "waf": "Reliability" + "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" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "7cdeb3c6-1fc2-4fc1-9eea-6e69d8d9a3ed", - "link": "https://learn.microsoft.com/purview/concept-best-practices-automation", - "service": "Purview", - "services": [], - "severity": "Medium", - "subcategory": "Data catalog", - "text": "Follow automation best practices", - "waf": "Reliability" + "arm-service": "Microsoft.ServiceBus/namespaces", + "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", + "services": [ + "Storage", + "RBAC", + "Subscriptions", + "ServiceBus", + "WAF" + ], + "severity": "High", + "text": "Use least privilege data plane RBAC", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Security" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "c218e687-ab06-47ac-a49e-5b9603324ecf", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", + "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": [ - "Backup" + "Monitor", + "VNet", + "ServiceBus", + "WAF" ], "severity": "Medium", - "subcategory": "Data catalog", - "text": "Follow Backup and Migration Best practices", - "waf": "Reliability" + "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" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "8cc13318-da61-4170-869f-4fb4aa3d3ef7", - "link": "https://learn.microsoft.com/purview/concept-best-practices-glossary", - "service": "Purview", - "services": [], + "arm-service": "Microsoft.ServiceBus/namespaces", + "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", + "services": [ + "PrivateLink", + "ServiceBus", + "VNet", + "WAF" + ], "severity": "Medium", - "subcategory": "Data catalog", - "text": "Follow Purview Glossary Best Practices", - "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" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "f3176c4b-97b1-45b8-a219-a4abeb578790", - "link": "https://learn.microsoft.com/purview/concept-workflow", - "service": "Purview", - "services": [], - "severity": "Low", - "subcategory": "Data catalog", - "text": "Leverage Workflows ", - "waf": "Reliability" + "arm-service": "Microsoft.ServiceBus/namespaces", + "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", + "services": [ + "ServiceBus", + "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" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "24d22678-6d20-4b56-a56a-958119bf8d8e", - "link": "https://learn.microsoft.com/purview/concept-best-practices-security", - "service": "Purview", - "services": [], + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", + "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", + "service": "APIM", + "services": [ + "AzurePolicy", + "WAF" + ], "severity": "Medium", - "subcategory": "Data catalog", - "text": "Follow Purview Security Best Practices", - "waf": "Reliability" + "text": "Implement an error handling policy at the global level", + "waf": "Operations" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "5c586b7d-8cdc-415a-ac07-5ee9b130a888", - "link": "https://learn.microsoft.com/purview/concept-best-practices-lineage-azure-data-factory", - "service": "Purview", - "services": [], + "arm-service": "Microsoft.ApiManagement/service", + "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", + "services": [ + "AzurePolicy", + "WAF" + ], "severity": "Medium", - "subcategory": "Data Map", - "text": "Follow Purview Data Lineage Best Practices", - "waf": "Reliability" + "text": "Ensure all APIs policies include a element.", + "waf": "Operations" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "9579e76b-896e-4710-a7da-7be9956d14d3", - "link": "https://learn.microsoft.com/purview/concept-best-practices-scanning", - "service": "Purview", - "services": [], + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", + "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", + "service": "APIM", + "services": [ + "ACR", + "AzurePolicy", + "WAF" + ], "severity": "Medium", - "subcategory": "Data Map", - "text": "Follow Best Practices for Scanning Registered Sources", - "waf": "Reliability" + "text": "Use Policy Fragments to avoid repeating same policies definitions across multiple APIs", + "waf": "Operations" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "c49d997c-b3d1-4325-aa22-5c6f4e0685ed", - "link": "https://learn.microsoft.com/purview/concept-best-practices-classification", - "service": "Purview", - "services": [], + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", + "link": "https://learn.microsoft.com/azure/api-management/monetization-support", + "service": "APIM", + "services": [ + "WAF" + ], "severity": "Medium", - "subcategory": "Data Map", - "text": "Follow Classification Best Practices in Governance Portal", - "waf": "Reliability" + "text": "If you are planning to monetize your APIs, review the 'monetization support' article for best practices", + "waf": "Operations" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "ddea8a4b-7cde-4b3c-91fc-2fc14eea6e69", - "link": "https://learn.microsoft.com/purview/sensitivity-labels-frequently-asked-questions", - "service": "Purview", - "services": [], + "arm-service": "Microsoft.ApiManagement/service", + "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", + "services": [ + "Monitor", + "WAF" + ], + "severity": "High", + "text": "Enable Diagnostics Settings to export logs to Azure Monitor", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", + "service": "APIM", + "services": [ + "WAF" + ], "severity": "Medium", - "subcategory": "Data Map", - "text": "Perform Sensitivity Labelling in the Purview Data Map", - "waf": "Reliability" + "text": "Enable Application Insights for more detailed telemetry", + "waf": "Operations" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "d8d9a3ed-c218-4e68-9ab0-67acb49e5b96", - "link": "https://learn.microsoft.com/purview/concept-data-share", - "service": "Purview", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "Storage" + "Monitor", + "WAF" ], - "severity": "Low", - "subcategory": "Data Sharing", - "text": "Leverage Azure Storage in-place data sharing with Microsoft Purview", - "waf": "Reliability" + "severity": "High", + "text": "Configure alerts on the most critical metrics", + "waf": "Operations" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "03324ecf-8cc1-4331-ada6-1170269f4fb4", - "link": "https://learn.microsoft.com/purview/concept-insights", - "service": "Purview", - "services": [], - "severity": "Low", - "subcategory": "Data Estate", - "text": "Leverage Data Estate Insights", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "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", + "services": [ + "AKV", + "WAF" + ], + "severity": "High", + "text": "Ensure that custom SSL certificates are stored an Azure Key Vault so they can be securely accessed and updated", + "waf": "Security" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "aa3d3ef7-f317-46c4-a97b-15b8a219a4ab", - "link": "https://learn.microsoft.com/purview/catalog-adoption-insights", - "service": "Purview", - "services": [], - "severity": "Low", - "subcategory": "Data Estate", - "text": "Use Data stewardship and Catalog adoption", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "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", + "services": [ + "Entra", + "WAF" + ], + "severity": "High", + "text": "Protect incoming requests to APIs (data plane) with Azure AD", + "waf": "Security" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "eb578790-24d2-4267-a6d2-0b56c56a9581", - "link": "https://learn.microsoft.com/purview/concept-insights", - "service": "Purview", - "services": [], - "severity": "Low", - "subcategory": "Data Estate", - "text": "Use Inventory and Ownership", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", + "service": "APIM", + "services": [ + "Entra", + "WAF" + ], + "severity": "Medium", + "text": "Use Microsoft Entra ID to authenticate users in the Developer Portal", + "waf": "Security" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "19bf8d8e-5c58-46b7-b8cd-c15acc075ee9", - "link": "https://learn.microsoft.com/purview/glossary-insights", - "service": "Purview", - "services": [], - "severity": "Low", - "subcategory": "Data Estate", - "text": "Leverage Insights for Glossary, Classifications, Sensitivity Labels", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", + "service": "APIM", + "services": [ + "WAF" + ], + "severity": "Medium", + "text": "Create appropriate groups to control the visibility of the products", + "waf": "Security" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "b130a888-9579-4e76-a896-e710a7da7be9", - "link": "https://learn.microsoft.com/purview/compliance-manager", - "service": "Purview", - "services": [], + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "06862505-2d9a-4874-9491-2837b00a3475", + "link": "https://learn.microsoft.com/azure/api-management/backends", + "service": "APIM", + "services": [ + "WAF" + ], + "severity": "Medium", + "text": "Use Backends feature to eliminate redundant API backend configurations", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.ApiManagement/service", + "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", + "services": [ + "AzurePolicy", + "WAF" + ], + "severity": "Medium", + "text": "Use Named Values to store common values that can be used in policies", + "waf": "Operations" + }, + { + "arm-service": "Microsoft.ApiManagement/service", + "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", + "services": [ + "ACR", + "WAF" + ], "severity": "Medium", - "subcategory": "Data Quality ", - "text": "Generate assessment scores", + "text": "For DR, leverage the premium tier with deployments scaled across two or more regions for 99.99% SLA", "waf": "Reliability" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "956d14d3-c49d-4997-ab3d-1325aa225c6f", - "link": "https://learn.microsoft.com/purview/compliance-manager-scoring", - "service": "Purview", - "services": [], + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", + "link": "https://learn.microsoft.com/azure/api-management/high-availability", + "service": "APIM", + "services": [ + "WAF" + ], "severity": "Medium", - "subcategory": "Data Quality ", - "text": "Profiling- get summaries of data content", + "text": "Deploy at least one unit in two or more availability zones for an increased SLA of 99.99%", "waf": "Reliability" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "4e0685ed-ddea-48a4-a7cd-eb3c61fc2fc1", - "link": "https://learn.microsoft.com/purview/concept-policies-data-owner#microsoft-purview-policy-concepts", - "service": "Purview", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "AzurePolicy" + "Backup", + "WAF" ], - "severity": "Low", - "subcategory": "Data Policy", - "text": "Follow Microsoft Purview Data Owner access policies", + "severity": "High", + "text": "Ensure there is an automated backup routine", "waf": "Reliability" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "4eea6e69-d8d9-4a3e-bc21-8e687ab067ac", - "link": "https://learn.microsoft.com/purview/concept-self-service-data-access-policy", - "service": "Purview", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", + "link": "https://learn.microsoft.com/azure/api-management/retry-policy", + "service": "APIM", "services": [ - "AzurePolicy" + "AzurePolicy", + "WAF" ], - "severity": "Low", - "subcategory": "Data Policy", - "text": "Follow Self-service access policies", + "severity": "Medium", + "text": "Use Policies to add a fail-over backend URL and caching to reduce failing calls.", "waf": "Reliability" }, { - "category": "Operations management", - "checklist": "Microsoft Purview Review Checklist", - "guid": "b49e5b96-0332-44ec-b8cc-13318da61170", - "link": "https://learn.microsoft.com/purview/concept-policies-devops", - "service": "Purview", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "AzurePolicy" + "EventHubs", + "AzurePolicy", + "WAF" ], "severity": "Low", - "subcategory": "Data Policy", - "text": "Follow DevOps policies", - "waf": "Reliability" + "text": "If you need to log at high performance levels, consider Event Hubs policy", + "waf": "Operations" }, { - "category": "Application Deployment", - "checklist": "Azure AKS Review", - "guid": "785c2fa5-5b56-4ad4-a408-fe72734c476b", - "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/containers/aks/secure-baseline-aks", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", + "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", + "service": "APIM", "services": [ - "AKS" + "AzurePolicy", + "WAF" ], "severity": "Medium", - "subcategory": "Development", - "text": "Use canary or blue/green deployments", - "waf": "Operations" + "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" }, { - "category": "Application Deployment", - "checklist": "Azure AKS Review", - "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", - "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", - "service": "AKS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", + "service": "APIM", "services": [ - "AKS" + "WAF" ], - "severity": "Low", - "subcategory": "Development", - "text": "If required for AKS Windows workloads HostProcess containers can be used", - "waf": "Reliability" + "severity": "Medium", + "text": "Configure autoscaling to scale out the number of instances when the load increases", + "waf": "Performance" }, { - "category": "Application Deployment", - "checklist": "Azure AKS Review", - "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", - "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", - "service": "AKS", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "AKS" + "WAF" ], - "severity": "Low", - "subcategory": "Development", - "text": "Use KEDA if running event-driven workloads", + "severity": "Medium", + "text": "Deploy self-hosted gateways where Azure doesn't have a region close to the backend APIs.", "waf": "Performance" }, { - "category": "Application Deployment", - "checklist": "Azure AKS Review", - "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", - "link": "https://dapr.io/", - "service": "AKS", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "AKS" + "WAF" ], - "severity": "Low", - "subcategory": "Development", - "text": "Use Dapr to ease microservice development", - "waf": "Operations" + "severity": "Medium", + "text": "Use the premium tier for production workloads.", + "waf": "Reliability" }, { - "category": "Application Deployment", - "checklist": "Azure AKS Review", - "guid": "3acbe04b-be20-49d3-afda-47778424d116", - "link": "https://learn.microsoft.com/azure/developer/terraform/create-k8s-cluster-with-tf-and-aks", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "AKS" + "AzurePolicy", + "WAF" ], "severity": "Medium", - "subcategory": "Infrastructure as Code", - "text": "Use automation through ARM/TF to create your Azure resources", - "waf": "Operations" + "text": "In multi-region model, use Policies to route the requests to regional backends based on availability or latency.", + "waf": "Reliability" }, { - "category": "BC and DR", - "checklist": "Azure AKS Review", - "guid": "36cb45e5-7960-4332-9bdf-8cc23318da61", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/enterprise-scale/business-continuity-and-disaster-recovery", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "ASR", - "AKS" + "Entra", + "APIM", + "WAF" ], "severity": "High", - "subcategory": "Disaster Recovery", - "text": "Schedule and perform DR tests regularly", + "text": "Be aware of APIM's limits", "waf": "Reliability" }, { - "category": "BC and DR", - "checklist": "Azure AKS Review", - "guid": "170265f4-bb46-4a39-9af7-f317284797b1", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "TrafficManager", - "LoadBalancer", + "WAF" + ], + "severity": "High", + "text": "Ensure that the self-hosted gateway deployments are resilient.", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "7519e385-a88b-4d34-966b-6269d686e890", + "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", + "service": "APIM", + "services": [ + "Entra", + "APIM", "FrontDoor", - "AKS" + "WAF" ], "severity": "Medium", - "subcategory": "High Availability", - "text": "Use Azure Traffic Manager or Azure Front Door as a global load balancer for region failover", - "waf": "Reliability" + "text": "Use Azure Front Door in front of APIM for multi-region deployment", + "waf": "Performance" }, { - "category": "BC and DR", - "checklist": "Azure AKS Review", - "graph": "resources | where type=='microsoft.containerservice/managedclusters' | extend compliant= isnotnull(properties.agentPoolProfiles[0].availabilityZones) | distinct id,compliant", - "guid": "578a219a-46be-4b54-9350-24922634292b", - "link": "https://learn.microsoft.com/azure/aks/availability-zones", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "AKS" + "VNet", + "WAF" ], "severity": "Medium", - "subcategory": "High Availability", - "text": "Use Availability Zones if they are supported in your Azure region", - "waf": "Reliability" + "text": "Deploy the service within a Virtual Network (VNet)", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "AKS" + "Entra", + "APIM", + "Monitor", + "VNet", + "WAF" ], - "severity": "High", - "subcategory": "High Availability", - "text": "Use the SLA-backed AKS offering", - "waf": "Reliability" + "severity": "Medium", + "text": "Deploy network security groups (NSG) to your subnets to restrict or monitor traffic to/from APIM.", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Azure AKS Review", - "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "Cost", - "AKS" + "Entra", + "PrivateLink", + "APIM", + "VNet", + "WAF" ], - "severity": "Low", - "subcategory": "High Availability", - "text": "Use Disruption Budgets in your pod and deployment definitions", - "waf": "Reliability" + "severity": "Medium", + "text": "Deploy Private Endpoints to filter incoming traffic when APIM is not deployed to a VNet.", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Azure AKS Review", - "guid": "3c763963-7a55-42d5-a15e-401955387e5c", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", - "service": "ACR", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "ACR", - "AKS" + "WAF" ], "severity": "High", - "subcategory": "High Availability", - "text": "If using a private registry, configure region replication to store images in multiple regions", - "waf": "Reliability" + "text": "Disable Public Network Access", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Azure AKS Review", - "guid": "daa9a260-c3ea-4490-b077-5fc1f2a80cb0", - "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", + "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", + "service": "APIM", "services": [ - "Storage", - "ASR", - "AKS" + "WAF" ], - "severity": "High", - "subcategory": "Disaster Recovery", - "text": "Use Zone-Redundant Storage (ZRS) with stateful workloads", - "waf": "Reliability" + "severity": "Medium", + "text": "Simplify management with PowerShell automation scripts", + "waf": "Operations" }, { - "category": "BC and DR", - "checklist": "Azure AKS Review", - "guid": "bc14aea6-e65d-48d9-a3ad-c218e6436b06", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/enterprise-scale/business-continuity-and-disaster-recovery", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "AKS" + "Entra", + "APIM", + "WAF" ], - "severity": "High", - "subcategory": "Requirements", - "text": "Define non-functional requirements such as SLAs, RTO (Recovery Time Objective) and RPO (Recovery Point Objective).", - "waf": "Reliability" + "severity": "Medium", + "text": "Configure APIM via Infrastructure-as-code. Review DevOps best practices from the Cloud Adaption Framework APIM Landing Zone Accelerator", + "waf": "Operations" }, { - "category": "Cost Governance", - "checklist": "Azure AKS Review", - "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", - "service": "AKS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", + "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", + "service": "APIM", "services": [ - "Cost", - "AKS" + "Entra", + "APIM", + "WAF" ], - "severity": "Low", - "subcategory": "Cost", - "text": "Use an external application such as kubecost to allocate costs to different users", - "waf": "Cost" + "severity": "Medium", + "text": "Promote usage of Visual Studio Code APIM extension for faster API development", + "waf": "Operations" }, { - "category": "Cost Governance", - "checklist": "Azure AKS Review", - "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", - "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", - "service": "AKS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "354f1c03-8112-4965-85ad-c0074bddf231", + "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", + "service": "APIM", "services": [ - "Cost", - "AKS" + "WAF" ], - "severity": "Low", - "subcategory": "Cost", - "text": "Use scale down mode to delete/deallocate nodes", - "waf": "Cost" + "severity": "Medium", + "text": "Implement DevOps and CI/CD in your workflow", + "waf": "Operations" }, { - "category": "Cost Governance", - "checklist": "Azure AKS Review", - "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", - "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", - "service": "AKS", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "Cost", - "AKS" + "WAF" ], "severity": "Medium", - "subcategory": "Cost", - "text": "When required use multi-instance partitioning GPU on AKS Clusters", - "waf": "Cost" + "text": "Secure APIs using client certificate authentication", + "waf": "Security" }, { - "category": "Cost Governance", - "checklist": "Azure AKS Review", - "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", - "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", - "service": "AKS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "2a67d143-1033-4c0a-8732-680896478f08", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", + "service": "APIM", "services": [ - "Cost", - "AKS" + "WAF" ], - "severity": "Low", - "subcategory": "Cost", - "text": "If running a Dev/Test cluster use NodePool Start/Stop", - "waf": "Cost" + "severity": "Medium", + "text": "Secure backend services using client certificate authentication", + "waf": "Security" }, { - "category": "Governance and Security", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", + "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", + "service": "APIM", "services": [ - "AzurePolicy", - "AKS" + "WAF" ], "severity": "Medium", - "subcategory": "Compliance", - "text": "Use Azure Policy for Kubernetes to ensure cluster compliance", + "text": "Review 'Recommendations to mitigate OWASP API Security Top 10 threats' article and check what is applicable to your APIs", "waf": "Security" }, { - "category": "Governance and Security", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "WAF checklist", + "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", + "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", + "service": "APIM", "services": [ - "AKS" + "WAF" ], "severity": "Medium", - "subcategory": "Compliance", - "text": "Separate applications from the control plane with user/system node pools", + "text": "Use Authorizations feature to simplify management of OAuth 2.0 token for your backend APIs", "waf": "Security" }, { - "category": "Governance and Security", - "checklist": "Azure AKS Review", - "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", - "link": "https://learn.microsoft.com/azure/aks/use-system-pools", - "service": "AKS", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "AKS" + "WAF" ], - "severity": "Low", - "subcategory": "Compliance", - "text": "Add taint to your system nodepool to make it dedicated", + "severity": "High", + "text": "Use the latest TLS version when encrypting information in transit. Disable outdated and unnecessary protocols and ciphers when possible.", "waf": "Security" }, { - "category": "Governance and Security", - "checklist": "Azure AKS Review", - "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", - "link": "https://learn.microsoft.com/azure/container-registry/", - "service": "AKS", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "ACR", - "AKS" + "AKV", + "WAF" ], - "severity": "Medium", - "subcategory": "Compliance", - "text": "Use a private registry for your images, such as ACR", + "severity": "High", + "text": "Ensure that secrets (Named values) are stored an Azure Key Vault so they can be securely accessed and updated", "waf": "Security" }, { - "category": "Governance and Security", - "checklist": "Azure AKS Review", - "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", - "link": "https://learn.microsoft.com/azure/security-center/container-security", - "service": "ACR", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "AKS" + "Entra", + "WAF" ], "severity": "Medium", - "subcategory": "Compliance", - "text": "Scan your images for vulnerabilities", + "text": "Use managed identities to authenticate to other Azure resources whenever possible", "waf": "Security" }, { - "category": "Governance and Security", - "checklist": "Azure AKS Review", - "guid": "cc639637-a652-42ac-89e8-06965388e9de", - "link": "https://learn.microsoft.com/azure/security-center/container-security", + "arm-service": "Microsoft.ApiManagement/service", + "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", "services": [ - "Defender", - "AKS" + "Entra", + "APIM", + "AppGW", + "WAF" ], - "severity": "Medium", - "subcategory": "Compliance", - "text": "Use Azure Security Center to detect security posture vulnerabilities", + "severity": "High", + "text": "Use web application firewall (WAF) by deploying Application Gateway in front of APIM", "waf": "Security" }, { - "category": "Governance and Security", - "checklist": "Azure AKS Review", - "guid": "42d4aefe-2383-470e-b019-c30df24996b2", - "link": "https://learn.microsoft.com/azure/aks/use-multiple-node-pools#add-a-fips-enabled-node-pool", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKS" + "WAF" ], "severity": "Low", - "subcategory": "Compliance", - "text": "If required configure FIPS", - "waf": "Security" + "text": "Refer to baseline highly available zone-redundant web application architecture for best practices", + "waf": "Reliability" }, { - "category": "Governance and Security", - "checklist": "Azure AKS Review", - "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKS" + "Backup", + "WAF" + ], + "severity": "Medium", + "text": "Use Premium and Standard tiers. These tiers support staging slots and automated backups.", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.web/sites", + "checklist": "WAF checklist", + "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", + "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", + "service": "App Services", + "services": [ + "WAF" ], "severity": "High", - "subcategory": "Compliance", - "text": "Define app separation requirements (namespace/nodepool/cluster)", - "waf": "Security" + "text": "Leverage Availability Zones where regionally applicable (requires Premium v2 or v3 tier)", + "waf": "Reliability" }, { - "category": "Governance and Security", - "checklist": "Azure AKS Review", - "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", - "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKV", - "AKS" + "WAF" ], "severity": "Medium", - "subcategory": "Secrets", - "text": "Store your secrets in Azure Key Vault with the CSI Secrets Store driver", - "waf": "Security" + "text": "Implement health checks", + "waf": "Reliability" }, { - "category": "Governance and Security", - "checklist": "Azure AKS Review", - "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", - "link": "https://learn.microsoft.com/azure/aks/update-credentials", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "checklist": "WAF checklist", + "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", + "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", + "service": "App Services", "services": [ - "AKV", - "AKS" + "AppSvc", + "Backup", + "WAF" ], "severity": "High", - "subcategory": "Secrets", - "text": "If using Service Principals for the cluster, refresh credentials periodically (like quarterly)", - "waf": "Security" + "text": "Refer to backup and restore best practices for Azure App Service", + "waf": "Reliability" }, { - "category": "Governance and Security", - "checklist": "Azure AKS Review", - "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", - "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKV", - "AKS" + "AppSvc", + "WAF" ], - "severity": "Medium", - "subcategory": "Secrets", - "text": "If required add Key Management Service etcd encryption", - "waf": "Security" + "severity": "High", + "text": "Implement Azure App Service reliability best practices", + "waf": "Reliability" }, { - "category": "Governance and Security", - "checklist": "Azure AKS Review", - "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", - "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKV", - "AKS" + "AppSvc", + "WAF" ], "severity": "Low", - "subcategory": "Secrets", - "text": "If required consider using Confidential Compute for AKS", - "waf": "Security" + "text": "Familiarize with how to move an App Service app to another region During a disaster", + "waf": "Reliability" }, { - "category": "Governance and Security", - "checklist": "Azure AKS Review", - "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", - "service": "AKS", + "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": [ - "Defender", - "AKV", - "AKS" + "AppSvc", + "WAF" ], - "severity": "Medium", - "subcategory": "Secrets", - "text": "Consider using Defender for Containers", - "waf": "Security" + "severity": "High", + "text": "Familiarize with reliability support in Azure App Service", + "waf": "Reliability" }, { - "category": "Identity and Access Management", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "Entra", - "AKS" + "AppSvc", + "WAF" ], - "severity": "High", - "subcategory": "Identity", - "text": "Use managed identities instead of Service Principals", - "waf": "Security" + "severity": "Medium", + "text": "Ensure \"Always On\" is enabled for Function Apps running on a app service plan", + "waf": "Reliability" }, { - "category": "Identity and Access Management", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "Entra", - "AKS" + "AppSvc", + "Monitor", + "WAF" ], "severity": "Medium", - "subcategory": "Identity", - "text": "Integrate authentication with AAD (using the managed integration)", - "waf": "Security" + "text": "Monitor App Service instances using Health checks", + "waf": "Reliability" }, { - "category": "Identity and Access Management", - "checklist": "Azure AKS Review", - "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", - "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "Entra", - "AKS" + "Monitor", + "WAF" ], "severity": "Medium", - "subcategory": "Identity", - "text": "Limit access to admin kubeconfig (get-credentials --admin)", - "waf": "Security" + "text": "Monitor availability and responsiveness of web app or website using Application Insights availability tests", + "waf": "Reliability" }, { - "category": "Identity and Access Management", - "checklist": "Azure AKS Review", - "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", - "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "RBAC", - "Entra", - "AKS" + "Monitor", + "WAF" ], - "severity": "Medium", - "subcategory": "Identity", - "text": "Integrate authorization with AAD RBAC", - "waf": "Security" + "severity": "Low", + "text": "Use Application Insights Standard test to monitor availability and responsiveness of web app or website", + "waf": "Reliability" }, { - "category": "Identity and Access Management", - "checklist": "Azure AKS Review", - "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "RBAC", - "Entra", - "AKS" + "AKV", + "AppSvc", + "WAF" ], "severity": "High", - "subcategory": "Identity", - "text": "Use namespaces for restricting RBAC privilege in Kubernetes", + "text": "Use Key Vault to store secrets", "waf": "Security" }, { - "category": "Identity and Access Management", - "checklist": "Azure AKS Review", - "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", - "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ "Entra", - "AKS" + "AKV", + "AppSvc", + "WAF" ], - "severity": "Medium", - "subcategory": "Identity", - "text": "For Pod Identity Access Management use Azure AD Workload Identity (preview)", + "severity": "High", + "text": "Use Managed Identity to connect to Key Vault", "waf": "Security" }, { - "category": "Identity and Access Management", - "checklist": "Azure AKS Review", - "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", - "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "Entra", - "AKS" + "AKV", + "AppSvc", + "WAF" ], - "severity": "Medium", - "subcategory": "Identity", - "text": "For AKS non-interactive logins use kubelogin (preview)", + "severity": "High", + "text": "Use Key Vault to store TLS certificate.", "waf": "Security" }, { - "category": "Identity and Access Management", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "Entra", - "AKS" + "AppSvc", + "Subscriptions", + "WAF" ], "severity": "Medium", - "subcategory": "Identity", - "text": "Disable AKS local accounts", + "text": "Isolate systems that process sensitive information", "waf": "Security" }, { - "category": "Identity and Access Management", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "Entra", - "AKS" + "AppSvc", + "TrafficManager", + "WAF" ], - "severity": "Low", - "subcategory": "Identity", - "text": "Configure if required Just-in-time cluster access", + "severity": "Medium", + "text": "Do not store sensitive data on local disk", "waf": "Security" }, { - "category": "Identity and Access Management", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.web/sites", + "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", "services": [ "Entra", - "AKS" + "AppSvc", + "WAF" ], - "severity": "Low", - "subcategory": "Identity", - "text": "Configure if required AAD conditional access for AKS", + "severity": "Medium", + "text": "Use an established Identity Provider for authentication", "waf": "Security" }, { - "category": "Identity and Access Management", - "checklist": "Azure AKS Review", - "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", - "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "Entra", - "AKS" + "AppSvc", + "WAF" ], - "severity": "Low", - "subcategory": "Identity", - "text": "If required for Windows AKS workloads configure gMSA ", + "severity": "High", + "text": "Deploy from a trusted environment", "waf": "Security" }, { - "category": "Identity and Access Management", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.web/sites", + "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", "services": [ "Entra", - "AKS" + "WAF" ], - "severity": "Medium", - "subcategory": "Identity", - "text": "For finer control consider using a managed Kubelet Identity", + "severity": "High", + "text": "Disable basic authentication", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", - "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "ACR", - "AppGW", - "AKS" + "Entra", + "AKV", + "WAF" ], - "severity": "Medium", - "subcategory": "Best practices", - "text": "If using AGIC, do not share an AppGW across clusters", - "waf": "Reliability" + "severity": "High", + "text": "Use Managed Identity to connect to resources", + "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKS" + "Entra", + "ACR", + "WAF" ], "severity": "High", - "subcategory": "Best practices", - "text": "Do not use AKS HTTP Routing Add-On, use instead the managed NGINX ingress with the application routing add-on.", - "waf": "Reliability" + "text": "Pull containers using a Managed Identity", + "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKS" + "Entra", + "AppSvc", + "Monitor", + "WAF" ], "severity": "Medium", - "subcategory": "Best practices", - "text": "For Windows workloads use Accelerated Networking", - "waf": "Performance" - }, - { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "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": [ - "LoadBalancer", - "AKS" - ], - "severity": "High", - "subcategory": "Best practices", - "text": "Use the standard ALB (as opposed to the basic one)", - "waf": "Reliability" + "text": "Send App Service runtime logs to Log Analytics", + "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "VNet", - "AKS" + "Entra", + "AppSvc", + "Monitor", + "WAF" ], "severity": "Medium", - "subcategory": "Best practices", - "text": "If using Azure CNI, consider using different Subnets for NodePools", + "text": "Send App Service activity logs to Log Analytics", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", - "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "PrivateLink", - "Cost", + "NVA", + "Monitor", "VNet", - "AKS" + "Firewall", + "WAF" ], "severity": "Medium", - "subcategory": "Cost", - "text": "Use Private Endpoints (preferred) or Virtual Network Service Endpoints to access PaaS services from the cluster", + "text": "Outbound network access should be controlled", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "guid": "e8a03f97-8794-468d-96a7-86d60f96c97b", - "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "VPN", - "AKS" + "PrivateLink", + "Storage", + "NVA", + "VNet", + "Firewall", + "WAF" ], - "severity": "Medium", - "subcategory": "HA", - "text": "If hybrid connectivity is required, use 2xER or ER+VPN for better availability", - "waf": "Reliability" + "severity": "Low", + "text": "Ensure a stable IP for outbound communications towards internet addresses", + "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKS" + "PrivateLink", + "AppSvc", + "WAF" ], "severity": "High", - "subcategory": "IPAM", - "text": "Choose the best CNI network plugin for your requirements (Azure CNI recommended)", - "waf": "Reliability" + "text": "Inbound network access should be controlled", + "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "VNet", - "AKS" + "AppGW", + "FrontDoor", + "Monitor", + "AppSvc", + "WAF" ], "severity": "High", - "subcategory": "IPAM", - "text": "If using Azure CNI, size your subnet accordingly considering the maximum number of pods per node", - "waf": "Performance" + "text": "Use a WAF in front of App Service", + "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKS" + "PrivateLink", + "WAF" ], "severity": "High", - "subcategory": "IPAM", - "text": "If using Azure CNI, check the maximum pods/node (default 30)", - "waf": "Performance" + "text": "Avoid for WAF to be bypassed", + "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "VNet", - "AKS" + "AppSvc", + "AzurePolicy", + "WAF" ], - "severity": "Low", - "subcategory": "IPAM", - "text": "If using private-IP LoadBalancer services, use a dedicated subnet (not the AKS subnet)", + "severity": "Medium", + "text": "Set minimum TLS policy to 1.2", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKS" + "AppSvc", + "WAF" ], "severity": "High", - "subcategory": "IPAM", - "text": "Size the service IP address range accordingly (it is going to limit the cluster scalability)", - "waf": "Reliability" + "text": "Use HTTPS only", + "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", - "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKS" + "Storage", + "WAF" ], - "severity": "Low", - "subcategory": "Operations", - "text": "If required add your own CNI plugin", + "severity": "High", + "text": "Wildcards must not be used for CORS", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKS" + "WAF" ], - "severity": "Low", - "subcategory": "Operations", - "text": "If required configure Public IP per node in AKS", - "waf": "Performance" + "severity": "High", + "text": "Turn off remote debugging", + "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", - "link": "https://learn.microsoft.com/azure/aks/concepts-network", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKS" + "AppSvc", + "Defender", + "WAF" ], "severity": "Medium", - "subcategory": "Scalability", - "text": "Use an ingress controller to expose web-based apps instead of exposing them with LoadBalancer-type services", - "waf": "Reliability" + "text": "Enable Defender for Cloud - Defender for App Service", + "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", - "link": "https://learn.microsoft.com/azure/aks/nat-gateway", - "service": "AKS", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKS" + "AppGW", + "DDoS", + "NVA", + "EventHubs", + "VNet", + "WAF" ], - "severity": "Low", - "subcategory": "Scalability", - "text": "Use Azure NAT Gateway as outboundType for scaling egress traffic", - "waf": "Reliability" + "severity": "Medium", + "text": "Enable DDOS Protection Standard on the WAF VNet", + "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKS" + "PrivateLink", + "ACR", + "VNet", + "WAF" ], "severity": "Medium", - "subcategory": "Scalability", - "text": "Use Dynamic allocations of IPs in order to avoid Azure CNI IP exhaustion", - "waf": "Reliability" + "text": "Pull containers over a Virtual Network", + "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "NVA", - "AKS" + "WAF" ], - "severity": "High", - "subcategory": "Security", - "text": "Filter egress traffic with AzFW/NVA if your security requirements mandate it", + "severity": "Medium", + "text": "Conduct a penetration test", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKS" + "WAF" ], "severity": "Medium", - "subcategory": "Security", - "text": "If using a public API endpoint, restrict the IP addresses that can access it", + "text": "Deploy validated code", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.web/sites", + "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", "services": [ - "AKS" + "WAF" ], "severity": "High", - "subcategory": "Security", - "text": "Use private clusters if your requirements mandate it", + "text": "Use up-to-date platforms, languages, protocols and frameworks", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "WAF checklist", + "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", + "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", + "service": "Azure MySQL", "services": [ - "AzurePolicy", - "AKS" + "WAF" ], "severity": "Medium", - "subcategory": "Security", - "text": "For Windows 2019 and 2022 AKS nodes Calico Network Policies can be used ", - "waf": "Security" + "text": "Leverage Flexible Server", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.DBforMySQL/servers", + "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", "services": [ - "AzurePolicy", - "AKS" + "WAF" ], "severity": "High", - "subcategory": "Security", - "text": "Enable a Kubernetes Network Policy option (Calico/Azure)", - "waf": "Security" + "text": "Leverage Availability Zones where regionally applicable", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", + "arm-service": "Microsoft.DBforMySQL/servers", + "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", "services": [ - "AzurePolicy", - "AKS" + "WAF" ], - "severity": "High", - "subcategory": "Security", - "text": "Use Kubernetes network policies to increase intra-cluster security", - "waf": "Security" + "severity": "Medium", + "text": "Leverage Data-in replication for cross-region DR scenarios", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", + "arm-service": "Microsoft.Kusto/clusters", + "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", "services": [ - "WAF", - "AKS" + "Storage", + "Cost", + "WAF" ], - "severity": "High", - "subcategory": "Security", - "text": "Use a WAF for web workloads (UIs or APIs)", - "waf": "Security" + "text": "Leverage External Tables and Continuous data export overview to reduce costs", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Kusto/clusters", + "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", "services": [ - "DDoS", - "VNet", - "AKS" + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Security", - "text": "Use DDoS Standard in the AKS Virtual Network", - "waf": "Security" + "text": "To share data, explore Leader-follower cluster configuration", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Kusto/clusters", + "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", "services": [ - "AKS" + "ASR", + "WAF" ], - "severity": "Low", - "subcategory": "Security", - "text": "If required add company HTTP Proxy", - "waf": "Security" + "text": "To protect against regional failure, create Multiple independent clusters, preferably in two Azure Paired regions", + "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure AKS Review", - "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", - "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", - "service": "AKS", + "arm-service": "Microsoft.Kusto/clusters", + "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", "services": [ - "AKS" + "RBAC", + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Security", - "text": "Consider using a service mesh for advanced microservice communication management", - "waf": "Security" + "text": "Replicate all management activities such as creating new tables or managing user roles on each cluster.", + "waf": "Reliability" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", - "service": "AKS", + "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", "services": [ - "Monitor", - "AKS" + "WAF" ], - "severity": "High", - "subcategory": "Alerting", - "text": "Configure alerts on the most critical metrics (see Container Insights for recommendations)", - "waf": "Operations" + "text": "Ingest data into each cluster in parallel", + "waf": "Reliability" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "337453a3-cc63-4963-9a65-22ac19e80696", - "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", - "service": "AKS", + "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", + "services": [ + "ACR", + "WAF" + ], + "text": "For critical application with no tolerance for outages, create Active-Active-Active (always-on) configuration", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Kusto/clusters", + "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", + "services": [ + "ACR", + "WAF" + ], + "text": "For critical applications, create Active-Active configuration in two paired regions", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Kusto/clusters", + "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", "services": [ - "Entra", - "AKS" + "WAF" ], - "severity": "Low", - "subcategory": "Compliance", - "text": "Check regularly Azure Advisor for recommendations on your cluster", - "waf": "Operations" + "text": "For applications, which required only read during failure, create Active-Hot standby configuration", + "waf": "Reliability" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", - "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", - "service": "AKS", + "arm-service": "Microsoft.Kusto/clusters", + "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", "services": [ - "AKS" + "Storage", + "ASR", + "AzurePolicy", + "Cost", + "WAF" ], - "severity": "Low", - "subcategory": "Compliance", - "text": "Enable AKS auto-certificate rotation", - "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", - "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", - "service": "AKS", + "arm-service": "Microsoft.Kusto/clusters", + "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", "services": [ - "AKS" + "AzurePolicy", + "WAF" ], - "severity": "High", - "subcategory": "Compliance", - "text": "Have a regular process to upgrade your kubernetes version periodically (quarterly, for example), or use the AKS autoupgrade feature", - "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", - "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", - "service": "AKS", + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "WAF checklist", + "guid": "1559ab91-53e8-4908-ae28-b84c33b6b780", + "link": "https://learn.microsoft.com/azure/data-explorer/devops", + "service": "Azure Data Explorer", "services": [ - "AKS" + "WAF" ], - "severity": "High", - "subcategory": "Compliance", - "text": "Use kured for Linux node upgrades in case you are not using node-image upgrade", - "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", - "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", - "service": "AKS", + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "WAF checklist", + "guid": "8b9fe5c4-1049-4d40-9a82-2c3474d00f18", + "link": "https://learn.microsoft.com/azure/data-explorer/devops", + "service": "Azure Data Explorer", "services": [ - "AKS" + "WAF" ], - "severity": "High", - "subcategory": "Compliance", - "text": "Have a regular process to upgrade the cluster node images periodically (weekly, for example)", - "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", - "service": "AKS", + "arm-service": "microsoft.cache/redis", + "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", "services": [ - "AKS" + "ACR", + "WAF" ], - "severity": "Low", - "subcategory": "Compliance", - "text": "Consider gitops to deploy applications or cluster configuration to multiple clusters", - "waf": "Operations" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "d7672c26-7602-4482-85a4-14527fbe855c", - "link": "https://learn.microsoft.com/azure/aks/command-invoke", - "service": "AKS", + "arm-service": "microsoft.cache/redis", + "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", "services": [ - "AKS" + "Storage", + "WAF" ], - "severity": "Low", - "subcategory": "Compliance", - "text": "Consider using AKS command invoke on private clusters", - "waf": "Operations" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", - "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", - "service": "AKS", + "arm-service": "microsoft.cache/redis", + "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", "services": [ - "AKS" + "Storage", + "WAF" ], - "severity": "Low", - "subcategory": "Compliance", - "text": "For planned events consider using Node Auto Drain", - "waf": "Operations" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", - "link": "https://learn.microsoft.com/azure/aks/faq", - "service": "AKS", + "arm-service": "microsoft.cache/redis", + "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", "services": [ - "AKS" + "ASR", + "WAF" ], - "severity": "High", - "subcategory": "Compliance", - "text": "Develop own governance practices to make sure no changes are performed by operators in the node RG (aka 'infra RG')", - "waf": "Operations" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "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", + "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": [ - "AKS" + "EventHubs", + "WAF" ], "severity": "Low", - "subcategory": "Compliance", - "text": "Use custom Node RG (aka 'Infra RG') name", - "waf": "Operations" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", - "link": "https://kubernetes.io/docs/setup/release/notes/", - "service": "AKS", + "arm-service": "microsoft.eventhub/namespaces", + "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", "services": [ - "AKS" + "EventHubs", + "WAF" ], "severity": "Medium", - "subcategory": "Compliance", - "text": "Do not use deprecated Kubernetes APIs in your YAML manifests", - "waf": "Operations" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", - "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", - "service": "AKS", + "arm-service": "microsoft.eventhub/namespaces", + "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", "services": [ - "AKS" + "Entra", + "AzurePolicy", + "RBAC", + "TrafficManager", + "EventHubs", + "WAF" ], - "severity": "Low", - "subcategory": "Compliance", - "text": "Taint Windows nodes", - "waf": "Operations" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.eventhub/namespaces", + "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", "services": [ - "AKS" + "Entra", + "AKV", + "Storage", + "VM", + "EventHubs", + "WAF" ], - "severity": "Low", - "subcategory": "Compliance", - "text": "Keep windows containers patch level in sync with host patch level", - "waf": "Operations" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.eventhub/namespaces", + "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", "services": [ - "Monitor", - "AKS" + "RBAC", + "EventHubs", + "WAF" ], - "severity": "Low", - "subcategory": "Compliance", - "text": "Send master logs (aka API logs) to Azure Monitor or your preferred log management solution", - "waf": "Operations" + "severity": "High", + "text": "Use least privilege data plane RBAC", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Security" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", - "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", - "service": "AKS", + "arm-service": "microsoft.eventhub/namespaces", + "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", "services": [ - "AKS" + "EventHubs", + "Monitor", + "VNet", + "WAF" ], - "severity": "Low", - "subcategory": "Compliance", - "text": "If required use nodePool snapshots", - "waf": "Cost" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", - "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", - "service": "AKS", + "arm-service": "microsoft.eventhub/namespaces", + "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", "services": [ - "Cost", - "AKS" + "PrivateLink", + "EventHubs", + "VNet", + "WAF" ], - "severity": "Low", - "subcategory": "Cost", - "text": "Consider spot node pools for non time-sensitive workloads", - "waf": "Operations" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.eventhub/namespaces", + "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", "services": [ - "Cost", - "AKS" + "EventHubs", + "WAF" ], - "severity": "Low", - "subcategory": "Cost", - "text": "Consider AKS virtual node for quick bursting", - "waf": "Operations" + "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/", + "waf": "Security" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", - "service": "AKS", + "arm-service": "microsoft.eventhub/namespaces", + "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", "services": [ - "Monitor", - "AKS" + "WAF" ], - "severity": "High", - "subcategory": "Monitoring", - "text": "Monitor your cluster metrics with Container Insights (or other tools like Prometheus)", - "waf": "Operations" + "severity": "Medium", + "text": "Leverage FTA Resillency HandBook", + "waf": "Reliability" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.eventhub/namespaces", + "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", "services": [ - "Monitor", - "AKS" + "EventHubs", + "ACR", + "WAF" ], "severity": "High", - "subcategory": "Monitoring", - "text": "Store and analyze your cluster logs with Container Insights (or other tools like Telegraf/ElasticSearch)", - "waf": "Operations" + "text": "Leverage Availability Zones if regionally applicable", + "waf": "Reliability" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", - "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", - "service": "AKS", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "WAF checklist", + "guid": "20b56c56-ad58-4519-8f82-735c586bb281", + "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", + "service": "Event Hubs", "services": [ - "Monitor", - "AKS" + "WAF" ], "severity": "Medium", - "subcategory": "Monitoring", - "text": "Monitor CPU and memory utilization of the nodes", - "waf": "Operations" + "text": "Use the Premium or Dedicated SKUs for predicable performance", + "waf": "Reliability" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "1a4835ac-9422-423e-ae80-b123081a5417", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "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": [ - "Monitor", - "AKS" + "EventHubs", + "ASR", + "WAF" ], - "severity": "Medium", - "subcategory": "Monitoring", - "text": "If using Azure CNI, monitor % of pod IPs consumed per node", - "waf": "Operations" + "severity": "High", + "text": "Plan for Geo Disaster Recovery using Active Passive configuration", + "waf": "Reliability" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.eventhub/namespaces", + "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", "services": [ - "Storage", - "Monitor", "EventHubs", - "AKS", - "ServiceBus" + "ASR", + "WAF" ], "severity": "Medium", - "subcategory": "Monitoring", - "text": "Monitor OS disk queue depth in nodes", - "waf": "Operations" + "text": "For Business Critical Applications, use Active Active configuration", + "waf": "Reliability" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "be209d39-fda4-4777-a424-d116785c2fa5", - "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", - "service": "AKS", + "arm-service": "microsoft.eventhub/namespaces", + "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", "services": [ - "NVA", - "LoadBalancer", - "Monitor", - "AKS" + "EventHubs", + "WAF" ], "severity": "Medium", - "subcategory": "Monitoring", - "text": "If not using egress filtering with AzFW/NVA, monitor standard ALB allocated SNAT ports", - "waf": "Operations" + "text": "Design Resilient Event Hubs", + "waf": "Reliability" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", - "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", + "service": "AVS", + "services": [ + "Entra", + "Subscriptions", + "WAF" + ], + "severity": "High", + "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": "75089c20-990d-4927-b105-885576f76fc2", + "service": "AVS", "services": [ - "Monitor", - "AKS" + "AVS", + "WAF" ], "severity": "Medium", - "subcategory": "Monitoring", - "text": "Subscribe to resource health notifications for your AKS cluster", - "waf": "Operations" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", + "service": "AVS", "services": [ - "AKS" + "WAF" ], "severity": "High", - "subcategory": "Resources", - "text": "Configure requests and limits in your pod specs", - "waf": "Operations" + "text": "Ensure that vCenter is connected to ADDS to enable authentication based on 'named user accounts'", + "waf": "Security" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "769ef669-1a48-435a-a942-223ece80b123", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", + "service": "AVS", "services": [ - "AKS" + "WAF" ], "severity": "Medium", - "subcategory": "Resources", - "text": "Enforce resource quotas for namespaces", - "waf": "Operations" + "text": "Ensure that the connection from vCenter to ADDS is using a secure protocol (LDAPS)", + "waf": "Security" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "081a5417-4158-433e-a3ad-3c2de733165c", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", + "service": "AVS", "services": [ - "Subscriptions", - "AKS" + "WAF" ], - "severity": "High", - "subcategory": "Resources", - "text": "Ensure your subscription has enough quota to scale out your nodepools", - "waf": "Operations" + "severity": "Medium", + "text": "CloudAdmin account in vCenter IdP is used only as an emergency account (break-glass)", + "waf": "Security" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "f4fd0602-7ab5-46f1-b66a-e9dea9654a65", - "link": "https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", + "service": "AVS", "services": [ - "AKS" + "Entra", + "WAF" ], "severity": "High", - "subcategory": "Resources", - "text": "Configure Liveness and Readiness probes for all deployments", - "waf": "Operations" + "text": "Ensure that NSX-Manager is integrated with an external Identity provider (LDAPS)", + "waf": "Security" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", + "service": "AVS", "services": [ - "AKS" + "RBAC", + "AVS", + "WAF" ], "severity": "Medium", - "subcategory": "Scalability", - "text": "Use the Cluster Autoscaler", - "waf": "Performance" + "text": "Has an RBAC model been created for use within VMware vSphere", + "waf": "Security" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", + "service": "AVS", "services": [ - "AKS" + "RBAC", + "WAF" ], - "severity": "Low", - "subcategory": "Scalability", - "text": "Customize node configuration for AKS node pools", - "waf": "Performance" + "severity": "Medium", + "text": "RBAC permissions should be granted on ADDS groups and not on specific users", + "waf": "Security" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", - "link": "https://learn.microsoft.com/azure/aks/concepts-scale", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", + "service": "AVS", "services": [ - "AKS" + "RBAC", + "AVS", + "WAF" ], - "severity": "Medium", - "subcategory": "Scalability", - "text": "Use the Horizontal Pod Autoscaler when required", - "waf": "Performance" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", + "service": "AVS", "services": [ - "AKS" + "RBAC", + "WAF" ], "severity": "High", - "subcategory": "Scalability", - "text": "Consider an appropriate node size, not too large or too small", - "waf": "Performance" + "text": "Ensure all custom roles are scoped with CloudAdmin permitted authorizations", + "waf": "Security" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", - "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", + "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", + "service": "AVS", "services": [ - "AKS" + "AVS", + "WAF" ], - "severity": "Low", - "subcategory": "Scalability", - "text": "If more than 5000 nodes are required for scalability then consider using an additional AKS cluster", + "severity": "High", + "text": "Is the correct Azure VMware Solution connectivity model selected for the customer use case at hand", "waf": "Performance" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", - "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", + "service": "AVS", "services": [ - "AKS" + "NetworkWatcher", + "VPN", + "Monitor", + "ExpressRoute", + "WAF" ], - "severity": "Low", - "subcategory": "Scalability", - "text": "Consider subscribing to EventGrid Events for AKS automation", - "waf": "Performance" + "severity": "High", + "text": "Ensure ExpressRoute or VPN connections from on-premises to Azure are monitored using 'connection monitor'", + "waf": "Operations" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", - "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", + "service": "AVS", "services": [ - "AKS" + "NetworkWatcher", + "AVS", + "VM", + "Monitor", + "ExpressRoute", + "WAF" ], - "severity": "Low", - "subcategory": "Scalability", - "text": "For long running operation on an AKS cluster consider event termination", - "waf": "Performance" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", - "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", + "service": "AVS", "services": [ - "AKS" + "NetworkWatcher", + "AVS", + "VM", + "Monitor", + "WAF" ], - "severity": "Low", - "subcategory": "Scalability", - "text": "If required consider using Azure Dedicated Hosts for AKS nodes", - "waf": "Performance" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", + "service": "AVS", "services": [ - "Storage", - "AKS" + "ARS", + "WAF" ], "severity": "High", - "subcategory": "Storage", - "text": "Use ephemeral OS disks", - "waf": "Performance" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", - "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", + "service": "AVS", "services": [ - "Storage", - "AKS" + "Entra", + "RBAC", + "AVS", + "WAF" ], "severity": "High", - "subcategory": "Storage", - "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": "Is Privileged Identity Management implemented for roles managing the Azure VMware Solution resource in the Azure Portal (no standing permissions allowed)", + "waf": "Security" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", - "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", + "service": "AVS", "services": [ - "Storage", - "AKS" + "Entra", + "RBAC", + "AVS", + "WAF" ], - "severity": "Low", - "subcategory": "Storage", - "text": "For hyper performance storage option use Ultra Disks on AKS", - "waf": "Performance" + "severity": "High", + "text": "Privileged Identity Management audit reporting should be implemented for the Azure VMware Solution PIM roles", + "waf": "Security" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", + "service": "AVS", "services": [ - "SQL", - "Storage", - "AKS" + "Entra", + "AVS", + "WAF" ], "severity": "Medium", - "subcategory": "Storage", - "text": "Avoid keeping state in the cluster, and store data outside (AzStorage, AzSQL, Cosmos, etc)", - "waf": "Performance" + "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" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", + "service": "AVS", "services": [ - "Storage", - "AKS" + "WAF" ], - "severity": "Medium", - "subcategory": "Storage", - "text": "If using AzFiles Standard, consider AzFiles Premium and/or ANF for performance reasons", - "waf": "Performance" + "severity": "High", + "text": "Limit use of CloudAdmin account to emergency access only", + "waf": "Security" }, { - "category": "Operations", - "checklist": "Azure AKS Review", - "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", - "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", + "service": "AVS", "services": [ - "Storage", - "AKS" + "RBAC", + "WAF" ], "severity": "Medium", - "subcategory": "Storage", - "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" + "text": "Create custom RBAC roles in vCenter to implement a least-privilege model inside vCenter", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Stack HCI Review", - "guid": "9f519499-5820-4060-88fe-cab4538c9dd0", - "link": "https://learn.microsoft.com/windows-server/storage/storage-spaces/storage-spaces-direct-hardware-requirements", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", + "service": "AVS", "services": [ - "Storage" + "WAF" ], "severity": "Medium", - "subcategory": "Physical", - "text": "All planned storage pools should use direct-attached storage (SATA, SAS, NVMe)", - "waf": "Performance" + "text": "Is a process defined to regularly rotate cloudadmin (vCenter) and admin (NSX) credentials", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Stack HCI Review", - "guid": "f7c015e0-7d97-4283-b006-567afeb2b5ca", - "link": "https://learn.microsoft.com/azure-stack/hci/concepts/drive-symmetry-considerations#understand-capacity-imbalance", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", + "service": "AVS", "services": [ - "Storage", - "ACR" + "Entra", + "AVS", + "VM", + "WAF" ], - "severity": "Medium", - "subcategory": "Physical", - "text": "Disks are symmetrical across all nodes", - "waf": "Performance" + "severity": "High", + "text": "Use a centralized identity provider to be used for workloads (VM's) running on Azure VMware Solution", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Stack HCI Review", - "guid": "f785b143-2c1e-4466-9baa-dde8ba4c7aaa", - "link": "https://learn.microsoft.com/azure-stack/hci/concepts/fault-tolerance#parity", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", + "service": "AVS", "services": [ - "Storage", - "Backup" + "WAF" ], "severity": "Medium", - "subcategory": "S2D", - "text": "Parity type disk redundancy should only be used for low I/O volumes (backup/archive)", - "waf": "Performance" + "text": "Is East-West traffic filtering implemented within NSX-T", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Stack HCI Review", - "guid": "8a705965-9840-43cc-93b3-06d089406bb4", - "link": "https://learn.microsoft.com/windows-server/storage/storage-spaces/storage-spaces-direct-hardware-requirements#physical-deployments", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", + "service": "AVS", "services": [ - "Storage" + "AVS", + "AppGW", + "Firewall", + "WAF" ], - "severity": "Medium", - "subcategory": "S2D", - "text": "Ensure there at least 2 capacity disks with available capacity in the Storage Pool", - "waf": "Reliability" + "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" }, { - "category": "Storage", - "checklist": "Azure Stack HCI Review", - "guid": "2a4f629a-d623-4610-a8e3-d6fd66057d8e", - "link": "https://learn.microsoft.com/windows-server/storage/storage-spaces/delimit-volume-allocation", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", + "service": "AVS", "services": [ - "Storage" + "AVS", + "WAF" ], - "severity": "Low", - "subcategory": "S2D", - "text": "'Delimited allocation' has been considered to improve volume resiliency in a multi-node failure", - "waf": "Reliability" + "severity": "High", + "text": "Auditing and logging is implemented for inbound internet requests to Azure VMware Solution and Azure VMware Solution based workloads", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Stack HCI Review", - "guid": "960eb9be-1f0f-4fc1-9b31-fcf1cf9e34e6", - "link": "https://learn.microsoft.com/azure-stack/hci/concepts/plan-volumes#choosing-how-many-volumes-to-create", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", + "service": "AVS", "services": [ - "Storage" + "Monitor", + "AVS", + "WAF" ], "severity": "Medium", - "subcategory": "S2D", - "text": "CSVs are created in multiples of node count", - "waf": "Performance" + "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" }, { - "category": "Storage", - "checklist": "Azure Stack HCI Review", - "guid": "859ba2b9-a3a8-4ca1-bb61-165effbf1c03", - "link": "https://learn.microsoft.com/azure-stack/hci/concepts/cache", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "334fdf91-c234-4182-a652-75269440b4be", + "service": "AVS", "services": [ - "Storage" + "DDoS", + "VPN", + "ExpressRoute", + "VNet", + "WAF" ], "severity": "Medium", - "subcategory": "S2D", - "text": "If a cache tier is implemented, the number of capacity drives is a multiple of the number of cache drives", - "waf": "Performance" + "text": "Is DDoS standard protection enabled on ExR/VPN Gateway subnet in Azure", + "waf": "Security" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", + "service": "AVS", + "services": [ + "AVS", + "WAF" + ], + "severity": "Medium", + "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": "9ccbd869-266a-4cca-874f-aa19bf39d95d", + "service": "AVS", + "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" }, { - "category": "Storage", - "checklist": "Azure Stack HCI Review", - "guid": "d8a65f05-db06-461d-81dc-7899ad3f8f1e", - "link": "https://learn.microsoft.com/azure-stack/hci/concepts/plan-volumes#reserve-capacity", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", + "service": "AVS", "services": [ - "Storage" + "AVS", + "Arc", + "WAF" ], "severity": "Medium", - "subcategory": "S2D", - "text": "A minimum of 1 type of each disk type per node has been factored as a reserve disk", - "waf": "Reliability" + "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" }, { - "category": "Storage", - "checklist": "Azure Stack HCI Review", - "description": "VMFleet is a tool that can be used to measure the performance of a storage subsystem, best used to baseline performance prior to workload deployment", - "guid": "9d138f1d-5363-476e-bbd7-acfa500bdc0c", - "link": "https://github.com/microsoft/diskspd/wiki/VMFleet", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", + "service": "AVS", "services": [ - "Storage" + "AVS", + "SQL", + "WAF" ], "severity": "Low", - "subcategory": "S2D", - "text": "VMFleet has been run prior to workload deployment to baseline storage performance", - "waf": "Performance" + "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" }, { - "category": "Storage", - "checklist": "Azure Stack HCI Review", - "guid": "13c12e2a-c938-4dd1-9223-507d5e17f9c5", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "a3592718-e6e2-4051-9267-6ae46691e883", + "service": "AVS", "services": [ - "Storage" + "AKV", + "WAF" ], - "severity": "Medium", - "subcategory": "Host OS", - "text": "OS drives use a dedicated storage controller", - "waf": "Reliability" + "severity": "Low", + "text": "When in-guest encryption is used, store encryption keys in Azure Key vault when possible", + "waf": "Security" }, { - "category": "Storage", - "checklist": "Azure Stack HCI Review", - "guid": "a631e7dc-8879-45bd-b0a7-e5927b805428", - "link": "https://learn.microsoft.com/azure-stack/hci/manage/use-csv-cache", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "5ac94222-3e13-4810-9230-81a941741583", + "service": "AVS", "services": [ - "Storage" + "AVS", + "WAF" ], "severity": "Medium", - "subcategory": "Host OS", - "text": "CSV in-memory read caching is enabled and properly configured", - "waf": "Performance" + "text": "Consider using extended security update support for workloads running on Azure VMware Solution (Azure VMware Solution is eligible for ESU)", + "waf": "Security" }, { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "guid": "c062cd9a-f1db-4f83-aab3-9cb03f56c140", - "link": "https://learn.microsoft.com/azure-stack/hci/concepts/host-network-requirements#switch-embedded-teaming-set", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", + "service": "AVS", "services": [ - "ACR" + "WAF" ], - "severity": "Medium", - "subcategory": "Host", - "text": "NICs are symmetrical across nodes", + "severity": "High", + "text": "Ensure that the appropriate vSAN Data redundancy method is used (RAID specification)", "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "guid": "ea8054db-a558-4533-80c8-5d9cf447ba19", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "d88408f3-7273-44c8-96ba-280214590146", + "service": "AVS", "services": [ - "Storage" + "Storage", + "AzurePolicy", + "WAF" ], "severity": "High", - "subcategory": "Host", - "text": "Storage networking is redundant", - "waf": "Reliability" - }, - { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "guid": "15d976c5-e267-49a1-8b00-62010bfa5188", - "link": "https://learn.microsoft.com/azure-stack/hci/deploy/network-atc", - "services": [], - "severity": "Medium", - "subcategory": "Host", - "text": "Host networking configuration is managed by Network ATC and intents are healthy", + "text": "Ensure that the Failure-to-tolerate policy is in place to meet your vSAN storage needs", "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "guid": "676c53ad-b29a-4de1-9d03-d7d2674405b8", - "link": "https://learn.microsoft.com/azure-stack/hci/concepts/network-hud-overview", - "services": [], - "severity": "Low", - "subcategory": "Host", - "text": "Network HUD has been configured", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", + "service": "AVS", + "services": [ + "ASR", + "WAF" + ], + "severity": "High", + "text": "Ensure that you have requested enough quota, ensuring you have considered growth and Disaster Recovery requirement", "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "guid": "8f6d58d9-6c1a-4ec1-b2d7-b2c6ba8f3949", - "link": "https://learn.microsoft.com/azure-stack/hci/concepts/host-network-requirements", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", + "service": "AVS", "services": [ - "Storage", - "VNet" + "WAF" ], "severity": "Medium", - "subcategory": "Host", - "text": "Storage NICs are assigned static IP addresses on separate subnets and VLANs", - "waf": "Reliability" + "text": "Ensure that access constraints to ESXi are understood, there are access limits which might affect 3rd party solutions.", + "waf": "Operations" }, { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "guid": "824e53ec-953e-40c2-a6b8-52970b5b0f74", - "link": "https://learn.microsoft.com/azure-stack/hci/plan/two-node-switched-converged", - "services": [], + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", + "service": "AVS", + "services": [ + "AzurePolicy", + "WAF" + ], "severity": "Medium", - "subcategory": "Host", - "text": "For switchless designs, dual link full mesh connectivity has been implemented", - "waf": "Reliability" + "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" }, { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "guid": "dbc85d0e-0ebd-4589-a789-0fa8ceb1d0f0", - "link": "https://learn.microsoft.com/azure-stack/hci/concepts/physical-network-requirements#using-switchless", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", + "service": "AVS", "services": [ - "Storage" + "AVS", + "Cost", + "WAF" ], "severity": "Medium", - "subcategory": "Host", - "text": "If the cluster is made up of more than 3 nodes, a switched storage network has been implemented", - "waf": "Reliability" + "text": "Ensure a good cost management process is in place for Azure VMware Solution - Azure Cost Management can be used", + "waf": "Cost" }, { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "guid": "603c6d71-59d2-419c-a312-8edc6e799c6a", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", + "service": "AVS", "services": [ - "Storage" + "AVS", + "Cost", + "WAF" ], - "severity": "High", - "subcategory": "Host", - "text": "RDMA is enabled on the Storage networking", - "waf": "Performance" - }, - { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "guid": "9e260eae-bca1-4827-a259-76ee63fda8d6", - "link": "https://github.com/microsoft/SDN/blob/master/Diagnostics/Test-Rdma.ps1", - "services": [], - "severity": "Medium", - "subcategory": "Host", - "text": "Test-RDMA.ps1 has been run to validate the RDMA configuration", - "waf": "Performance" + "severity": "Low", + "text": "Are Azure reserved instances used to optimize cost for using Azure VMware Solution", + "waf": "Cost" }, { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "description": "This ensures that Management traffic is not exposed to the VM traffic", - "guid": "abc85d0e-0ebd-4589-a777-0fa8ceb1d0f0", - "link": "", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "6691e883-5ac9-4422-83e1-3810523081a9", + "service": "AVS", "services": [ - "VM" + "WAF" ], "severity": "Medium", - "subcategory": "Host", - "text": "If a VMSwitch is shared for Compute and Management traffic, require that Management traffic is tagged with a VLAN ID", + "text": "Consider the use of Azure Private-Link when using other Azure Native Services", "waf": "Security" }, { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "description": "This ensures you have at least 3 NCs active at all times during NC upgrades.", - "guid": "eb36f5f4-0fa7-4a2c-85f3-1b1c7c7817c0", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", + "service": "AVS", "services": [ - "VM" + "WAF" ], - "severity": "Medium", - "subcategory": "SDN", - "text": "There are at least 3 Network Controller VMs deployed", - "waf": "Reliability" + "severity": "High", + "text": "Ensure all required resource reside within the same Azure availability zone(s)", + "waf": "Performance" }, { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "guid": "8bc78c85-6028-4a43-af2d-082a0a344909", - "link": "https://learn.microsoft.com/windows-server/networking/sdn/manage/update-backup-restore", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", + "service": "AVS", "services": [ - "Backup" + "AVS", + "VM", + "Defender", + "WAF" ], - "severity": "High", - "subcategory": "SDN", - "text": "Backups of SDN infrastructure are configured and tested", - "waf": "Operations" + "severity": "Medium", + "text": "Enable Microsoft Defender for Cloud for Azure VMware Solution guest VM workloads", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "Azure Stack HCI Review", - "guid": "51eaa4b6-b9a7-43e1-a7dc-634d3107bc6d", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", + "service": "AVS", "services": [ - "Monitor" + "AVS", + "VM", + "Arc", + "WAF" ], "severity": "Medium", - "subcategory": "Cluster", - "text": "SCOM Managed Instance has been considered for more complex monitoring and alerting scenarios", - "waf": "Operations" + "text": "Use Azure Arc enabled servers to manage your Azure VMware Solution guest VM workloads", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "Azure Stack HCI Review", - "guid": "831f5aca-99ef-41e7-8263-9509f5093b43", - "link": "https://learn.microsoft.com/azure-stack/hci/manage/setup-hci-system-alerts", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", + "service": "AVS", "services": [ - "Monitor" + "AVS", + "WAF" ], "severity": "High", - "subcategory": "Cluster", - "text": "Alerts have been configured for the cluster, either using Azure Monitor, SCOM, or a third-party solution", + "text": "Enable Diagnostic and metric logging on Azure VMware Solution", "waf": "Operations" }, { - "category": "Management and Monitoring", - "checklist": "Azure Stack HCI Review", - "guid": "f95d0e7e-9f61-476d-bf65-59f2454d1d39", - "link": "https://learn.microsoft.com/azure-stack/hci/manage/monitor-hci-single?tabs=22h2-and-later", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", + "service": "AVS", "services": [ - "Monitor" + "Monitor", + "AVS", + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "Cluster", - "text": "Insights has been enabled at the cluster level and all nodes are reporting data", + "text": "Deploy the Log Analytics Agents to Azure VMware Solution guest VM workloads", "waf": "Operations" }, { - "category": "Management and Monitoring", - "checklist": "Azure Stack HCI Review", - "guid": "f4250fcb-ff53-40c9-b304-3560464fd90c", - "link": "https://learn.microsoft.com/azure-stack/hci/manage/monitor-hci-single?tabs=22h2-and-later", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "589d457a-927c-4397-9d11-02cad6aae11e", + "service": "AVS", "services": [ - "Monitor" + "Backup", + "AVS", + "VM", + "AzurePolicy", + "WAF" ], "severity": "Medium", - "subcategory": "Cluster", - "text": "Azure Monitoring Agent has been deployed to hosts and an appropriate Data Collection Rule has been configured", + "text": "Ensure you have a documented and implemented backup policy and solution for Azure VMware Solution VM workloads", "waf": "Operations" }, { - "category": "Management and Monitoring", - "checklist": "Azure Stack HCI Review", - "guid": "6143af1d-0d1a-4163-b1c9-662f7459bb98", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "ee29711b-d352-4caa-ab79-b198dab81932", + "service": "AVS", "services": [ - "Monitor" + "Monitor", + "AVS", + "Defender", + "WAF" ], "severity": "Medium", - "subcategory": "Hardware", - "text": "Relevant hardware monitoring has been configured", - "waf": "Operations" + "text": "Use Microsoft Defender for Cloud for compliance monitoring of workloads running on Azure VMware Solution", + "waf": "Security" }, { - "category": "Management and Monitoring", - "checklist": "Azure Stack HCI Review", - "guid": "9cbdf225-549a-41cf-9c97-794766a6f2b0", - "link": "https://learn.microsoft.com/azure-stack/hci/manage/health-service-overview", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", + "service": "AVS", "services": [ - "Monitor" + "Defender", + "WAF" ], "severity": "Medium", - "subcategory": "Hardware", - "text": "Relevant hardware alerting has been configured", - "waf": "Operations" + "text": "Are the applicable compliance baselines added to Microsoft Defender for Cloud", + "waf": "Security" }, { - "category": "Operations", - "checklist": "Azure Stack HCI Review", - "guid": "c0da5bbd-0f0d-4a26-98ec-38c9cc42b323", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", + "service": "AVS", "services": [ - "VM" + "AVS", + "WAF" ], - "severity": "Low", - "subcategory": "VM Management - Resource Bridge", - "text": "The Azure CLI has been installed on every node to enable RB management from WAC", - "waf": "Operations" + "severity": "High", + "text": "Was data residency evaluated when selecting Azure regions to use for Azure VMware Solution deployment", + "waf": "Security" }, { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "guid": "a8ecf23c-c048-4fa9-b87b-51ebfb409863", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", + "service": "AVS", "services": [ - "VM" + "WAF" ], - "severity": "Low", - "subcategory": "VM Management - Resource Bridge", - "text": "DHCP is available in the cluster to support Guest Configuration at VM deployment from Azure", - "waf": "Operations" + "severity": "High", + "text": "Are data processing implications (service provider / service consumer model) clear and documented", + "waf": "Security" }, { - "category": "Backup and Disaster Recovery", - "checklist": "Azure Stack HCI Review", - "guid": "074541e3-fe08-458a-8062-32d13dcc10c6", - "link": "https://learn.microsoft.com/azure/backup/back-up-azure-stack-hyperconverged-infrastructure-virtual-machines", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "547c1747-dc56-4068-a714-435cd19dd244", + "service": "AVS", "services": [ - "Backup", - "VM", - "ASR" + "WAF" ], - "severity": "High", - "subcategory": "VM", - "text": "Backups of HCI VMs have been configured using MABS or a third-party solution", - "waf": "Operations" + "severity": "Medium", + "text": "Consider using CMK (Customer Managed Key) for vSAN only if needed for compliance reason(s).", + "waf": "Security" }, { - "category": "Operations", - "checklist": "Azure Stack HCI Review", - "guid": "48f7ae57-1035-4101-8a38-fbe163d03e8a", - "services": [], + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", + "service": "AVS", + "services": [ + "Monitor", + "AVS", + "WAF" + ], "severity": "High", - "subcategory": "Cluster Configuration", - "text": "Cluster configuration or a configuration script has been documented and maintained", + "text": "Create dashboards to enable core Azure VMware Solution monitoring insights", "waf": "Operations" }, { - "category": "Operations", - "checklist": "Azure Stack HCI Review", - "guid": "f2a6a19a-ffe6-444d-badb-cb336c8e7b50", - "link": "https://learn.microsoft.com/azure-stack/hci/manage/witness", - "services": [], + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", + "service": "AVS", + "services": [ + "Monitor", + "AVS", + "WAF" + ], "severity": "High", - "subcategory": "Cluster Configuration", - "text": "A cluster witness has been configured for clusters with less than 5 nodes", - "waf": "Reliability" - }, - { - "category": "Operations", - "checklist": "Azure Stack HCI Review", - "guid": "a47339fe-62c5-44a0-bb83-3d46ef16292f", - "link": "https://learn.microsoft.com/azure-stack/hci/manage/update-cluster", - "services": [], - "severity": "Medium", - "subcategory": "Cluster Configuration", - "text": "Cluster-Aware Updating has been configured for Windows and hardware updates (if available)", + "text": "Create warning alerts for critical thresholds for automatic alerting on Azure VMware Solution performance (CPU >80%, Avg Memory >80%, vSAN >70%)", "waf": "Operations" }, { - "category": "Operations", - "checklist": "Azure Stack HCI Review", - "guid": "7f1d6fe8-3079-44ea-8ea6-14494d1aa470", - "link": "https://learn.microsoft.com/azure-stack/hci/deploy/validate", - "services": [], + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "9659e396-80e7-4828-ac93-5657d02bff45", + "service": "AVS", + "services": [ + "Monitor", + "AVS", + "WAF" + ], "severity": "High", - "subcategory": "Cluster Configuration", - "text": "Cluster validation has been run against the configured cluster", - "waf": "Reliability" + "text": "Ensure critical alert is created to monitor if vSAN consumption is below 75% as this is a support threshold from VMware", + "waf": "Operations" }, { - "category": "Operations", - "checklist": "Azure Stack HCI Review", - "guid": "81693af0-5638-4aa2-a153-1d6189df30a7", - "link": "https://learn.microsoft.com/azure-stack/hci/manage/azure-benefits", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", + "service": "AVS", "services": [ - "VM" + "Monitor", + "WAF" ], - "severity": "Medium", - "subcategory": "Cluster Configuration", - "text": "Azure Benefits has been enabled at the cluster and VM levels", - "waf": "Cost" - }, - { - "category": "Operations", - "checklist": "Azure Stack HCI Review", - "guid": "8c967ee8-8170-4537-a28d-33431cd3632a", - "link": "https://learn.microsoft.com/azure-stack/hci/manage/use-environment-checker", - "services": [], - "severity": "Medium", - "subcategory": "Cluster Configuration", - "text": "The Environment Checker module has been run to validate the environment", - "waf": "Reliability" + "severity": "High", + "text": "Ensure alerts are configured for Azure Service Health alerts and notifications", + "waf": "Operations" }, { - "category": "Operations", - "checklist": "Azure Stack HCI Review", - "guid": "43ffbfab-766e-4950-a102-78b479136e4d", - "link": "https://learn.microsoft.com/azure-stack/hci/manage/azure-benefits", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", + "service": "AVS", "services": [ - "AzurePolicy" + "AVS", + "Storage", + "WAF" ], "severity": "Medium", - "subcategory": "Cluster Configuration", - "text": "Group Policy inheritance on the HCI cluster and node Active Directory organizational unit has been blocked or applied policies have been evaluated for compatibility issues (usually WinRM and PowerShell execution policy)", + "text": "Configure Azure VMware Solution logging to be send to an Azure Storage account or Azure EventHub for processing", "waf": "Operations" }, { - "category": "Operations", - "checklist": "Azure Stack HCI Review", - "guid": "e6a3f3a7-4a7d-49e2-985a-6e39dd284027", - "services": [], - "severity": "Medium", - "subcategory": "Cluster Configuration", - "text": "WAC is on the latest release and configured to automatically upgrade extensions", - "waf": "Reliability" - }, - { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "guid": "d1caa31f-cc26-42b2-b92f-2b667c0e6020", - "link": "https://learn.microsoft.com/azure/architecture/hybrid/azure-stack-hci-dr", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", + "service": "AVS", "services": [ - "Entra" + "AVS", + "WAF" ], - "severity": "Medium", - "subcategory": "Stretch Clustering", - "text": "There is sub 5ms latency between each site if synchronous replication is being configured AAD", - "waf": "Performance" + "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" }, { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "guid": "3277558e-3155-4088-b49a-78594cb4ce1a", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", + "service": "AVS", "services": [ "Storage", - "VNet" + "VM", + "AzurePolicy", + "WAF" ], "severity": "High", - "subcategory": "Stretch Clustering", - "text": "Management, Replication and Storage networks excluded from stretched VLANs configurations, are routed, and in different subnets", - "waf": "Reliability" - }, - { - "category": "Operations", - "checklist": "Azure Stack HCI Review", - "guid": "baed6066-8531-44ba-bd94-38cbabbf4099", - "services": [], - "severity": "High", - "subcategory": "Stretch Clustering", - "text": "There is a plan detailed for site failure and recovery", + "text": "Ensure the vSAN storage policy for VM's is NOT the default storage policy as this policy applies thick provisioning", "waf": "Operations" }, { - "category": "Networking", - "checklist": "Azure Stack HCI Review", - "guid": "8e62945f-b9ac-4a5c-a4e4-836f527010b4", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", + "service": "AVS", "services": [ - "ACR" + "WAF" ], "severity": "Medium", - "subcategory": "Stretch Clustering", - "text": "Separate vLANs and networks are used for each replication network across both sites", - "waf": "Reliability" + "text": "Ensure vSphere content libraries are not placed on vSAN as vSAN is a finite resource", + "waf": "Operations" }, { - "category": "Operations", - "checklist": "Azure Stack HCI Review", - "guid": "8e62945f-b9ac-4a5c-a4e4-836f527010b5", - "link": "https://learn.microsoft.com/azure/architecture/hybrid/azure-stack-hci-dr#cost-optimization", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", + "service": "AVS", "services": [ - "Storage" + "Storage", + "Backup", + "WAF" ], - "severity": "High", - "subcategory": "Stretch Clustering", - "text": "Use either a cloud witness or a file share witness in a third site for cluster quorum for clusters with less than 5 nodes", - "waf": "Reliability" + "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" }, { - "category": "Operations", - "checklist": "Azure Stack HCI Review", - "guid": "8e62945f-b9ac-4a5c-a4e4-836f527010b6", - "link": "https://learn.microsoft.com/azure/architecture/hybrid/azure-stack-hci-dr#cost-optimization", - "services": [], - "severity": "High", - "subcategory": "Stretch Clustering", - "text": "When using data deduplication, only enable it on the primary/source volumes", - "waf": "Reliability" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", + "service": "AVS", + "services": [ + "AVS", + "Arc", + "WAF" + ], + "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" }, { - "category": "Operations", - "checklist": "Azure Stack HCI Review", - "guid": "ac527887-f6f4-40a3-b883-e04d704f013b", - "link": "https://learn.microsoft.com/windows-server/storage/storage-replica/stretch-cluster-replication-using-shared-storage#provision-operating-system-features-roles-storage-and-network", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", + "service": "AVS", "services": [ - "Storage" + "Monitor", + "AVS", + "WAF" ], - "severity": "High", - "subcategory": "Stretch Clustering", - "text": "Storage backing log volumes must be faster (ideally) or at least as fast as capacity storage", - "waf": "Reliability" + "severity": "Medium", + "text": "Ensure workloads running on Azure VMware Solution are monitored using Azure Log Analytics and Azure Monitor", + "waf": "Operations" }, { - "category": "Backup and Disaster Recovery", - "checklist": "Azure Stack HCI Review", - "guid": "8ea49f70-1038-4283-b0c4-230165d3eabc", - "link": "https://learn.microsoft.com/azure-stack/hci/manage/azure-site-recovery", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", + "service": "AVS", "services": [ - "Backup", - "ASR" + "AVS", + "WAF" ], "severity": "Medium", - "subcategory": "Disaster Recovery", - "text": "Azure Site Recovery has been considered for DR purposes", + "text": "Include workloads running on Azure VMware Solution in existing update management tooling or in Azure Update Management", "waf": "Operations" }, { - "category": "Security", - "checklist": "Azure Stack HCI Review", - "guid": "03e65fdc-2628-4a1a-ba2e-a5174340ba52", - "link": "https://learn.microsoft.com/windows/security/operating-system-security/data-protection/bitlocker/protecting-cluster-shared-volumes-and-storage-area-networks-with-bitlocker", - "services": [], + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", + "service": "AVS", + "services": [ + "Monitor", + "AVS", + "AzurePolicy", + "WAF" + ], "severity": "Medium", - "subcategory": "Host", - "text": "BitLocker has been enabled on CSVs for volume encryption, where appropriate", - "waf": "Security" + "text": "Use Azure Policy to onboard Azure VMware Solution workloads in the Azure Management, Monitoring and Security solutions", + "waf": "Operations" }, { - "category": "Security", - "checklist": "Azure Stack HCI Review", - "guid": "9645d2e6-ba28-453c-b6d5-d9ef29fc34be", - "link": "https://learn.microsoft.com/windows-server/storage/file-server/smb-security", - "services": [], + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", + "service": "AVS", + "services": [ + "AVS", + "Defender", + "WAF" + ], "severity": "Medium", - "subcategory": "Host", - "text": "SMB encryption has been enabled, where appropriate", + "text": "Ensure workloads running on Azure VMware Solution are onboarded to Microsoft Defender for Cloud", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Stack HCI Review", - "guid": "8f03437a-5068-4486-9a78-0402ce771298", - "link": "https://learn.microsoft.com/microsoft-365/security/defender-endpoint/microsoft-defender-antivirus-on-windows-server", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", + "service": "AVS", "services": [ - "Defender" + "Backup", + "WAF" ], "severity": "Medium", - "subcategory": "Host", - "text": "Microsoft Defender Antivirus has been enabled on all nodes", - "waf": "Security" + "text": "Ensure backups are not stored on vSAN as vSAN is a finite resource", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Azure Stack HCI Review", - "guid": "dba6b211-fc02-43b3-b7c8-f163c188332e", - "link": "https://learn.microsoft.com/windows/security/identity-protection/credential-guard/credential-guard-manage", - "services": [], + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", + "service": "AVS", + "services": [ + "WAF" + ], "severity": "Medium", - "subcategory": "Host", - "text": "Credential Guard has been configured, where appropriate", - "waf": "Security" + "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" }, { - "category": "Identity and Access Management", - "checklist": "Azure Red Hat OpenShift", - "guid": "d7e47431-76c8-4bdb-b55b-ce619e8a03f9", - "link": "https://learn.microsoft.com/azure/openshift/howto-create-service-principal?pivots=aro-azurecli", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", + "service": "AVS", "services": [ - "RBAC", - "Entra" + "ASR", + "WAF" ], - "severity": "High", - "subcategory": "Identity", - "text": "Create a service principal and its role assignments before creating the ARO clusters.", - "waf": "Security" + "severity": "Medium", + "text": "Use Azure Site Recovery when the Disaster Recovery technology is native Azure IaaS", + "waf": "Reliability" }, { - "category": "Identity and Access Management", - "checklist": "Azure Red Hat OpenShift", - "guid": "7879424d-6267-486d-90b9-6c97be985190", - "link": "https://learn.microsoft.com/azure/openshift/configure-azure-ad-ui", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", + "service": "AVS", "services": [ - "Entra" + "WAF" ], "severity": "High", - "subcategory": "Identity", - "text": "Use AAD to authenticate users in your ARO cluster.", - "waf": "Security" + "text": "Use Automated recovery plans with either of the Disaster solutions, avoid manual tasks as much as possible", + "waf": "Reliability" }, { - "category": "Identity and Access Management", - "checklist": "Azure Red Hat OpenShift", - "guid": "adfec5f9-a82d-46e9-a8d1-5a0c7fed5d15", - "link": "https://docs.openshift.com/container-platform/4.14/authentication/remove-kubeadmin.html", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "8255461e-2aee-4345-9aec-8339248b262d", + "service": "AVS", "services": [ - "Entra" + "ASR", + "WAF" ], "severity": "Medium", - "subcategory": "Identity", - "text": "When using AAD authentication, remove kubeadmin user from the cluster.", - "waf": "Security" + "text": "Use the geopolitical region pair as the secondary disaster recovery environment", + "waf": "Reliability" }, { - "category": "Identity and Access Management", - "checklist": "Azure Red Hat OpenShift", - "guid": "483835c9-86bb-4291-8155-a11475e39f54", - "link": "https://docs.openshift.com/container-platform/4.13/applications/projects/working-with-projects.html", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", + "service": "AVS", "services": [ - "RBAC", - "Entra" + "WAF" ], "severity": "High", - "subcategory": "Identity", - "text": "Define OpenShift projects to restrict RBAC privilege and isolate workloads in your cluster.", - "waf": "Security" + "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" }, { - "category": "Identity and Access Management", - "checklist": "Azure Red Hat OpenShift", - "guid": "0acccd97-9376-4bcd-a375-0ab2ab039da6", - "link": "https://docs.openshift.com/container-platform/4.13/authentication/using-rbac.html", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", + "service": "AVS", "services": [ - "RBAC", - "Entra" + "AVS", + "ExpressRoute", + "NVA", + "WAF" ], "severity": "Medium", - "subcategory": "Identity", - "text": "Define the required RBAC roles in OpenShift are scoped to either a project or a cluster.", - "waf": "Security" + "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" }, { - "category": "Identity and Access Management", - "checklist": "Azure Red Hat OpenShift", - "guid": "d54d7c89-29db-4107-b532-5ae625ca44e4", - "link": "https://learn.microsoft.com/azure/cost-management-billing/manage/direct-ea-administration#manage-notification-contacts", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", + "service": "AVS", "services": [ - "AKV", - "Entra" + "Backup", + "WAF" ], "severity": "Medium", - "subcategory": "Identity", - "text": "Minimize the number of users who have administrator rights and secrets access.", - "waf": "Security" + "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" }, { - "category": "Identity and Access Management", - "checklist": "Azure Red Hat OpenShift", - "guid": "685e2223-ace8-4bb1-8307-ca5f16f154e3", - "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", + "service": "AVS", "services": [ - "RBAC", - "Entra" + "AVS", + "Backup", + "WAF" ], "severity": "Medium", - "subcategory": "Identity", - "text": "Use Privileged Identity Management in AAD for ARO users with privileged roles.", - "waf": "Security" + "text": "Deploy your backup solution in the same region as your Azure VMware Solution private cloud", + "waf": "Reliability" }, { - "category": "Network topology and connectivity", - "checklist": "Azure Red Hat OpenShift", - "guid": "aa369282-9e7e-4216-8836-87af467a1f89", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", + "service": "AVS", "services": [ - "WAF", - "Subscriptions", - "VNet", - "Entra", - "DDoS", - "Firewall" + "Backup", + "WAF" ], - "severity": "Low", - "subcategory": "DDoS", - "text": "Use Azure DDoS Network/IP Protection to protect the virtual network you use for the ARO cluster unless you use Azure Firewall or WAF in a centralized subscription", - "waf": "Security" - }, - { - "category": "Network topology and connectivity", - "checklist": "Azure Red Hat OpenShift", - "guid": "35bda433-24f1-4481-8533-182aa5174269", - "link": "https://docs.openshift.com/container-platform/4.13/networking/routes/secured-routes.html", - "services": [], - "severity": "High", - "subcategory": "Encryption", - "text": "All web applications you configure to use an ingress should use TLS encryption and shouldn't allow access over unencrypted HTTP.", - "waf": "Security" + "severity": "Medium", + "text": "Deploy your backup solution outside of vSan, on Azure native components", + "waf": "Reliability" }, { - "category": "Network topology and connectivity", - "checklist": "Azure Red Hat OpenShift", - "guid": "44008ae7-d7e4-4743-876c-8bdbf55bce61", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", + "service": "AVS", "services": [ - "WAF", - "FrontDoor" + "AVS", + "WAF" ], - "severity": "Medium", - "subcategory": "Internet", - "text": "Use Azure Front Door with WAF to securely publish ARO applications to the internet, especially in multi-region environments.", - "waf": "Security" + "severity": "Low", + "text": "Is a process in place to request a restore of the VMware components managed by the Azure Platform?", + "waf": "Reliability" }, { - "category": "Network topology and connectivity", - "checklist": "Azure Red Hat OpenShift", - "guid": "9e8a03f9-7879-4424-b626-786d60b96c97", - "link": "https://learn.microsoft.com/azure/openshift/howto-secure-openshift-with-front-door", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", + "service": "AVS", "services": [ - "FrontDoor", - "PrivateLink" + "WAF" ], - "severity": "Medium", - "subcategory": "Internet", - "text": "If exposing an app on ARO with Azure Front Door, use private link to connect Front Door with the ARO router.", - "waf": "Security" + "severity": "Low", + "text": "For manual deployments, all configuration and deployments must be documented", + "waf": "Operations" }, { - "category": "Network topology and connectivity", - "checklist": "Azure Red Hat OpenShift", - "guid": "be985190-4838-435c-a86b-b2912155a114", - "link": "https://learn.microsoft.com/azure/openshift/howto-restrict-egress", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", + "service": "AVS", "services": [ - "AzurePolicy", - "NVA", - "Firewall" + "AVS", + "WAF" ], - "severity": "Medium", - "subcategory": "Internet", - "text": "If your security policy requires you to inspect all outbound internet traffic that's generated in the ARO cluster, secure egress network traffic by using Azure Firewall or an NVA.", - "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" }, { - "category": "Network topology and connectivity", - "checklist": "Azure Red Hat OpenShift", - "guid": "75e39f54-0acc-4cd9-9937-6bcda3750ab2", - "link": "https://learn.microsoft.com/azure/openshift/howto-create-private-cluster-4x", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", + "service": "AVS", "services": [ - "AzurePolicy" + "WAF" ], - "severity": "High", - "subcategory": "Private access", - "text": "If your security policy requires you to use a private IP address for the OpenShift API, deploy a private ARO cluster.", - "waf": "Security" + "severity": "Low", + "text": "For automated deployments, deploy a minimal private cloud and scale as needed", + "waf": "Operations" }, { - "category": "Network topology and connectivity", - "checklist": "Azure Red Hat OpenShift", - "guid": "ab039da6-d54d-47c8-a29d-b107d5325ae6", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-private-link", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", + "service": "AVS", "services": [ - "ACR", - "PrivateLink" + "WAF" ], - "severity": "Medium", - "subcategory": "Private access", - "text": "Use Azure Private Link to secure network connections to managed Azure services, including to Azure Container Registry.", - "waf": "Security" + "severity": "Low", + "text": "For automated deployments, request or reserve quota prior to starting the deployment", + "waf": "Operations" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "25ca44e4-685e-4222-9ace-8bb12307ca5f", - "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-enable-arc-enabled-clusters", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", + "service": "AVS", "services": [ - "Monitor" + "AzurePolicy", + "WAF" ], - "severity": "High", - "subcategory": "Operations", - "text": "Establish a monitoring process using the inbuilt Prometheus, OpenShift Logging or Container Insights integration.", + "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" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "16f154e3-aa36-4928-89e7-e216183687af", - "link": "https://docs.openshift.com/container-platform/4.13/cicd/pipelines/understanding-openshift-pipelines.html", - "services": [], - "severity": "Medium", - "subcategory": "Operations", - "text": "Automate the application delivery process through DevOps practices and CI/CD solutions, such as Pipelines/GitOps provided by OpenShift.", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", + "service": "AVS", + "services": [ + "AKV", + "WAF" + ], + "severity": "Low", + "text": "Implement human understandable names for ExR authorization keys to allow for easy identification of the keys purpose/use", "waf": "Operations" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "467a1f89-35bd-4a43-924f-14811533182a", - "link": "https://learn.microsoft.com/azure/architecture/guide/design-principles/managed-services", - "services": [], + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "255461e2-aee3-4553-afc8-339248b262d6", + "service": "AVS", + "services": [ + "AKV", + "AVS", + "ExpressRoute", + "WAF" + ], "severity": "Low", - "subcategory": "Operations", - "text": "Whenever possible, remove the service state from inside containers. Instead, use an Azure platform as a service (PaaS) that supports multiregion replication.", + "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" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "1b7da8cf-aa66-4e15-b4d5-ada97dc3e232", - "link": "https://learn.microsoft.com/azure/openshift/howto-create-a-storageclass", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", + "service": "AVS", "services": [ - "Storage" + "AVS", + "WAF" ], "severity": "Low", - "subcategory": "Operations", - "text": "Use RWX storage with inbuilt Azure Files storage class.", + "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" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "6bb235c7-05e1-4696-bded-fa8a4c8cdec4", - "link": "https://docs.openshift.com/container-platform/4.13/nodes/clusters/nodes-cluster-limit-ranges.html", - "services": [], - "severity": "Medium", - "subcategory": "Performance", - "text": "Use pod requests and limits to manage the compute resources within a cluster.", - "waf": "Performance" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", + "service": "AVS", + "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" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "c620c30c-14ee-4b7f-9ae8-d9b3fec228e7", - "link": "https://docs.openshift.com/container-platform/4.13/applications/quotas/quotas-setting-per-project.html", - "services": [], + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", + "service": "AVS", + "services": [ + "AVS", + "Subscriptions", + "WAF" + ], "severity": "Medium", - "subcategory": "Performance", - "text": "Enforce resource quotas on projects.", + "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" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "87ab177a-db59-4f6b-a613-334fd09dc234", - "link": "https://docs.openshift.com/container-platform/4.13/machine_management/applying-autoscaling.html", - "services": [], - "severity": "High", - "subcategory": "Performance", - "text": "Define ClusterAutoScaler and MachineAutoScaler to scale machines when your cluster runs out of resources to support more deployments.", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", + "service": "AVS", + "services": [ + "Storage", + "AzurePolicy", + "WAF" + ], + "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" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "19db6128-1269-4040-a4ba-4d3e0804276d", - "link": "https://learn.microsoft.com/azure/openshift/support-policies-v4#supported-virtual-machine-sizes", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", + "service": "AVS", "services": [ - "VM" + "WAF" ], - "severity": "High", - "subcategory": "Reliability", - "text": "Use virtual machine sizes that are large enough to contain multiple container instances so you get the benefits of increased density, but not so large that your cluster can't handle the workload of a failing node.", - "waf": "Reliability" - }, - { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "4b98b15c-8b31-4aa5-aceb-58889135e227", - "link": "https://docs.openshift.com/container-platform/4.13/machine_management/deploying-machine-health-checks.html", - "services": [], - "severity": "High", - "subcategory": "Reliability", - "text": "Deploy machine health checks to automatically repair damaged machines in a machine pool.", - "waf": "Reliability" + "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" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "896d31b6-6c67-4ba5-a119-c08e8f5d587c", - "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-metric-alerts", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", + "service": "AVS", "services": [ - "Monitor" + "WAF" ], - "severity": "High", - "subcategory": "Reliability", - "text": "Use an alerting system to provide notifications when things need direct action: Container Insights metric alerts or in-built Alerting UI.", - "waf": "Reliability" - }, - { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "7e9ced16-acd1-476e-b9b2-41a998a57ae7", - "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview#availability-zones", - "services": [], - "severity": "High", - "subcategory": "Reliability", - "text": "Ensure that the cluster is created in a region that supports AZs and create a machine set for each AZ.", - "waf": "Reliability" + "severity": "Medium", + "text": "Consider and validate scaling operations on 3rd party solutions used in the architecture (supported or not)", + "waf": "Performance" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "7b997e71-1b7d-4a8c-baa6-6e15d4d5ada9", - "link": "https://docs.openshift.com/container-platform/4.13/machine_management/creating-infrastructure-machinesets.html", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", + "service": "AVS", "services": [ - "AKS" + "WAF" ], - "severity": "Low", - "subcategory": "Reliability", - "text": "Create infrastructure machine sets to hold infrastructure components. Apply specific Kubernetes labels to these machines and then update the infrastructure components to run on only those machines.", - "waf": "Reliability" + "severity": "Medium", + "text": "Define and enforce scale in/out maximum limits for your environment in the automations", + "waf": "Performance" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "7dc3e232-6bb2-435c-905e-1696fdedfa8a", - "link": "https://learn.microsoft.com/azure/openshift/howto-create-a-backup#create-a-backup-with-velero-to-include-snapshots", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", + "service": "AVS", "services": [ - "Backup" + "Monitor", + "WAF" ], "severity": "Medium", - "subcategory": "Reliability", - "text": "Create application backup and plan for restore and include persistent volumes in the backup.", - "waf": "Reliability" + "text": "Implement monitoring rules to monitor automated scaling operations and monitor success and failure to enable appropriate (automated) responses", + "waf": "Operations" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "81c12318-1a64-4174-8583-3fb4ae3c2df7", - "link": "https://docs.openshift.com/container-platform/4.13/nodes/pods/nodes-pods-priority.html", - "services": [], - "severity": "Low", - "subcategory": "Reliability", - "text": "Use pod priorities, so that in case of limited resources the most critical pods will run.", + "arm-service": "Microsoft.AVS/privateClouds", + "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", + "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" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "43166c3b-cbe0-45bb-b209-d4a0da577784", - "link": "https://docs.openshift.com/container-platform/4.13/architecture/admission-plug-ins.html", + "arm-service": "Microsoft.AVS/privateClouds", + "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", "services": [ - "AzurePolicy" + "WAF" ], - "severity": "Low", - "subcategory": "Security", - "text": "Regulate cluster functions using admission plug-ins, which are commonly used to enforce security policy, resource limitations, or configuration requirements.", - "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" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "24d21678-5d2f-4a56-a56a-d48408fe8273", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", + "service": "AVS", "services": [ - "ACR" + "VPN", + "WAF" ], - "severity": "Low", - "subcategory": "Security", - "text": "Store your container images in Azure Container Registry and geo-replicate the registry to each region.", - "waf": "Security" - }, - { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "4c486ba2-80dc-4059-8cf7-5ee8e1309ccc", - "link": "https://docs.openshift.com/container-platform/4.13/nodes/pods/nodes-pods-vertical-autoscaler.html", - "services": [], "severity": "Medium", - "subcategory": "Workload", - "text": "Optimize the CPU and memory request values, and maximize the efficiency of the cluster resources using vertical pod autoscaler.", + "text": "If using a VPN connection for migrations, adjust your MTU size accordingly.", "waf": "Performance" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "d579366b-cda2-4750-aa1a-bfe9d55d14c3", - "link": "https://docs.openshift.com/container-platform/4.13/applications/application-health.html", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "e614658d-d457-4e92-9139-b821102cad6e", + "service": "AVS", "services": [ - "Monitor" + "WAF" ], "severity": "Medium", - "subcategory": "Workload", - "text": "Add health probes to your pods to monitor application health. Make sure pods contain livenessProbe and readinessProbe. Use Startup probes to determine the point at which the application has started up.", - "waf": "Reliability" + "text": "For low connectivity regions connecting into Azure (500Mbps or less), considering deploying the HCX WAN optimization appliance", + "waf": "Performance" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "c4929cb1-b3d1-4325-ae12-4ba34d0685ed", - "link": "https://docs.openshift.com/container-platform/4.13/nodes/pods/nodes-pods-autoscaling.html", - "services": [], + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", + "service": "AVS", + "services": [ + "WAF" + ], "severity": "Medium", - "subcategory": "Workload", - "text": "Scale pods to meet demand using horizontal pod autoscaler.", + "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" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "dce9be3b-b0dd-4b3b-95fb-2ec14eeaa359", - "link": "https://docs.openshift.com/container-platform/4.13/nodes/pods/nodes-pods-configuring.html#nodes-pods-pod-distruption-about_nodes-pods-configuring", + "arm-service": "Microsoft.AVS/privateClouds", + "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", "services": [ - "Cost" + "AVS", + "VM", + "Storage", + "WAF" ], "severity": "Medium", - "subcategory": "Workload", - "text": "Use disruption budgets to ensure the required number of pod replicas exist to handle expected application load.", + "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" }, { - "category": "Operations management", - "checklist": "Azure Red Hat OpenShift", - "guid": "2829e2ed-b217-4367-9aff-6791b4935ada", - "link": "https://docs.openshift.com/container-platform/4.13/nodes/scheduling/nodes-scheduler-pod-topology-spread-constraints.html", - "services": [], + "arm-service": "Microsoft.AVS/privateClouds", + "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", + "services": [ + "Storage", + "ExpressRoute", + "WAF" + ], "severity": "Medium", - "subcategory": "Workload", - "text": "Use pod topology constraints to automatically schedule pods on nodes throughout the cluster.", + "text": "Ensure that a dedicated ExpressRoute Gateway is being used for external data storage solutions", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "Azure Red Hat OpenShift", - "guid": "fea1dbf3-dd95-4d48-a7c8-91dcb1f7d575", - "link": "https://learn.microsoft.com/azure/openshift/intro-openshift#service-level-agreement", - "services": [], + "arm-service": "Microsoft.AVS/privateClouds", + "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", + "services": [ + "Storage", + "ExpressRoute", + "WAF" + ], "severity": "Medium", - "subcategory": "Availablity", - "text": "Leverage Current ARO SLA - 99.95 into BCDR planning", + "text": "Ensure that FastPath is enabled on the ExpressRoute Gateway that is being used for external data storage solutions", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "Azure Red Hat OpenShift", - "guid": "b95e06e1-58e2-4ea3-a92c-2de6e2065b3a", - "link": "https://www.redhat.com/rhdc/managed-files/pa-getting-started-azure-openshift-ebook-f20686-201911-en_0.pdf", - "services": [], + "arm-service": "Microsoft.AVS/privateClouds", + "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", + "services": [ + "ASR", + "WAF" + ], "severity": "High", - "subcategory": "Cluster Design", - "text": "Run user workloads on the worker nodes, not the control plane nodes", + "text": "If using stretched cluster, ensure that your selected Disaster Recovery solution is supported by the vendor", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "Azure Red Hat OpenShift", - "description": "Create infrastructure machine sets to hold infrastructure components. Apply specific Kubernetes labels to these machines and then update the infrastructure components to run on only those machines", - "guid": "76af4a69-1e88-439a-ba46-667e13c10567", - "link": "https://learn.microsoft.com/azure/openshift/howto-segregate-machinesets", + "arm-service": "Microsoft.AVS/privateClouds", + "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", "services": [ - "VNet", - "AKS" + "WAF" ], - "severity": "Medium", - "subcategory": "Cluster Design", - "text": "Isolate workloads into worker nodes running in individual subnets as needed", + "severity": "High", + "text": "If using stretched cluster, ensure that the SLA provided will meet your requirements", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "Azure Red Hat OpenShift", - "guid": "785c6fe9-6c96-4ad8-a44c-f3b2b38c886b", - "link": "https://learn.microsoft.com/azure/openshift/howto-create-a-backup", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", + "service": "AVS", "services": [ - "Backup" + "ExpressRoute", + "WAF" ], - "severity": "Medium", - "subcategory": "Backup", - "text": "Backup a cluster state for stateful workload scenarios to a paired region", + "severity": "High", + "text": "If using stretched cluster, ensure that both ExpressRoute circuits are connected to your connectivity hub.", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "Azure Red Hat OpenShift", - "guid": "a2c02149-9014-4a5d-9ce5-74dccbd9792a", - "link": "https://access.redhat.com/documentation/red_hat_openshift_container_storage/4.4/html/deploying_and_managing_openshift_container_storage_on_microsoft_azure/deploying-openshift-container-storage-on-microsoft-azure_rhocs", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", + "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", + "service": "AVS", "services": [ - "Storage", - "ACR" + "ExpressRoute", + "WAF" ], - "severity": "Medium", - "subcategory": "Data Store", - "text": "If container storage is required, ensure availability across regions if needed: Using RWX storage with inbuilt Azure Files storage class. Using CSI Drivers for storage provisioning", - "waf": "Reliability" - }, - { - "category": "Operations Management", - "checklist": "Azure Red Hat OpenShift", - "guid": "6bcca2b4-fea1-4dbf-9dd9-5d48c7c891dc", - "link": "https://docs.openshift.com/aro/3/dev_guide/persistent_volumes.html", - "services": [], - "severity": "Medium", - "subcategory": "Data Store", - "text": "Whenever possible, move state out of containers and into external databases that support multi-region replication. Avoid Persistent Volumes", + "severity": "High", + "text": "If using stretched cluster, ensure that both ExpressRoute circuits have GlobalReach enabled.", "waf": "Reliability" }, { - "category": "Platform Automation", - "checklist": "Azure Red Hat OpenShift", - "guid": "42324ece-81c1-4231-a1a6-417415833fb4", - "link": "https://docs.openshift.com/container-platform/4.13/applications/deployments/route-based-deployment-strategies.html", - "services": [], - "severity": "Low", - "subcategory": "Workload", - "text": "Consider blue/green or canary strategies to deploy new releases of application.", - "waf": "Operations" - }, - { - "category": "Platform Automation", - "checklist": "Azure Red Hat OpenShift", - "guid": "ae3c2df7-4316-46c3-acbe-05bbe209d4a0", - "link": "https://docs.openshift.com/container-platform/4.13/cicd/gitops/understanding-openshift-gitops.html", - "services": [], - "severity": "Low", - "subcategory": "Workload", - "text": "Consider using Red Hat OpenShift GitOps. Red Hat OpenShift GitOps uses Argo CD to maintain cluster resources and support application CI/CD.", - "waf": "Operations" - }, - { - "category": "Security", - "checklist": "Azure Red Hat OpenShift", - "guid": "da577784-24d2-4167-a5d2-fa56c56ad484", - "link": "https://learn.microsoft.com/azure/openshift/support-lifecycle", - "services": [], + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "WAF checklist", + "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", + "service": "AVS", + "services": [ + "WAF" + ], "severity": "High", - "subcategory": "Control plane", - "text": "Keep your clusters on the latest OpenShift version to avoid potential security or upgrade issues.", - "waf": "Security" + "text": "Have site disaster tolerance settings been properly considered and changed for your business if needed.", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Azure Red Hat OpenShift", - "guid": "08fe8273-4c48-46ba-880d-c0591cf75ee8", - "link": "https://learn.microsoft.com/azure/azure-arc/kubernetes/quickstart-connect-cluster", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "WAF checklist", + "guid": "ac1d6380-f866-4bbd-a9b4-b1ee5d7908b8", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#availability-zones", + "service": "IoT", "services": [ - "Arc", - "AKS" + "WAF" ], "severity": "High", - "subcategory": "Control plane", - "text": "Connect Azure Red Hat OpenShift clusters to Azure Arc-enabled Kubernetes.", - "waf": "Security" - }, - { - "category": "Security", - "checklist": "Azure Red Hat OpenShift", - "guid": "e1309ccc-d579-4366-acda-2750aa1abfe9", - "link": "https://docs.openshift.com/container-platform/4.10/security/encrypting-etcd.html", - "services": [], - "severity": "Low", - "subcategory": "Encryption", - "text": "For Azure Red Hat OpenShift 4 clusters, etcd data isn't encrypted by default, but it's recommended to enable etcd encryption to provide another layer of data security.", - "waf": "Security" + "text": "Leverage Availability Zones if regionally applicable (this is automatically enabled)", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Azure Red Hat OpenShift", - "guid": "d55d14c3-c492-49cb-8b3d-1325ae124ba3", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-introduction", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "WAF checklist", + "guid": "35f651e8-0124-4ef7-8c57-658e38609e6e", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", + "service": "IoT", "services": [ - "Arc", - "Defender", - "AKS" + "WAF" ], "severity": "Medium", - "subcategory": "Posture", - "text": "Use Microsoft Defender for Containers supported via Arc-enabled Kubernetes to secure clusters, containers, and applications.", - "waf": "Security" + "text": "Be aware of Microsoft-initiated failovers. These are exercised by Microsoft in rare situations to fail over all the IoT hubs from an affected region to the corresponding geo-paired region.", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Azure Red Hat OpenShift", - "guid": "4d0685ed-dce9-4be3-ab0d-db3b55fb2ec1", - "link": "https://learn.microsoft.com/azure/azure-arc/kubernetes/tutorial-akv-secrets-provider", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "WAF checklist", + "guid": "4ed3e490-dc06-4a1e-b467-5d0239d85540", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#cross-region-dr", + "service": "IoT", "services": [ - "Arc", - "AKV", - "AKS" + "WAF" ], - "severity": "Medium", - "subcategory": "Secrets", - "text": "For applications that require access to sensitive information, use a service principal and the AKV Secrets Provider with the extension for Arc-enabled Kubernetes clusters.", - "waf": "Security" + "severity": "High", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Azure Red Hat OpenShift", - "guid": "4eeaa359-2829-4e2e-bb21-73676aff6791", - "link": "https://learn.microsoft.com/azure/aks/developer-best-practices-pod-security#secure-pod-access-to-resources", - "services": [], - "severity": "Medium", - "subcategory": "Workload", - "text": "Secure pod access to resources. Provide the least number of permissions, and avoid using root or privileged escalation.", - "waf": "Security" + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "WAF checklist", + "guid": "a11ecab0-db47-46f7-9aa7-17764e7e45a1", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", + "service": "IoT", + "services": [ + "WAF" + ], + "severity": "High", + "text": "Learn how to trigger a manual failover.", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Azure Red Hat OpenShift", - "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", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "WAF checklist", + "guid": "f9db8dfb-1194-460b-aedd-34dd6a69db22", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#failback", + "service": "IoT", "services": [ - "Monitor", - "AzurePolicy" + "WAF" ], - "severity": "Medium", - "subcategory": "Workload", - "text": "Monitor and enforce configuration by using the Azure Policy Extension.", - "waf": "Security" + "severity": "High", + "text": "Learn how to fail back after a failover.", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Azure Red Hat OpenShift", - "guid": "15833fb4-ae3c-42df-9431-66c3bcbe05bb", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-introduction", + "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": [ - "Defender" + "WAF" ], "severity": "High", - "subcategory": "Workload", - "text": "Scan your images for vulnerabilities with Microsoft Defender or any other image scanning solution.", - "waf": "Security" + "text": "Follow Metaprompting guardrails for resonsible AI", + "waf": "Operational Excellence" }, { - "category": "Security", - "checklist": "Azure Red Hat OpenShift", - "guid": "e209d4a0-da57-4778-924d-216785d2fa56", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-private-link", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", + "link": "https://github.com/Azure-Samples/AI-Gateway", + "service": "Azure OpenAI", "services": [ - "ACR", - "Subscriptions" + "Entra", + "APIM", + "WAF" ], - "severity": "Low", - "subcategory": "Workload", - "text": "Deploy a dedicated and private instance of Azure Container Registry to each landing zone subscription.", - "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" }, { - "category": "Governance", - "checklist": "Azure Key Vault", - "guid": "6d37a33b-531c-4a91-871a-b69d8044f04e", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Key Vault", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "AKV", - "Backup" + "Monitor", + "WAF" ], "severity": "High", - "subcategory": "Deployment best practices", - "text": "Familiarize yourself with the Key Vault's best practices such as isolation recommendations, access control, data protection, backup, and logging.", - "waf": "Reliability" + "text": "Enable monitoring for your AOAI instances", + "waf": "Operational Excellence" }, { - "category": "BC and DR", - "checklist": "Azure Key Vault", - "guid": "7ba4d380-7b9e-4a8b-a0c3-2d8e49c11872", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "Key Vault", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "ACR", - "AKV" + "AKV", + "Monitor", + "Subscriptions", + "WAF" ], - "severity": "Medium", - "subcategory": "High Availability", - "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" + "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" }, { - "category": "BC and DR", - "checklist": "Azure Key Vault", - "guid": "17fb86a2-eb45-42a4-9c34-52b92a2a1842", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#data-replication", - "service": "Key Vault", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "Azure OpenAI", "services": [ - "AKV" + "Monitor", + "WAF" ], - "severity": "Medium", - "subcategory": "High Availability", - "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" + "severity": "High", + "text": "Monitor token usage to prevent service disruptions due to capacity", + "waf": "Operational Excellence" }, { - "category": "BC and DR", - "checklist": "Azure Key Vault", - "guid": "614682ca-6e0c-4f34-9f03-c6d3f2b99a32", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#failover-across-regions", - "service": "Key Vault", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "Azure OpenAI", "services": [ - "AzurePolicy", - "AKV" + "Monitor", + "WAF" ], "severity": "Medium", - "subcategory": "High Availability", - "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" + "text": "observe metrics like processed inference tokens, generated completion tokens monitor for rate limit", + "waf": "Operational Excellence" }, { - "category": "Management", - "checklist": "Azure Key Vault", - "guid": "9ef2b0d2-3206-4c94-b47a-4f07e6a1c509", - "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#design-considerations", - "service": "Key Vault", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "AKV", - "Storage", - "ASR", - "Backup", - "Subscriptions" + "APIM", + "WAF" ], - "severity": "Medium", - "subcategory": "Business continuity and disaster recovery", - "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" + "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" }, { - "category": "Management", - "checklist": "Azure Key Vault", - "guid": "2df045b1-c0f6-47d3-9a9b-99cf6999684e", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "Key Vault", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", + "link": "https://github.com/Azure-Samples/openai-enterprise-iac", + "service": "Azure OpenAI", "services": [ - "AKV", - "ASR" + "WAF" ], "severity": "High", - "subcategory": "Business continuity and disaster recovery", - "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" + "text": "Use Infrastructure as code to deploy the Azure OpenAI Service, model deployments, and all related resources", + "waf": "Operational Excellence" }, { - "category": "Management", - "checklist": "Azure Key Vault", - "guid": "cbfa96b0-5249-4e6f-947c-d0e79509708c", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "Key Vault", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "AKV", - "ASR" + "Entra", + "WAF" ], - "severity": "Low", - "subcategory": "Business continuity and disaster recovery", - "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" + "severity": "High", + "text": "Use Microsoft Entra Authentication with Managed Identity instead of API Key", + "waf": "Security" }, { - "category": "Management", - "checklist": "Azure Key Vault", - "guid": "e8659d11-7e02-4db0-848c-c6541dbab68c", - "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", - "service": "Key Vault", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "AKV", - "Backup", - "ASR" + "WAF" ], - "severity": "Low", - "subcategory": "Business continuity and disaster recovery", - "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" + "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" }, { - "category": "Management", - "checklist": "Azure Key Vault", - "guid": "45c25e29-d0ef-4f07-aa04-0f8c64cbcc04", - "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", - "service": "Key Vault", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "AKV", - "Backup", - "ASR" + "WAF" ], - "severity": "Low", - "subcategory": "Business continuity and disaster recovery", - "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" + "severity": "High", + "text": "Evaluate usage of Provisioned throughput model ", + "waf": "Performance" }, { - "category": "Management", - "checklist": "Azure Key Vault", - "guid": "0f15640b-31e5-4de6-85a7-d2c652fa09d3", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview#purge-protection", - "service": "Key Vault", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", + "service": "Azure OpenAI", "services": [ - "ASR", - "AKV", - "EventHubs" + "WAF" ], - "severity": "Medium", - "subcategory": "Business continuity and disaster recovery", - "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" + "severity": "High", + "text": "Review and implement Azure AI content safety", + "waf": "Operational Excellence" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage" + "WAF" ], - "severity": "Medium", - "subcategory": " Overview", - "text": "Consider the 'Azure security baseline for storage'", - "waf": "Security" + "severity": "High", + "text": "Define and evaluate the throughput of the system based on tokens & response per minute and align with requirements", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage", - "PrivateLink" + "WAF" ], - "severity": "High", - "subcategory": "Networking", - "text": "Consider using private endpoints for Azure Storage", - "waf": "Security" + "severity": "Medium", + "text": "Improve latency of the system by limiting token sizes, streaming options", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "RBAC", "Storage", - "Subscriptions" + "ServiceBus", + "WAF" ], "severity": "Medium", - "subcategory": "Governance", - "text": "Ensure older storage accounts are not using 'classic deployment model'", - "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" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "5bda4332-4f24-4811-9331-82ba51752694", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "Azure OpenAI", "services": [ - "Storage", - "Defender" + "WAF" ], "severity": "High", - "subcategory": "Governance", - "text": "Enable Microsoft Defender for all of your storage accounts", - "waf": "Security" + "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" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage" + "WAF" ], "severity": "Medium", - "subcategory": "Data Availability", - "text": "Enable 'soft delete' for blobs", - "waf": "Security" + "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" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", + "service": "Azure OpenAI", "services": [ - "Storage" + "WAF" ], - "severity": "Medium", - "subcategory": "Confidentiality", - "text": "Disable 'soft delete' for blobs", - "waf": "Security" + "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" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "e9951904-8384-45c9-a6cb-2912156a1147", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "Azure OpenAI", "services": [ - "Storage" + "WAF" ], - "severity": "High", - "subcategory": "Data Availability", - "text": "Enable 'soft delete' for containers", - "waf": "Security" + "severity": "Medium", + "text": "Have a baseline for performance without fine-tuning for knowing whether or not fine-tuning has improved model performance", + "waf": "Performance" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage" + "ACR", + "WAF" ], - "severity": "Medium", - "subcategory": "Confidentiality", - "text": "Disable 'soft delete' for containers", - "waf": "Security" + "severity": "Low", + "text": "Deploy multiple OAI instances across regions", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage" + "Entra", + "APIM", + "WAF" ], "severity": "High", - "subcategory": "Data Availability", - "text": "Enable resource locks on storage accounts", - "waf": "Security" + "text": "Implement retry & healthchecks with Gateway pattern like APIM", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage", - "AzurePolicy", - "Subscriptions" + "WAF" ], - "severity": "High", - "subcategory": "Data Availability, Compliance", - "text": "Consider immutable blobs", - "waf": "Security" + "severity": "Medium", + "text": "Ensure having adequate quotas of TPM & RPM for the workload", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", + "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", + "service": "Azure OpenAI", "services": [ - "Storage" + "WAF" ], - "severity": "High", - "subcategory": "Networking", - "text": "Require HTTPS, i.e. disable port 80 on the storage account", - "waf": "Security" + "severity": "Medium", + "text": "Review the considerations in HAI toolkit guidance and apply those interaction practices for the slution", + "waf": "Operational Excellence" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage" + "ACR", + "WAF" ], - "severity": "High", - "subcategory": "Networking", - "text": "When enforcing HTTPS (disabling HTTP), check that you do not use custom domains (CNAME) for the storage account.", - "waf": "Security" + "severity": "Medium", + "text": "Deploy separate fine tuned models across regions if finetuning is employed", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "77a1f893-5bda-4433-84f2-4811633182ba", + "link": "https://learn.microsoft.com/azure/backup/backup-overview", + "service": "Azure OpenAI", "services": [ - "Storage" + "Backup", + "ASR", + "WAF" ], "severity": "Medium", - "subcategory": "Networking", - "text": "Limit shared access signature (SAS) tokens to HTTPS connections only", - "waf": "Security" + "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" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage", - "Entra" + "WAF" ], "severity": "High", - "subcategory": "Identity and Access Management", - "text": "Use Azure Active Directory (Azure AD) tokens for blob access", - "waf": "Security" + "text": "Azure AI search service tiers should be choosen to have a SLA ", + "waf": "Reliability" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", + "link": "https://learn.microsoft.com/purview/purview", + "service": "Azure OpenAI", "services": [ - "RBAC", - "Storage", - "Entra" + "WAF" ], - "severity": "Medium", - "subcategory": "Identity and Access Management", - "text": "Least privilege in IaM permissions", + "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" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage", - "Entra" + "WAF" ], "severity": "High", - "subcategory": "Identity and Access Management", - "text": "When using SAS, prefer 'user delegation SAS' over storage-account-key based SAS.", + "text": "Encrypt data used for RAG with SSE/Disk encryption with optional BYOK", "waf": "Security" }, { - "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. ", - "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", - "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", - "service": "Azure Storage", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", + "link": "https://learn.microsoft.com/azure/search/search-security-overview", + "service": "Azure OpenAI", "services": [ - "Storage", - "Monitor", - "AKV", - "Entra" + "ACR", + "WAF" ], "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": "Ensure TLS is enforced for data in transit across data sources, AI search used for Retrieval-Augmented Generation (RAG) and LLM communication", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage", - "AzurePolicy", - "AKV", - "Monitor" + "RBAC", + "WAF" ], "severity": "High", - "subcategory": "Monitoring", - "text": "Consider using Azure Monitor to audit control plane operations on the storage account", + "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" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", + "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", + "service": "Azure OpenAI", "services": [ - "Storage", - "AKV", - "AzurePolicy", - "Entra" + "WAF" ], "severity": "Medium", - "subcategory": "Identity and Access Management", - "text": "When using storage account keys, consider enabling a 'key expiration policy'", + "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" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage", - "AzurePolicy", - "Entra" + "Sentinel", + "Monitor", + "Defender", + "WAF" ], - "severity": "Medium", - "subcategory": "Identity and Access Management", - "text": "Consider configuring an SAS expiration policy", + "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" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage", - "AKV", "AzurePolicy", - "Entra" + "WAF" ], "severity": "Medium", - "subcategory": "Identity and Access Management", - "text": "Consider linking SAS to a stored access policy", + "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" }, { - "category": "Security", - "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", + "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": [ - "Storage", - "AKV" + "WAF" ], - "severity": "Medium", - "subcategory": "CI/CD", - "text": "Consider configuring your application's source code repository to detect checked-in connection strings and storage account keys.", - "waf": "Security" + "severity": "High", + "text": "Implement Prompt shields and groundedness detection using Content Safety ", + "waf": "Operational Excellence" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", + "link": "https://learn.microsoft.com/azure/compliance/", + "service": "Azure OpenAI", "services": [ - "Storage", - "Entra" + "WAF" ], "severity": "High", - "subcategory": "Identity and Access Management", - "text": "Consider storing connection strings in Azure KeyVault (in scenarios where managed identities are not possible)", + "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" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", + "service": "Azure OpenAI", "services": [ - "Storage", - "AzurePolicy", - "Entra" + "WAF" ], - "severity": "High", - "subcategory": "Identity and Access Management", - "text": "Strive for short validity periods for ad-hoc SAS", + "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.", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", + "service": "Azure OpenAI", "services": [ - "Storage", - "Entra" + "WAF" ], - "severity": "Medium", - "subcategory": "Identity and Access Management", - "text": "Apply a narrow scope to a SAS", + "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" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", + "service": "Azure OpenAI", "services": [ - "Storage", - "Entra" + "WAF" ], "severity": "Medium", - "subcategory": "Identity and Access Management", - "text": "Consider scoping SAS to a specific client IP address, wherever possible", + "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" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", + "service": "Azure OpenAI", "services": [ - "Storage", - "Entra" + "RBAC", + "AzurePolicy", + "WAF" ], - "severity": "Low", - "subcategory": "Identity and Access Management", - "text": "Consider checking uploaded data, after clients used a SAS to upload a file. ", + "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", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", + "service": "Azure OpenAI", "services": [ - "RBAC", - "Storage", - "Entra" + "WAF" ], "severity": "High", - "subcategory": "Identity and Access Management", - "text": "SFTP: Limit the amount of 'local users' for SFTP access, and audit whether access is needed over time.", + "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" }, { - "category": "Security", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage", - "Entra" + "RBAC", + "WAF" ], - "severity": "Medium", - "subcategory": "Identity and Access Management", - "text": "SFTP: The SFTP endpoint does not support POSIX-like ACLs.", + "severity": "High", + "text": "Apply RBAC to th data stores having embeddings and vectors and scope access based on role's access requirements", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage", - "AzurePolicy" + "PrivateLink", + "WAF" ], "severity": "High", - "subcategory": "Networking", - "text": "Avoid overly broad CORS policies", + "text": "Configure private endpoint for AI services to restrict service access within your network", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Storage Review 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", + "service": "Azure OpenAI", "services": [ - "Storage" + "VNet", + "Firewall", + "WAF" ], "severity": "High", - "subcategory": "Confidentiality and Encryption", - "text": "Determine how data at rest should be encrypted. Understand the thread model for data.", + "text": "Enforce strict inbound and outbound traffic control with Azure Firewall and UDRs and limit the external integration points", "waf": "Security" }, { - "category": "Security", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", + "service": "Azure OpenAI", "services": [ - "Storage" + "WAF" ], - "severity": "Medium", - "subcategory": "Confidentiality and Encryption", - "text": "Determine which/if platform encryption should be used.", + "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" }, { - "category": "Security", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage" + "WAF" ], "severity": "Medium", - "subcategory": "Confidentiality and Encryption", - "text": "Determine which/if client-side encryption should be used.", - "waf": "Security" + "text": "Use prompt compression tools like LLMLingua or gprtrim", + "waf": "Cost Optimization" }, { - "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.", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage", - "Entra" + "Entra", + "AKV", + "WAF" ], "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": "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" }, { - "category": "Operations Management", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage" + "WAF" ], - "severity": "High", - "subcategory": "Platform Version", - "text": "Leverage a storagev2 account type for better performance and reliability", - "waf": "Reliability" + "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", + "waf": "Security" }, { - "category": "BC and DR", - "checklist": "Azure Storage Review Checklist", - "guid": "e05bbe20-9d49-4fda-9777-8424d116785c", - "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", - "service": "Azure Storage", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "93555620-2bfe-4456-9b0d-834a348b263e", + "service": "Azure OpenAI", "services": [ - "Storage" + "Monitor", + "WAF" ], - "severity": "High", - "subcategory": "Availablity", - "text": "Leverage GRS, ZRS or GZRS storage for the highest availability", - "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" }, { - "category": "BC and DR", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", + "service": "Azure OpenAI", "services": [ - "Storage" + "WAF" ], "severity": "Medium", - "subcategory": "Failover", - "text": "For write operation after failover, use customer-Managed Failover ", - "waf": "Reliability" + "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" }, { - "category": "Operations Management", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage" + "WAF" ], - "severity": "Medium", - "subcategory": "Failover", - "text": "Understand Microsoft-Managed Failover details", - "waf": "Reliability" + "severity": "Low", + "text": "Azure AI Services are properly tagged for better management", + "waf": "Operational Excellence" }, { - "category": "Operations Management", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "Storage" + "WAF" ], - "severity": "Medium", - "subcategory": "Data Protection", - "text": "Enable Soft Delete", - "waf": "Reliability" + "severity": "Low", + "text": "Azure AI Service accounts follows organizational naming conventions", + "waf": "Operational Excellence" }, { - "category": "BCDR", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Ensure that your backups are protected against attacks. This should include encryption of the backups to protect against loss of confidentiality. For regular Azure service backup, backup data is automatically encrypted using Azure platform-managed keys. You can also choose to encrypt the backup using a customer-managed key. In this case, ensure this customer-managed key in the key vault is also in the backup scope.", - "guid": "676f6951-0368-49e9-808d-c33a692c9a64", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/sql-database-security-baseline#br-2-encrypt-backup-data", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", + "service": "Azure OpenAI", "services": [ - "SQL", - "AKV", - "Backup" + "WAF" ], - "severity": "Medium", - "subcategory": "Azure Key Vault", - "text": "Protect your backup data with encryption and store keys safely in Azure Key Vault", - "waf": "Security" + "severity": "High", + "text": "Diagnostic logs in Azure AI services resources should be enabled", + "waf": "Operational Excellence" }, { - "category": "BCDR", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Azure SQL Database uses SQL Server technology to create full backups every week, differential backup every 12-24 hours, and transaction log backup every 5 to 10 minutes. By default, SQL Database stores data in geo-redundant storage blobs that are replicated to a paired region.", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "link": "https://learn.microsoft.com/azure/ai-services/authentication", + "service": "Azure OpenAI", "services": [ - "SQL", - "Storage", - "Backup" + "Entra", + "WAF" ], - "severity": "Medium", - "subcategory": "Backup", - "text": "Configure Azure SQL Database automated backups", + "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" }, { - "category": "BCDR", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "By default, SQL Database stores data in geo-redundant storage blobs that are replicated to a paired region. For SQL Database, the backup storage redundancy can be configured at the time of database creation or can be updated for an existing database; the changes made to an existing database apply to future backups only.", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", "services": [ - "SQL", - "Storage", - "Backup" + "Entra", + "AKV", + "WAF" ], - "severity": "Low", - "subcategory": "Backup", - "text": "Enable geo-redundant backup storage to protect against single region failure and data loss", + "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" }, { - "category": "Code", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Malicious code can potentially circumvent security controls. Before deploying custom code to production, it is essential to review what's being deployed. Use a database tool like Azure Data Studio that supports source control. Implement tools and logic for code analysis, vulnerability and credential scanning.", - "guid": "7ca9f006-d2a9-4652-951c-de8e4ac5e76e", - "link": "https://learn.microsoft.com/azure/azure-sql/database/transparent-data-encryption-byok-create-server", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", "services": [ - "SQL" + "AKV", + "WAF" ], - "severity": "Medium", - "subcategory": "Source Control and Code Review", - "text": "Use Source Control systems to store, maintain and review application code deployed inside Azure SQLDB Database", + "severity": "High", + "text": "Regularly rotate and expire keys stored in Azure Key Vault to minimize the risk of unauthorized access.", "waf": "Security" }, { - "category": "Data Discovery and Classification", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "In case of classification requirements Purview is the preferred option. Only use SQL Data Discovery & Classification in case Purview is not an option. Discover columns that potentially contain sensitive data. What is considered sensitive data heavily depends on the customer, compliance regulation, etc., and needs to be evaluated by the users in charge of that data. Classify the columns to use advanced sensitivity-based auditing and protection scenarios. Review results of automated discovery and finalize the classification if necessary.", - "guid": "d401509b-2629-4484-9a7f-af0d29a7778f", - "link": "https://learn.microsoft.com/azure/azure-sql/database/data-discovery-and-classification-overview?view=azuresql#faq---advanced-classification-capabilities", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "adfe27be-e297-401a-a352-baaab79b088d", + "link": "https://github.com/openai/tiktoken", + "service": "Azure OpenAI", "services": [ - "SQL" + "WAF" ], - "severity": "Low", - "subcategory": "Data Discovery and Classification", - "text": "Plan and configure Data Discovery & Classification to protect the sensitive data", - "waf": "Security" + "severity": "High", + "text": "Use tiktoken to understand token sizes for token optimizations in conversational mode", + "waf": "Cost Optimization" }, { - "category": "Data Masking", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Usage of this feature is recommended only if column encryption is not an option and there is a specific requirement to preserve data types and formats. Dynamic data masking limits sensitive data exposure by masking it to non-privileged users. Dynamic data masking helps prevent unauthorized access to sensitive data by enabling customers to designate how much of the sensitive data to reveal with minimal impact on the application layer.", - "guid": "9391fd50-135e-453e-90a7-c1a23f88cc13", - "link": "https://learn.microsoft.com/azure/azure-sql/database/dynamic-data-masking-overview", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", + "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", + "service": "Azure OpenAI", "services": [ - "SQL" + "WAF" ], - "severity": "Low", - "subcategory": "Data Masking", - "text": "Use Data Masking to prevent unauthorized non-admin users data access if no encryption is possible", + "severity": "High", + "text": "Follow secure coding practices to prevent common vulnerabilities such as injection attacks, cross-site scripting (XSS), or security misconfigurations", "waf": "Security" }, { - "category": "Defender", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "SQL Advanced Threat Detection (ATP) provides a layer of security that detects potential vulnerabilities and anomalous activity in databases such as SQL injection attacks and unusual behavior patterns. When a potential threat is detected Threat Detection sends an actionable real-time alert by email and in Microsoft Defender for Cloud, which includes clear investigation and remediation steps for the specific threat.", - "guid": "4e52d73f-5d37-428f-b3a2-e6997e835979", - "link": "https://learn.microsoft.com/azure/azure-sql/database/threat-detection-configure", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "SQL", - "Defender", - "EventHubs" + "WAF" ], "severity": "High", - "subcategory": "Advanced Threat Protection", - "text": "Review and complete Advanced Threat Protection (ATP) configuration", + "text": "Setup a process to regularly update and patch the LLM libraries and other system components", "waf": "Security" }, { - "category": "Defender", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Enable Microsoft Defender for Azure SQL at the subscription level to automatically onboard and protect all existing and future servers and databases. When you enable on the subscription level, all databases in Azure SQL Database and Azure SQL Managed Instance are protected. You can then disable them individually if you choose. If you want to manually manage which databases are protected, disable at the subscription level and enable each database that you want protected.", - "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 ", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "e29711b1-352b-4eee-879b-588defc4972c", + "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", + "service": "Azure OpenAI", "services": [ - "SQL", - "Defender", - "Subscriptions" + "AzurePolicy", + "WAF" ], "severity": "High", - "subcategory": "Defender for Azure SQL", - "text": "Enable Microsoft Defender for Azure SQL", - "waf": "Security" + "text": "Adhere to Azure OpenAI or other LLMs terms of use, policies and guidance and allowed use cases", + "waf": "Operational Excellence" }, { - "category": "Defender", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Microsoft Defender for Azure SQL ATP detects anomalous activities indicating unusual and potentially harmful attempts to access or exploit databases. Alerts can be configured and generated and will be reported in the Defender for console.", - "guid": "ca342fdf-d25a-4427-b105-fcd50ff8a0ea", - "link": "https://learn.microsoft.com/azure/azure-sql/database/threat-detection-configure", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "SQL", - "Defender", - "Monitor" + "Cost", + "WAF" ], - "severity": "High", - "subcategory": "Defender for Azure SQL", - "text": "Prepare a security response plan to promptly react to Microsoft Defender for Azure SQL alerts", - "waf": "Security" + "severity": "Medium", + "text": "Understand difference in cost of base models and fine tuned models and token step sizes", + "waf": "Cost Optimization" }, { - "category": "Defender", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Azure SQLDB vulnerability assessment is a service that provides visibility into your security state. Vulnerability assessment includes actionable steps to resolve security issues and enhance your database security. It can help you to monitor a dynamic database environment where changes are difficult to track and improve your SQL security posture.", - "guid": "a6101ae7-534c-45ab-86fd-b34c55ea21ca", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/sql-azure-vulnerability-assessment-overview", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "SQL", - "Defender", - "Monitor" + "Cost", + "WAF" ], "severity": "High", - "subcategory": "Vulnerability Assessment", - "text": "Configure Vulnerability Assessment (VA) findings and review recommendations", - "waf": "Security" + "text": "Batch requests, where possible, to minimize the per-call overhead which can reduce overall costs. Ensure you optimize batch size", + "waf": "Cost Optimization" }, { - "category": "Defender", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Microsoft Defender for Cloud provides vulnerability assessment for your Azure SQL Databases. Vulnerability assessment scans your databases for software vulnerabilities and provides a list of findings. You can use the findings to remediate software vulnerabilities and disable findings.", - "guid": "c8c5f112-1e50-4f77-9264-8195b4cd61ac", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/sql-azure-vulnerability-assessment-find?view=azuresql", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "SQL", - "Defender" + "Monitor", + "Cost", + "WAF" ], - "severity": "High", - "subcategory": "Vulnerability Assessment", - "text": "Regularly review of Vulnerability Assessment (VA) findings and recommendations and prepare a plan to fix", - "waf": "Security" + "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" }, { - "category": "Encryption", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Always Encrypted with Secure Enclaves expands confidential computing capabilities of Always Encrypted by enabling in-place encryption and richer confidential queries. Always Encrypted with Secure Enclaves addresses these limitations by allowing some computations on plaintext data inside a secure enclave on the server side. Usage of this feature is recommended for the cases where you need to limit administrator access and need your queries to support more than equality matching of encrypted columns.", - "guid": "65d7e54a-10a6-4094-b673-9ff3809c9277", - "link": "https://learn.microsoft.com/sql/relational-databases/security/encryption/always-encrypted-enclaves", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "SQL" + "WAF" ], "severity": "Medium", - "subcategory": "Always Encrypted", - "text": "If protecting sensitive PII data from admin users is a key requirement, but Column Encryption limitations cannot be tolerated, consider the adoption of Always Encrypted with Secure Enclaves", - "waf": "Security" + "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" }, { - "category": "Encryption", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "With Azure SQL Database, you can apply symmetric encryption to a column of data by using Transact-SQL. This approach is called column encryption, because you can use it to encrypt specific columns with different encryption keys. Doing so gives you more granular encryption capability than TDE, which encrypts data in pages. Using Always Encrypted to ensure sensitive data isn't exposed in plaintext in Azure SQL Database or SQL Managed Instance, even in memory/in use. Always Encrypted protects the data from Database Administrators (DBAs) and cloud admins (or bad actors who can impersonate high-privileged but unauthorized users) and gives you more control over who can access your data.", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", + "link": "https://learn.microsoft.com/azure/search/search-reliability", + "service": "Azure OpenAI", "services": [ - "SQL", - "Storage", - "AKV" + "WAF" ], - "severity": "Low", - "subcategory": "Column Encryption", - "text": "To protect sensitive PII data from non-admin users in specific table columns, consider using Column Encryption", - "waf": "Security" + "severity": "Medium", + "text": "Review the guidance provided on setting up AI search for Reliability", + "waf": "Operational Excellence" }, { - "category": "Encryption", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Enabled by default, Transparent data encryption (TDE) helps to protect the database files against information disclosure by performing real-time encryption and decryption of the database, associated backups, and transaction log files 'at rest', without requiring changes to the application.", - "guid": "c614ac47-bebf-4061-b0a1-43e0c6b5e00d", - "link": "https://learn.microsoft.com/azure/azure-sql/database/transparent-data-encryption-byok-create-server", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "SQL", "Storage", - "Backup" + "WAF" ], - "severity": "High", - "subcategory": "Transparent Data Encryption", - "text": "Ensure Transparent Data Encryption (TDE) is kept enabled", - "waf": "Security" + "severity": "Medium", + "text": "Plan and manage AI Search Vector storage", + "waf": "Operational Excellence" }, { - "category": "Encryption", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "If separation of duties in the management of keys and data within the organization is required, leverage Customer Managed Keys (CMK) for Transparent Data Encryption (TDE) for your Azure SQLDB and use Azure Key Vault to store (refer to its checklist). Leverage this feature when you have strict security requirements which cannot be met by the managed service keys.", - "guid": "2edb4165-4f54-47cc-a891-5c82c2f21e25", - "link": "https://learn.microsoft.com/azure/azure-sql/database/transparent-data-encryption-byok-overview", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "SQL", - "AKV" + "WAF" ], "severity": "Medium", - "subcategory": "Transparent Data Encryption", - "text": "Use customer-managed keys (CMK) in Azure Key Vault (AKV) if you need increased transparency and granular control over the TDE protection", - "waf": "Security" + "text": "Apply LLMOps practices to automate the lifecycle management of your GenAI applications", + "waf": "Operational Excellence" }, { - "category": "Encryption", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "The minimal Transport Layer Security (TLS) version setting allows customers to choose which version of TLS their SQL database uses. It's possible to change the minimum TLS version by using the Azure portal, Azure PowerShell, and the Azure CLI.", - "guid": "7754b605-57fd-4bcb-8213-52c39d8e8225", - "link": "https://learn.microsoft.com/azure/azure-sql/database/connectivity-settings?source=recommendations&view=azuresql&tabs=azure-portal#minimal-tls-version", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "SQL" + "WAF" ], "severity": "High", - "subcategory": "Transport Layer Security", - "text": "Enforce minimum TLS version to the latest available", - "waf": "Security" + "text": "Evaluate usage of billing models - PAYG vs PTU", + "waf": "Cost Optimization" }, { - "category": "Identity", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Use Azure Active Directory (Azure AD) authentication for centralized identity management. Use SQL Authentication only if really necessary and document as exceptions.", - "guid": "c9b8b6bf-2c6b-453d-b400-de9a43a549d7", - "link": "https://learn.microsoft.com/azure/azure-sql/database/authentication-aad-overview", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "SQL", - "Entra" + "WAF" ], "severity": "Medium", - "subcategory": "Azure Active Directory", - "text": "Leverage Azure AD authentication for connections to Azure SQL Databases", - "waf": "Security" + "text": "Evaluate the quality of prompts and applications when switching between model versions", + "waf": "Operational Excellence" }, { - "category": "Identity", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Using Azure AD groups simplifies permission management and both the group owner, and the resource owner can add/remove members to/from the group. Create a separate group for Azure AD administrators for each logical server. Monitor Azure AD group membership changes using Azure AD audit activity reports.", - "guid": "29820254-1d14-4778-ae90-ff4aeba504a3", - "link": "https://learn.microsoft.com/azure/azure-sql/database/security-best-practice?view=azuresql#central-management-for-identities", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "SQL", "Monitor", - "Entra" + "WAF" ], "severity": "Medium", - "subcategory": "Azure Active Directory", - "text": "Create a separate Azure AD group with two admin accounts for each Azure SQL Database logical server", - "waf": "Security" + "text": "Evaluate, monitor and refine your GenAI apps for features like groundedness, relevance, accuracy, coherence, fluency, �", + "waf": "Operational Excellence" }, { - "category": "Identity", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Ensure that distinct system and user assigned managed identities, that are dedicated to the function, with least permissions assigned, are used for communication from Azure services and applications to the Azure SQLDB databases.", - "guid": "df3a09ee-03bb-4198-8637-d141acf5f289", - "link": "https://learn.microsoft.com/azure/azure-sql/database/security-best-practice?view=azuresql#minimize-the-use-of-password-based-authentication-for-applications", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "294798b1-578b-4219-a46c-eb5443513592", + "service": "Azure OpenAI", "services": [ - "SQL", - "Entra" + "WAF" ], "severity": "Medium", - "subcategory": "Azure Active Directory", - "text": "Minimize the use of password-based authentication for applications", - "waf": "Security" + "text": "Evaluate your Azure AI Search results based on different search parameters", + "waf": "Operational Excellence" }, { - "category": "Identity", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "System or User assigned managed identities enable Azure SQLDB to authenticate to other cloud services (e.g. Azure Key Vault) without storing credentials in code. Once enabled, all necessary permissions can be granted via Azure role-based-access-control to the specific Azure SQLDB instance. Do not share user assigned managed identities across multiple services if not strictly required.", - "guid": "69891194-5074-4e30-8f69-4efc3c580900", - "link": "https://learn.microsoft.com/azure/active-directory/managed-identities-azure-resources/overview", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "AKV", - "RBAC", - "SQL", - "ACR", - "Entra" + "WAF" ], - "severity": "Low", - "subcategory": "Managed Identities", - "text": "Assign Azure SQL Database a managed identity for outbound resource access", - "waf": "Security" + "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" }, { - "category": "Identity", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Use an Azure AD integrated authentication that eliminates the use of passwords. Password-based authentication methods are a weaker form of authentication. Credentials can be compromised or mistakenly given away. Use single sign-on authentication using Windows credentials. Federate the on-premises AD domain with Azure AD and use integrated Windows authentication (for domain-joined machines with Azure AD).", - "guid": "88287d4a-8bb8-4640-ad78-03f51354d003", - "link": "https://learn.microsoft.com/azure/azure-sql/database/authentication-aad-configure?view=azuresql&tabs=azure-powershell#active-directory-integrated-authentication", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "SQL", - "Entra" + "WAF" ], "severity": "Medium", - "subcategory": "Passwords", - "text": "Minimize the use of password-based authentication for users", - "waf": "Security" + "text": "Use prompt engineering techniques to improve the accuracy of LLM responses", + "waf": "Operational Excellence" }, { - "category": "Ledger", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "The hash of the latest block in the database ledger is called the database digest. It represents the state of all ledger tables in the database at the time when the block was generated. Generating a database digest is efficient, because it involves computing only the hashes of the blocks that were recently appended. Azure Confidential Ledger is one of the supported store, it can be used and supports automatic generation and storage of database digests. Azure Ledger provides advanced security features like Blockchain Ledger Proof and Confidential Hardware Enclaves. Use it only if advanced security features are required, otherwise revert to Azure storage.", - "guid": "0e853380-50ba-4bce-b2fd-5c7391c85ecc", - "link": "https://learn.microsoft.com/azure/architecture/guide/technology-choices/multiparty-computing-service#confidential-ledger-and-azure-blob-storage", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "e737897e-71ca-47da-acfa-962a1594946d", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", + "service": "Azure OpenAI", "services": [ - "SQL", - "Storage" + "WAF" ], "severity": "Medium", - "subcategory": "Database Digest", - "text": "Use Azure Confidential Ledger to store database digests only if advanced security features are required", + "text": "Red team your GenAI applications", "waf": "Security" }, { - "category": "Ledger", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "The hash of the latest block in the database ledger is called the database digest. It represents the state of all ledger tables in the database at the time when the block was generated. Generating a database digest is efficient, because it involves computing only the hashes of the blocks that were recently appended. Azure Blob Storage with Immutable Storage feature can be used and supports automatic generation and storage of database digests. To prevent tampering of your digest files, configure and lock a retention policy for your container.", - "guid": "afefb2d3-95da-4ac9-acf5-33d18b32ef9a", - "link": "https://learn.microsoft.com/sql/relational-databases/security/ledger/ledger-digest-management", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", + "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", + "service": "Azure OpenAI", "services": [ - "SQL", - "Storage", - "AzurePolicy" + "WAF" ], "severity": "Medium", - "subcategory": "Database Digest", - "text": "If Azure storage account is used to store database digests, ensure security is properly configured", - "waf": "Security" + "text": "Provide end users with scoring options for LLM responses and track these scores. ", + "waf": "Operational Excellence" }, { - "category": "Ledger", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Ledger provides a form of data integrity called forward integrity, which provides evidence of data tampering on data in your ledger tables. The database verification process takes as input one or more previously generated database digests. It then recomputes the hashes stored in the database ledger based on the current state of the ledger tables. If the computed hashes don't match the input digests, the verification fails. The failure indicates that the data has been tampered with. The verification process reports all inconsistencies that it detects.", - "guid": "f8d4ffda-8aac-4cc6-b72b-c81cb8625420", - "link": "https://learn.microsoft.com/sql/relational-databases/security/ledger/ledger-database-verification", + "arm-service": "Microsoft.CognitiveServices/accounts", + "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", "services": [ - "SQL", - "Storage" + "WAF" + ], + "severity": "High", + "text": "Consider Quota management practices", + "waf": "Cost Optimization" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "WAF checklist", + "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", + "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", + "service": "Azure OpenAI", + "services": [ + "Entra", + "APIM", + "LoadBalancer", + "ACR", + "WAF" ], "severity": "Medium", - "subcategory": "Integrity", - "text": "Schedule the Ledger verification process regularly to verify data integrity", - "waf": "Security" + "text": "Use Load balancer solutions like APIM based gateway for balancing load and capacity across services and regions", + "waf": "Operational Excellence" }, { - "category": "Ledger", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "The Ledger feature provides tamper-evidence capabilities in your database. You can cryptographically attest to other parties, such as auditors or other business parties, that your data hasn't been tampered with. Ledger helps protect data from any attacker or high-privileged user, including database administrators (DBAs), system administrators, and cloud administrators.", - "guid": "2563f498-e2d3-42ea-9e7b-5517881a06a2", - "link": "https://learn.microsoft.com/sql/relational-databases/security/ledger/ledger-overview", + "arm-service": "Microsoft.Purview/accounts", + "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", "services": [ - "SQL" + "WAF" ], "severity": "Medium", - "subcategory": "Ledger", - "text": "If cryptographic proof of data integrity is a critical requirement, Ledger feature should be considered", - "waf": "Security" + "text": "Leverage FTA Resillency Handbook", + "waf": "Reliability" }, { - "category": "Ledger", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Depending on the type of tampering, there are cases where you can repair the ledger without losing data. In the article contained in the --More Info-- column, different scenarios and recovery techniques are described.", - "guid": "804fc554-6554-4842-91c1-713b32f99902", - "link": "https://learn.microsoft.com/sql/relational-databases/security/ledger/ledger-how-to-recover-after-tampering", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "ab067acb-49e5-4b96-8332-4ecf8cc13318", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", "services": [ - "SQL" + "WAF" + ], + "severity": "High", + "text": "Plan for Data Center level outage", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Purview/accounts", + "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", + "services": [ + "WAF" ], "severity": "Medium", - "subcategory": "Recovery", - "text": "Prepare a response plan to investigate and repair a database after a tampering event", - "waf": "Security" + "text": "Practice Failover for BCDR", + "waf": "Reliability" }, { - "category": "Logging", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Azure SQL Database Auditing tracks database events and writes them to an audit log in your Azure storage account. Auditing helps you understand database activity and gain insight into discrepancies and anomalies that could indicate business concerns or suspected security violations as well as helps you meet regulatory compliance. By default auditing policy includes all actions (queries, stored procedures and successful and failed logins) against the databases, which may result in high volume of audit logs. It's recommended for customers to configure auditing for different types of actions and action groups using PowerShell.", - "guid": "4082e31d-35f4-4a49-8507-d3172cc930a6", - "link": "https://learn.microsoft.com/azure/azure-sql/database/auditing-overview", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "97b15b8a-219a-44ab-bb57-879024d22678", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", "services": [ - "SQL", - "Storage", - "AzurePolicy" + "Backup", + "WAF" ], - "severity": "Medium", - "subcategory": "Auditing", - "text": "Ensure that Azure SQL Database Auditing is enabled at the server level", - "waf": "Security" + "severity": "High", + "text": "Plan a backup strategy and take regular backups", + "waf": "Reliability" }, { - "category": "Logging", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Azure SQL Database Auditing logs can be written to external storage accounts, Log Analytics workspace or Event Hub. Be sure to protect the target repository using backups and secured configuration. Use Azure SQL Database Managed Identity to access the storage and set an explicit retention period. Do not grant permissions to administrators to the audit log repository. Use a different target storage for --Enabling Auditing of Microsoft support operations--. ", - "guid": "9b64bc50-b60f-4035-bf7a-28c4806dfb46", - "link": "https://learn.microsoft.com/azure/azure-sql/database/auditing-overview", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "6d20b56c-56a9-4581-89bf-8d8e5c586b7d", + "link": "https://learn.microsoft.com/purview/manage-kafka-dotnet", + "service": "Purview", "services": [ - "Storage", - "Monitor", "EventHubs", - "SQL", - "Entra", - "Backup" + "WAF" ], "severity": "Low", - "subcategory": "Auditing", - "text": "Ensure that Azure SQL Database Auditing logs are backed up and secured in the selected repository type", - "waf": "Security" + "text": "Use Microsoft Purview's Event Hubs to subscribe and create entities to another account", + "waf": "Reliability" }, { - "category": "Logging", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "The Azure Monitor activity log is a platform log in Azure that provides insight into subscription-level events. The activity log includes information like when a resource is modified. It is recommended to send this activity log to the same external storage repository as the Azure SQL Database Audit Log (storage account, Log Analytics workspace, Event Hub).", - "guid": "fcd34708-87ac-4efc-aaf6-57a47f76644a", - "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "8cdc15ac-c075-4ee9-a130-a8889579e76b", + "link": "https://learn.microsoft.com/purview/deployment-best-practices", + "service": "Purview", "services": [ - "Storage", - "Monitor", - "EventHubs", - "SQL", - "Subscriptions" + "WAF" ], "severity": "Medium", - "subcategory": "Auditing", - "text": "Ensure that Azure SQL Database Activity Log is collected and integrated with Auditing logs", - "waf": "Security" + "text": "Follow Purview accounts architectures and deployment best practices", + "waf": "Reliability" }, { - "category": "Logging", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Forward any logs from Azure SQL to your Security Information and Event Management (SIEM) and Security Orchestration Automation and Response (SOAR). Ensure that you are monitoring different types of Azure assets for potential threats and anomalies. Focus on getting high-quality alerts to reduce false positives for analysts to sort through. Alerts can be sourced from log data, agents, or other data.", - "guid": "f96e127e-9572-453a-b325-ff89ae9f6b44", - "link": "https://learn.microsoft.com/azure/azure-sql/database/auditing-overview", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "896e710a-7da7-4be9-a56d-14d3c49d997c", + "link": "https://learn.microsoft.com/purview/concept-best-practices-collections", + "service": "Purview", "services": [ - "SQL", - "Monitor" + "WAF" ], "severity": "Medium", - "subcategory": "SIEM/SOAR", - "text": "Ensure that Azure SQL Database Auditing logs are being presented in to your organizations SIEM/SOAR", - "waf": "Security" + "text": "Follow Collection Architectures and best practices", + "waf": "Reliability" }, { - "category": "Logging", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Forward any logs from Azure SQL to your Security Information and Event Management (SIEM) and Security Orchestration Automation and Response (SOAR), which can be used to set up custom threat detections. Ensure that you are monitoring different types of Azure assets for potential threats and anomalies. Focus on getting high-quality alerts to reduce false positives for analysts to sort through. Alerts can be sourced from log data, agents, or other data.", - "guid": "41503bf8-73da-4a10-af9f-5f7fceb5456f", - "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "b3d1325a-a225-4c6f-9e06-85edddea8a4b", + "link": "https://learn.microsoft.com/purview/concept-best-practices-asset-lifecycle", + "service": "Purview", "services": [ - "SQL", - "Monitor" + "WAF" ], "severity": "Medium", - "subcategory": "SIEM/SOAR", - "text": "Ensure that Azure SQL Database Activity Log data is presented in to your SIEM/SOAR", - "waf": "Security" + "text": "Follow Assest lifecycle best practices", + "waf": "Reliability" }, { - "category": "Logging", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Security Operation Center (SOC) team should create an incident response plan (playbooks or manual responses) to investigate and mitigate tampering, malicious activities, and other anomalous behaviors.", - "guid": "19ec7c97-c563-4e1d-82f0-54d6ec12e754", - "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "7cdeb3c6-1fc2-4fc1-9eea-6e69d8d9a3ed", + "link": "https://learn.microsoft.com/purview/concept-best-practices-automation", + "service": "Purview", "services": [ - "SQL", - "EventHubs" + "WAF" ], "severity": "Medium", - "subcategory": "SIEM/SOAR", - "text": "Ensure that you have response plans for malicious or aberrant audit logging events", - "waf": "Security" + "text": "Follow automation best practices", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "When you create a logical server from the Azure portal for Azure SQL Database, the result is a public endpoint that is visible and reachable over the public network (Public Access). You can then limit connectivity based on firewall rules and Service Endpoint. You can also configure private connectivity only limiting connections to internal networks using Private Endpoint (Private Access). Private Access using Private Endpoint should be the default unless a business case or performance/technical reason applies that cannot support it. Usage of Private Endpoints has performance implications that need to be considered and assessed.", - "guid": "2c6d356a-1784-475b-a42c-ec187dc8c925", - "link": "https://learn.microsoft.com/azure/azure-sql/database/network-access-controls-overview", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "c218e687-ab06-47ac-a49e-5b9603324ecf", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", "services": [ - "SQL", - "PrivateLink" + "Backup", + "WAF" ], - "severity": "High", - "subcategory": "Connectivity", - "text": "Review Public vs. Private Access connectivity methods and select the appropriate one for the workload", - "waf": "Security" + "severity": "Medium", + "text": "Follow Backup and Migration Best practices", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "IMPORTANT: Connections to private endpoint only support Proxy as the connection policy. When using private endpoints connections are proxied via the Azure SQL Database gateway to the database nodes. Clients will not have a direct connection.", - "guid": "557b3ce5-bada-4296-8d52-a2d447bc1718", - "link": "https://learn.microsoft.com/azure/azure-sql/database/connectivity-architecture", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "8cc13318-da61-4170-869f-4fb4aa3d3ef7", + "link": "https://learn.microsoft.com/purview/concept-best-practices-glossary", + "service": "Purview", "services": [ - "SQL", - "AzurePolicy", - "PrivateLink" + "WAF" ], - "severity": "Low", - "subcategory": "Connectivity", - "text": "Keep default Azure SQL Database Connection Policy if not differently required and justified", - "waf": "Security" + "severity": "Medium", + "text": "Follow Purview Glossary Best Practices", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "This option configures the firewall to allow all connections from Azure, including connections from the subscriptions of other customers. If you select this option, make sure that your login and user permissions limit access to authorized users only. If not strictly required, keep this setting to OFF.", - "guid": "f48efacf-4405-4e8d-9dd0-16c5302ed082", - "link": "https://learn.microsoft.com/azure/azure-sql/database/network-access-controls-overview", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "f3176c4b-97b1-45b8-a219-a4abeb578790", + "link": "https://learn.microsoft.com/purview/concept-workflow", + "service": "Purview", "services": [ - "SQL", - "Subscriptions" + "WAF" ], - "severity": "High", - "subcategory": "Connectivity", - "text": "Ensure Allow Azure Services and Resources to Access this Server setting is disabled in Azure SQL Database firewall", - "waf": "Security" + "severity": "Low", + "text": "Leverage Workflows ", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Azure SQL Database has a new built-in feature that allows native integration with external REST endpoints. This means that integration of Azure SQL Database with Azure Functions, Azure Logic Apps, Cognitive Services, Event Hubs, Event Grid, Azure Containers, API Management and in general any REST or even GraphQL endpoint. If not properly restricted, code inside an Azure SQL Database database could leverage this mechanism to exfiltrate data. If not strictly required, it is recommended to block or restrict this feature using Outbound Firewall Rules.", - "guid": "cb3274a7-e36d-46f6-8de5-46d30c8dde8e", - "link": "https://learn.microsoft.com/sql/relational-databases/system-stored-procedures/sp-invoke-external-rest-endpoint-transact-sql", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "24d22678-6d20-4b56-a56a-958119bf8d8e", + "link": "https://learn.microsoft.com/purview/concept-best-practices-security", + "service": "Purview", "services": [ - "APIM", - "SQL", - "EventHubs" + "WAF" ], "severity": "Medium", - "subcategory": "Outbound Control", - "text": "Block or restrict outbound REST API calls to external endpoints", - "waf": "Security" + "text": "Follow Purview Security Best Practices", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Outbound firewall rules limit network traffic from the Azure SQL Database logical server to a customer defined list of Azure Storage accounts and Azure SQL Database logical servers. Any attempt to access storage accounts or databases not in this list is denied.", - "guid": "a566dd3d-314e-4a94-9378-102c42d82b38", - "link": "https://learn.microsoft.com/azure/azure-sql/database/outbound-firewall-rule-overview", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "5c586b7d-8cdc-415a-ac07-5ee9b130a888", + "link": "https://learn.microsoft.com/purview/concept-best-practices-lineage-azure-data-factory", + "service": "Purview", "services": [ - "SQL", - "Storage" + "WAF" ], "severity": "Medium", - "subcategory": "Outbound Control", - "text": "If outbound network access is required, it is recommended to configure outbound networking restrictions using built-in Azure SQL Database control feature", - "waf": "Security" + "text": "Follow Purview Data Lineage Best Practices", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Private Endpoint is created inside a subnet in an Azure Virtual Network. Proper security configuration must be applied also to the containing network environment, including NSG/ASG, UDR, firewall, monitoring and auditing.", - "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", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "9579e76b-896e-4710-a7da-7be9956d14d3", + "link": "https://learn.microsoft.com/purview/concept-best-practices-scanning", + "service": "Purview", "services": [ - "PrivateLink", - "Monitor", - "SQL", - "VNet", - "Firewall" + "WAF" ], "severity": "Medium", - "subcategory": "Private Access", - "text": "If Private Access connectivity is used, ensure that you are using the Private Endpoint, Azure Virtual Network, Azure Firewall, and Azure Network Security Group checklists", - "waf": "Security" - }, - { - "category": "Networking", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "When adding a Private Endpoint connection, public routing to your logical server isn't blocked by default. In the --Firewall and virtual networks-- pane, the setting --Deny public network access-- is not selected by default. To disable public network access, ensure that you select --Deny public network access--.", - "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": [ - "SQL", - "VNet", - "PrivateLink" - ], - "severity": "High", - "subcategory": "Private Access", - "text": "If Private Endpoint (Private Access) is used, consider disabling Public Access connectivity", - "waf": "Security" + "text": "Follow Best Practices for Scanning Registered Sources", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Network Security Group (NSG) and Application Security Group (ASG) can be now applied to subnet containing Private Endpoints to restrict connections to Azure SQLDB based on internal source IP ranges.", - "guid": "8600527e-e8c4-4424-90ef-1f0dca0224f2", - "link": "https://learn.microsoft.com/azure/private-link/private-endpoint-overview#network-security-of-private-endpoints", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "c49d997c-b3d1-4325-aa22-5c6f4e0685ed", + "link": "https://learn.microsoft.com/purview/concept-best-practices-classification", + "service": "Purview", "services": [ - "SQL", - "VNet", - "PrivateLink" + "WAF" ], "severity": "Medium", - "subcategory": "Private Access", - "text": "If Private Endpoint (Private Access) is used, apply NSG and eventually ASG to limit incoming source IP address ranges", - "waf": "Security" + "text": "Follow Classification Best Practices in Governance Portal", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "A Managed Instance (SQL MI) can be isolated inside a virtual network to prevent external access. Applications and tools that are in the same or peered virtual network in the same region could access it directly. Applications and tools that are in different region could use virtual-network-to-virtual-network connection or ExpressRoute circuit peering to establish connection. Customer should use Network Security Groups (NSG), and eventually internal firewalls, to restrict access over port 1433 only to resources that require access to a managed instance.", - "guid": "18123ef4-a0a6-45e3-87fe-7f454f65d975", - "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/connectivity-architecture-overview", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "ddea8a4b-7cde-4b3c-91fc-2fc14eea6e69", + "link": "https://learn.microsoft.com/purview/sensitivity-labels-frequently-asked-questions", + "service": "Purview", "services": [ - "SQL", - "ExpressRoute", - "VNet" + "WAF" ], "severity": "Medium", - "subcategory": "Private Access", - "text": "Apply Network Security Groups (NSG) and firewall rules to restrict access to Azure SQL Managed Instance internal subnet", - "waf": "Security" + "text": "Perform Sensitivity Labelling in the Purview Data Map", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Azure Virtual Network Service Endpoint is preferred solution if you want to establish a direct connection to the Azure SQL Database backend nodes using Redirect policy. This will allow access in high performance mode and is the recommended approach from a performance perspective.", - "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", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "d8d9a3ed-c218-4e68-9ab0-67acb49e5b96", + "link": "https://learn.microsoft.com/purview/concept-data-share", + "service": "Purview", "services": [ - "SQL", - "AzurePolicy", - "VNet" + "Storage", + "WAF" ], - "severity": "High", - "subcategory": "Public Access", - "text": "If Public Access connectivity is used, leverage Service Endpoint to restrict access from selected Azure Virtual Networks", - "waf": "Security" + "severity": "Low", + "text": "Leverage Azure Storage in-place data sharing with Microsoft Purview", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "The Azure SQL Database firewall allows you to specify IP address ranges from which communications are accepted. This approach is fine for stable IP addresses that are outside the Azure private network.", - "guid": "a73e32da-b3f4-4960-b5ec-2f42a557bf31", - "link": "https://learn.microsoft.com/azure/azure-sql/database/network-access-controls-overview", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "03324ecf-8cc1-4331-ada6-1170269f4fb4", + "link": "https://learn.microsoft.com/purview/concept-insights", + "service": "Purview", "services": [ - "SQL", - "Storage" + "WAF" ], - "severity": "Medium", - "subcategory": "Public Access", - "text": "If Public Access connectivity is used, ensure that only specific known IPs are added to the firewall", - "waf": "Security" + "severity": "Low", + "text": "Leverage Data Estate Insights", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "We recommend that you use database-level IP firewall rules whenever possible. This practice enhances security and makes your database more portable. Use server-level IP firewall rules for administrators. Also use them when you have many databases that have the same access requirements, and you don't want to configure each database individually.", - "guid": "e0f31ac9-35c8-4bfd-9865-edb60ffc6768", - "link": "https://learn.microsoft.com/azure/azure-sql/database/firewall-configure", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "aa3d3ef7-f317-46c4-a97b-15b8a219a4ab", + "link": "https://learn.microsoft.com/purview/catalog-adoption-insights", + "service": "Purview", "services": [ - "SQL", - "Storage" + "WAF" ], "severity": "Low", - "subcategory": "Public Access", - "text": "If Public Access connectivity is used and controlled by Azure SQL Database firewall rules, use database-level over server-level IP rules", - "waf": "Security" + "text": "Use Data stewardship and Catalog adoption", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "A Managed Instance (SQL MI) can be isolated inside a virtual network to prevent external access. The Managed Instance public endpoint is not enabled by default, must be explicitly enabled, only if strictly required. If company policy disallows the use of public endpoints, use Azure Policy to prevent enabling public endpoints in the first place.", - "guid": "b8435656-143e-41a8-9922-61d34edb751a", - "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/public-endpoint-overview", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "eb578790-24d2-4267-a6d2-0b56c56a9581", + "link": "https://learn.microsoft.com/purview/concept-insights", + "service": "Purview", "services": [ - "SQL", - "AzurePolicy", - "VNet" + "WAF" ], - "severity": "High", - "subcategory": "Public Access", - "text": "Do not enable Azure SQL Managed Instance public endpoint", - "waf": "Security" + "severity": "Low", + "text": "Use Inventory and Ownership", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "A Managed Instance (SQL MI) public endpoint is not enabled by default, must be explicitly enabled, only if strictly required. In this case, it is recommended to apply a Network Security Groups (NSG) to restrict access to port 3342 only to trusted source IP addresses.", - "guid": "057dd298-8726-4aa6-b590-1f81d2e30421", - "link": "https://learn.microsoft.com/azure/azure-sql/managed-instance/public-endpoint-overview", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "19bf8d8e-5c58-46b7-b8cd-c15acc075ee9", + "link": "https://learn.microsoft.com/purview/glossary-insights", + "service": "Purview", "services": [ - "SQL", - "VNet" + "WAF" ], - "severity": "High", - "subcategory": "Public Access", - "text": "Restrict access if Azure SQL Managed Instance public endpoint is required", - "waf": "Security" + "severity": "Low", + "text": "Leverage Insights for Glossary, Classifications, Sensitivity Labels", + "waf": "Reliability" }, { - "category": "Privileged Access", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Most operations, support, and troubleshooting performed by Microsoft personnel and sub-processors do not require access to customer data. In those rare circumstances where such access is required, Customer Lockbox for Microsoft Azure provides an interface for customers to review and approve or reject customer data access requests. In support scenarios where Microsoft needs to access customer data, Azure SQL Database supports Customer Lockbox to provide an interface for you to review and approve or reject customer data access requests.", - "guid": "37b6eb0f-553d-488f-8a8a-cb9bf97388ff", - "link": "https://learn.microsoft.com/azure/security/fundamentals/customer-lockbox-overview", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "b130a888-9579-4e76-a896-e710a7da7be9", + "link": "https://learn.microsoft.com/purview/compliance-manager", + "service": "Purview", "services": [ - "SQL" + "WAF" ], - "severity": "Low", - "subcategory": "Lockbox", - "text": "Review and enable Customer Lockbox for Azure SQL Database access by Microsoft personnel", - "waf": "Security" + "severity": "Medium", + "text": "Generate assessment scores", + "waf": "Reliability" }, { - "category": "Privileged Access", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "The principle of least privilege states that users shouldn't have more privileges than needed to complete their tasks. High-privileged database and server users can perform many configuration and maintenance activities on the database and can also drop databases in Azure SQL instance. Tracking database owners and privileged accounts is important to avoid having excessive permission.", - "guid": "5fe5281f-f0f9-4842-a682-8baf18bd8316", - "link": "https://learn.microsoft.com/azure/azure-sql/database/security-best-practice?view=azuresql#implement-principle-of-least-privilege", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "956d14d3-c49d-4997-ab3d-1325aa225c6f", + "link": "https://learn.microsoft.com/purview/compliance-manager-scoring", + "service": "Purview", "services": [ - "SQL" + "WAF" ], "severity": "Medium", - "subcategory": "Permissions", - "text": "Ensure that users are assigned the minimum level of access necessarily to complete their job functions", - "waf": "Security" + "text": "Profiling- get summaries of data content", + "waf": "Reliability" }, { - "category": "Privileged Access", - "checklist": "Azure SQLDB Security Checklist (Preview)", - "description": "Identities (both Users and SPNs) should be scoped to the least amount of access needed to perform the function. A higher number of tightly scoped SPNs should be used, instead of having one SPN with multiple sets of unrelated permissions. For example, if there are three external web applications hosted on-prem that make queries to the Azure SQL Database, they should not all use the same SPN for these activities. Instead, they should each have their own tightly scoped SPN.", - "guid": "7b5b55e5-4750-4920-be97-eb726c256a5c", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/sql-database-security-baseline#im-3-use-azure-ad-single-sign-on-sso-for-application-access", + "arm-service": "Microsoft.Purview/accounts", + "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", "services": [ - "SQL", - "Entra" + "AzurePolicy", + "WAF" ], "severity": "Low", - "subcategory": "Permissions", - "text": "Ensure that distinct applications will be assigned different credentials with minimal permissions to access Azure SQL Database", - "waf": "Security" + "text": "Follow Microsoft Purview Data Owner access policies", + "waf": "Reliability" }, { - "category": "Compute", - "checklist": "Resiliency Review", - "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", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "4eea6e69-d8d9-4a3e-bc21-8e687ab067ac", + "link": "https://learn.microsoft.com/purview/concept-self-service-data-access-policy", + "service": "Purview", "services": [ - "VM" + "AzurePolicy", + "WAF" ], "severity": "Low", - "subcategory": "VM Scale Sets", - "text": "Enable automatic instance repairs for enhanced VM Scale Sets resiliency", + "text": "Follow Self-service access policies", "waf": "Reliability" }, { - "category": "Compute", - "checklist": "Resiliency Review", - "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", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "WAF checklist", + "guid": "b49e5b96-0332-44ec-b8cc-13318da61170", + "link": "https://learn.microsoft.com/purview/concept-policies-devops", + "service": "Purview", "services": [ - "Backup", - "VM" + "AzurePolicy", + "WAF" ], - "severity": "High", - "subcategory": "Virtual Machines", - "text": "Consider Azure Backup to meet your resiliency requirements for Azure VMs", + "severity": "Low", + "text": "Follow DevOps policies", "waf": "Reliability" }, { - "category": "Compute", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", + "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", + "service": "AKS", "services": [ - "VM" + "AKS", + "WAF" ], - "severity": "High", - "subcategory": "Virtual Machines", - "text": "Use Premium or Ultra disks for production VMs", + "severity": "Low", + "text": "If required for AKS Windows workloads HostProcess containers can be used", "waf": "Reliability" }, { - "category": "Compute", - "checklist": "Resiliency Review", - "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", + "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", + "service": "AKS", "services": [ - "VM" - ], - "severity": "High", - "subcategory": "Virtual Machines", - "text": "Ensure Managed Disks are used for all VMs", - "waf": "Reliability" + "WAF" + ], + "severity": "Low", + "text": "Use KEDA if running event-driven workloads", + "waf": "Performance" }, { - "category": "Compute", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", + "link": "https://dapr.io/", + "service": "AKS", "services": [ - "Storage", - "SQL", - "VM" + "WAF" ], - "severity": "Medium", - "subcategory": "Virtual Machines", - "text": "Do not use the Temp disk for anything that is not acceptable to be lost", - "waf": "Reliability" + "severity": "Low", + "text": "Use Dapr to ease microservice development", + "waf": "Operations" }, { - "category": "Compute", - "checklist": "Resiliency Review", - "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", + "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", + "service": "AKS", "services": [ - "Storage", - "ACR", - "VM" + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "Virtual Machines", - "text": "Leverage Availability Zones for your VMs in regions where they are supported", + "severity": "High", + "text": "Use the SLA-backed AKS offering", "waf": "Reliability" }, { - "category": "Compute", - "checklist": "Resiliency Review", - "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", + "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", + "service": "AKS", "services": [ - "VM" + "Cost", + "WAF" ], - "severity": "Medium", - "subcategory": "Virtual Machines", - "text": "For regions that do not support Availability Zones deploy VMs into Availability Sets", + "severity": "Low", + "text": "Use Disruption Budgets in your pod and deployment definitions", "waf": "Reliability" }, { - "category": "Compute", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "WAF checklist", + "guid": "3c763963-7a55-42d5-a15e-401955387e5c", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", + "service": "ACR", "services": [ - "VM", - "ASR" + "ACR", + "WAF" ], "severity": "High", - "subcategory": "Virtual Machines", - "text": "Avoid running a production workload on a single VM", + "text": "If using a private registry, configure region replication to store images in multiple regions", "waf": "Reliability" }, { - "category": "Compute", - "checklist": "Resiliency Review", - "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", + "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", + "service": "AKS", "services": [ - "AVS", - "VM", - "ASR" + "Cost", + "WAF" ], - "severity": "High", - "subcategory": "Virtual Machines", - "text": "For Azure and on-premises VMs (Hyper-V/Phyiscal/VMware) with low RTO requirements use Azure Site Recovery", - "waf": "Reliability" + "severity": "Low", + "text": "Use an external application such as kubecost to allocate costs to different users", + "waf": "Cost" }, { - "category": "Compute", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", + "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", + "service": "AKS", "services": [ - "VM" + "WAF" ], "severity": "Low", - "subcategory": "Virtual Machines", - "text": "Use Capacity Reservations for critical workloads that require guaranteed capacity", - "waf": "Reliability" + "text": "Use scale down mode to delete/deallocate nodes", + "waf": "Cost" }, { - "category": "Compute", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", + "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", + "service": "AKS", "services": [ - "VM", - "ASR" + "AKS", + "WAF" ], "severity": "Medium", - "subcategory": "Virtual Machines", - "text": "Increase quotas in DR region before testing failover with ASR", - "waf": "Reliability" + "text": "When required use multi-instance partitioning GPU on AKS Clusters", + "waf": "Cost" }, { - "category": "Compute", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", + "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", + "service": "AKS", "services": [ - "VM" + "WAF" ], "severity": "Low", - "subcategory": "Virtual Machines", - "text": "Utilize Scheduled Events to prepare for VM maintenance", - "waf": "Reliability" + "text": "If running a Dev/Test cluster use NodePool Start/Stop", + "waf": "Cost" }, { - "category": "Data", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "Storage" + "AKS", + "AzurePolicy", + "WAF" ], "severity": "Medium", - "subcategory": "Storage Accounts", - "text": "Choose the most appropriate data redundancy option for Azure Storage based on your requirements", - "waf": "Reliability" + "text": "Use Azure Policy for Kubernetes to ensure cluster compliance", + "waf": "Security" }, { - "category": "Data", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "Storage" + "WAF" ], - "severity": "Low", - "subcategory": "Storage Accounts", - "text": "Apply a Delete lock to prevent accidental or malicious deletion of storage accounts", - "waf": "Reliability" + "severity": "Medium", + "text": "Separate applications from the control plane with user/system node pools", + "waf": "Security" }, { - "category": "Data", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", + "link": "https://learn.microsoft.com/azure/aks/use-system-pools", + "service": "AKS", "services": [ - "Storage" + "WAF" ], "severity": "Low", - "subcategory": "Storage Accounts", - "text": "Enable soft delete for Storage Account Containers", - "waf": "Reliability" + "text": "Add taint to your system nodepool to make it dedicated", + "waf": "Security" }, { - "category": "Data", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", + "link": "https://learn.microsoft.com/azure/container-registry/", + "service": "AKS", "services": [ - "Storage" + "ACR", + "WAF" ], - "severity": "Low", - "subcategory": "Storage Accounts", - "text": "Enable soft delete for blobs", - "waf": "Reliability" + "severity": "Medium", + "text": "Use a private registry for your images, such as ACR", + "waf": "Security" }, { - "category": "General", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "WAF checklist", + "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", + "link": "https://learn.microsoft.com/azure/security-center/container-security", + "service": "ACR", "services": [ - "Backup" + "WAF" ], "severity": "Medium", - "subcategory": "Backup", - "text": "Enable Azure Backup enhanced soft delete for improved data protection and recovery", - "waf": "Reliability" + "text": "Scan your images for vulnerabilities", + "waf": "Security" }, { - "category": "General", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", + "service": "AKS", "services": [ - "Backup" + "WAF" ], - "severity": "Low", - "subcategory": "Backup", - "text": "Implement multi-user authorization for Azure Backup to ensure secure and controlled access to backup resources", - "waf": "Reliability" + "severity": "High", + "text": "Define app separation requirements (namespace/nodepool/cluster)", + "waf": "Security" }, { - "category": "General", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", + "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", + "service": "AKS", "services": [ - "Storage", - "Backup" + "AKV", + "WAF" ], - "severity": "Low", - "subcategory": "Backup", - "text": "Implement Immutable Storage for your vaults to protect against ransomware and prevent unauthorized modifications to backups", - "waf": "Reliability" + "severity": "Medium", + "text": "Store your secrets in Azure Key Vault with the CSI Secrets Store driver", + "waf": "Security" }, { - "category": "General", - "checklist": "Resiliency Review", - "description": "Clearly define your organization's business continuity and disaster recovery requirements for your Azure environment. This includes identifying the critical applications, data, and services that need to be protected, as well as specifying the desired recovery objectives and strategies.", - "guid": "72e52e36-11dd-458c-9a4b-1521e43a58a9", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/management-business-continuity-disaster-recovery", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", + "link": "https://learn.microsoft.com/azure/aks/update-credentials", + "service": "AKS", "services": [ - "ASR" + "WAF" ], "severity": "High", - "subcategory": "Design", - "text": "Define business continuity and disaster recovery requirements", - "waf": "Reliability" + "text": "If using Service Principals for the cluster, refresh credentials periodically (like quarterly)", + "waf": "Security" }, { - "category": "General", - "checklist": "Resiliency Review", - "description": "Ensure that your Azure architectures are designed with a focus on reliability. Consider implementing fault-tolerant mechanisms, redundancy, and resiliency patterns to minimize the impact of failures and maximize the availability of your applications and services.", - "guid": "c2399c4d-7b67-4d0c-9555-62f2b3e4563a", - "link": "https://learn.microsoft.com/azure/architecture/reliability/architect", - "services": [], - "severity": "High", - "subcategory": "Design", - "text": "Implement reliability best practices in Azure architectures", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", + "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", + "service": "AKS", + "services": [ + "WAF" + ], + "severity": "Medium", + "text": "If required add Key Management Service etcd encryption", + "waf": "Security" }, { - "category": "General", - "checklist": "Resiliency Review", - "description": "IaC configurations can play a role in your disaster recovery plan, particularly in situations where recovery time is not time-sensitive. In the event of infrastructure recreation in a second region, IaC can be used to reproduce the necessary infrastructure.", - "guid": "fe237de2-43b1-46c3-8d7a-a9b7570449aa", - "link": "https://learn.microsoft.com/azure/well-architected/devops/automation-infrastructure", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", + "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", + "service": "AKS", "services": [ - "RBAC", - "ASR" + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "DevOps", - "text": "Implement Infrastructure as Code (IaC) for Rapid Infrastructure Recovery", - "waf": "Reliability" + "severity": "Low", + "text": "If required consider using Confidential Compute for AKS", + "waf": "Security" }, { - "category": "General", - "checklist": "Resiliency Review", - "description": "Azure offers region pairs that are geographically separated and can be used for cross-region replication and disaster recovery. These region pairs provide redundancy and protection against regional or large-scale disasters.", - "guid": "dcb1f7d5-769a-4e56-aba3-8d4a85e2213d", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", + "service": "AKS", "services": [ - "ASR" + "Defender", + "WAF" ], "severity": "Medium", - "subcategory": "Multi-region", - "text": "Plan for cross-region recovery by leveraging region pairs", - "waf": "Reliability" + "text": "Consider using Defender for Containers", + "waf": "Security" }, { - "category": "Network", - "checklist": "Resiliency Review", - "description": "By deploying an Application Gateway with a minimum instance count of two, you will have at least two instances available under normal circumstances. In the event that one of the instances encounters a problem, the other instance will handle the traffic while a new instance is being created. This approach significantly reduces the risk of service disruption and ensures a seamless experience for your users.", - "guid": "93c76286-37a5-451c-9b04-e4f1854387e5", - "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-autoscaling-zone-redundant#autoscaling-and-high-availability", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "AppGW" + "Entra", + "WAF" + ], + "severity": "High", + "text": "Use managed identities instead of Service Principals", + "waf": "Security" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "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", + "services": [ + "Entra", + "WAF" ], "severity": "Medium", - "subcategory": "Application Gateways", - "text": "Deploy Application Gateways with a minimum instance count of 2 to avoid instance provisioning downtime", - "waf": "Reliability" + "text": "Integrate authentication with AAD (using the managed integration)", + "waf": "Security" }, { - "category": "Network", - "checklist": "Resiliency Review", - "description": "The v2 SKU offers several advantages and critical new features that enhance the availability and resilience of your application infrastructure. One notable feature supported by the v2 SKU is zone redundancy, which allows an Application Gateway deployment to span multiple Availability Zones.", - "guid": "ced126cd-032a-4f5b-8fc6-998a535e3378", - "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", + "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", + "service": "AKS", "services": [ - "Storage", - "AppGW" + "WAF" ], - "severity": "High", - "subcategory": "Application Gateways", - "text": "Deploy Azure Application Gateway v2 for zone redundancy support", - "waf": "Reliability" + "severity": "Medium", + "text": "Limit access to admin kubeconfig (get-credentials --admin)", + "waf": "Security" }, { - "category": "Network", - "checklist": "Resiliency Review", - "description": "Azure Front Door provides automatic failover capabilities, ensuring continuity in the event of a primary region becoming unavailable. However, during the failover process, there may be a brief period (typically 20-60 seconds) when clients cannot reach the application. It is essential to review the Azure Front Door service level agreement (SLA) to determine whether relying solely on Front Door meets your business requirements for high availability. ", - "guid": "97e31c67-d68c-4f6a-92a1-194956d697dc", - "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/app-service-web-app/multi-region#azure-front-door", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", + "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", + "service": "AKS", "services": [ - "FrontDoor" + "Entra", + "RBAC", + "WAF" ], - "severity": "Low", - "subcategory": "Azure Front Door", - "text": "Consider a redundant traffic management solution in conjunction with Azure Front Door", - "waf": "Reliability" + "severity": "Medium", + "text": "Integrate authorization with AAD RBAC", + "waf": "Security" }, { - "category": "Network", - "checklist": "Resiliency Review", - "description": "By implementing Traffic Manager, you can configure it to continuously monitor the health of your application endpoints and automatically redirect traffic to an alternate endpoint when necessary. This automation minimizes downtime and provides a more seamless experience for your users during disaster recovery scenarios.", - "guid": "8df03a82-2cd4-463c-abbc-8ac299ebc92a", - "link": "https://learn.microsoft.com/azure/networking/disaster-recovery-dns-traffic-manager", + "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", + "service": "AKS", "services": [ - "DNS", - "Monitor", - "ASR", - "TrafficManager" + "RBAC", + "AKS", + "WAF" ], - "severity": "Low", - "subcategory": "DNS", - "text": "Plan for automated failover using Traffic Manager for DNS Traffic", - "waf": "Reliability" + "severity": "High", + "text": "Use namespaces for restricting RBAC privilege in Kubernetes", + "waf": "Security" }, { - "category": "Network", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", + "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", + "service": "AKS", "services": [ - "DNS", - "ACR", - "ASR" + "Entra", + "WAF" ], - "severity": "Low", - "subcategory": "DNS", - "text": "Implement DNS Failover using Azure DNS Private Resolvers", - "waf": "Reliability" + "severity": "Medium", + "text": "For Pod Identity Access Management use Azure AD Workload Identity (preview)", + "waf": "Security" }, { - "category": "Network", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "ACR" + "AKS", + "WAF" ], "severity": "Medium", - "subcategory": "Data Gateways", - "text": "Use on-premises data gateway clusters to ensure high availability for business-critical data", - "waf": "Reliability" + "text": "For AKS non-interactive logins use kubelogin (preview)", + "waf": "Security" }, { - "category": "Network", - "checklist": "Resiliency Review", - "description": "When using ExpressRoute, it's important to design for high availability by incorporating redundancy in both the partner and customer networks. This can include multiple ExpressRoute circuits, redundant connections from your network to Microsoft, and ensuring your on-premises network equipment has redundant connections.", - "guid": "c0e7c28d-c936-4657-802b-ff4564b0d934", - "link": "https://learn.microsoft.com/azure/expressroute/designing-for-high-availability-with-expressroute", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "ExpressRoute" + "AKS", + "WAF" ], "severity": "Medium", - "subcategory": "ExpressRoute", - "text": "Ensure redundancy within both the partner network and customer network when utilizing ExpressRoute for high availability", - "waf": "Reliability" + "text": "Disable AKS local accounts", + "waf": "Security" }, { - "category": "Network", - "checklist": "Resiliency Review", - "description": "The primary circuit should handle regular traffic while the backup circuit stays ready to take over if the primary circuit fails. Utilize BGP attributes to influence routing and designate your primary and backup circuits effectively.", - "guid": "a359c373-e7dd-4616-83a3-64a907ebae48", - "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "ExpressRoute", - "Backup" + "WAF" ], - "severity": "Medium", - "subcategory": "ExpressRoute", - "text": "When using multiple ExpressRoute circuits ensure that routing allows for a primary and backup", - "waf": "Reliability" + "severity": "Low", + "text": "Configure if required Just-in-time cluster access", + "waf": "Security" }, { - "category": "Network", - "checklist": "Resiliency Review", - "description": "S2S VPN connection can provide a cost-effective, resilient backup solution in the event of an ExpressRoute circuit failure. By using S2S VPN as a failover, you can maintain connectivity to your Azure resources without relying solely on ExpressRoute.", - "guid": "ead53cc7-de2e-48aa-ab35-71549ab9153d", - "link": "https://learn.microsoft.com/azure/expressroute/use-s2s-vpn-as-backup-for-expressroute-privatepeering", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "Cost", - "ExpressRoute", - "VPN", - "Backup" + "Entra", + "AKS", + "WAF" ], "severity": "Low", - "subcategory": "ExpressRoute", - "text": "Consider deploying site-to-site VPN as a backup for your ExpressRoute private peering", - "waf": "Reliability" + "text": "Configure if required AAD conditional access for AKS", + "waf": "Security" }, { - "category": "Network", - "checklist": "Resiliency Review", - "description": "Standard Load Balancer SKU offers an SLA of 99.99% and a higher level of service availability compared to the Basic Load Balancer SKU.", - "guid": "778468d5-5a78-45d6-be96-c96ad8844cf3", - "link": "https://learn.microsoft.com/azure/load-balancer/skus", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", + "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", + "service": "AKS", "services": [ - "LoadBalancer" + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "Load Balancers", - "text": "Leverage the Standard SKU for Load Balancers that handle traffic to production applications", - "waf": "Reliability" + "severity": "Low", + "text": "If required for Windows AKS workloads configure gMSA ", + "waf": "Security" }, { - "category": "Network", - "checklist": "Resiliency Review", - "description": "By configuring the load balancer with a zone-redundant frontend, it can serve zonal resources in any zone with a single IP address. As long as at least one zone remains healthy within the region, the IP address associated with the frontend can survive one or more zone failures. It is recommended to have multiple zonal resources, such as virtual machines from different zones, in the backend pool of the load balancer. ", - "guid": "b2b38c88-6ba2-4c02-8499-114a5d3ce574", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "LoadBalancer", - "VM" + "Entra", + "WAF" ], - "severity": "Low", - "subcategory": "Load Balancers", - "text": "For load balancers, consider using a zone-redundant frontend with multiple zonal resources in the backend", - "waf": "Reliability" + "severity": "Medium", + "text": "For finer control consider using a managed Kubelet Identity", + "waf": "Security" }, { - "category": "Network", - "checklist": "Resiliency Review", - "description": "When designing health probes for your Azure Load Balancer, it is important to follow best practices to ensure reliable and accurate monitoring of your backend instances.", - "guid": "dccbd979-2a6b-4cca-8b5f-ea1ebf3dd95d", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-custom-probe-overview#design-guidance", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", + "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", + "service": "AKS", "services": [ - "LoadBalancer", - "Monitor" + "ACR", + "AppGW", + "WAF" ], - "severity": "Low", - "subcategory": "Load Balancers", - "text": "Select the right protocol, appropriate intervals and timeouts, representative paths and probe responses when defining Load Balancer Health Probes", + "severity": "Medium", + "text": "If using AGIC, do not share an AppGW across clusters", "waf": "Reliability" }, { - "category": "Network", - "checklist": "Resiliency Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "NVA" + "AKS", + "WAF" ], "severity": "High", - "subcategory": "NVAs", - "text": "Deploy Network Virtual Appliances (NVAs) in a vendor supported configuration for High Availability", + "text": "Do not use AKS HTTP Routing Add-On, use instead the managed NGINX ingress with the application routing add-on.", "waf": "Reliability" }, { - "category": "Network", - "checklist": "Resiliency Review", - "description": "By deploying VPN Gateways in an active-active mode, you can distribute VPN traffic across multiple gateways, improving reliability and ensuring continuous connectivity in case of failures or maintenance.", - "guid": "927139b8-2110-42db-b6ea-f11e6f843e53", - "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-highlyavailable", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", + "service": "AKS", "services": [ - "ACR", - "VPN" + "WAF" ], "severity": "Medium", - "subcategory": "VPN Gateways", - "text": "Deploy Azure VPN Gateways in an active-active mode to ensure high availability and redundancy for your VPN connections.", - "waf": "Reliability" + "text": "For Windows workloads use Accelerated Networking", + "waf": "Performance" }, { - "category": "Network", - "checklist": "Resiliency Review", - "description": "Zone-redundant SKUs ensure that your VPN gateways are physically and logically separated within a region, providing resiliency and scalability. This deployment configuration safeguards your on-premises network connectivity to Azure from zone-level failures.", - "guid": "f4722d92-8c1b-41cd-921f-54b29b9de39a", - "link": "https://learn.microsoft.com/azure/vpn-gateway/about-zone-redundant-vnet-gateways", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "VPN" + "LoadBalancer", + "WAF" ], - "severity": "Medium", - "subcategory": "VPN Gateways", - "text": "Use zone-redundant SKUs when deploying VPN Gateways to enhance resilience and protect against zone-level failures", + "severity": "High", + "text": "Use the standard ALB (as opposed to the basic one)", "waf": "Reliability" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Ensure data repositories for the backup solution are stored outside of vSAN storage. Either in Azure native or on a disk pool-backed datastore", - "guid": "976f32a7-30d1-6caa-c2a0-207fdc26571b", - "link": "https://learn.microsoft.com/azure/azure-vmware/set-up-backup-server-for-azure-vmware-solution", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "Storage", - "AVS", - "Backup" + "VNet", + "WAF" ], "severity": "Medium", - "subcategory": "Backup", - "text": "Ensure backups are not stored on vSAN as vSAN is a finite resource", - "waf": "Reliability" + "text": "If using Azure CNI, consider using different Subnets for NodePools", + "waf": "Security" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Microsoft backup service", - "guid": "fc8af7a1-c724-e255-c18d-4ca22a6f27f0", - "link": "https://docs.microsoft.com/azure/azure-vmware/set-up-backup-server-for-azure-vmware-solution", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", + "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", + "service": "AKS", "services": [ - "AVS", - "Backup" + "PrivateLink", + "VNet", + "WAF" ], "severity": "Medium", - "subcategory": "Business Continuity", - "text": "Use MABS as your backup solution", - "waf": "Reliability" + "text": "Use Private Endpoints (preferred) or Virtual Network Service Endpoints to access PaaS services from the cluster", + "waf": "Security" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Best practice - this is Backup, not disaster recovery", - "guid": "be28860f-3d29-a79a-1a0e-36f1b23b36ae", - "link": "Best practice to deploy backup in the same region as your AVS deployment", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "AVS", - "Backup", - "ASR" + "WAF" ], - "severity": "Medium", - "subcategory": "Business Continuity", - "text": "Deploy your backup solution in the same region as your Azure VMware Solution private cloud", + "severity": "High", + "text": "Choose the best CNI network plugin for your requirements (Azure CNI recommended)", "waf": "Reliability" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Best practice - in case AVS is unavailable", - "guid": "4d2f79a5-4ccf-0dfc-557c-49619b99a540", - "link": "https://docs.microsoft.com/azure/azure-vmware/set-up-backup-server-for-azure-vmware-solution", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "services": [ - "AVS" + "VNet", + "WAF" ], - "severity": "Medium", - "subcategory": "Business Continuity", - "text": "Preferably deploy MABS outside of the SDDC as native Azure IaaS", - "waf": "Reliability" + "severity": "High", + "text": "If using Azure CNI, size your subnet accordingly considering the maximum number of pods per node", + "waf": "Performance" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Is a process in place to request a restore of the VMware components managed by the Azure Platform?", - "guid": "ff431c40-962c-5182-d536-0c2f0c4ce9e0", - "link": "Will Disaster Recovery Site Recovery, HCX Disaster Recovery, SRM or back tools be used?", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "services": [ - "AVS" + "WAF" ], - "severity": "Medium", - "subcategory": "Business Continuity", - "text": "Escalation process with Microsoft in the event of a regional DR", - "waf": "Reliability" + "severity": "High", + "text": "If using Azure CNI, check the maximum pods/node (default 30)", + "waf": "Performance" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Compare SRM with HCX", - "guid": "f379436d-3051-daa0-01fb-dc4e0e04d677", - "link": "https://docs.microsoft.com/azure/azure-vmware/disaster-recovery-using-vmware-site-recovery-manager", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "AVS", - "ASR" + "VNet", + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "Disaster Recovery", - "text": "Use VMware Site Recovery Manager when both sites are Azure VMware Solution", - "waf": "Reliability" + "severity": "Low", + "text": "If using private-IP LoadBalancer services, use a dedicated subnet (not the AKS subnet)", + "waf": "Security" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Recovery into Azure instead of Vmware solution", - "guid": "367f71d8-3cf6-51a0-91a5-3db3d570cc19", - "link": "https://docs.microsoft.com/azure/site-recovery/avs-tutorial-prepare-azure", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "services": [ - "AVS", - "ASR" + "WAF" ], - "severity": "Medium", - "subcategory": "Disaster Recovery", - "text": "Use Azure Site Recovery when the Disaster Recovery technology is native Azure IaaS", + "severity": "High", + "text": "Size the service IP address range accordingly (it is going to limit the cluster scalability)", "waf": "Reliability" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Avoid manual tasks as much as possible", - "guid": "ee02ada0-1887-bb3a-b84c-423f45a09ef9", - "link": "https://docs.microsoft.com/azure/site-recovery/avs-tutorial-prepare-azure", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", + "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", + "service": "AKS", "services": [ - "AVS", - "ASR" + "WAF" ], - "severity": "Medium", - "subcategory": "Disaster Recovery", - "text": "Use Automated recovery plans with either of the Disaster solutions,", - "waf": "Reliability" + "severity": "Low", + "text": "If required add your own CNI plugin", + "waf": "Security" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Any other datacenter in the same region", - "guid": "0c2b74e5-9c28-780d-1df3-12d3de4aaa76", - "link": "https://docs.microsoft.com/azure/azure-vmware/connect-multiple-private-clouds-same-region", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "AVS", - "ASR" + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "Disaster Recovery", - "text": "Configure a secondary disaster recovery environment", - "waf": "Reliability" + "severity": "Low", + "text": "If required configure Public IP per node in AKS", + "waf": "Performance" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "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", - "guid": "c2a34ec4-2933-4e6c-dc36-e20e67abbe3f", - "link": "https://docs.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/plan-for-ip-addressing", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", + "link": "https://learn.microsoft.com/azure/aks/concepts-network", + "service": "AKS", "services": [ - "AVS", - "ASR" + "WAF" ], "severity": "Medium", - "subcategory": "Disaster Recovery", - "text": "Assign IP ranges unique to each region", + "text": "Use an ingress controller to expose web-based apps instead of exposing them with LoadBalancer-type services", "waf": "Reliability" }, { - "category": "BCDR", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "ExpressRoute Global Reach can be used for connectivity between the primary and secondary Azure VMware Solution Private Clouds or routing must be done through network virtual appliances?", - "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.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", + "link": "https://learn.microsoft.com/azure/aks/nat-gateway", + "service": "AKS", "services": [ - "ExpressRoute", - "AVS", - "NVA", - "ASR" + "WAF" ], - "severity": "Medium", - "subcategory": "Disaster Recovery", - "text": "Use Global Reach between DR regions", + "severity": "Low", + "text": "Use Azure NAT Gateway as outboundType for scaling egress traffic", "waf": "Reliability" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "An ExR Global Reach connection will be established to the ExR circuit, no other connections", - "guid": "a2c12df2-07fa-3edd-2cec-fda0b55fb952", - "link": "https://learn.microsoft.com/azure/azure-vmware/tutorial-expressroute-global-reach-private-cloud", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "VWAN", - "AVS" + "WAF" ], "severity": "Medium", - "subcategory": "Direct (no vWAN, no H&S)", - "text": "Global Reach to ExR circuit - no Azure resources", - "waf": "Performance" + "text": "Use Dynamic allocations of IPs in order to avoid Azure CNI IP exhaustion", + "waf": "Reliability" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Use ExR to connect on-premises (other) location to Azure", - "guid": "f62ce162-ba5a-429d-674e-fafa1af5f706", - "link": "https://learn.microsoft.com/azure/azure-vmware/tutorial-expressroute-global-reach-private-cloud", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "ExpressRoute", - "AVS" + "NVA", + "WAF" ], - "severity": "Medium", - "subcategory": "ExpressRoute", - "text": "Connect to Azure using ExR", - "waf": "Performance" + "severity": "High", + "text": "Filter egress traffic with AzFW/NVA if your security requirements mandate it", + "waf": "Security" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Use the migration assesment tool and timeline to determine bandwidth required", - "guid": "cf01c73b-1247-0a7a-740c-e1ea29bda340", - "link": "https://learn.microsoft.com/azure/expressroute/expressroute-introduction", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "ExpressRoute", - "AVS" + "WAF" ], "severity": "Medium", - "subcategory": "ExpressRoute", - "text": "Bandwidth sizing", - "waf": "Performance" + "text": "If using a public API endpoint, restrict the IP addresses that can access it", + "waf": "Security" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "What traffic is routed through a firewall, what goes directly into Azure", - "guid": "aab216ee-8941-315e-eada-c7e1f2243bd1", - "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/azure-vmware-solution-foundation-networking", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "ExpressRoute", - "AVS" + "WAF" ], - "severity": "Medium", - "subcategory": "ExpressRoute", - "text": "Traffic routing ", - "waf": "Performance" + "severity": "High", + "text": "Use private clusters if your requirements mandate it", + "waf": "Security" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "AVS to ExR circuit, no traffic inspection", - "guid": "1f956e45-f62d-5c95-3a95-3bab718907f8", - "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/azure-vmware-solution-foundation-networking", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "ExpressRoute", - "AVS" + "AKS", + "AzurePolicy", + "WAF" ], "severity": "Medium", - "subcategory": "ExpressRoute", - "text": "Global Reach ", - "waf": "Performance" + "text": "For Windows 2019 and 2022 AKS nodes Calico Network Policies can be used ", + "waf": "Security" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Name of the vNet and a unique address space /24 minimum", - "guid": "91f7a87b-21ac-d712-959c-8df2ba034253", - "link": "https://learn.microsoft.com/azure/virtual-network/quick-create-portal", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "AVS", - "VNet" + "AKS", + "AzurePolicy", + "WAF" ], - "severity": "Medium", - "subcategory": "Hub & Spoke", - "text": "VNet name & address space", - "waf": "Performance" + "severity": "High", + "text": "Enable a Kubernetes Network Policy option (Calico/Azure)", + "waf": "Security" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Subnet must be called GatewaySubnet", - "guid": "58a027e2-f37f-b540-45d5-e44843aba26b", - "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", "services": [ - "ExpressRoute", - "AVS", - "VPN", - "VNet" + "AKS", + "AzurePolicy", + "WAF" ], - "severity": "Medium", - "subcategory": "Hub & Spoke", - "text": "Gateway subnet", - "waf": "Performance" + "severity": "High", + "text": "Use Kubernetes network policies to increase intra-cluster security", + "waf": "Security" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Create a VPN gateway on the hub Gateway subnet", - "guid": "d4806549-0913-3e79-b580-ac2d3706e65a", - "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", "services": [ - "ExpressRoute", - "AVS", - "VPN", - "VNet" + "WAF" ], - "severity": "Medium", - "subcategory": "Hub & Spoke", - "text": "VPN Gateway", - "waf": "Performance" + "severity": "High", + "text": "Use a WAF for web workloads (UIs or APIs)", + "waf": "Security" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Create an ExR Gateway in the hub Gateway subnet.", - "guid": "864d7a8b-7016-c769-a717-61af6bfb73d2", - "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "ExpressRoute", - "AVS", - "VPN", - "VNet" + "AKS", + "VNet", + "DDoS", + "WAF" ], "severity": "Medium", - "subcategory": "Hub & Spoke", - "text": "ExR Gateway", - "waf": "Performance" + "text": "Use DDoS Standard in the AKS Virtual Network", + "waf": "Security" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "How will Internet traffic be routes, Az Firewall, NVA, Secure Hub, On-Premises firewall?", - "guid": "cc2e11b9-7911-7da1-458c-d7fcef794aad", - "link": "https://learn.microsoft.com/azure/azure-vmware/enable-public-internet-access", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "AVS", - "NVA" + "WAF" ], - "severity": "Medium", - "subcategory": "Internet", - "text": "Egress point", - "waf": "Performance" + "severity": "Low", + "text": "If required add company HTTP Proxy", + "waf": "Security" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Allow remote connectivity to AVS via the portal, specifically to vCenter, NSX-T and HCX", - "guid": "71e68ce3-982e-5e56-0191-01100ad0e66f", - "link": "https://learn.microsoft.com/answers/questions/171195/how-to-create-jump-server-in-azure-not-bastion-paa.html", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", + "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", + "service": "AKS", "services": [ - "Bastion", - "AVS" + "WAF" ], "severity": "Medium", - "subcategory": "Jumpbox & Bastion", - "text": "Remote connectivity to AVS", - "waf": "Performance" + "text": "Consider using a service mesh for advanced microservice communication management", + "waf": "Security" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Name the jumpbox and identify the subnet where it will be hosted", - "guid": "6f8e93a2-44b1-bb1d-28a1-4d5b3c2ea857", - "link": "https://learn.microsoft.com/azure/bastion/tutorial-create-host-portal", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", + "service": "AKS", "services": [ - "Bastion", - "AVS", - "VNet" + "Monitor", + "WAF" ], - "severity": "Medium", - "subcategory": "Jumpbox & Bastion", - "text": "Configure a jumbox and Azure Bastion", - "waf": "Performance" + "severity": "High", + "text": "Configure alerts on the most critical metrics (see Container Insights for recommendations)", + "waf": "Operations" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Provides secure / seamless RDP/SSH connectivity to your vm's directly through the portal.", - "guid": "ba430d58-4541-085c-3641-068c00be9bc5", - "link": "https://learn.microsoft.com/azure/virtual-network/network-security-groups-overview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "337453a3-cc63-4963-9a65-22ac19e80696", + "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", + "service": "AKS", "services": [ - "Bastion", - "AVS", - "VM" + "Entra", + "WAF" ], - "severity": "Medium", - "subcategory": "Jumpbox & Bastion", - "text": "Security measure allowing RDP access via the portal", - "waf": "Performance" + "severity": "Low", + "text": "Check regularly Azure Advisor for recommendations on your cluster", + "waf": "Operations" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Using a VPN to connect to Azure to enable VMware communications (HCX) (not recommended)", - "guid": "9988598f-2a9f-6b12-9b46-488415ceb325", - "link": "https://learn.microsoft.com/azure/azure-vmware/configure-site-to-site-vpn-gateway", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", + "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", + "service": "AKS", "services": [ - "AVS", - "VPN" + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "VPN", - "text": "Connect to Azure using a VPN", - "waf": "Performance" + "severity": "Low", + "text": "Enable AKS auto-certificate rotation", + "waf": "Operations" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Use the migration assesment tool and timeline to determine bandwidth required (eg 3rd party tool in link)", - "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.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", + "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", + "service": "AKS", "services": [ - "AVS", - "VPN" + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "VPN", - "text": "Bandwidth sizing", - "waf": "Performance" + "severity": "High", + "text": "Have a regular process to upgrade your kubernetes version periodically (quarterly, for example), or use the AKS autoupgrade feature", + "waf": "Operations" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "What traffic is routed through a firewall, what goes directly into Azure", - "guid": "e095116f-0bdc-4b51-4d71-b9e469d56f59", - "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/azure-vmware-solution-foundation-networking", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", + "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", + "service": "AKS", "services": [ - "AVS", - "VPN" + "WAF" ], - "severity": "Medium", - "subcategory": "VPN", - "text": "Traffic routing ", - "waf": "Performance" + "severity": "High", + "text": "Use kured for Linux node upgrades in case you are not using node-image upgrade", + "waf": "Operations" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Name and unique address space for the vWAN, name for the vWAN hub", - "guid": "4dc480ac-cecd-39c4-fdc6-680b300716ab", - "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-site-to-site-portal#openvwan", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", + "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", + "service": "AKS", "services": [ - "VWAN", - "AVS" + "WAF" ], - "severity": "Medium", - "subcategory": "vWAN hub", - "text": "vWAN name, hub name and address space", - "waf": "Performance" + "severity": "High", + "text": "Have a regular process to upgrade the cluster node images periodically (weekly, for example)", + "waf": "Operations" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Select either boh or the appropriate connection type.", - "guid": "51d6affd-8e02-6aea-d3d4-0baf618b3076", - "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-point-to-site-portal", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", + "service": "AKS", "services": [ - "VWAN", - "AVS", - "VPN" + "WAF" ], - "severity": "Medium", - "subcategory": "vWAN hub", - "text": "ExR and/or VPN gateway provisioned", - "waf": "Performance" + "severity": "Low", + "text": "Consider gitops to deploy applications or cluster configuration to multiple clusters", + "waf": "Operations" }, { - "category": "Connectivity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Add Azure firewall to vWAN (recommended)", - "guid": "e32a4c67-3dc0-c134-1c12-52d46dcbab5b", - "link": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-expressroute-portal", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "d7672c26-7602-4482-85a4-14527fbe855c", + "link": "https://learn.microsoft.com/azure/aks/command-invoke", + "service": "AKS", "services": [ - "VWAN", - "AVS", - "Firewall" + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "vWAN hub", - "text": "Secure vWAN", - "waf": "Security" + "severity": "Low", + "text": "Consider using AKS command invoke on private clusters", + "waf": "Operations" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Active directory or other identity provider servers", - "guid": "fbc47fbf-bc96-fa93-ed5d-8c9be63cd5c3", - "link": "https://learn.microsoft.com/azure/azure-vmware/configure-identity-source-vcenter", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", + "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", + "service": "AKS", "services": [ - "AVS", - "Entra" + "WAF" ], - "severity": "Medium", - "subcategory": "Access", - "text": "External Identity (user accounts)", - "waf": "Security" + "severity": "Low", + "text": "For planned events consider using Node Auto Drain", + "waf": "Operations" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Not required for LDAPS, required for Kerberos", - "guid": "b5db7975-f6bb-8ba3-ee5f-e3e805887997", - "link": "https://learn.microsoft.com/windows-server/identity/ad-ds/plan/understanding-active-directory-site-topology", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", + "link": "https://learn.microsoft.com/azure/aks/faq", + "service": "AKS", "services": [ - "AVS", - "Entra" + "WAF" ], - "severity": "Medium", - "subcategory": "Access", - "text": "If using AD domain, ensure Sites & Services has been configured", - "waf": "Security" + "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" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Authentication for users, must be secure.", - "guid": "c30749c4-e2af-558c-2eb9-0b6ae84881d1", - "link": "https://learn.microsoft.com/azure/azure-vmware/configure-identity-source-vcenter", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "AVS", - "Entra" + "WAF" ], - "severity": "Medium", - "subcategory": "Access", - "text": "Use LDAPS not ldap ( vCenter)", - "waf": "Security" + "severity": "Low", + "text": "Use custom Node RG (aka 'Infra RG') name", + "waf": "Operations" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Authentication for users, must be secure.", - "guid": "64cb9b5c-9edd-787e-1dd8-2b2338e51635", - "link": "https://learn.microsoft.com/azure/azure-vmware/configure-external-identity-source-nsx-t", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", + "link": "https://kubernetes.io/docs/setup/release/notes/", + "service": "AKS", "services": [ - "AVS", - "Entra" + "AKS", + "WAF" ], "severity": "Medium", - "subcategory": "Access", - "text": "Use LDAPS not ldap (NSX-T)", - "waf": "Security" + "text": "Do not use deprecated Kubernetes APIs in your YAML manifests", + "waf": "Operations" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "CN or SAN names, no wildcards, contains private key - CER or PFX", - "guid": "bec285ab-037e-d629-81d1-f61dac23cd4c", - "link": "https://youtu.be/4jvfbsrhnEs", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "AVS", - "Entra" + "WAF" ], - "severity": "Medium", - "subcategory": "Security", - "text": "Security certificate installed on LDAPS servers ", - "waf": "Security" + "severity": "Low", + "text": "Taint Windows nodes", + "waf": "Operations" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Standard Azure Roles Based Access Controls", - "guid": "4ba394a2-3c33-104c-8e34-2dadaba9cc73", - "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-identity", + "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", "services": [ - "RBAC", - "AVS", - "Entra" + "WAF" ], - "severity": "Medium", - "subcategory": "Security", - "text": "RBAC applied to Azure roles", - "waf": "Security" + "severity": "Low", + "text": "Keep windows containers patch level in sync with host patch level", + "waf": "Operations" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Create roles in vCenter required to meet minimum viable access guidelines", - "guid": "b04ca129-83a9-3494-7512-347dd2d766db", - "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-identity#view-the-vcenter-server-privileges", + "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", "services": [ - "RBAC", - "AVS", - "Entra" + "Monitor", + "WAF" ], - "severity": "Medium", - "subcategory": "Security", - "text": "RBAC model in vCenter", - "waf": "Security" + "severity": "Low", + "text": "Send master logs (aka API logs) to Azure Monitor or your preferred log management solution", + "waf": "Operations" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "CloudAdmin account in vCenter IdP is used only as an emergency account (break-glass)", - "guid": "8e477d2f-8004-3dd0-93d6-0aece9e1b2fb", - "link": "Best practice", + "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", "services": [ - "RBAC", - "AVS", - "Entra" + "WAF" ], - "severity": "Medium", - "subcategory": "Security", - "text": "CloudAdmin role usage", - "waf": "Security" + "severity": "Low", + "text": "If required use nodePool snapshots", + "waf": "Cost" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "For roles managing the Azure VMware Solution resource in the Azure Portal (no standing permissions allowed)", - "guid": "00e0b729-f9be-f600-8c32-5ec0e8f2ed63", - "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "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", "services": [ - "RBAC", - "AVS", - "Entra" + "WAF" ], - "severity": "Medium", - "subcategory": "Security ", - "text": "Is Privileged Identity Management implemented", - "waf": "Security" + "severity": "Low", + "text": "Consider spot node pools for non time-sensitive workloads", + "waf": "Operations" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "For the Azure VMware Solution PIM roles", - "guid": "0842d45f-41a8-8274-1155-2f6ed554d315", - "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "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", "services": [ - "RBAC", - "AVS", - "Entra" + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "Security ", - "text": "Is Privileged Identity Management audit reporting implemented", - "waf": "Security" + "severity": "Low", + "text": "Consider AKS virtual node for quick bursting", + "waf": "Operations" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Best practice, also see Monitoring/Alerts", - "guid": "915cbcd7-0640-eb7c-4162-9f33775de559", - "link": "Best practice", + "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", "services": [ "Monitor", - "AVS", - "Entra" + "WAF" ], - "severity": "Medium", - "subcategory": "Security ", - "text": "Limit use of CloudAdmin account to emergency access only", - "waf": "Security" + "severity": "High", + "text": "Monitor your cluster metrics with Container Insights (or other tools like Prometheus)", + "waf": "Operations" }, { - "category": "Identity", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Operational procedure", - "guid": "7effa0c0-9172-e8e4-726a-67dbea8be40a", - "link": "https://learn.microsoft.com/azure/azure-vmware/rotate-cloudadmin-credentials?tabs=azure-portal", + "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", "services": [ - "AVS", - "Entra" + "WAF" ], - "severity": "Medium", - "subcategory": "Security ", - "text": "Is a process defined to regularly rotate cloudadmin (vCenter) and admin (NSX) credentials", - "waf": "Security" + "severity": "High", + "text": "Store and analyze your cluster logs with Container Insights (or other tools like Telegraf/ElasticSearch)", + "waf": "Operations" }, { - "category": "Management", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "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)", - "guid": "8f426fd0-d73b-d398-1f6f-df0cbe262a82", - "link": "https://learn.microsoft.com/azure/azure-arc/vmware-vsphere/overview", + "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", "services": [ - "Arc", - "AVS", - "VM" + "Monitor", + "WAF" ], "severity": "Medium", - "subcategory": "Operations", - "text": "AVS VM Management (Azure Arc)", + "text": "Monitor CPU and memory utilization of the nodes", "waf": "Operations" }, { - "category": "Management", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Use Azure Policy to onboard Azure VMware Solution workloads in the Azure Management, Monitoring and Security solutions", - "guid": "11dbe773-e380-9191-1418-e886fa7a6fd0", - "link": "https://docs.microsoft.com/azure/governance/policy/overview", + "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", "services": [ - "AzurePolicy", - "AVS", - "Monitor" + "Monitor", + "WAF" ], "severity": "Medium", - "subcategory": "Operations", - "text": "Azure policy", + "text": "If using Azure CNI, monitor % of pod IPs consumed per node", "waf": "Operations" }, { - "category": "Management", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "For manual deployments, consider implementing resource locks to prevent accidental actions on your Azure VMware Solution Private Cloud", - "guid": "1e59c639-9b7e-a60b-5e93-3798c1aff5db", - "link": "https://docs.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json#configure-locks", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "AVS" + "Storage", + "Monitor", + "EventHubs", + "ServiceBus", + "WAF" ], "severity": "Medium", - "subcategory": "Operations", - "text": "Resource locks", + "text": "Monitor OS disk queue depth in nodes", "waf": "Operations" }, { - "category": "Management", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "For manual deployments, all configuration and deployments must be documented", - "guid": "8f2c46aa-ca1b-cad3-3ac9-213dfc0a265e", - "link": "Make sure to create your own runbook on the deployment of AVS.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "be209d39-fda4-4777-a424-d116785c2fa5", + "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", + "service": "AKS", "services": [ - "AVS" + "LoadBalancer", + "Monitor", + "NVA", + "WAF" ], "severity": "Medium", - "subcategory": "Operations", - "text": "Run books", + "text": "If not using egress filtering with AzFW/NVA, monitor standard ALB allocated SNAT ports", "waf": "Operations" }, { - "category": "Management", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Implement human understandable names for ExR authorization keys to allow for easy identification of the keys purpose/use", - "guid": "86b314f9-1f1e-317a-4dfb-cf510ad4a030", - "link": "https://docs.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", + "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", + "service": "AKS", "services": [ - "AVS", - "AKV" + "AKS", + "WAF" ], "severity": "Medium", - "subcategory": "Operations", - "text": "Naming conventions for auth keys", + "text": "Subscribe to resource health notifications for your AKS cluster", "waf": "Operations" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "For automatic alerting on Azure VMware Solution performance (CPU >80%, Avg Memory >80%, vSAN >70%)", - "guid": "e22a2d99-eb71-7d7c-07af-6d4cdb1d4443", - "link": "https://docs.microsoft.com/azure/azure-vmware/configure-alerts-for-azure-vmware-solution", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", "services": [ - "Monitor", - "AVS" + "WAF" ], - "severity": "Medium", - "subcategory": "Alerts", - "text": "Create warning alerts for critical thresholds ", + "severity": "High", + "text": "Configure requests and limits in your pod specs", "waf": "Operations" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "for automatic alerting on Azure VMware Solution performance (CPU >80%, Avg Memory >80%, vSAN >70%)", - "guid": "6d02f159-627d-79bf-a931-fab6d947eda2", - "link": "https://docs.microsoft.com/azure/azure-vmware/configure-alerts-for-azure-vmware-solution", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "769ef669-1a48-435a-a942-223ece80b123", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", "services": [ - "Monitor", - "AVS" + "WAF" ], "severity": "Medium", - "subcategory": "Alerts", - "text": "Create critical alert vSAN consumption", + "text": "Enforce resource quotas for namespaces", "waf": "Operations" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Provides platform alerts (generated by Microsoft)", - "guid": "1cc97b39-2c7e-246f-6d73-789cfebfe951", - "link": "https://www.virtualworkloads.com/2021/04/azure-vmware-solution-azure-service-health/", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "Monitor", - "AVS" + "Subscriptions", + "WAF" ], - "severity": "Medium", - "subcategory": "Alerts", - "text": "Configured for Azure Service Health alerts and notifications", + "severity": "High", + "text": "Ensure your subscription has enough quota to scale out your nodepools", "waf": "Operations" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Ensure you have a documented and implemented backup policy and solution for Azure VMware Solution VM workloads", - "guid": "0962606c-e3b4-62a9-5661-e4ffd62a4509", - "link": "https://docs.microsoft.com/azure/azure-vmware/set-up-backup-server-for-azure-vmware-solution", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "AzurePolicy", - "Monitor", - "VM", - "AVS", - "Backup" + "WAF" ], - "severity": "Medium", - "subcategory": "Backup", - "text": "Backup policy", + "severity": "High", + "text": "Configure Liveness and Readiness probes for all deployments", "waf": "Operations" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Keep in mind the lead time for requesting new nodes", - "guid": "4ec7ccfb-795e-897e-4a84-fd31c04eadc6", - "link": "https://docs.microsoft.com/azure/azure-vmware/configure-alerts-for-azure-vmware-solution", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "AzurePolicy", - "AVS", - "Monitor" + "WAF" ], "severity": "Medium", - "subcategory": "Capacity", - "text": "Policy around ESXi host density and efficiency", - "waf": "Operations" + "text": "Use the Cluster Autoscaler", + "waf": "Performance" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Azure Cost Management can be used - one option, put AVS in it's own Subscription. ", - "guid": "7f8f175d-13f4-5298-9e61-0bc7e9fcc279", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/govern", + "arm-service": "microsoft.containerservice/managedClusters", + "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", "services": [ - "Cost", - "Monitor", - "AVS", - "Subscriptions" + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "Costs", - "text": "Ensure a good cost management process is in place for Azure VMware Solution - ", - "waf": "Operations" + "severity": "Low", + "text": "Customize node configuration for AKS node pools", + "waf": "Performance" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Create dashboards to enable core Azure VMware Solution monitoring insights", - "guid": "01e689e0-7c6c-b58f-37bd-4d6b9b1b9c74", - "link": "https://docs.microsoft.com/azure/azure-portal/azure-portal-dashboards", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", + "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", + "link": "https://learn.microsoft.com/azure/aks/concepts-scale", + "service": "AKS", "services": [ - "Monitor", - "AVS", - "NetworkWatcher" + "WAF" ], "severity": "Medium", - "subcategory": "Dashboard", - "text": "Connection monitor dashboard", - "waf": "Operations" + "text": "Use the Horizontal Pod Autoscaler when required", + "waf": "Performance" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Send to an Azure Storage account or Azure EventHub for processing (direct to Log Analytics is pending)", - "guid": "f9afdcc9-649d-d840-9fb5-a3c0edcc697d", - "link": "https://docs.microsoft.com/azure/azure-vmware/configure-vmware-syslogs", + "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", "services": [ - "Monitor", - "AVS", - "Storage" + "WAF" ], - "severity": "Medium", - "subcategory": "Logs & Metrics", - "text": "Configure Azure VMware Solution logging ", - "waf": "Operations" + "severity": "High", + "text": "Consider an appropriate node size, not too large or too small", + "waf": "Performance" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Must be on-premises, implement if available", - "guid": "7cbac8c3-4eda-d5d9-9bda-c6b5abba9fb6", - "link": "Is vROPS or vRealize Network Insight going to be used? ", + "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", "services": [ - "Monitor", - "AVS" + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "Logs & Metrics", - "text": "vRealize Operations", - "waf": "Operations" + "severity": "Low", + "text": "If more than 5000 nodes are required for scalability then consider using an additional AKS cluster", + "waf": "Performance" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Ensure workloads running on Azure VMware Solution are monitored using Azure Log Analytics and Azure Monitor", - "guid": "b243521a-644d-f865-7fb6-21f9019c0dd2", - "link": "https://docs.microsoft.com/azure/azure-vmware/configure-vmware-syslogs", + "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", "services": [ - "Monitor", - "AVS", - "VM" + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "Logs & Metrics", - "text": "AVS VM logging", - "waf": "Operations" + "severity": "Low", + "text": "Consider subscribing to EventGrid Events for AKS automation", + "waf": "Performance" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Between on-premises to Azure are monitored using 'connection monitor'", - "guid": "2ca97d91-dd36-7229-b668-01036ccc3cd3", - "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-create-using-portal", + "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", "services": [ - "ExpressRoute", - "VPN", - "Monitor", - "NetworkWatcher", - "AVS" + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "Network", - "text": "Monitor ExpressRoute and/or VPN connections ", - "waf": "Operations" + "severity": "Low", + "text": "For long running operation on an AKS cluster consider event termination", + "waf": "Performance" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "To monitor the Azure VMware Solution back-end ExpressRoute connection (Azure native to AVS)", - "guid": "99209143-60fe-19f0-5633-8b5671277ba5", - "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-create-using-portal", + "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", "services": [ - "Monitor", - "AVS", - "ExpressRoute" + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "Network", - "text": "Monitor from an Azure native resource to an Azure VMware Solution VM", - "waf": "Operations" + "severity": "Low", + "text": "If required consider using Azure Dedicated Hosts for AKS nodes", + "waf": "Performance" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "To monitor end-to-end, on-premises to AVS workloads", - "guid": "b9e5867c-57d3-036f-fb1b-3f0a71664efe", - "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-create-using-portal", + "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", "services": [ - "Monitor", - "AVS" + "WAF" ], - "severity": "Medium", - "subcategory": "Network", - "text": "Monitor from an on-premises resource to an Azure VMware Solution VM", - "waf": "Operations" + "severity": "High", + "text": "Use ephemeral OS disks", + "waf": "Performance" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Track requests to Azure VMware Solution and Azure VMware Solution based workloads", - "guid": "4af7c5f7-e5e9-bedf-a8cf-314b81735962", - "link": "Firewall logging and alerting rules are configured (Azure Firewall or 3rd party)", + "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", "services": [ - "Monitor", - "AVS" + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "Security", - "text": "Auditing and logging is implemented for inbound internet ", - "waf": "Operations" + "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" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Implemented for outbound internet connections from Azure VMware Solution or Azure VMware Solution based workloads to identify suspicious/malicious activity", - "guid": "74be60a3-cfac-f057-eda6-3ee087e805d5", - "link": "https://docs.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/eslz-network-topology-connectivity", + "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", "services": [ - "Monitor", - "AVS" + "Storage", + "AKS", + "WAF" ], - "severity": "Medium", - "subcategory": "Security", - "text": "Session monitoring ", - "waf": "Operations" + "severity": "Low", + "text": "For hyper performance storage option use Ultra Disks on AKS", + "waf": "Performance" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Enable Diagnostic and metric logging on Azure VMware Solution", - "guid": "a434b3b5-f258-0845-cd76-d7df6ef5890e", - "link": "https://docs.microsoft.com/azure/azure-vmware/configure-vmware-syslogs", + "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", "services": [ - "Monitor", - "AVS" + "Storage", + "SQL", + "WAF" ], "severity": "Medium", - "subcategory": "VMWare", - "text": "Logging and diagnostics", - "waf": "Operations" + "text": "Avoid keeping state in the cluster, and store data outside (AzStorage, AzSQL, Cosmos, etc)", + "waf": "Performance" }, { - "category": "Monitoring", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Monitor AVS workloads (each VM in AVS)", - "guid": "fb00b69a-83ec-ce72-446e-6c23a0cab09a", - "link": "https://docs.microsoft.com/azure/azure-monitor/agents/agent-windows?tabs=setup-wizard", + "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", "services": [ - "Monitor", - "AVS", - "VM" + "Storage", + "WAF" ], "severity": "Medium", - "subcategory": "VMware", - "text": "Log Analytics Agents deployed on Azure VMware Solution guest VM workloads", - "waf": "Operations" + "text": "If using AzFiles Standard, consider AzFiles Premium and/or ANF for performance reasons", + "waf": "Performance" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Decision on traffic flow", - "guid": "a1354b87-e18e-bf5c-c50b-8ddf0540e971", - "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-hub-and-spoke", + "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", "services": [ - "AVS" + "Storage", + "WAF" ], "severity": "Medium", - "subcategory": "Hub & Spoke", - "text": "North/South routing through Az Firewall or 3rd party ", - "waf": "Security" + "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" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Decision to route Azure to Azure traffic through Firewall, not E/W between AVS workloads (internal to AVS)", - "guid": "29a8a499-ec31-f336-3266-0895f035e379", - "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-hub-and-spoke", + "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": [ + "AKV", + "Backup", + "WAF" + ], + "severity": "High", + "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.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", "services": [ - "AVS" + "AKV", + "ACR", + "WAF" ], "severity": "Medium", - "subcategory": "Hub & Spoke", - "text": "East West (Internal to Azure)", - "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" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Requires a 3rd party NVA with Azure Route server - Scenario 2 (see link)", - "guid": "ebd3cc3c-ac3d-4293-950d-cecd8445a523", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/eslz-network-topology-connectivity", + "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", "services": [ - "NVA", - "AVS", - "ARS" + "AKV", + "WAF" ], "severity": "Medium", - "subcategory": "Hub & Spoke", - "text": "ExR without Global Reach", - "waf": "Operations" + "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" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "When route server is used, ensure no more then 200 routes are propagated from route server to ExR gateway to on-premises (ARS limit). Important when using MoN", - "guid": "ffb5c5ca-bd89-ff1b-8b73-8a54d503d506", - "link": "https://learn.microsoft.com/azure/route-server/route-server-faq", + "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": [ - "AVS", - "ARS" + "AKV", + "AzurePolicy", + "WAF" ], "severity": "Medium", - "subcategory": "Hub & Spoke", - "text": "Route server ", - "waf": "Operations" + "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" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Via on-premises, Az Firewall, 3rd Party, NSX-T pubic IP", - "guid": "a4070dad-3def-818d-e9f7-be440d10e7de", - "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-design-public-internet-access", + "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": [ - "AVS" + "AKV", + "Storage", + "Backup", + "Subscriptions", + "WAF" ], "severity": "Medium", - "subcategory": "Internet", - "text": "Egress point(s)", - "waf": "Security" + "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" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Az Firewall, 3rd party NVA, Application Gateway, Azure Frontdoor ", - "guid": "e942c03d-beaa-3d9f-0526-9b26cd5e9937", - "link": "Research and choose optimal solution for each application", + "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", "services": [ - "AVS", - "AppGW", - "NVA", - "FrontDoor" + "AKV", + "WAF" ], - "severity": "Medium", - "subcategory": "Internet", - "text": "Internet facing applications", - "waf": "Security" + "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.", + "waf": "Reliability" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Ensure no more then 200 routes are propagated from route server to ExR gateway to on-premises (ARS limit). Important when using MoN", - "guid": "e778a2ec-b4d7-1d27-574c-14476b167d37", - "link": "https://docs.microsoft.com/azure/route-server/route-server-faq#route-server-limits", + "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", "services": [ - "AVS", - "ARS" + "AKV", + "WAF" ], - "severity": "Medium", - "subcategory": "Routing", - "text": "When route server Route limit understood? ", - "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" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "(VPN Gateway, AppGW, FrontDoor, Load balancer, VMs (etc) (Remove: enabled on ExR/VPN Gateway subnet in Azure)", - "guid": "66c97b30-81b9-139a-cc76-dd1d94aef42a", - "link": "https://docs.microsoft.com/azure/ddos-protection/manage-ddos-protection", + "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", "services": [ - "ExpressRoute", - "VPN", - "AppGW", - "VM", - "VNet", - "LoadBalancer", - "AVS", - "DDoS", - "FrontDoor" + "AKV", + "Backup", + "WAF" ], - "severity": "Medium", - "subcategory": "Security", - "text": "Is DDoS standard protection of public facing IP addresses? ", - "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" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "To manage Azure VMware Solution, vCenter, NSX manager and HCX manager", - "guid": "d43da920-4ecc-a4e9-dd45-a2986ce81d32", - "link": "Best practice: Bastion or 3rd party tool", + "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", "services": [ - "AVS" + "AKV", + "Backup", + "WAF" ], - "severity": "Medium", - "subcategory": "Security", - "text": "Use a dedicated privileged access workstation (PAW)", - "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" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Use NSX-T for inter-vmware-traffic inspection", - "guid": "a2dac74f-5380-6e39-25e6-f13b99ece51f", - "link": "https://docs.vmware.com/en/VMware-NSX-T-Data-Center/3.2/administration/GUID-F6685367-7AA1-4771-927E-ED77727CFDA3.html", + "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", "services": [ - "AVS" + "AKV", + "EventHubs", + "WAF" ], "severity": "Medium", - "subcategory": "Traffic Inspection", - "text": "East West (Internal to AVS)", - "waf": "Security" + "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" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Decision on whether or not to use Secure hub for E/W and Internet traffic - requires Global Reach", - "guid": "3f621543-dfac-c471-54a6-7b2849b6909a", - "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", + "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", "services": [ - "VWAN", - "AVS", - "Firewall" + "Storage", + "WAF" ], "severity": "Medium", - "subcategory": "Virtual WAN", - "text": "Use Secure Hub (Azure Firewall or 3rd party)", + "text": "Consider the 'Azure security baseline for storage'", "waf": "Security" }, { - "category": "Networking", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Decision to route Azure to Azure traffic through Firewall, not E/W between AVS workloads (internal to AVS)", - "guid": "d7af5670-1b39-d95d-6da2-8d660dfbe16b", - "link": "https://learn.microsoft.com/azure/firewall-manager/secure-cloud-network", + "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", "services": [ - "VWAN", - "AVS" + "PrivateLink", + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Virtual WAN", - "text": "East West (Internal to Azure)", + "severity": "High", + "text": "Consider using private endpoints for Azure Storage", "waf": "Security" }, { - "category": "Other Services/Operations", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "When intending to use automated scale-out, be sure to apply for sufficient Azure VMware Solution quota for the subscriptions running Azure VMware Solution", - "guid": "7d049005-eb35-4a93-50a5-3b31a9f61161", - "link": "https://docs.microsoft.com/azure/azure-vmware/configure-nsx-network-components-azure-portal", + "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", "services": [ - "AVS", - "Subscriptions" + "RBAC", + "Storage", + "Subscriptions", + "WAF" ], "severity": "Medium", - "subcategory": "Automated Scale", - "text": "Scale out operations planning", - "waf": "Performance" + "text": "Ensure older storage accounts are not using 'classic deployment model'", + "waf": "Security" }, { - "category": "Other Services/Operations", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "When intending to use automated scale-in, be sure to take storage policy requirements into account before performing such action", - "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", + "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", "services": [ "Storage", - "AVS", - "AzurePolicy" + "Defender", + "WAF" ], - "severity": "Medium", - "subcategory": "Automated Scale", - "text": "Scale in operations planning", - "waf": "Performance" + "severity": "High", + "text": "Enable Microsoft Defender for all of your storage accounts", + "waf": "Security" }, { - "category": "Other Services/Operations", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "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)", - "guid": "3233e49e-62ce-97f3-8737-8230e771b694", - "link": "https://docs.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/eslz-platform-automation-and-devops#automated-scale", + "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", "services": [ - "AVS" + "Storage", + "WAF" ], "severity": "Medium", - "subcategory": "Automated Scale", - "text": "Scale serialized operations planning", - "waf": "Performance" + "text": "Enable 'soft delete' for blobs", + "waf": "Security" }, { - "category": "Other Services/Operations", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Consider and validate scaling operations on 3rd party solutions used in the architecture (supported or not)", - "guid": "68161d66-5707-319b-e77d-9217da892593", - "link": "Best practice (testing)", + "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", "services": [ - "AVS" + "Storage", + "WAF" ], "severity": "Medium", - "subcategory": "Automated Scale", - "text": "Scale rd operations planning", - "waf": "Performance" + "text": "Disable 'soft delete' for blobs", + "waf": "Security" }, { - "category": "Other Services/Operations", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Define and enforce scale in/out maximum limits for your environment in the automations", - "guid": "c32cb953-e860-f204-957a-c79d61202669", - "link": "Operational planning - understand workload requirements", + "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", "services": [ - "AVS" + "WAF" ], - "severity": "Medium", - "subcategory": "Automated Scale", - "text": "Scale maximum operations planning", - "waf": "Performance" + "severity": "High", + "text": "Enable 'soft delete' for containers", + "waf": "Security" }, { - "category": "Other Services/Operations", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Implement monitoring rules to monitor automated scaling operations and monitor success and failure to enable appropriate (automated) responses", - "guid": "7bd65a5e-7b5d-652d-dbea-fc6f73a42857", - "link": "https://docs.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/eslz-management-and-monitoring", + "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", "services": [ - "Monitor", - "AVS" + "Storage", + "WAF" ], "severity": "Medium", - "subcategory": "Automated Scale", - "text": "Monitor scaling operations ", - "waf": "Performance" + "text": "Disable 'soft delete' for containers", + "waf": "Security" }, { - "category": "Other Services/Operations", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Consider the use of Azure Private-Link when using other Azure Native Services", - "guid": "95e374af-8a2a-2672-7ab7-b4a1be43ada7", - "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", + "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", "services": [ - "AVS", - "PrivateLink" + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Networking", - "text": "Private link", - "waf": "Performance" + "severity": "High", + "text": "Enable resource locks on storage accounts", + "waf": "Security" }, { - "category": "Other Services/Operations", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "When performing automated configuration of NSX-T segments with a single Tier-1 gateway, use Azure Portal APIs instead of NSX-Manager APIs", - "guid": "71eff90d-5ad7-ac60-6244-2a6f7d3c51f2", - "link": "Best practice", + "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", "services": [ - "AVS" + "Storage", + "Subscriptions", + "AzurePolicy", + "WAF" ], - "severity": "Medium", - "subcategory": "Networking", - "text": "Provisioning Vmware VLANs", - "waf": "Performance" + "severity": "High", + "text": "Consider immutable blobs", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "In which region will AVS be deployed", - "guid": "04e3a2f9-83b7-968a-1044-2811811a924b", - "link": "https://learn.microsoft.com/windows-server/identity/ad-ds/plan/understanding-active-directory-site-topology", + "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", "services": [ - "AVS" + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "Region selected", - "waf": "Reliability" + "severity": "High", + "text": "Require HTTPS, i.e. disable port 80 on the storage account", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Are there regulatory or compliance policies in play", - "guid": "e52d1615-9cc6-565c-deb6-743ed7e90f4b", - "link": "Internal policy or regulatory compliance", + "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", "services": [ - "AzurePolicy", - "AVS" + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "Data residency compliant with selected regions", - "waf": "Reliability" + "severity": "High", + "text": "When enforcing HTTPS (disabling HTTP), check that you do not use custom domains (CNAME) for the storage account.", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Request through the support blade", - "guid": "92bd5ad6-441f-a983-7aa9-05dd669d760b", - "link": "https://learn.microsoft.com/azure/migrate/concepts-azure-vmware-solution-assessment-calculation", + "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", "services": [ - "AVS" + "Storage", + "WAF" ], "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "Request for number of AVS hosts submitted ", - "waf": "Reliability" + "text": "Limit shared access signature (SAS) tokens to HTTPS connections only", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "PG approval for deployment", - "guid": "28370f63-1cb8-2e35-907f-c5516b6954fa", - "link": "Support request through portal or get help from Account Team", + "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", "services": [ - "AVS" + "Entra", + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "Region and number of AVS nodes approved", - "waf": "Reliability" + "severity": "High", + "text": "Use Azure Active Directory (Azure AD) tokens for blob access", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Portal/subscription/resource providers/ Microsoft.AVS", - "guid": "96c76997-30a6-bb92-024d-f4f93f5f57fa", - "link": "Done through the subscription/resource providers/ AVS register in the portal", + "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", "services": [ - "AVS", - "Subscriptions" + "RBAC", + "WAF" ], "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "Resource provider for AVS registered", - "waf": "Reliability" + "text": "Least privilege in IaM permissions", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Connectivity, subscription & governanace model", - "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" + "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", + "services": [ + "Entra", + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "Landing zone architecture", - "waf": "Reliability" + "severity": "High", + "text": "When using SAS, prefer 'user delegation SAS' over storage-account-key based SAS.", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "The name of the RG where AVS will exist", - "guid": "d0181fb8-9cb8-bf4b-f5e5-b5f9bf7ae4ea", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/manage-resource-groups-portal", + "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", "services": [ - "AVS" + "Entra", + "AKV", + "Storage", + "Monitor", + "WAF" ], - "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "Resource group name selected", - "waf": "Reliability" + "severity": "High", + "text": "Consider disabling storage account keys, so that only AAD access (and user delegation SAS) is supported.", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Each resource created as part of the deployment will also utilize this prefix in the name", - "guid": "0f0d20c2-5a19-726c-de20-0984e070d9d6", - "link": "Best practice - naming standards", + "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", "services": [ - "AVS" + "AKV", + "Storage", + "AzurePolicy", + "Monitor", + "WAF" ], - "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "Deployment prefix selected", - "waf": "Reliability" + "severity": "High", + "text": "Consider using Azure Monitor to audit control plane operations on the storage account", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "/22 unique non-overlapping IPv4 address space", - "guid": "7fbf2ab7-a36c-5957-c27a-67038557af2a", - "link": "https://learn.microsoft.com/azure/azure-vmware/tutorial-network-checklist#routing-and-subnet-considerations", + "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": [ - "AVS" + "AKV", + "Storage", + "AzurePolicy", + "WAF" ], "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "Network space for AVS management layer", - "waf": "Reliability" + "text": "When using storage account keys, consider enabling a 'key expiration policy'", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "vNets used by workloads running in AVS (non-stretched)", - "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", + "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", "services": [ - "AVS", - "VNet" + "AzurePolicy", + "WAF" ], "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "Network space for AVS NSX-T segments", - "waf": "Reliability" + "text": "Consider configuring an SAS expiration policy", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Choose AV36, AV36P, AV52, AV36T (AV36T = Trial)", - "guid": "946c8966-f902-6f53-4f37-00847e8895c2", - "link": "https://azure.microsoft.com/pricing/details/azure-vmware/", + "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", "services": [ - "AVS" + "AKV", + "Storage", + "AzurePolicy", + "WAF" ], "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "AVS SKU (region dependent)", - "waf": "Performance" + "text": "Consider linking SAS to a stored access policy", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Use the Azure migration assessment tool to determine the minimum number of nodes required (consider BCDR as well)", - "guid": "31833808-26ba-9c31-416f-d54a89a17f5d", - "link": "https://learn.microsoft.com/azure/migrate/how-to-assess", + "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", "services": [ - "AVS" + "AKV", + "Storage", + "WAF" ], "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "Number of hosts to be deployed", - "waf": "Performance" + "text": "Consider configuring your application's source code repository to detect checked-in connection strings and storage account keys.", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Understand how and if you should be using reserved instances (cost control)", - "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", + "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", "services": [ - "Cost", - "AVS" + "Entra", + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "Reserverd Instances", - "waf": "Cost" + "severity": "High", + "text": "Consider storing connection strings in Azure KeyVault (in scenarios where managed identities are not possible)", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Ensure that you have requested enough quota, ensuring you have considered growth and Disaster Recovery requirement", - "guid": "94ac48ab-ade5-3fa7-f800-263feeb97070", - "link": "https://docs.microsoft.com/azure/azure-vmware/concepts-storage#storage-policies-and-fault-tolerance", + "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", "services": [ - "AVS", - "ASR" + "Storage", + "AzurePolicy", + "WAF" ], - "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "Capacity ", - "waf": "Performance" + "severity": "High", + "text": "Strive for short validity periods for ad-hoc SAS", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Identify which of the networking scenarios make ", - "guid": "1f9d4bd5-14b8-928c-b4cb-eb211f9b8de5", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/azure-vmware/eslz-network-topology-connectivity", + "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", "services": [ - "AVS" + "WAF" ], "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "Networking & Connectivity See docs describing scenrario 1 through 5", - "waf": "Reliability" + "text": "Apply a narrow scope to a SAS", + "waf": "Security" }, { - "category": "Planning", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Ensure that access constraints to ESXi are understood, there are access limits which might affect 3rd party solutions.", - "guid": "070db19b-8a2a-fd6a-c39b-4488d8780da9", - "link": "Please Check Partner Ecosystem", + "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", "services": [ - "AVS" + "WAF" ], "severity": "Medium", - "subcategory": "Pre-deployment", - "text": "3rd party application compatibility ", - "waf": "Reliability" + "text": "Consider scoping SAS to a specific client IP address, wherever possible", + "waf": "Security" }, { - "category": "Security", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "When in-guest encryption is used, store encryption keys in Azure Key vault when possible", - "guid": "70cfbddc-d3d4-9188-77c8-1cabaefef646", - "link": "General recommendation for storing encryption keys.", + "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", "services": [ - "AVS", - "AKV" + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Encryption", - "text": "Use Azure Key Vault with in-guest encryption ", + "severity": "Low", + "text": "Consider checking uploaded data, after clients used a SAS to upload a file. ", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "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)", - "guid": "c1a81638-18df-0ce9-a73a-4b9a8a8dd392", - "link": "https://docs.microsoft.com/azure/azure-vmware/concepts-storage#data-at-rest-encryption", + "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": [ - "SQL", - "AVS" + "Entra", + "RBAC", + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Encryption", - "text": "Use in-guest encryption", + "severity": "High", + "text": "SFTP: Limit the amount of 'local users' for SFTP access, and audit whether access is needed over time.", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Use Key vault to store secrets and authorization keys when separate Service Principles are used for deploying Azure VMware Solution and ExpressRoute", - "guid": "8d0a8f51-8d35-19cd-c2fe-4e3512fb467e", - "link": "https://docs.microsoft.com/azure/key-vault/general/authentication", + "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", "services": [ - "ExpressRoute", - "AVS", - "AKV" + "WAF" ], "severity": "Medium", - "subcategory": "Encryption", - "text": "Keyvault use for secrets", + "text": "SFTP: The SFTP endpoint does not support POSIX-like ACLs.", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Older OS security patching configured for workloads running on Azure VMware Solution are eligible for ESU", - "guid": "4f8b20e9-a2a1-f80f-af9b-8aa3b26dca08", - "link": "https://docs.microsoft.com/windows-server/get-started/extended-security-updates-deploy", + "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", "services": [ - "AVS" + "Storage", + "AzurePolicy", + "WAF" ], - "severity": "Medium", - "subcategory": "Extended support", - "text": "Ensure extended security update support ", + "severity": "High", + "text": "Avoid overly broad CORS policies", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Use a SIEM/SOAR", - "guid": "9bb22fec-4d00-3b95-7136-e225d0f5c63a", - "link": "https://learn.microsoft.com/azure/sentinel/overview", + "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", "services": [ - "Sentinel", - "AVS" + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Investigation", - "text": "Enable Azure Sentinel or 3rd party SIEM ", + "severity": "High", + "text": "Determine how data at rest should be encrypted. Understand the thread model for data.", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "MS Defender For Cloud, for workloads running on Azure VMware Solution", - "guid": "f42b0b09-c591-238a-1580-2de3c485ebd2", - "link": "https://learn.microsoft.com/azure/azure-vmware/azure-security-integration#prerequisites", + "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", "services": [ - "AVS", - "Defender" + "WAF" ], "severity": "Medium", - "subcategory": "Security", - "text": "Enable Advanced Threat Detection ", + "text": "Determine which/if platform encryption should be used.", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Are the applicable policies enabled (compliance baselines added to MDfC)", - "guid": "bcdd2348-3d0e-c6bb-1092-aa4cd1a66d6b", - "link": "https://docs.microsoft.com/azure/azure-vmware/azure-security-integration", + "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", "services": [ - "AzurePolicy", - "AVS" + "WAF" ], "severity": "Medium", - "subcategory": "Security", - "text": "Policy & Regulatory Compliance", + "text": "Determine which/if client-side encryption should be used.", "waf": "Security" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Azure to Azure (E/W), Azure to On-premises), AVS to Internet, AVS to Azure", - "guid": "607c1ca9-da92-ae19-5a4c-eb1e876acbe7", - "link": "https://techcommunity.microsoft.com/t5/azure-migration-and/firewall-integration-in-azure-vmware-solution/ba-p/2254961#:~:text=Azure%20VMware%20Solution%20customers%20have%20multiple%20security%20options,the%20box%20to%20provide%20East-West%20and%20North-South%20firewalling.", + "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", "services": [ - "AVS" + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Firewalls", - "text": "Azure / 3rd party firewall", + "severity": "High", + "text": "Consider whether public blob access is needed, or whether it can be disabled for certain storage accounts. ", "waf": "Security" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "To allow HCX appliance to connect/sync", - "guid": "1d87925c-c02b-7fde-a425-7e95ad846a27", - "link": "https://docs.vmware.com/en/VMware-Cloud-on-AWS/services/com.vmware.vmc-aws-networking-security/GUID-2CFE1654-9CC9-4EDB-A625-21317299E559.html", + "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", "services": [ - "AVS" + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Firewalls", - "text": "Firewalls allow for East/West traffic inside AVS", - "waf": "Security" + "severity": "High", + "text": "Leverage a storagev2 account type for better performance and reliability", + "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Decision on which tool to use (SRM requires additional license - enables automation & other features)", - "guid": "468b3495-2f6e-b65a-38ef-3ba631bcaa46", - "link": "https://docs.vmware.com/en/VMware-HCX/4.2/hcx-user-guide/GUID-B842696B-89EF-4183-9C73-B77157F56055.html", + "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", "services": [ - "AVS" + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Networking", - "text": "HCX and/or SRM", + "severity": "High", + "text": "Leverage GRS, ZRS or GZRS storage for the highest availability", "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Read up on requirements for Service Mesh requirements and how HCX ", - "guid": "be2ced52-da08-d366-cf7c-044c19e29509", - "link": "https://docs.vmware.com/en/VMware-HCX/4.6/hcx-user-guide/GUID-76BCD059-A31A-4041-9105-ACFB56213E7C.html", + "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", "services": [ - "AVS" + "WAF" ], "severity": "Medium", - "subcategory": "Networking", - "text": "Configuring and Managing the HCX Interconnect", + "text": "For write operation after failover, use customer-Managed Failover ", "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "If you are planning on using stretch networks ensure that your on-premises environment requirements", - "guid": "7dcac579-fc5c-5c9c-f1f7-9b1149ff2c37", - "link": "https://docs.vmware.com/en/VMware-HCX/4.2/hcx-user-guide/GUID-DBDB4D1B-60B6-4D16-936B-4AC632606909.html", + "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", "services": [ - "AVS" + "WAF" ], "severity": "Medium", - "subcategory": "Networking", - "text": "Restrictions and limitations for network extensions", - "waf": "Performance" + "text": "Understand Microsoft-Managed Failover details", + "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Do workloads require MoN?", - "guid": "cf45c0b9-6c4b-3bfb-86c5-62fe54061c73", - "link": "https://learn.microsoft.com/azure/azure-vmware/vmware-hcx-mon-guidance", + "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", "services": [ - "AVS" + "WAF" ], "severity": "Medium", - "subcategory": "Networking", - "text": "Mobility optimized networking", - "waf": "Performance" + "text": "Enable Soft Delete", + "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Operating system level of Vmware environment", - "guid": "b7cf11f3-b12e-5189-991a-06df5250d2ca", - "link": "https://learn.microsoft.com/azure/site-recovery/vmware-physical-azure-support-matrix", + "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", "services": [ - "AVS" + "VM", + "WAF" ], - "severity": "Medium", - "subcategory": "On-premises pre-requisites", - "text": "Support matrix (OS versions etc).", - "waf": "Operations" + "severity": "Low", + "text": "Enable automatic instance repairs for enhanced VM Scale Sets resiliency", + "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Required that all switches are dynamic", - "guid": "45fe9252-aa1b-4e30-45c6-bc02f3b76acf", - "link": "https://docs.vmware.com/en/VMware-vSphere/7.0/vsan-network-design-guide/GUID-91E1CD6F-33A6-4AC6-BC22-3E4807296F86.html#:~:text=Migrate%20Management%20Network%201%20Add%20hosts%20to%20the,each%20host.%20...%204%20Finish%20the%20configuration.%20", + "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", "services": [ - "AVS" + "Backup", + "VM", + "WAF" ], - "severity": "Medium", - "subcategory": "On-premises pre-requisites", - "text": "Standard switches converted to dynamic switches", - "waf": "Operations" + "severity": "High", + "text": "Consider Azure Backup to meet your resiliency requirements for Azure VMs", + "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "See sections on sizing and capacity in the link.", - "guid": "e9f6d736-ee44-e2ac-e7f9-e361f8c857f3", - "link": "https://learn.microsoft.com/azure/azure-vmware/plan-private-cloud-deployment", + "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", "services": [ - "AVS" + "VM", + "WAF" ], - "severity": "Medium", - "subcategory": "On-premises pre-requisites", - "text": "Capacity for HCX appliance", - "waf": "Performance" + "severity": "High", + "text": "Use Premium or Ultra disks for production VMs", + "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Check hardware restrictions to ensure compatibility with AVS/OS ", - "guid": "1be2cdd6-15a7-9a33-aea7-113859035ce9", - "link": "https://kb.vmware.com/s/article/2007240#:~:text=ESXi%2FESX%20hosts%20and%20compatible%20virtual%20machine%20hardware%20versions,%20Not%20Supported%20%204%20more%20rows", + "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", "services": [ - "AVS" + "VM", + "WAF" ], - "severity": "Medium", - "subcategory": "On-premises pre-requisites", - "text": "Hardware compatibility", - "waf": "Operations" + "severity": "High", + "text": "Ensure Managed Disks are used for all VMs", + "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Need to be converted", - "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", + "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", "services": [ + "SQL", "Storage", - "AVS" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "Storage", - "text": "VSAN RDM disks are converted - not supported.", - "waf": "Operations" + "text": "Do not use the Temp disk for anything that is not acceptable to be lost", + "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Need to be converted", - "guid": "eb2f9313-afb2-ab35-aa24-6d97a3cb0611", - "link": "3rd-Party tools", + "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", "services": [ + "ACR", "Storage", - "AVS", - "VM" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "Storage", - "text": "VM with SCSI shared bus are not supported", - "waf": "Operations" + "text": "Leverage Availability Zones for your VMs in regions where they are supported", + "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Remove Direct IO before migration", - "guid": "3f2a5cff-c8a6-634a-1f1b-53ef9d321381", - "link": "Contact VMware", + "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", "services": [ - "Storage", - "AVS", - "VM" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "Storage", - "text": "VM with Direct IO require removing DirectPath device", - "waf": "Operations" + "text": "For regions that do not support Availability Zones deploy VMs into Availability Sets", + "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Cannot migrate clusters ", - "guid": "efc8a311-74f8-0252-c6a0-4bac7610e266", - "link": "Contact VMware", + "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", "services": [ - "Storage", - "AVS" + "VM", + "ASR", + "WAF" ], - "severity": "Medium", - "subcategory": "Storage", - "text": "Shared VMDK files are not supported", - "waf": "Operations" + "severity": "High", + "text": "Avoid running a production workload on a single VM", + "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Convert to a different format", - "guid": "ab6c89cd-a26f-b894-fe59-61863975458e", - "link": "Contact VMware", + "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", "services": [ - "Storage", - "AVS" + "AVS", + "VM", + "ASR", + "WAF" ], - "severity": "Medium", - "subcategory": "Storage", - "text": "RDM with 'physical compatibility mode' are not supported.", - "waf": "Operations" + "severity": "High", + "text": "For Azure and on-premises VMs (Hyper-V/Phyiscal/VMware) with low RTO requirements use Azure Site Recovery", + "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Ensure the vSAN storage policy for VM's is NOT the default storage policy as this policy applies thick provisioning 'RAID-1 FTT-1' is default with Thin Provisioning", - "guid": "7628d446-6b10-9678-9cec-f407d990de43", - "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-storage#storage-policies-and-fault-tolerance", + "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", "services": [ - "Storage", - "AVS", - "AzurePolicy", - "VM" + "WAF" ], - "severity": "Medium", - "subcategory": "Storage", - "text": "Default storage policy", - "waf": "Operations" + "severity": "Low", + "text": "Use Capacity Reservations for critical workloads that require guaranteed capacity", + "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "The default storage policy is set to RAID-1 (Mirroring) FTT-1, with Object Space Reservation set to Thin provisioning.", - "guid": "37fef358-7ab9-43a9-542c-22673955200e", - "link": "https://learn.microsoft.com/azure/azure-vmware/configure-storage-policy", + "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", "services": [ - "Storage", - "AVS", - "AzurePolicy", - "VM" + "VM", + "ASR", + "WAF" ], "severity": "Medium", - "subcategory": "Storage", - "text": "Ensure that the appropriate VM template storage policy is used", - "waf": "Operations" + "text": "Increase quotas in DR region before testing failover with ASR", + "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "Ensure that the Failure-to-tolerate policy is in place to meet your vSAN storage needs", - "guid": "ebebd109-9f9d-d85e-1b2f-d302012843b7", - "link": "https://learn.microsoft.com/azure/azure-vmware/concepts-storage#storage-policies-and-fault-tolerance", + "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", "services": [ - "AzurePolicy", - "AVS", - "Storage" + "VM", + "WAF" ], - "severity": "Medium", - "subcategory": "Storage", - "text": "Failure to tolerate policy", - "waf": "Operations" + "severity": "Low", + "text": "Utilize Scheduled Events to prepare for VM maintenance", + "waf": "Reliability" }, { - "category": "VMware", - "checklist": "Azure VMware Solution Implementation Checklist", - "description": "ANF can be used to extend storage for Azure VMware Solution,", - "guid": "1be821bd-4f37-216a-3e3d-2a5ac6996863", - "link": "https://learn.microsoft.com/azure/azure-vmware/netapp-files-with-azure-vmware-solution", + "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", "services": [ "Storage", - "AVS" + "WAF" ], "severity": "Medium", - "subcategory": "Storage", - "text": "Use ANF for external storage", - "waf": "Operations" - }, - { - "category": "Operations Management", - "checklist": "DataBricks Review Checklist", - "guid": "65285269-440c-44be-9d3e-0844276d4bdc", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/pass-foudations-playbooks-ADB_v1.docx", - "services": [], - "severity": "High", - "subcategory": "Best Practices", - "text": "Reference Databricks HA/DR playbook", + "text": "Choose the most appropriate data redundancy option for Azure Storage based on your requirements", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "DataBricks Review Checklist", - "guid": "89d558b9-37d3-4974-b111-2dbd7aaf12e6", - "link": "https://learn.microsoft.com/azure/databricks/security/secrets/secret-scopes", + "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", "services": [ - "Backup" + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Backup", - "text": "Backup Your Workspace Configuration including ARM templates and Secret Scopes", + "severity": "Low", + "text": "Apply a Delete lock to prevent accidental or malicious deletion of storage accounts", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "DataBricks Review Checklist", - "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", + "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", "services": [ - "ACR", - "Backup" + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Backup", - "text": "Share MetaData Across different Databricks Workspaces using Hive External Metastore", + "severity": "Low", + "text": "Enable soft delete for Storage Account Containers", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "DataBricks Review Checklist", - "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", + "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", "services": [ - "Backup", - "ASR" + "Storage", + "WAF" ], - "severity": "Medium", - "subcategory": "Backup", - "text": "Plan Disaster Recovery Strategy in Databricks using the Hive External Metastore", + "severity": "Low", + "text": "Enable soft delete for blobs", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "DataBricks Review Checklist", - "guid": "4b1d944a-3598-437e-b79d-6c6d3a364a5b", - "link": "https://www.databricks.com/blog/2021/04/20/attack-of-the-delta-clones-against-disaster-recovery-availability-complexity.html", + "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", "services": [ - "Backup" + "Backup", + "WAF" ], "severity": "Medium", - "subcategory": "Backup", - "text": "Backup your data with deep and shallow clones", + "text": "Enable Azure Backup enhanced soft delete for improved data protection and recovery", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "DataBricks Review Checklist", - "description": "Download the blob using Secondary Endpoint in RAGRS Storage Account", - "guid": "7abae48a-bd54-4cd7-ae2e-86768357c559", - "link": "https://techcommunity.microsoft.com/t5/azure-paas-blog/download-the-blob-using-secondary-endpoint-in-ragrs-storage/ba-p/2403750", + "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", "services": [ - "Storage", - "Backup" + "Backup", + "WAF" ], - "severity": "Medium", - "subcategory": "Backup", - "text": "Backup your data to Azure Storage RA-GRS", + "severity": "Low", + "text": "Implement multi-user authorization for Azure Backup to ensure secure and controlled access to backup resources", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "DataBricks Review Checklist", - "guid": "675c5ee8-5b85-49c7-944c-e3b1a28b875a", - "link": "https://learn.microsoft.com/azure/databricks/dev-tools/index-ci-cd", + "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", "services": [ - "Backup" + "Storage", + "Backup", + "WAF" ], - "severity": "High", - "subcategory": "Backup", - "text": "Backup your code with DevOps", + "severity": "Low", + "text": "Implement Immutable Storage for your vaults to protect against ransomware and prevent unauthorized modifications to backups", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "DataBricks Review Checklist", - "guid": "a1bf1038-9f03-4a4d-8ce4-63dbbbc8682a", - "link": "https://learn.microsoft.com/azure/databricks/administration-guide/disaster-recovery", + "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": [ - "ASR" + "DNS", + "ACR", + "ASR", + "WAF" ], - "severity": "High", - "subcategory": "Disaster Recovery", - "text": "Plan for Disaster recovery using Active/Active or Active/Passive Configuration", + "severity": "Low", + "text": "Implement DNS Failover using Azure DNS Private Resolvers", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "DataBricks Review Checklist", - "description": "Migration package to log all Databricks resources for backup and/or migrating to another Databricks workspace", - "guid": "5abc92a4-eda1-4dae-8cc8-5c47c6b781cc", - "link": "https://github.com/databrickslabs/migrate", + "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": [ - "Backup" + "ACR", + "WAF" ], "severity": "Medium", - "subcategory": "Migration", - "text": "Use Databricks Migration tools", + "text": "Use on-premises data gateway clusters to ensure high availability for business-critical data", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "DataBricks Review Checklist", - "guid": "a0e6c465-89d5-458b-a37d-3974d1112dbd", - "link": "https://github.com/databrickslabs/databricks-sync", - "services": [], - "severity": "Low", - "subcategory": "Migration", - "text": "Use Databricks Sync", + "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", + "services": [ + "NVA", + "WAF" + ], + "severity": "High", + "text": "Deploy Network Virtual Appliances (NVAs) in a vendor supported configuration for High Availability", "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ + "AKV", "FrontDoor", - "AKV" + "WAF" ], "severity": "Medium", - "subcategory": "Front Door", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", - "guid": "b71ca41b-3a80-48f3-a6cd-22cdf197c1cf", - "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", - "services": [], - "severity": "Medium", - "subcategory": "App delivery", - "text": "Perform app delivery within landing zones for both internal-facing (corp) and external-facing apps (online).", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Security" - }, - { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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" + "AppGW", + "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "text": "Ensure you are using Application Gateway v2 SKU", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "LoadBalancer" + "LoadBalancer", + "WAF" ], "severity": "Medium", - "subcategory": "Load Balancer", "text": "Ensure you are using the Standard SKU for your Azure Load Balancers", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "LoadBalancer" + "LoadBalancer", + "WAF" ], "severity": "Medium", - "subcategory": "Load Balancer", "text": "Ensure your Load Balancers frontend IP addresses are zone-redundant (unless you require zonal frontends).", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ + "VNet", "AppGW", - "VNet" + "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ + "Entra", "AppGW", "NVA", + "Subscriptions", "VNet", - "Entra", - "WAF", - "Subscriptions" + "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "DDoS" + "DDoS", + "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", - "services": [], + "services": [ + "WAF" + ], "severity": "Medium", - "subcategory": "App Gateway", "text": "Configure autoscaling with a minimum amount of instances of two.", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ "ACR", - "AppGW" + "AppGW", + "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "text": "Deploy Application Gateway across Availability Zones", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ + "FrontDoor", "AzurePolicy", - "WAF", - "FrontDoor" + "WAF" ], "severity": "Medium", - "subcategory": "Front Door", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "AzurePolicy", + "FrontDoor", "AppGW", - "WAF", - "FrontDoor" + "AzurePolicy", + "WAF" ], "severity": "Medium", - "subcategory": "App delivery", "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" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "TrafficManager" + "TrafficManager", + "WAF" ], "severity": "High", - "subcategory": "Traffic Manager", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ + "Entra", "AVD", - "Entra" + "WAF" ], "severity": "Low", - "subcategory": "App delivery", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "Entra" + "Entra", + "WAF" ], "severity": "Medium", - "subcategory": "App delivery", "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" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ + "FrontDoor", "AzurePolicy", - "WAF", - "FrontDoor" + "WAF" ], "severity": "High", - "subcategory": "Front Door", "text": "Deploy your WAF policy for Front Door in 'Prevention' mode.", "waf": "Security" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ + "TrafficManager", "FrontDoor", - "TrafficManager" + "WAF" ], "severity": "High", - "subcategory": "Front Door", "text": "Avoid combining Azure Traffic Manager and Azure Front Door.", "waf": "Security" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "High", - "subcategory": "Front Door", "text": "Use the same domain name on Azure Front Door and your origin. Mismatched host names can cause subtle bugs.", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Low", - "subcategory": "Front Door", "text": "Disable health probes when there is only one origin in an Azure Front Door origin group.", "waf": "Performance" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Medium", - "subcategory": "Front Door", "text": "Select good health probe endpoints for Azure Front Door. Consider building health endpoints that check all of your application's dependencies.", "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Low", - "subcategory": "Front Door", "text": "Use HEAD health probes with Azure Front Door, to reduce the traffic that Front Door sends to your application.", "waf": "Performance" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "LoadBalancer" + "LoadBalancer", + "WAF" ], "severity": "High", - "subcategory": "Load Balancer", "text": "Use Azure NAT Gateway instead of Load Balancer outbound rules for better SNAT scalability", "waf": "Reliability" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ + "AKV", "Cost", "FrontDoor", - "AKV" + "WAF" ], "severity": "High", - "subcategory": "Front Door", "text": "Use managed TLS certificates with Azure Front Door. Reduce operational cost and risk of outages due to certificate renewals.", "waf": "Operations" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "WAF", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Medium", - "subcategory": "Front Door", "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" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "High", - "subcategory": "Front Door", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Medium", - "subcategory": "Front Door", "text": "Use HTTP to HTTPS redirection with Azure Front Door. Support older clients by redirecting them to an HTTPS request automatically.", "waf": "Security" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "WAF", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "High", - "subcategory": "Front Door", "text": "Enable the Azure Front Door WAF. Protect your application from a range of attacks.", "waf": "Security" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "WAF", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "High", - "subcategory": "Front Door", "text": "Tune the Azure Front Door WAF for your workload. Reduce false positive detections.", "waf": "Security" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ + "FrontDoor", "AzurePolicy", - "WAF", - "FrontDoor" + "WAF" ], "severity": "High", - "subcategory": "Front Door", "text": "Enable request body inspection feature enabled in Azure Front Door WAF policy.", "waf": "Security" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "WAF", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "High", - "subcategory": "Front Door", "text": "Enable the Azure Front Door WAF default rule sets. The default rule sets detect and block common attacks.", "waf": "Security" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "WAF", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "High", - "subcategory": "Front Door", "text": "Enable the Azure Front Door WAF bot protection rule set. The bot rules detect good and bad bots.", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "WAF", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Medium", - "subcategory": "Front Door", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "WAF", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Medium", - "subcategory": "Front Door", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "WAF", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Medium", - "subcategory": "Front Door", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "FrontDoor" + "WAF" ], "severity": "Low", - "subcategory": "Front Door", "text": "If you are not expecting traffic from all geographical regions, use geo-filters to block traffic from non-expected countries.", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "WAF", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Medium", - "subcategory": "Front Door", "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" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", @@ -35905,31 +33603,29 @@ "WAF" ], "severity": "High", - "subcategory": "App Gateway", "text": "Enable the Azure Application Gateway WAF bot protection rule set The bot rules detect good and bad bots.", "waf": "Security" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "AzurePolicy", "AppGW", + "AzurePolicy", "WAF" ], "severity": "High", - "subcategory": "App Gateway", "text": "Enable request body inspection feature enabled in Azure Application Gateway WAF policy.", "waf": "Security" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", @@ -35938,31 +33634,29 @@ "WAF" ], "severity": "High", - "subcategory": "App Gateway", "text": "Tune the Azure Application Gateway WAF for your workload. Reduce false positive detections.", "waf": "Security" }, { "ammp": true, - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "AzurePolicy", "AppGW", + "AzurePolicy", "WAF" ], "severity": "High", - "subcategory": "App Gateway", "text": "Deploy your WAF policy for Application Gateway in 'Prevention' mode.", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", @@ -35971,13 +33665,12 @@ "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", @@ -35986,25 +33679,25 @@ "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", - "services": [], + "services": [ + "WAF" + ], "severity": "Low", - "subcategory": "App Gateway", "text": "If you are not expecting traffic from all geographical regions, use geo-filters to block traffic from non-expected countries.", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", @@ -36013,13 +33706,12 @@ "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", @@ -36028,13 +33720,12 @@ "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", @@ -36043,28 +33734,26 @@ "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "text": "Add diagnostic settings to save your Azure Application Gateway WAF logs.", "waf": "Operations" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "WAF", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Medium", - "subcategory": "Front Door", "text": "Add diagnostic settings to save your Azure Front Door WAF logs.", "waf": "Operations" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", @@ -36074,29 +33763,27 @@ "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "text": "Send Azure Application Gateway WAF logs to Microsoft Sentinel.", "waf": "Operations" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ "Sentinel", - "WAF", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Medium", - "subcategory": "Front Door", "text": "Send Azure Front Door WAF logs to Microsoft Sentinel.", "waf": "Operations" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", @@ -36105,13 +33792,12 @@ "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "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" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", @@ -36120,56 +33806,56 @@ "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "text": "Use WAF Policies instead of the legacy WAF configuration.", "waf": "Operations" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ + "AppGW", "VPN", "ExpressRoute", - "AppGW", - "VNet" + "VNet", + "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "text": "Filter inbound traffic in the backends so that they only accept connections from the Application Gateway subnet, for example with NSGs.", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Medium", - "subcategory": "Front Door", "text": "Make sure your origins only take traffic from your Azure Front Door instance.", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", - "services": [], + "services": [ + "WAF" + ], "severity": "High", - "subcategory": "App Gateway", "text": "You should encrypt traffic to the backend servers.", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", @@ -36177,408 +33863,408 @@ "WAF" ], "severity": "High", - "subcategory": "App Gateway", "text": "You should use a Web Application Firewall.", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", - "services": [], + "services": [ + "WAF" + ], "severity": "Medium", - "subcategory": "App Gateway", "text": "Redirect HTTP to HTTPS", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", - "services": [], + "services": [ + "WAF" + ], "severity": "Medium", - "subcategory": "App Gateway", "text": "Use gateway-managed cookies to direct traffic from a user session to the same server for processing", "waf": "Operations" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", - "services": [], + "services": [ + "WAF" + ], "severity": "High", - "subcategory": "App Gateway", "text": "Enable connection draining during planned service updates to prevent connection loss to existing membrs of the backend pool", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", - "services": [], + "services": [ + "WAF" + ], "severity": "Low", - "subcategory": "App Gateway", "text": "Create custom error pages to display a personalized user experience", "waf": "Operations" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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": [], + "services": [ + "WAF" + ], "severity": "Medium", - "subcategory": "App Gateway", "text": "Edit HTTP requests and response headers for easier routing and information exchange between the client and server", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "text": "Configure Front Door to optimize global web traffic routing and top-tier end-user performance, and reliability through quick global failover", "waf": "Performance" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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": [], + "services": [ + "WAF" + ], "severity": "Medium", - "subcategory": "App Gateway", "text": "Use transport layer load balancing", "waf": "Performance" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", - "services": [], + "services": [ + "WAF" + ], "severity": "Medium", - "subcategory": "App Gateway", "text": "Configure routing based on host or domain name for multiple web applications on a single gateway", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "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", "services": [ - "Entra" + "Entra", + "WAF" ], "severity": "Medium", - "subcategory": "App Gateway", "text": "Centralize SSL certificate management to reduce encryption and decryption overhead from a backend server farm", "waf": "Security" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Application Delivery Networking", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "WAF checklist", "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", "service": "App Gateway", "services": [ - "AppGW" + "AppGW", + "WAF" ], "severity": "Low", - "subcategory": "App Gateway", "text": "Use Application Gateway for native support for WebSocket and HTTP/2 protocols", "waf": "Security" }, { - "category": "Operations Management", - "checklist": "PostgreSQL Review Checklist", + "arm-service": "Microsoft.DBforPostgreSQL/servers", + "checklist": "WAF checklist", "guid": "65285269-441c-44bf-9d3e-0844276d4bdc", "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview", "service": "PostgreSQL", "services": [ - "SQL" + "WAF" ], "severity": "Medium", - "subcategory": "Best Practices", "text": "Leverage Flexible Server", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "PostgreSQL Review Checklist", + "arm-service": "Microsoft.DBforPostgreSQL/servers", + "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", "services": [ - "SQL" + "WAF" ], "severity": "High", - "subcategory": "Best Practices", "text": "Leverage Availability Zones where regionally applicable", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "PostgreSQL Review Checklist", + "arm-service": "Microsoft.DBforPostgreSQL/servers", + "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", "services": [ - "SQL" + "WAF" ], "severity": "Medium", - "subcategory": "Best Practices", "text": "Leverage cross-region read replicas for BCDR", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "Azure Data Factory Review Checklist", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "WAF checklist", "guid": "ab91932c-9fc9-4d1b-a881-37f5e6c0cb9e", "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ADF_v1.docx", "service": "Azure Data Factory", - "services": [], + "services": [ + "WAF" + ], "severity": "Medium", - "subcategory": "Best Practices", "text": "Leverage FTA Resiliency Playbook for Azure Data Factory", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "Azure Data Factory Review Checklist", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "WAF checklist", "guid": "e503547c-d447-4e82-9138-a7200f1cac6d", "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", "service": "Azure Data Factory", - "services": [], + "services": [ + "WAF" + ], "severity": "High", - "subcategory": "Availablity Zone", "text": "Use zone redundant pipelines in regions that support Availability Zones", "waf": "Reliability" }, { - "category": "Operations Management", - "checklist": "Azure Data Factory Review Checklist", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "WAF checklist", "guid": "9ef1d6e8-32e5-42e3-911c-818b1a0bc511", "link": "https://learn.microsoft.com/azure/data-factory/source-control", "service": "Azure Data Factory", "services": [ - "Backup" + "Backup", + "WAF" ], "severity": "Medium", - "subcategory": "DevOps Integration", "text": "Use DevOps to Backup the ARM templates with Github/Azure DevOps integration ", "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Data Factory Review Checklist", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "WAF checklist", "guid": "e43a18a9-cd29-49cf-b7b1-7db8255562f2", "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", "service": "Azure Data Factory", "services": [ - "VM" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "Network", "text": "Make sure you replicate the Self-Hosted Integration Runtime VMs in another region ", "waf": "Reliability" }, { - "category": "Network Topology and Connectivity", - "checklist": "Azure Data Factory Review Checklist", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "WAF checklist", "guid": "aee4563a-fd83-4393-98b2-62d6dc5f512a", "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", "service": "Azure Data Factory", "services": [ - "VNet" + "VNet", + "WAF" ], "severity": "Medium", - "subcategory": "Network", "text": "Make sure you replicate or duplicate your network in the sister region. You have to make a copy of your Vnet in another region", "waf": "Reliability" }, { - "category": "Governance and Security", - "checklist": "Azure Data Factory Review Checklist", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "WAF checklist", "description": "If your ADF Pipelines use Key Vault you don't have to do anything to replicate Key Vault. Key Vault is a managed service and Microsoft takes care of it for you", "guid": "25498f6d-bad3-47da-a43b-c6ce1d7aa9b2", "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", "service": "Azure Data Factory", "services": [ - "AKV" + "AKV", + "WAF" ], "severity": "Low", - "subcategory": "Integration", "text": "If using Keyvault integration, use SLA of Keyvault to understand your availablity", "waf": "Reliability" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ - "ACR" + "ACR", + "WAF" ], "severity": "High", - "subcategory": "Data Protection", "text": "Disable Azure Container Registry image export", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ + "ACR", "AzurePolicy", - "ACR" + "WAF" ], "severity": "High", - "subcategory": "Data Protection", "text": "Enable Azure Policies for Azure Container Registry", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ + "AKV", "ACR", - "AKV" + "WAF" ], "severity": "High", - "subcategory": "Data Protection", "text": "Sign and Verify containers with notation (Notary v2)", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ "ACR", - "AKV" + "AKV", + "WAF" ], "severity": "Medium", - "subcategory": "Data Protection", "text": "Encrypt registry with a customer managed key", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ + "Entra", "RBAC", "ACR", - "Entra" + "WAF" ], "severity": "High", - "subcategory": "Identity and Access Control", "text": "Use Managed Identities to connect instead of Service Principals", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ "RBAC", - "ACR", - "Entra" + "WAF" ], "severity": "High", - "subcategory": "Identity and Access Control", "text": "Disable local authentication for management plane access", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ + "Entra", "RBAC", "ACR", - "Entra" + "WAF" ], "severity": "High", - "subcategory": "Identity and Access Control", "text": "Assign AcrPull & AcrPush RBAC roles rather than granting Administrative access to identity principals", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ - "ACR", - "Entra" + "WAF" ], "severity": "Medium", - "subcategory": "Identity and Access Control", "text": "Disable Anonymous pull access", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ - "ACR", - "Entra" + "Entra", + "WAF" ], "severity": "High", - "subcategory": "Identity and Access Control", "text": "Disable repository-scoped access tokens", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", @@ -36586,1398 +34272,1288 @@ "PrivateLink", "EventHubs", "ACR", - "Entra" + "WAF" ], "severity": "High", - "subcategory": "Identity and Access Control", "text": "Deploy images from a trusted environment", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ - "AzurePolicy", + "Entra", "ACR", - "Entra" + "AzurePolicy", + "WAF" ], "severity": "Medium", - "subcategory": "Identity and Access Control", "text": "Disable Azure ARM audience tokens for authentication", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ - "Monitor", + "Entra", "ACR", - "Entra" + "Monitor", + "WAF" ], "severity": "Medium", - "subcategory": "Logging and Monitoring", "text": "Enable diagnostics logging", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ - "Firewall", - "ACR", + "PrivateLink", "VNet", - "PrivateLink" + "Firewall", + "WAF" ], "severity": "Medium", - "subcategory": "Network Security", "text": "Control inbound network access with Private Link", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ - "ACR", - "PrivateLink" + "PrivateLink", + "WAF" ], "severity": "Medium", - "subcategory": "Network Security", "text": "Disable Public Network access", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ + "PrivateLink", "ACR", - "PrivateLink" + "WAF" ], "severity": "Medium", - "subcategory": "Network Security", "text": "Use an Azure Container Registry SKU that supports Private Link (Premium SKU)", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ "ACR", - "Defender" + "Defender", + "WAF" ], "severity": "Low", - "subcategory": "Network Security", "text": "Enable Defender for Containers to scan Azure Container Registry for vulnerabilities", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "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", "services": [ - "ACR" + "WAF" ], "severity": "Medium", - "subcategory": "Vulnerability Management", "text": "Deploy validated container images", "waf": "Security" }, { - "category": "Security", - "checklist": "Azure Container Registry Security Review", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "WAF checklist", "description": "Use the latest versions of supported platforms, programming languages, protocols, and frameworks.", "guid": "4e401955-387e-45ce-b126-cd132af5b20c", "service": "ACR", "services": [ - "ACR" + "WAF" ], "severity": "High", - "subcategory": "Vulnerability Management", "text": "Use up-to-date platforms, languages, protocols and frameworks", "waf": "Security" }, { - "category": "Cleanup", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Insights/components", + "checklist": "WAF checklist", "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", "service": "Azure Monitor", "services": [ - "Cost", - "Monitor" + "Monitor", + "WAF" ], "severity": "Medium", - "subcategory": "Azure Monitor - enforce data collection rules", "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" }, { - "category": "Cleanup", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.RecoveryServices/vaults", + "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", "services": [ - "Cost", - "Backup" + "Backup", + "WAF" ], "severity": "Medium", - "subcategory": "Backup", "text": "check backup instances with the underlying datasource not found", "waf": "Cost" }, { - "category": "Cleanup", - "checklist": "Cost Optimization Checklist", + "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", "service": "VM", "services": [ - "Cost" + "WAF" ], "severity": "Medium", - "subcategory": "Delete/archive", "text": "Delete or archive unassociated services (disks, nics, ip addresses etc)", "waf": "Cost" }, { - "category": "Cleanup", - "checklist": "Cost Optimization Checklist", - "guid": "659d3958-fd77-4289-a835-556df2bfe456", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Delete/archive", - "text": "Consider snooze and stop technique (snooze a service after x days, stop after 2x, delete/deallocate after 3x)", - "waf": "Cost" - }, - { - "category": "Cleanup", - "checklist": "Cost Optimization Checklist", - "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": [ - "Cost", - "Storage", - "Backup" - ], - "severity": "Medium", - "subcategory": "Delete/archive", - "text": "Delete or archive unused resources (old backups, logs, storage accounts, etc...)", - "waf": "Cost" - }, - { - "category": "Cleanup", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.RecoveryServices/vaults", + "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", "services": [ - "Cost", "Storage", "Backup", - "ASR" + "ASR", + "WAF" ], "severity": "Medium", - "subcategory": "Delete/archive", "text": "Consider a good balance between site recovery storage and backup for non mission critical applications", "waf": "Cost" }, { - "category": "Cleanup", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Insights/components", + "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", "services": [ - "Cost", - "Monitor" + "Monitor", + "WAF" ], "severity": "Medium", - "subcategory": "Log Analytics retention for workspaces", "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" }, { - "category": "Cleanup", - "checklist": "Cost Optimization 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", - "services": [ - "Cost", - "Storage", - "AzurePolicy" - ], - "severity": "Medium", - "subcategory": "Policy", - "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" - }, - { - "category": "Cleanup", - "checklist": "Cost Optimization Checklist", - "guid": "59bb91a3-ed90-4cae-8cc8-4c37b6b780cb", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-enterprise-agreement#design-considerations", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Run orphaned resources workbook - delete or snooze ghost items", - "text": "https://github.com/dolevshor/azure-orphan-resources", - "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/tutorial-acm-create-budgets", - "waf": "Cost" - }, - { - "category": "Cleanup", - "checklist": "Cost Optimization Checklist", - "guid": "9fe5c464-89d4-457a-a27c-3874d0102cac", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-enterprise-agreement#design-considerations", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Shutdown/deallocate", - "text": "Shutdown underutilized instances", - "training": "https://learn.microsoft.com/azure/cost-management-billing/understand/analyze-unexpected-charges", - "waf": "Cost" - }, - { - "category": "Cleanup", - "checklist": "Cost Optimization 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", - "services": [ - "Cost", - "Storage", - "Backup", - "VM" - ], - "severity": "Medium", - "subcategory": "stopped/deallocated VMs: check disks", - "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" - }, - { - "category": "Cleanup", - "checklist": "Cost Optimization 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", - "services": [ - "Cost", - "Storage", - "AzurePolicy" - ], - "severity": "Medium", - "subcategory": "storage accounts lifecycle policy", - "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" - }, - { - "category": "Cleanup", - "checklist": "Cost Optimization Checklist", - "guid": "f2bfe456-3b0d-4834-a348-726de69c6b5c", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Tagging", - "text": "Use specific tags for temporary items with 'delete by DATE' format - and automate monthly cleanup", - "waf": "Cost" - }, - { - "category": "DB/App tuning", - "checklist": "Cost Optimization Checklist", - "guid": "2a26494b-69ba-4d37-aad5-3cc78e1d7666", - "link": "https://learn.microsoft.com/azure/cost-management-billing/manage/mca-section-invoice", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "DB optimization", - "text": "Plan for db optimization with the intent of downsizing the related services (and improve performance)", - "waf": "Cost" - }, - { - "category": "DB/APP tuning", - "checklist": "Cost Optimization Checklist", - "guid": "7357c449-674b-45ed-a5a8-59c7733be2a1", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "App modernization", - "text": "Modernizing the app towards a microservices architecture will have the effect of letting the app scale according to the single service and not the entire stack", - "waf": "Cost" - }, - { - "category": "DB/APP tuning", - "checklist": "Cost Optimization Checklist", - "guid": "a27b765a-91be-41f3-a8ef-394c2bd463cb", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-billing-microsoft-customer-agreement#design-recommendations", - "services": [ - "Cost", - "Storage", - "VM" - ], - "severity": "Medium", - "subcategory": "DB optimization", - "text": "optimizing the DB queries will increase performance and allow better right-sizing of storage and VMs", - "waf": "Cost" - }, - { - "category": "DB/APP tuning", - "checklist": "Cost Optimization Checklist", - "guid": "bac75819-59bb-491a-9ed9-0cae2cc84c37", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Demand shaping", - "text": "Using demand shaping on PaaS services will optimize costs and performances", - "waf": "Cost" - }, - { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "b6b780cb-9fe5-4c46-989d-457a927c3874", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/naming-and-tagging", - "services": [ - "Cost", - "Entra" - ], - "severity": "Medium", - "subcategory": "Advisor", - "text": "Start from the Azure Advisor page suggestions.", - "waf": "Cost" - }, - { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "VM", - "services": [ - "Cost", - "VM" - ], - "severity": "Medium", - "subcategory": "Advisor", - "text": "Make sure advisor is configured for VM right sizing ", - "waf": "Cost" - }, - { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "881a1bd5-d1e4-44a1-a659-d3958fd77289", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Automation", - "text": "Consider implementing IaC scripts or devops pipelines to match the cost governance process", - "waf": "Cost" - }, - { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "b835556d-f2bf-4e45-93b0-d834a348726d", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "services": [ - "Cost", - "Monitor" - ], - "severity": "Medium", - "subcategory": "Automation", - "text": "Set up cost alerts for applications that have variable costs (ideally for all of them)", - "waf": "Cost" - }, - { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "e69c6b5c-2a26-4494-a69b-ad37aad53cc7", - "link": "https://learn.microsoft.com/security/benchmark/azure/mcsb-asset-management#am-2-use-only-approved-services", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Automation", - "text": "Use Azure Automation: Automate repetitive tasks can help you save time and resources, reducing costs in the process. ", - "waf": "Cost" - }, - { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "8e1d7666-7357-4c44-a674-b5ed85a859c7", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Automation", - "text": "Run orphaned resources workbook", - "waf": "Cost" - }, - { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "733be2a1-a27b-4765-a91b-e1f388ef394c", - "link": "https://learn.microsoft.com/azure/governance/policy/overview#azure-rbac-permissions-in-azure-policy", - "services": [ - "Cost", - "Storage" - ], - "severity": "Medium", - "subcategory": "Baseline", - "text": "Try and establish a baseline of monthly spending and an acceptable saving target against the baseline (new services will not be optimized at this stage)", - "waf": "Cost" - }, - { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "2bd463cb-bac7-4581-a59b-b91a3ed90cae", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "services": [ - "Cost", - "AzurePolicy" - ], - "severity": "Medium", - "subcategory": "Baseline", - "text": "Establish a cost optimization baseline by using a policy that tags every new resource as #NEW", - "waf": "Cost" - }, - { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "2cc84c37-b6b7-480c-a9fe-5c46489d457a", - "link": "https://learn.microsoft.com/azure/automation/automation-solution-vm-management-config", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Baseline", - "text": "Organize resources to maximize cost insights and accountability", - "waf": "Cost" - }, - { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "927c3874-d010-42ca-a6aa-e01e6a84de5d", - "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": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Budgets", - "text": "Create budgets", - "waf": "Cost" - }, - { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "e36d1d92-881a-41bd-9d1e-44a19659d395", - "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": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Cost Analysis", - "text": "In cost analysis - use daily granularity, grouped by service name to analyze the spending of the past 3 months and identify the top 3 spenders", - "waf": "Cost" - }, - { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "8fd77289-b835-4556-bf2b-fe4563b0d834", - "link": "https://learn.microsoft.com/azure/active-directory/hybrid/how-to-connect-sync-staging-server", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Cost Analysis", - "text": "Check daily for cost spikes and anomalies (ideally with automatic billing exports)", - "waf": "Cost" - }, - { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "a348726d-e69c-46b5-a2a2-6494b69bad37", - "link": "https://learn.microsoft.com/azure/active-directory/roles/security-emergency-access", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Cost Analysis", - "text": "Automate cost retrieval for deep analysis or integration", - "waf": "Cost" - }, - { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "aad53cc7-8e1d-4766-9735-7c449674b5ed", - "link": "https://learn.microsoft.com/azure/active-directory/reports-monitoring/concept-activity-logs-azure-monitor", + "arm-service": "Microsoft.Insights/components", + "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", "services": [ - "Cost", - "ACR" + "Storage", + "AzurePolicy", + "WAF" ], "severity": "Medium", - "subcategory": "Free services", - "text": "Take advantage of Azure free services: Azure offers a number of free services, such as DevOps, Azure Container Registry, and Azure Logic Apps, that can help you save costs on development and operations. ", + "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" }, { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "96c96ad8-844c-4f3b-8b38-c886ba2c0214", - "link": "https://learn.microsoft.com/azure/role-based-access-control/overview", + "arm-service": "Microsoft.Compute/virtualMachines", + "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", "services": [ - "Cost" + "Storage", + "Backup", + "WAF" ], "severity": "Medium", - "subcategory": "Tagging", - "text": "Tag shared resources", + "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" }, { - "category": "Process Administration", - "checklist": "Cost Optimization Checklist", - "guid": "99014a5d-3ce5-474d-acbd-9792a6bcca2b", - "link": "https://learn.microsoft.com/azure/active-directory/conditional-access/overview", + "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", "services": [ - "Cost" + "Storage", + "AzurePolicy", + "WAF" ], "severity": "Medium", - "subcategory": "Tagging", - "text": "Consider using tags to all services for cost allocation", + "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" }, { - "category": "reservations", - "checklist": "Cost Optimization Checklist", - "guid": "4fea1dbf-3dd9-45d4-ac7c-891dcb1f7d57", - "link": "https://learn.microsoft.com/azure/active-directory/authentication/concept-mfa-howitworks", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "WAF checklist", + "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "VM", "services": [ - "Cost" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "automation", - "text": "Consider Reservation automation to track and promptly react to changes", + "text": "Make sure advisor is configured for VM right sizing ", "waf": "Cost" }, { - "category": "Reservations", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Compute/virtualMachines", + "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", "services": [ + "VM", "Cost", "AzurePolicy", - "SQL", - "VM" + "WAF" ], "severity": "Medium", - "subcategory": "check AHUB is applied to all Windows VMs, RHEL and SQL", "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" }, { - "category": "Reservations", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "WAF checklist", "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", "service": "VM", "services": [ - "Cost", - "LoadBalancer" + "LoadBalancer", + "WAF" ], "severity": "Medium", - "subcategory": "Check Red Hat Licences if applicable", "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" }, { - "category": "Reservations", - "checklist": "Cost Optimization Checklist", - "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": [ - "Cost", - "AppSvc" - ], - "severity": "Medium", - "subcategory": "Functions", - "text": "Saving plans will provide 17% on select app service plans", - "waf": "Cost" - }, - { - "category": "Reservations", - "checklist": "Cost Optimization Checklist", + "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", "services": [ - "Cost", - "VM" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "Planning", "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" }, { - "category": "Reservations", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Compute/virtualMachines", + "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", "services": [ - "Cost", "ARS", - "VM" + "VM", + "Cost", + "WAF" ], "severity": "Medium", - "subcategory": "Reservations/savings plans", "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" }, { - "category": "Reservations", - "checklist": "Cost Optimization Checklist", - "guid": "a785c6fe-96c9-46ad-a844-cf3b2b38c886", - "link": "https://azure.microsoft.com/resources/achieving-compliant-data-residency-and-security-with-azure/", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Reservations/savings plans", - "text": "Plan for Azure Savings Plans for all the workloads that are dynamic and need maximum flexibility", - "waf": "Cost" - }, - { - "category": "Reservations", - "checklist": "Cost Optimization Checklist", - "guid": "ba2c0214-9901-44a5-b3ce-574dccbd9792", - "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Reservations/savings plans", - "text": "Plan for Azure Reservations for all the workloads that are less dynamic and won't change much", - "waf": "Cost" - }, - { - "category": "Reservations", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "WAF checklist", "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", "service": "VM", "services": [ - "Cost", - "Storage" + "WAF" ], "severity": "Medium", - "subcategory": "Reserve storage", "text": "Only larger disks can be reserved => 1 TiB -", "waf": "Cost" }, { - "category": "Reservations", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "WAF checklist", "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", "service": "VM", "services": [ - "Cost", - "VM" + "WAF" ], "severity": "Medium", - "subcategory": "Reserve VMs with normalized and rationalized sizes", "text": "After the right-sizing optimization", "waf": "Cost" }, { - "category": "Reservations", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Sql/servers", + "checklist": "WAF checklist", "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", "service": "Azure SQL", "services": [ - "Cost", + "AzurePolicy", "SQL", - "AzurePolicy" + "Cost", + "WAF" ], "severity": "Medium", - "subcategory": "SQL Database AHUB", "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" }, { - "category": "Reservations", - "checklist": "Cost Optimization Checklist", + "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": [ - "Cost", - "SQL", - "VM" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "SQL Database Reservations", "text": "The VM + license part discount (ahub + 3YRI) is around 70% discount", "waf": "Cost" }, { - "category": "Reservations", - "checklist": "Cost Optimization Checklist", - "guid": "e13c1056-75c1-4e94-9b45-9837ff7ae7c6", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/identity-access-landing-zones#managed-identities", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Tracking", - "text": "Make sure you Azure Reservations and Savings plans are close to 100% utilization or make the necessary changes to reach it.", - "waf": "Cost" - }, - { - "category": "Reservations", - "checklist": "Cost Optimization Checklist", - "guid": "d3b475a5-c7ac-4be4-abbe-64dd89f2e877", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/identity-access-landing-zones#rbac-recommendations", - "services": [ - "Cost", - "AzurePolicy" - ], - "severity": "Medium", - "subcategory": "Tracking", - "text": "Make sure that your reservations usage is close to 100%. If not, either enforce an allowed SKU policy or exchange the reservation", - "waf": "Cost" - }, - { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", - "guid": "78468d55-a785-4c6f-b96c-96ad8844cf3b", - "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-create-roles-and-resource-roles-review", - "services": [ - "Cost", - "AzurePolicy" - ], - "severity": "Medium", - "subcategory": "Automation", - "text": "Plan and enforce a On/Off policy for production services, where possible", - "waf": "Cost" - }, - { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", - "guid": "2b38c886-ba2c-4021-9990-14a5d3ce574d", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-diagnostic-settings-to-save-your-wafs-logs", - "services": [ - "Cost", - "AzurePolicy" - ], - "severity": "Medium", - "subcategory": "Automation", - "text": "Plan and enforce a On-Demand policy with auto-shutdown for non-production services, where possible", - "waf": "Cost" - }, - { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Compute/virtualMachines", + "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", "services": [ - "Cost", - "VM" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "Autoscale", "text": "Consider using a VMSS to match demand rather than flat sizing", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "WAF checklist", "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", "service": "AKS", "services": [ - "Cost", - "AKS" + "AKS", + "WAF" ], "severity": "Medium", - "subcategory": "Autoscale", "text": "Use AKS autoscaler to match your clusters usage (make sure the pods requirements match the scaler)", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", - "guid": "93665720-2bff-4456-9b0d-934a359c363e", - "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Autoscale", - "text": "Right-size PaaS service according to average use and accomodate spikes with auto or manual scaling", - "waf": "Cost" - }, - { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", - "guid": "7dd61623-a364-4a90-9eba-e38ead53cc7d", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Autoscale", - "text": "Plan for demand shaping where applicable", - "waf": "Cost" - }, - { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", - "guid": "e2e8aaab-3571-4549-ab91-53d89f89dc7b", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Autoscale", - "text": "Consider implementing a service re-scaling logic within the application", - "training": "https://learn.microsoft.com/azure/cost-management-billing/savings-plan/", - "waf": "Cost" - }, - { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.RecoveryServices/vaults", + "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", "services": [ - "Cost", - "Backup" + "WAF" ], "severity": "Medium", - "subcategory": "Backup", "text": "Move recovery points to vault-archive where applicable (Validate)", "training": "https://azure.microsoft.com/pricing/reservations/", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Databricks/workspaces", + "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", "services": [ - "Cost", "LoadBalancer", - "VM" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "Databricks", "text": "Consider using Spot VMs with fallback where possible. Consider autotermination of clusters.", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "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": [ - "Cost" + "WAF" ], "severity": "Medium", - "subcategory": "Functions", "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" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Web/sites", + "checklist": "WAF checklist", "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", "link": "https://learn.microsoft.com/azure/automation/update-management/overview", "service": "Azure Functions", "services": [ - "Cost" + "WAF" ], "severity": "Medium", - "subcategory": "Functions", "text": "Functions - Cache data locally", "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Web/sites", + "checklist": "WAF checklist", "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", "service": "Azure Functions", "services": [ - "Cost", - "Storage" + "Storage", + "WAF" ], "severity": "Medium", - "subcategory": "Functions", "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" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Web/sites", + "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", "services": [ - "Cost" + "WAF" ], "severity": "Medium", - "subcategory": "Functions", "text": "Functions - Keep your functions warm", "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "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": [ - "Cost" + "WAF" ], "severity": "Medium", - "subcategory": "Functions", "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" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Web/sites", + "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", "services": [ - "Cost" + "WAF" ], "severity": "Medium", - "subcategory": "Functions", "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" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Web/sites", + "checklist": "WAF checklist", "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", "service": "Azure Functions", "services": [ - "Cost" + "WAF" ], "severity": "Medium", - "subcategory": "Functions", "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" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", - "guid": "df03a822-cd46-43cb-abc8-ac299ebc91a4", - "link": "https://learn.microsoft.com/azure/sentinel/quickstart-onboard", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Networking", - "text": "Evaluate your network topology against networking costs and where applicable reduce the egress and peering data", - "waf": "Cost" - }, - { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "microsoft.network/frontdoors", + "checklist": "WAF checklist", "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", "service": "Front Door", "services": [ - "Cost", + "EventHubs", "FrontDoor", - "EventHubs" + "WAF" ], "severity": "Medium", - "subcategory": "Networking", "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" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "microsoft.network/frontdoors", + "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", "services": [ - "Cost", "AppSvc", - "FrontDoor" + "FrontDoor", + "WAF" ], "severity": "Medium", - "subcategory": "Networking", "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" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", - "guid": "f843e52f-4722-4d92-ac1b-1cd521e54a29", - "link": "https://learn.microsoft.com/azure/azure-monitor/agents/diagnostics-extension-overview", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "PaaS", - "text": "Consider using free tiers where applicable for all non-production environments", - "waf": "Cost" - }, - { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", - "guid": "b9de39ac-0e7c-428d-a936-657202bff456", - "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/alerts-overview", - "services": [ - "Cost" - ], - "severity": "Medium", - "subcategory": "Serverless", - "text": "Using serverless patterns for spikes can help keeping costs down", - "waf": "Cost" - }, - { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "WAF checklist", "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", "service": "Storage", "services": [ - "Cost", - "Storage" + "WAF" ], "severity": "Medium", - "subcategory": "Storage", "text": "Consider archiving tiers for less used data", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "WAF checklist", "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", "service": "VM", "services": [ - "Cost", - "Storage" + "WAF" ], "severity": "Medium", - "subcategory": "Storage", "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" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "WAF checklist", "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", "service": "Storage", "services": [ - "Cost", - "Storage" + "WAF" ], "severity": "Medium", - "subcategory": "Storage", "text": "Consider using standard SSD rather than Premium or Ultra where possible", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Storage/storageAccounts", + "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", "services": [ - "Cost", - "Storage" + "Storage", + "WAF" ], "severity": "Medium", - "subcategory": "Storage", "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" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "WAF checklist", "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", "service": "Site Recovery", "services": [ - "Cost", - "Storage", - "ASR" + "ASR", + "WAF" ], "severity": "Medium", - "subcategory": "Storage", "text": "For ASR, consider using Standard SSD disks if the RPO/RTO and replication throughput allow it", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "WAF checklist", "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", "service": "Storage", "services": [ - "Cost", - "Storage" + "Storage", + "WAF" ], "severity": "Medium", - "subcategory": "storage", "text": "Storage accounts: check hot tier and/or GRS necessary", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "WAF checklist", "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", "service": "VM", "services": [ - "Cost", - "Storage" + "WAF" ], "severity": "Medium", - "subcategory": "Storage", "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" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "WAF checklist", "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", "service": "Synapse", "services": [ - "Cost", + "EventHubs", "Monitor", - "EventHubs" + "Cost", + "WAF" ], "severity": "Medium", - "subcategory": "Synapse", "text": "Create budgets to manage costs and create alerts that automatically notify stakeholders of spending anomalies and overspending risks.", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "WAF checklist", "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", "link": "https://learn.microsoft.com/azure/virtual-machines/availability", "service": "Synapse", "services": [ + "Storage", "Cost", - "Storage" + "WAF" ], "severity": "Medium", - "subcategory": "Synapse", "text": "Export cost data to a storage account for additional data analysis.", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "WAF checklist", "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", "service": "Synapse", "services": [ + "SQL", "Cost", - "SQL" + "WAF" ], "severity": "Medium", - "subcategory": "Synapse", "text": "Control costs for a dedicated SQL pool by pausing the resource when it is not in use.", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "WAF checklist", "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", "service": "Synapse", "services": [ - "Cost" + "WAF" ], "severity": "Medium", - "subcategory": "Synapse", "text": "Enable the serverless Apache Spark automatic pause feature and set your timeout value accordingly.", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Synapse/workspaces", + "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", "services": [ - "Cost" + "WAF" ], "severity": "Medium", - "subcategory": "Synapse", "text": "Create multiple Apache Spark pool definitions of various sizes.", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Synapse/workspaces", + "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", "services": [ - "Cost" + "Cost", + "WAF" ], "severity": "Medium", - "subcategory": "Synapse", "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" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "WAF checklist", "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", "service": "VM", "services": [ + "VM", "Cost", - "VM" + "WAF" ], "severity": "Medium", - "subcategory": "VM", "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" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "WAF checklist", "guid": "544451e1-92d3-4442-a3c7-628637a551c5", "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", "service": "VM", "services": [ - "Cost", - "VM" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "VM", "text": "Right-sizing all VMs", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Compute/virtualMachines", + "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", "services": [ - "Cost", - "VM" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "VM", "text": "Swap VM sized with normalized and most recent sizes", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Cost" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "WAF checklist", "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "VM", "services": [ - "Cost", "Monitor", - "VM" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "VM", "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" }, { - "category": "Right-sizing", - "checklist": "Cost Optimization Checklist", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "WAF checklist", "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "VM", "services": [ - "Cost", - "VM" + "VM", + "WAF" ], "severity": "Medium", - "subcategory": "VM", "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" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "1fc2fc14-eea6-4e69-b8d9-a3edc218e687", + "link": "https://polite-sea-0995b240f.2.azurestaticapps.net/technical-delivery-playbook/azure-services/analytics/purview/", + "service": "Purview", + "services": [], + "severity": "Medium", + "subcategory": "Best Practices", + "text": "Leverage FTA Resillency Handbook", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "ab067acb-49e5-4b96-8332-4ecf8cc13318", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", + "services": [ + "ASR" + ], + "severity": "High", + "subcategory": "Disaster Recovery", + "text": "Plan for Data Center level outage", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review 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", + "services": [ + "ASR" + ], + "severity": "Medium", + "subcategory": "Disaster Recovery", + "text": "Practice Failover for BCDR", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "97b15b8a-219a-44ab-bb57-879024d22678", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", + "services": [ + "Backup" + ], + "severity": "High", + "subcategory": "Backup and Restore ", + "text": "Plan a backup strategy and take regular backups", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "6d20b56c-56a9-4581-89bf-8d8e5c586b7d", + "link": "https://learn.microsoft.com/purview/manage-kafka-dotnet", + "service": "Purview", + "services": [ + "EventHubs" + ], + "severity": "Low", + "subcategory": "Purview Accounts Replications", + "text": "Use Microsoft Purview's Event Hubs to subscribe and create entities to another account", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "8cdc15ac-c075-4ee9-a130-a8889579e76b", + "link": "https://learn.microsoft.com/purview/deployment-best-practices", + "service": "Purview", + "services": [], + "severity": "Medium", + "subcategory": "Data catalog", + "text": "Follow Purview accounts architectures and deployment best practices", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "896e710a-7da7-4be9-a56d-14d3c49d997c", + "link": "https://learn.microsoft.com/purview/concept-best-practices-collections", + "service": "Purview", + "services": [], + "severity": "Medium", + "subcategory": "Data catalog", + "text": "Follow Collection Architectures and best practices", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "b3d1325a-a225-4c6f-9e06-85edddea8a4b", + "link": "https://learn.microsoft.com/purview/concept-best-practices-asset-lifecycle", + "service": "Purview", + "services": [], + "severity": "Medium", + "subcategory": "Data catalog", + "text": "Follow Assest lifecycle best practices", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "7cdeb3c6-1fc2-4fc1-9eea-6e69d8d9a3ed", + "link": "https://learn.microsoft.com/purview/concept-best-practices-automation", + "service": "Purview", + "services": [], + "severity": "Medium", + "subcategory": "Data catalog", + "text": "Follow automation best practices", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "c218e687-ab06-47ac-a49e-5b9603324ecf", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", + "services": [ + "Backup" + ], + "severity": "Medium", + "subcategory": "Data catalog", + "text": "Follow Backup and Migration Best practices", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "8cc13318-da61-4170-869f-4fb4aa3d3ef7", + "link": "https://learn.microsoft.com/purview/concept-best-practices-glossary", + "service": "Purview", + "services": [], + "severity": "Medium", + "subcategory": "Data catalog", + "text": "Follow Purview Glossary Best Practices", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "f3176c4b-97b1-45b8-a219-a4abeb578790", + "link": "https://learn.microsoft.com/purview/concept-workflow", + "service": "Purview", + "services": [], + "severity": "Low", + "subcategory": "Data catalog", + "text": "Leverage Workflows ", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "24d22678-6d20-4b56-a56a-958119bf8d8e", + "link": "https://learn.microsoft.com/purview/concept-best-practices-security", + "service": "Purview", + "services": [], + "severity": "Medium", + "subcategory": "Data catalog", + "text": "Follow Purview Security Best Practices", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "5c586b7d-8cdc-415a-ac07-5ee9b130a888", + "link": "https://learn.microsoft.com/purview/concept-best-practices-lineage-azure-data-factory", + "service": "Purview", + "services": [], + "severity": "Medium", + "subcategory": "Data Map", + "text": "Follow Purview Data Lineage Best Practices", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "9579e76b-896e-4710-a7da-7be9956d14d3", + "link": "https://learn.microsoft.com/purview/concept-best-practices-scanning", + "service": "Purview", + "services": [], + "severity": "Medium", + "subcategory": "Data Map", + "text": "Follow Best Practices for Scanning Registered Sources", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "c49d997c-b3d1-4325-aa22-5c6f4e0685ed", + "link": "https://learn.microsoft.com/purview/concept-best-practices-classification", + "service": "Purview", + "services": [], + "severity": "Medium", + "subcategory": "Data Map", + "text": "Follow Classification Best Practices in Governance Portal", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "ddea8a4b-7cde-4b3c-91fc-2fc14eea6e69", + "link": "https://learn.microsoft.com/purview/sensitivity-labels-frequently-asked-questions", + "service": "Purview", + "services": [], + "severity": "Medium", + "subcategory": "Data Map", + "text": "Perform Sensitivity Labelling in the Purview Data Map", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "d8d9a3ed-c218-4e68-9ab0-67acb49e5b96", + "link": "https://learn.microsoft.com/purview/concept-data-share", + "service": "Purview", + "services": [ + "Storage" + ], + "severity": "Low", + "subcategory": "Data Sharing", + "text": "Leverage Azure Storage in-place data sharing with Microsoft Purview", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "03324ecf-8cc1-4331-ada6-1170269f4fb4", + "link": "https://learn.microsoft.com/purview/concept-insights", + "service": "Purview", + "services": [], + "severity": "Low", + "subcategory": "Data Estate", + "text": "Leverage Data Estate Insights", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "aa3d3ef7-f317-46c4-a97b-15b8a219a4ab", + "link": "https://learn.microsoft.com/purview/catalog-adoption-insights", + "service": "Purview", + "services": [], + "severity": "Low", + "subcategory": "Data Estate", + "text": "Use Data stewardship and Catalog adoption", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "eb578790-24d2-4267-a6d2-0b56c56a9581", + "link": "https://learn.microsoft.com/purview/concept-insights", + "service": "Purview", + "services": [], + "severity": "Low", + "subcategory": "Data Estate", + "text": "Use Inventory and Ownership", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "19bf8d8e-5c58-46b7-b8cd-c15acc075ee9", + "link": "https://learn.microsoft.com/purview/glossary-insights", + "service": "Purview", + "services": [], + "severity": "Low", + "subcategory": "Data Estate", + "text": "Leverage Insights for Glossary, Classifications, Sensitivity Labels", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "b130a888-9579-4e76-a896-e710a7da7be9", + "link": "https://learn.microsoft.com/purview/compliance-manager", + "service": "Purview", + "services": [], + "severity": "Medium", + "subcategory": "Data Quality ", + "text": "Generate assessment scores", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "956d14d3-c49d-4997-ab3d-1325aa225c6f", + "link": "https://learn.microsoft.com/purview/compliance-manager-scoring", + "service": "Purview", + "services": [], + "severity": "Medium", + "subcategory": "Data Quality ", + "text": "Profiling- get summaries of data content", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "4e0685ed-ddea-48a4-a7cd-eb3c61fc2fc1", + "link": "https://learn.microsoft.com/purview/concept-policies-data-owner#microsoft-purview-policy-concepts", + "service": "Purview", + "services": [ + "AzurePolicy" + ], + "severity": "Low", + "subcategory": "Data Policy", + "text": "Follow Microsoft Purview Data Owner access policies", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "4eea6e69-d8d9-4a3e-bc21-8e687ab067ac", + "link": "https://learn.microsoft.com/purview/concept-self-service-data-access-policy", + "service": "Purview", + "services": [ + "AzurePolicy" + ], + "severity": "Low", + "subcategory": "Data Policy", + "text": "Follow Self-service access policies", + "waf": "Reliability" + }, + { + "category": "Operations management", + "checklist": "Microsoft Purview Review Checklist", + "guid": "b49e5b96-0332-44ec-b8cc-13318da61170", + "link": "https://learn.microsoft.com/purview/concept-policies-devops", + "service": "Purview", + "services": [ + "AzurePolicy" + ], + "severity": "Low", + "subcategory": "Data Policy", + "text": "Follow DevOps policies", + "waf": "Reliability" + }, + { + "category": "BC and DR", + "checklist": "Device Update Review", + "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": [], + "severity": "High", + "subcategory": "High Availability", + "text": "Leverage Availability Zones if regionally applicable (this is automatically enabled).", + "waf": "Reliability" + }, + { + "category": "BC and DR", + "checklist": "Device Update Review", + "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": [], + "severity": "High", + "subcategory": "High Availability", + "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" + }, + { + "category": "BC and DR", + "checklist": "Device Update Review", + "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": [], + "severity": "High", + "subcategory": "High Availability", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" + }, + { + "category": "BC and DR", + "checklist": "Device Update Review", + "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" + ], + "severity": "High", + "subcategory": "High Availability", + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "waf": "Reliability" + }, + { + "category": "BC and DR", + "checklist": "Device Provisioning Service Review", + "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": [], + "severity": "High", + "subcategory": "High Availability", + "text": "Select the right Logic App hosting plan based on your business & SLO requirements", + "waf": "Reliability" + }, + { + "category": "BC and DR", + "checklist": "Device Provisioning Service Review", + "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": [], + "severity": "High", + "subcategory": "High Availability", + "text": "Protect logic apps from region failures with zone redundancy and availability zones", + "waf": "Reliability" + }, + { + "category": "BC and DR", + "checklist": "Device Provisioning Service Review", + "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": [], + "severity": "High", + "subcategory": "High Availability", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" + }, + { + "category": "BC and DR", + "checklist": "Device Provisioning Service Review", + "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "IoT Hub DPS", + "services": [ + "AppSvc" + ], + "severity": "High", + "subcategory": "High Availability", + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "waf": "Reliability" + }, + { + "category": "Application Deployment", + "checklist": "Device Provisioning Service Review", + "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "IoT Hub DPS", + "services": [], + "severity": "Medium", + "subcategory": "CI/CD", + "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", + "waf": "Operations" } ], "metadata": { "name": "Master checklist", - "timestamp": "August 05, 2024" + "timestamp": "August 08, 2024" }, "severities": [ { diff --git a/checklists/network_appdelivery_checklist.en.json b/checklists/network_appdelivery_checklist.en.json index 05f38ce18..f89e9c89c 100644 --- a/checklists/network_appdelivery_checklist.en.json +++ b/checklists/network_appdelivery_checklist.en.json @@ -823,6 +823,6 @@ "name": "Azure Application Delivery Networking", "state": "GA", "waf": "all", - "timestamp": "March 15, 2024" + "timestamp": "August 08, 2024" } -} +} \ No newline at end of file diff --git a/checklists/network_appdelivery_checklist.es.json b/checklists/network_appdelivery_checklist.es.json index 6720132f4..fe1399650 100644 --- a/checklists/network_appdelivery_checklist.es.json +++ b/checklists/network_appdelivery_checklist.es.json @@ -1,12 +1,12 @@ { "categories": [ { - "name": "Topología y conectividad de red" + "name": "Topología de red y conectividad" } ], "items": [ { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "f00a69de-7076-4734-a734-6e4552cad9e1", "id": "A01.01", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-latest-version-for-customer-managed-certificates", @@ -17,18 +17,18 @@ "waf": "Operaciones" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "b71ca41b-3a80-48f3-a6cd-22cdf197c1cf", "id": "A01.02", "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", "severity": "Medio", "subcategory": "Entrega de aplicaciones", - "text": "Realice la entrega de aplicaciones dentro de las zonas de aterrizaje tanto para aplicaciones internas (corporativas) como externas (en línea).", + "text": "Realice la entrega de aplicaciones dentro de las zonas de aterrizaje para aplicaciones internas (corporativas) y externas (en línea).", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "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", "id": "A01.03", @@ -41,7 +41,7 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "graph": "resources | where type == 'microsoft.network/loadbalancers' | project id, compliant=(tolower(sku.name) == 'standard')", "guid": "4e35fbf5-0ae2-48b2-97ce-753353edbd1a", "id": "A01.04", @@ -49,22 +49,22 @@ "service": "Load Balancer", "severity": "Medio", "subcategory": "Equilibrador de carga", - "text": "Asegúrese de que usa la SKU estándar para Azure Load Balancers", + "text": "Asegúrese de que usa la SKU estándar para los equilibradores de carga de Azure", "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "9432621a-8397-4654-a882-5bc856b7ef83", "id": "A01.05", "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", "service": "Load Balancer", "severity": "Medio", "subcategory": "Equilibrador de carga", - "text": "Asegúrese de que las direcciones IP de front-end de Load Balancers tengan redundancia de zona (a menos que necesite front-end zonal).", + "text": "Asegúrese de que las direcciones IP de front-end de los equilibradores de carga sean con redundancia de zona (a menos que necesite front-end zonal).", "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "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", "id": "A01.06", @@ -77,32 +77,32 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", - "description": "La administración de proxies inversos en general y de WAF en particular está más cerca de la aplicación que de la red, por lo que pertenecen a la misma suscripción que la aplicación. La centralización de Application Gateway y WAF en la suscripción de conectividad puede ser correcta si la administra un solo equipo.", + "category": "Topología de red y conectividad", + "description": "La administración de proxies inversos en general y WAF en particular está más cerca de la aplicación que de la red, por lo que pertenecen a la misma suscripción que la aplicación. La centralización de Application Gateway y WAF en la suscripción de conectividad puede ser correcta si la administra un solo equipo.", "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", "id": "A01.07", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "App Gateway", "severity": "Medio", "subcategory": "Puerta de enlace de aplicaciones", - "text": "Implemente Azure Application Gateway v2 o aplicaciones virtuales de red de asociados que se usan para proxy de conexiones HTTP(S) entrantes dentro de la red virtual de la zona de aterrizaje y con las aplicaciones que están protegiendo.", + "text": "Implemente Azure Application Gateway v2 o NVA de asociados que se usan para proxy de conexiones HTTP(S) entrantes dentro de la red virtual de la zona de aterrizaje y con las aplicaciones que protegen.", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", "id": "A01.08", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "App Gateway", "severity": "Medio", "subcategory": "Puerta de enlace de aplicaciones", - "text": "Use una red DDoS o planes de protección IP para todas las direcciones IP públicas en las zonas de aterrizaje de la aplicación.", + "text": "Utilice una red DDoS o planes de protección IP para todas las direcciones IP públicas en las zonas de aterrizaje de aplicaciones.", "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "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", "id": "A01.09", @@ -115,7 +115,7 @@ "waf": "Fiabilidad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "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", "id": "A01.10", @@ -128,7 +128,7 @@ "waf": "Fiabilidad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", "id": "A01.11", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", @@ -140,7 +140,7 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "3f29812b-2363-4cef-b179-b599de0d5973", "id": "A01.12", "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", @@ -153,7 +153,7 @@ }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", "id": "A01.13", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", @@ -165,7 +165,7 @@ "waf": "Fiabilidad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", "id": "A01.14", "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", @@ -177,20 +177,20 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", "id": "A01.15", "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", "service": "Entra", "severity": "Medio", "subcategory": "Entrega de aplicaciones", - "text": "Para reducir el número de puertos de firewall abiertos para las conexiones entrantes en la red, considere la posibilidad de usar Microsoft Entra ID Application Proxy para proporcionar a los usuarios remotos acceso seguro y autenticado a las aplicaciones internas.", + "text": "Para reducir el número de puertos de firewall abiertos para las conexiones entrantes en la red, considere la posibilidad de usar el proxy de aplicación de identificador de Microsoft Entra para proporcionar a los usuarios remotos acceso seguro y autenticado a las aplicaciones internas.", "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", "waf": "Seguridad" }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "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", "id": "A01.16", @@ -198,12 +198,12 @@ "service": "Front Door", "severity": "Alto", "subcategory": "Puerta", - "text": "Implemente la directiva de WAF para Front Door en modo de \"prevención\".", + "text": "Implemente la directiva de WAF para Front Door en modo de \"Prevención\" para que el firewall de aplicaciones web tome las medidas adecuadas para permitir o denegar el tráfico.", "waf": "Seguridad" }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "062d5839-4d36-402f-bfa4-02811eb936e9", "id": "A01.17", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", @@ -215,18 +215,18 @@ }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "5efeb96a-003f-4b18-8fcd-b4d84459c2b2", "id": "A01.18", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-the-same-domain-name-on-front-door-and-your-origin", "service": "Front Door", "severity": "Alto", "subcategory": "Puerta", - "text": "Use el mismo nombre de dominio en Azure Front Door y su origen. Los nombres de host no coincidentes pueden causar errores sutiles.", + "text": "Use el mismo nombre de dominio en Azure Front Door y en su origen. Los nombres de host no coincidentes pueden causar errores sutiles.", "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "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", "id": "A01.19", @@ -234,11 +234,11 @@ "service": "Front Door", "severity": "Bajo", "subcategory": "Puerta", - "text": "Deshabilite los sondeos de estado cuando solo haya un origen en un grupo de orígenes de Azure Front Door.", + "text": "Deshabilite los sondeos de estado cuando solo haya un origen en un grupo de origen de Azure Front Door.", "waf": "Rendimiento" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", "id": "A01.20", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", @@ -249,7 +249,7 @@ "waf": "Fiabilidad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "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", "id": "A01.21", @@ -262,7 +262,7 @@ }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "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", "id": "A01.22", @@ -270,12 +270,12 @@ "service": "Load Balancer", "severity": "Alto", "subcategory": "Equilibrador de carga", - "text": "Use Azure NAT Gateway en lugar de reglas de salida de Load Balancer para mejorar la escalabilidad de SNAT", + "text": "Use Azure NAT Gateway en lugar de las reglas de salida de Load Balancer para mejorar la escalabilidad de SNAT", "waf": "Fiabilidad" }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "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", "id": "A01.23", @@ -287,7 +287,7 @@ "waf": "Operaciones" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "189ea962-3969-4863-8f5a-5ad808c2cf4b", "id": "A01.24", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#define-your-waf-configuration-as-code", @@ -299,7 +299,7 @@ }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", "id": "A01.25", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", @@ -310,19 +310,19 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", "id": "A01.26", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", "service": "Front Door", "severity": "Medio", "subcategory": "Puerta", - "text": "Use el redireccionamiento de HTTP a HTTPS con Azure Front Door. Apoye a los clientes más antiguos redirigiéndolos automáticamente a una solicitud HTTPS.", + "text": "Use el redireccionamiento de HTTP a HTTPS con Azure Front Door. Apoye a los clientes más antiguos redirigiéndolos a una solicitud HTTPS automáticamente.", "waf": "Seguridad" }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", "id": "A01.27", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", @@ -334,19 +334,19 @@ }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "2902d8cc-1b0c-4495-afad-624ab70f7bd6", "id": "A01.28", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#tune-your-waf", "service": "Front Door", "severity": "Alto", "subcategory": "Puerta", - "text": "Ajuste el WAF de Azure Front Door para su carga de trabajo. Reduzca las detecciones de falsos positivos.", + "text": "Ajuste el WAF de Azure Front Door para su carga de trabajo configurando el WAF en modo de detección para reducir y corregir las detecciones de falsos positivos.", "waf": "Seguridad" }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "17ba124b-127d-42b6-9322-388d5b2bbcfc", "id": "A01.29", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", @@ -358,52 +358,52 @@ }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "49a98f2b-ec22-4a87-9415-6a10b00d6555", "id": "A01.30", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-default-rule-sets", "service": "Front Door", "severity": "Alto", "subcategory": "Puerta", - "text": "Habilite los conjuntos de reglas predeterminados de WAF de Azure Front Door. Los conjuntos de reglas predeterminados detectan y bloquean los ataques comunes.", + "text": "Habilite los conjuntos de reglas predeterminadas de WAF de Azure Front Door. Los conjuntos de reglas predeterminados detectan y bloquean ataques comunes.", "waf": "Seguridad" }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "147a13d4-2a2f-4824-a524-f5855b52b946", "id": "A01.31", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-bot-management-rules", "service": "Front Door", "severity": "Alto", "subcategory": "Puerta", - "text": "Habilite el conjunto de reglas de protección contra bots de Azure Front Door WAF. Las reglas de bots detectan bots buenos y malos.", + "text": "Habilite el conjunto de reglas de protección contra bots de WAF de Azure Front Door. Las reglas de bots detectan bots buenos y malos.", "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "d7dcdcb9-0d99-44b9-baab-ac7570ede79a", "id": "A01.32", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#use-the-latest-ruleset-versions", "service": "Front Door", "severity": "Medio", "subcategory": "Puerta", - "text": "Use la versión más reciente del conjunto de reglas de WAF de Azure Front Door. Las actualizaciones del conjunto de reglas se actualizan periódicamente para tener en cuenta el panorama actual de amenazas.", + "text": "Use la versión más reciente del conjunto de reglas de Azure Front Door WAF. Las actualizaciones del conjunto de reglas se actualizan periódicamente para tener en cuenta el panorama actual de amenazas.", "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "b9620385-1cde-418f-914b-a84a06982ffc", "id": "A01.33", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-rate-limiting", "service": "Front Door", "severity": "Medio", "subcategory": "Puerta", - "text": "Agregue limitación de velocidad al WAF de Azure Front Door. La limitación de velocidad bloquea a los clientes que envían accidental o intencionadamente grandes cantidades de tráfico en un corto período de tiempo.", + "text": "Agregue la limitación de velocidad al WAF de Azure Front Door. La limitación de velocidad bloquea a los clientes que envían accidental o intencionalmente grandes cantidades de tráfico en un corto período de tiempo.", "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "6dc36c52-0124-4ffe-9eaf-23ec1282dedb", "id": "A01.34", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#use-a-high-threshold-for-rate-limits", @@ -414,7 +414,7 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "388a3d0e-0a43-4367-90b2-3dd2aeece5ee", "id": "A01.35", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#geo-filter-traffic", @@ -425,7 +425,7 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "00acd8a9-6975-414f-8491-2be6309893b8", "id": "A01.36", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#specify-the-unknown-zz-location", @@ -437,7 +437,7 @@ }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "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", "id": "A01.37", @@ -445,12 +445,12 @@ "service": "App Gateway", "severity": "Alto", "subcategory": "Puerta de enlace de aplicaciones", - "text": "Habilitación del conjunto de reglas de protección contra bots de WAF de Azure Application Gateway Las reglas de bots detectan bots buenos y malos.", + "text": "Habilite el conjunto de reglas de protección contra bots de WAF de Azure Application Gateway. Las reglas de bots detectan bots buenos y malos.", "waf": "Seguridad" }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "8ea8e0d4-84e8-4b33-aeab-493f6391b4d6", "id": "A01.38", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", @@ -462,19 +462,19 @@ }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", "id": "A01.39", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", "service": "App Gateway", "severity": "Alto", "subcategory": "Puerta de enlace de aplicaciones", - "text": "Ajuste el WAF de Azure Application Gateway para la carga de trabajo. Reduzca las detecciones de falsos positivos.", + "text": "Ajuste el WAF de Azure Application Gateway en modo de detección para la carga de trabajo. Reduzca las detecciones de falsos positivos.", "waf": "Seguridad" }, { "ammp": true, - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "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", "id": "A01.40", @@ -482,33 +482,33 @@ "service": "App Gateway", "severity": "Alto", "subcategory": "Puerta de enlace de aplicaciones", - "text": "Implemente la directiva de WAF para Application Gateway en modo de \"prevención\".", + "text": "Implemente la directiva de WAF para Application Gateway en modo \"Prevención\".", "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", "id": "A01.41", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", "service": "App Gateway", "severity": "Medio", "subcategory": "Puerta de enlace de aplicaciones", - "text": "Agregue limitación de velocidad al WAF de Azure Application Gateway. La limitación de velocidad bloquea a los clientes que envían accidental o intencionadamente grandes cantidades de tráfico en un corto período de tiempo.", + "text": "Agregue la limitación de velocidad al WAF de Azure Application Gateway. La limitación de velocidad bloquea a los clientes que envían accidental o intencionalmente grandes cantidades de tráfico en un corto período de tiempo.", "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "041e0ad8-7b12-4694-a0b7-a0e25ee2470f", "id": "A01.42", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview#rate-limiting-details", "service": "App Gateway", "severity": "Medio", "subcategory": "Puerta de enlace de aplicaciones", - "text": "Use un umbral alto para los límites de frecuencia de WAF de Azure Application Gateway. Los umbrales de límite de velocidad altos evitan el bloqueo del tráfico legítimo, a la vez que proporcionan protección contra un número extremadamente alto de solicitudes que podrían sobrecargar su infraestructura. ", + "text": "Use un umbral alto para los límites de velocidad de WAF de Azure Application Gateway. Los umbrales de límite de velocidad altos evitan el bloqueo del tráfico legítimo, a la vez que proporcionan protección contra un número extremadamente alto de solicitudes que podrían sobrecargar su infraestructura. ", "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "99937189-ff78-492a-b9ca-18d828d82b37", "id": "A01.43", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#geo-filtering-best-practices", @@ -519,7 +519,7 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", "id": "A01.44", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", @@ -530,7 +530,7 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "6c19dfd5-a61c-436c-9001-491b9b3d0228", "id": "A01.45", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#use-the-latest-ruleset-versions", @@ -541,7 +541,7 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "f84106a2-2e9e-42ac-add6-d3416ecfed53", "id": "A01.46", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#add-diagnostic-settings-to-save-your-wafs-logs", @@ -552,7 +552,7 @@ "waf": "Operaciones" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "4cea4050-7946-4a7c-89e6-b021b73c352d", "id": "A01.47", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-diagnostic-settings-to-save-your-wafs-logs", @@ -563,7 +563,7 @@ "waf": "Operaciones" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "92664c60-47e3-4591-8b1b-8d557656e686", "id": "A01.48", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#send-logs-to-microsoft-sentinel", @@ -574,7 +574,7 @@ "waf": "Operaciones" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "845f5f91-9c21-4674-a725-5ce890850e20", "id": "A01.49", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#send-logs-to-microsoft-sentinel", @@ -585,7 +585,7 @@ "waf": "Operaciones" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "ba0e9b26-6e0d-4ec8-8541-023c00afd5b7", "id": "A01.50", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#define-your-waf-configuration-as-code", @@ -596,18 +596,18 @@ "waf": "Operaciones" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", "id": "A01.51", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", "service": "App Gateway", "severity": "Medio", "subcategory": "Puerta de enlace de aplicaciones", - "text": "Utilice directivas de WAF en lugar de la configuración de WAF heredada.", + "text": "Utilice las políticas de WAF en lugar de la configuración de WAF heredada.", "waf": "Operaciones" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", "id": "A01.52", "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", @@ -618,18 +618,18 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", "id": "A01.53", "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", "service": "Front Door", "severity": "Medio", "subcategory": "Puerta", - "text": "Asegúrese de que los orígenes solo toman tráfico de la instancia de Azure Front Door.", + "text": "Asegúrese de que los orígenes solo reciben tráfico de la instancia de Azure Front Door.", "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", "id": "A01.54", "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", @@ -640,7 +640,7 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", "id": "A01.55", "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", @@ -651,7 +651,7 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", "id": "A01.56", "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", @@ -662,7 +662,7 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "bb697864-1b4c-43af-8667-90cc69aaed5f", "id": "A01.57", "link": "https://learn.microsoft.com/azure/application-gateway/how-application-gateway-works#modifications-to-the-request", @@ -673,29 +673,29 @@ "waf": "Operaciones" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", "id": "A01.58", "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", "service": "App Gateway", "severity": "Alto", "subcategory": "Puerta de enlace de aplicaciones", - "text": "Habilite el drenaje de conexiones durante las actualizaciones de servicio planificadas para evitar la pérdida de conexión a los miembros existentes del grupo de back-end", + "text": "Habilite el drenaje de conexiones durante las actualizaciones de servicio planeadas para evitar la pérdida de conexión con los miembros existentes del grupo de back-end", "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", "id": "A01.59", "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", "service": "App Gateway", "severity": "Bajo", "subcategory": "Puerta de enlace de aplicaciones", - "text": "Crear páginas de error personalizadas para mostrar una experiencia de usuario personalizada", + "text": "Cree páginas de error personalizadas para mostrar una experiencia de usuario personalizada", "waf": "Operaciones" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", "id": "A01.60", "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", @@ -706,29 +706,29 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", "id": "A01.61", "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", "service": "App Gateway", "severity": "Medio", "subcategory": "Puerta de enlace de aplicaciones", - "text": "Configure Front Door para optimizar el enrutamiento del tráfico web global y el rendimiento del usuario final de primer nivel, así como la confiabilidad a través de una rápida conmutación por error global", + "text": "Configure Front Door para optimizar el enrutamiento del tráfico web global y el rendimiento y la confiabilidad del usuario final de primer nivel a través de una rápida conmutación por error global", "waf": "Rendimiento" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "29dcc19f-a8fa-4c35-8281-290577538793", "id": "A01.62", "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", "service": "App Gateway", "severity": "Medio", "subcategory": "Puerta de enlace de aplicaciones", - "text": "Usar el equilibrio de carga de la capa de transporte", + "text": "Uso del equilibrio de carga de la capa de transporte", "waf": "Rendimiento" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", "id": "A01.63", "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", @@ -739,18 +739,18 @@ "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", "id": "A01.64", "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", "service": "App Gateway", "severity": "Medio", "subcategory": "Puerta de enlace de aplicaciones", - "text": "Centralice la administración de certificados SSL para reducir la sobrecarga de cifrado y descifrado de una granja de servidores back-end", + "text": "Centralice la administración de certificados SSL para reducir la sobrecarga de cifrado y descifrado de una granja de servidores backend", "waf": "Seguridad" }, { - "category": "Topología y conectividad de red", + "category": "Topología de red y conectividad", "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", "id": "A01.65", "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", @@ -764,7 +764,7 @@ "metadata": { "name": "Azure Application Delivery Networking", "state": "GA", - "timestamp": "March 15, 2024", + "timestamp": "August 08, 2024", "waf": "all" }, "severities": [ @@ -780,7 +780,7 @@ ], "status": [ { - "description": "Esta comprobación aún no se ha examinado", + "description": "Este control aún no se ha examinado", "name": "No verificado" }, { diff --git a/checklists/network_appdelivery_checklist.ja.json b/checklists/network_appdelivery_checklist.ja.json index 825e1ba93..b075632f2 100644 --- a/checklists/network_appdelivery_checklist.ja.json +++ b/checklists/network_appdelivery_checklist.ja.json @@ -1,34 +1,34 @@ { "categories": [ { - "name": "ネットワークトポロジと接続性" + "name": "ネットワーク トポロジと接続性" } ], "items": [ { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "f00a69de-7076-4734-a734-6e4552cad9e1", "id": "A01.01", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-latest-version-for-customer-managed-certificates", "service": "Front Door", "severity": "中程度", "subcategory": "フロントドア", - "text": "Azure Front Door でカスタマー マネージド TLS 証明書を使用する場合は、\"最新\" の証明書バージョンを使用します。証明書の手動更新によって引き起こされる停止のリスクを軽減", + "text": "Azure Front Door でカスタマー マネージド TLS 証明書を使用する場合は、\"最新\" の証明書バージョンを使用します。証明書の手動更新による停止のリスクを軽減", "waf": "オペレーションズ" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "b71ca41b-3a80-48f3-a6cd-22cdf197c1cf", "id": "A01.02", "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", "severity": "中程度", - "subcategory": "アプリ配信", - "text": "内部向けアプリ (corp) と外部向けアプリ (online) の両方のランディング ゾーン内でアプリ配信を実行します。", + "subcategory": "アプリの配信", + "text": "ランディング ゾーン内で、内部向けアプリ (corp) と外部向けアプリ (online) の両方のアプリ配信を実行します。", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "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", "id": "A01.03", @@ -41,7 +41,7 @@ "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "graph": "resources | where type == 'microsoft.network/loadbalancers' | project id, compliant=(tolower(sku.name) == 'standard')", "guid": "4e35fbf5-0ae2-48b2-97ce-753353edbd1a", "id": "A01.04", @@ -49,11 +49,11 @@ "service": "Load Balancer", "severity": "中程度", "subcategory": "ロードバランサー", - "text": "Azure Load Balancer に Standard SKU を使用していることを確認する", + "text": "Azure Load Balancers に Standard SKU を使用していることを確認します", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "9432621a-8397-4654-a882-5bc856b7ef83", "id": "A01.05", "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", @@ -64,7 +64,7 @@ "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "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", "id": "A01.06", @@ -72,37 +72,37 @@ "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "Application Gateway v2 は、IP プレフィックスが /24 以上のサブネットにデプロイする必要があります", + "text": "Application Gateways v2 は、IP プレフィックスが /24 以上のサブネットにデプロイする必要があります", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", - "description": "リバースプロキシ全般、特にWAFの管理は、ネットワークよりもアプリケーションに近いため、アプリと同じサブスクリプションに属します。Application Gateway と WAF を接続サブスクリプションに一元化することは、1 つのチームによって管理されている場合は問題ない場合があります。", + "category": "ネットワーク トポロジと接続性", + "description": "リバースプロキシの管理全般、特にWAFの管理は、ネットワーキングよりもアプリケーションに近いため、アプリと同じサブスクリプションに属します。Application Gateway と WAF を接続サブスクリプションに一元化することは、1 つのチームによって管理されている場合は問題ない可能性があります。", "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", "id": "A01.07", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "ランディング ゾーン仮想ネットワーク内およびそれらがセキュリティで保護しているアプリと共に、受信 HTTP(S) 接続のプロキシに使用される Azure Application Gateway v2 またはパートナーの NVA をデプロイします。", + "text": "ランディング ゾーン仮想ネットワーク内の受信 HTTP(S) 接続のプロキシに使用される Azure Application Gateway v2 またはパートナー NVA と、それらがセキュリティ保護しているアプリをデプロイします。", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", "id": "A01.08", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "アプリケーション ランディング ゾーン内のすべてのパブリック IP アドレスに対して DDoS ネットワークまたは IP 保護プランを使用します。", + "text": "アプリケーション ランディング ゾーン内のすべてのパブリック IP アドレスに対して、DDoS ネットワークまたは IP 保護プランを使用します。", "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "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", "id": "A01.09", @@ -110,12 +110,12 @@ "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "最小数のインスタンスが 2 つになる自動スケーリングを構成します。", + "text": "自動スケールは、最小インスタンス数が 2 になるように構成します。", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "確実" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "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", "id": "A01.10", @@ -128,32 +128,32 @@ "waf": "確実" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", "id": "A01.11", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "Front Door", "severity": "中程度", "subcategory": "フロントドア", - "text": "Azure Front Door と WAF ポリシーを使用して、複数の Azure リージョンにまたがるグローバル HTTP/S アプリを配信し、保護します。", + "text": "Azure Front Door と WAF ポリシーを使用して、複数の Azure リージョンにまたがるグローバル HTTP/S アプリを提供し、保護します。", "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "3f29812b-2363-4cef-b179-b599de0d5973", "id": "A01.12", "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", "service": "Front Door", "severity": "中程度", - "subcategory": "アプリ配信", + "subcategory": "アプリの配信", "text": "Front Door と Application Gateway を使用して HTTP/S アプリを保護する場合は、Front Door で WAF ポリシーを使用します。Application Gateway をロックダウンして、Front Door からのトラフィックのみを受信します。", "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "安全" }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", "id": "A01.13", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", @@ -165,32 +165,32 @@ "waf": "確実" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", "id": "A01.14", "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", "service": "Entra", "severity": "低い", - "subcategory": "アプリ配信", - "text": "ユーザーが内部アプリケーションへのアクセスのみを必要とする場合、Microsoft Entra ID アプリケーション プロキシは Azure Virtual Desktop (AVD) の代替として検討されていますか?", + "subcategory": "アプリの配信", + "text": "ユーザーが内部アプリケーションへのアクセスのみを必要とする場合、Microsoft Entra ID アプリケーション プロキシは Azure Virtual Desktop (AVD) の代替手段として検討されていますか?", "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", "id": "A01.15", "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", "service": "Entra", "severity": "中程度", - "subcategory": "アプリ配信", - "text": "ネットワーク内の着信接続用に開かれているファイアウォール ポートの数を減らすには、Microsoft Entra ID アプリケーション プロキシを使用して、リモート ユーザーに内部アプリケーションへの安全で認証されたアクセスを提供することを検討してください。", + "subcategory": "アプリの配信", + "text": "ネットワーク内の着信接続用に開かれるファイアウォール ポートの数を減らすには、Microsoft Entra ID アプリケーション プロキシを使用して、リモート ユーザーに内部アプリケーションへの安全で認証されたアクセスを提供することを検討してください。", "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", "waf": "安全" }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "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", "id": "A01.16", @@ -198,24 +198,24 @@ "service": "Front Door", "severity": "高い", "subcategory": "フロントドア", - "text": "Front Door の WAF ポリシーを \"防止\" モードでデプロイします。", + "text": "Front Door の WAF ポリシーを \"防止\" モードでデプロイし、Web アプリケーション ファイアウォールがトラフィックを許可または拒否するための適切なアクションを実行するようにします。", "waf": "安全" }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "062d5839-4d36-402f-bfa4-02811eb936e9", "id": "A01.17", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", "service": "Front Door", "severity": "高い", "subcategory": "フロントドア", - "text": "Azure Traffic Manager と Azure Front Door の組み合わせは避けてください。", + "text": "Azure Traffic Manager と Azure Front Door を組み合わせることは避けてください。", "waf": "安全" }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "5efeb96a-003f-4b18-8fcd-b4d84459c2b2", "id": "A01.18", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-the-same-domain-name-on-front-door-and-your-origin", @@ -226,7 +226,7 @@ "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "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", "id": "A01.19", @@ -234,22 +234,22 @@ "service": "Front Door", "severity": "低い", "subcategory": "フロントドア", - "text": "Azure Front Door 配信元グループに配信元が 1 つしかない場合は、正常性プローブを無効にします。", + "text": "Azure Front Door の配信元グループに配信元が 1 つしかない場合は、正常性プローブを無効にします。", "waf": "パフォーマンス" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", "id": "A01.20", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", "service": "Front Door", "severity": "中程度", "subcategory": "フロントドア", - "text": "Azure Front Door に適した正常性プローブ エンドポイントを選択します。アプリケーションのすべての依存関係をチェックする正常性エンドポイントを構築することを検討してください。", + "text": "Azure Front Door の適切な正常性プローブ エンドポイントを選択します。アプリケーションのすべての依存関係をチェックする正常性エンドポイントの構築を検討してください。", "waf": "確実" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "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", "id": "A01.21", @@ -262,7 +262,7 @@ }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "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", "id": "A01.22", @@ -270,12 +270,12 @@ "service": "Load Balancer", "severity": "高い", "subcategory": "ロードバランサー", - "text": "Load Balancer の送信規則の代わりに Azure NAT Gateway を使用して、SNAT のスケーラビリティを向上させる", + "text": "Load Balancer のアウトバウンド規則の代わりに Azure NAT Gateway を使用して SNAT のスケーラビリティを向上させる", "waf": "確実" }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "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", "id": "A01.23", @@ -287,42 +287,42 @@ "waf": "オペレーションズ" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "189ea962-3969-4863-8f5a-5ad808c2cf4b", "id": "A01.24", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#define-your-waf-configuration-as-code", "service": "Front Door", "severity": "中程度", "subcategory": "フロントドア", - "text": "Azure Front Door WAF の構成をコードとして定義します。コードを使用すると、新しいルール セット バージョンをより簡単に採用し、追加の保護を得ることができます。", + "text": "Azure Front Door WAF 構成をコードとして定義します。コードを使用すると、新しいルール セット バージョンをより簡単に採用し、追加の保護を得ることができます。", "waf": "オペレーションズ" }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", "id": "A01.25", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", "service": "Front Door", "severity": "高い", "subcategory": "フロントドア", - "text": "Azure Front Door でエンド ツー エンドの TLS を使用します。クライアントから Front Door への接続、および Front Door から配信元への接続には TLS を使用します。", + "text": "Azure Front Door でエンド ツー エンド TLS を使用します。クライアントから Front Door への接続、および Front Door から配信元への接続には TLS を使用します。", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", "id": "A01.26", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", "service": "Front Door", "severity": "中程度", "subcategory": "フロントドア", - "text": "Azure Front Door で HTTP から HTTPS へのリダイレクトを使用します。古いクライアントをHTTPSリクエストに自動的にリダイレクトすることでサポートします。", + "text": "Azure Front Door で HTTP から HTTPS へのリダイレクトを使用します。古いクライアントを自動的に HTTPS リクエストにリダイレクトすることで、クライアントをサポートします。", "waf": "安全" }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", "id": "A01.27", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", @@ -334,110 +334,110 @@ }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "2902d8cc-1b0c-4495-afad-624ab70f7bd6", "id": "A01.28", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#tune-your-waf", "service": "Front Door", "severity": "高い", "subcategory": "フロントドア", - "text": "ワークロードに合わせて Azure Front Door WAF を調整します。誤検知を減らします。", + "text": "ワークロードに合わせて Azure Front Door WAF を調整するには、検出モードで WAF を構成して誤検知の検出を減らして修正します。", "waf": "安全" }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "17ba124b-127d-42b6-9322-388d5b2bbcfc", "id": "A01.29", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", "service": "Front Door", "severity": "高い", "subcategory": "フロントドア", - "text": "Azure Front Door WAF ポリシーで要求本文検査機能を有効にします。", + "text": "Azure Front Door WAF ポリシーで有効になっている要求本文の検査機能を有効にします。", "waf": "安全" }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "49a98f2b-ec22-4a87-9415-6a10b00d6555", "id": "A01.30", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-default-rule-sets", "service": "Front Door", "severity": "高い", "subcategory": "フロントドア", - "text": "Azure Front Door WAF の既定の規則セットを有効にします。既定のルール セットは、一般的な攻撃を検出してブロックします。", + "text": "Azure Front Door WAF の既定のルール セットを有効にします。デフォルトのルールセットは、一般的な攻撃を検出してブロックします。", "waf": "安全" }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "147a13d4-2a2f-4824-a524-f5855b52b946", "id": "A01.31", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-bot-management-rules", "service": "Front Door", "severity": "高い", "subcategory": "フロントドア", - "text": "Azure Front Door WAF ボット保護ルール セットを有効にします。ボットルールは、良いボットと悪いボットを検出します。", + "text": "Azure Front Door WAF ボット保護ルール セットを有効にします。ボット ルールは、良いボットと悪いボットを検出します。", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "d7dcdcb9-0d99-44b9-baab-ac7570ede79a", "id": "A01.32", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#use-the-latest-ruleset-versions", "service": "Front Door", "severity": "中程度", "subcategory": "フロントドア", - "text": "最新の Azure Front Door WAF ルール セット バージョンを使用します。ルール セットの更新は、現在の脅威の状況を考慮して定期的に更新されます。", + "text": "最新の Azure Front Door WAF ルール セット バージョンを使用します。ルールセットの更新は、現在の脅威の状況を考慮して定期的に更新されます。", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "b9620385-1cde-418f-914b-a84a06982ffc", "id": "A01.33", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-rate-limiting", "service": "Front Door", "severity": "中程度", "subcategory": "フロントドア", - "text": "Azure Front Door WAF にレート制限を追加します。レート制限は、クライアントが短期間に大量のトラフィックを誤ってまたは意図的に送信することをブロックします。", + "text": "Azure Front Door WAF にレート制限を追加します。レート制限は、クライアントが誤ってまたは意図的に短時間に大量のトラフィックを送信するのをブロックします。", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "6dc36c52-0124-4ffe-9eaf-23ec1282dedb", "id": "A01.34", "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", "severity": "中程度", "subcategory": "フロントドア", - "text": "Azure Front Door WAF のレート制限には、高いしきい値を使用します。高いレート制限しきい値は、正当なトラフィックのブロックを回避しながら、インフラストラクチャを圧倒する可能性のある非常に多数の要求に対する保護を提供します。", + "text": "Azure Front Door WAF のレート制限には高いしきい値を使用します。レート制限のしきい値を高くすると、正当なトラフィックのブロックを回避しながら、インフラストラクチャを圧倒する可能性のある非常に多くのリクエストに対する保護を提供します。", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "388a3d0e-0a43-4367-90b2-3dd2aeece5ee", "id": "A01.35", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#geo-filter-traffic", "service": "Front Door", "severity": "低い", "subcategory": "フロントドア", - "text": "すべての地域からのトラフィックが想定されていない場合は、地域フィルタを使用して、想定外の国からのトラフィックをブロックします。", + "text": "すべての地理的地域からのトラフィックを想定していない場合は、geo フィルタを使用して、想定外の国からのトラフィックをブロックします。", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "00acd8a9-6975-414f-8491-2be6309893b8", "id": "A01.36", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#specify-the-unknown-zz-location", "service": "Front Door", "severity": "中程度", "subcategory": "フロントドア", - "text": "Azure Front Door WAF を使用してトラフィックをジオフィルター処理するときに、不明な (ZZ) 場所を指定します。IP アドレスを地理的に一致させることができない場合に、正当な要求を誤ってブロックしないようにします。", + "text": "Azure Front Door WAF を使用してトラフィックを geo フィルタリングする場合は、不明な (ZZ) 場所を指定します。IP アドレスを地理的に一致できない場合に、正当な要求を誤ってブロックしないようにします。", "waf": "安全" }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "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", "id": "A01.37", @@ -445,36 +445,36 @@ "service": "App Gateway", "severity": "高い", "subcategory": "アプリケーション・ゲートウェイ", - "text": "Azure Application Gateway WAF ボット保護ルール セットを有効にする ボット ルールは、良いボットと悪いボットを検出します。", + "text": "Azure Application Gateway WAF ボット保護ルール セットを有効にします。ボット ルールは、良いボットと悪いボットを検出します。", "waf": "安全" }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "8ea8e0d4-84e8-4b33-aeab-493f6391b4d6", "id": "A01.38", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", "service": "App Gateway", "severity": "高い", "subcategory": "アプリケーション・ゲートウェイ", - "text": "Azure Application Gateway WAF ポリシーで有効になっている要求本文検査機能を有効にします。", + "text": "Azure Application Gateway WAF ポリシーで有効になっている要求本文の検査機能を有効にします。", "waf": "安全" }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", "id": "A01.39", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", "service": "App Gateway", "severity": "高い", "subcategory": "アプリケーション・ゲートウェイ", - "text": "ワークロードに合わせて Azure Application Gateway WAF を調整します。誤検知を減らします。", + "text": "ワークロードの検出モードで Azure Application Gateway WAF を調整します。誤検出を減らします。", "waf": "安全" }, { "ammp": true, - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "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", "id": "A01.40", @@ -486,73 +486,73 @@ "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", "id": "A01.41", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "Azure Application Gateway WAF にレート制限を追加します。レート制限は、クライアントが短期間に大量のトラフィックを誤ってまたは意図的に送信することをブロックします。", + "text": "Azure Application Gateway WAF にレート制限を追加します。レート制限は、クライアントが誤ってまたは意図的に短時間に大量のトラフィックを送信するのをブロックします。", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "041e0ad8-7b12-4694-a0b7-a0e25ee2470f", "id": "A01.42", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview#rate-limiting-details", "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "Azure Application Gateway の WAF レート制限には高いしきい値を使用します。高いレート制限しきい値は、正当なトラフィックのブロックを回避しながら、インフラストラクチャを圧倒する可能性のある非常に多数の要求に対する保護を提供します。", + "text": "Azure Application Gateway WAF のレート制限には高いしきい値を使用します。レート制限のしきい値を高くすると、正当なトラフィックのブロックを回避しながら、インフラストラクチャを圧倒する可能性のある非常に多くのリクエストに対する保護を提供します。", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "99937189-ff78-492a-b9ca-18d828d82b37", "id": "A01.43", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#geo-filtering-best-practices", "service": "App Gateway", "severity": "低い", "subcategory": "アプリケーション・ゲートウェイ", - "text": "すべての地域からのトラフィックが想定されていない場合は、地域フィルタを使用して、想定外の国からのトラフィックをブロックします。", + "text": "すべての地理的地域からのトラフィックを想定していない場合は、geo フィルタを使用して、想定外の国からのトラフィックをブロックします。", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", "id": "A01.44", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "Azure Application Gateway WAF でトラフィックを geo フィルタリングするときに、不明 (ZZ) の場所を指定します。IP アドレスを地理的に一致させることができない場合に、正当な要求を誤ってブロックしないようにします。", + "text": "Azure Application Gateway WAF を使用してトラフィックを geo フィルタリングする場合は、不明な (ZZ) 場所を指定します。IP アドレスを地理的に一致できない場合に、正当な要求を誤ってブロックしないようにします。", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "6c19dfd5-a61c-436c-9001-491b9b3d0228", "id": "A01.45", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#use-the-latest-ruleset-versions", "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "最新バージョンの Azure Application Gateway WAF ルール セットを使用します。ルール セットの更新は、現在の脅威の状況を考慮して定期的に更新されます。", + "text": "最新の Azure Application Gateway WAF ルール セット バージョンを使用します。ルールセットの更新は、現在の脅威の状況を考慮して定期的に更新されます。", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "f84106a2-2e9e-42ac-add6-d3416ecfed53", "id": "A01.46", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#add-diagnostic-settings-to-save-your-wafs-logs", "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "診断設定を追加して、Azure Application Gateway の WAF ログを保存します。", + "text": "診断設定を追加して、Azure Application Gateway WAF ログを保存します。", "waf": "オペレーションズ" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "4cea4050-7946-4a7c-89e6-b021b73c352d", "id": "A01.47", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-diagnostic-settings-to-save-your-wafs-logs", @@ -563,7 +563,7 @@ "waf": "オペレーションズ" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "92664c60-47e3-4591-8b1b-8d557656e686", "id": "A01.48", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#send-logs-to-microsoft-sentinel", @@ -574,7 +574,7 @@ "waf": "オペレーションズ" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "845f5f91-9c21-4674-a725-5ce890850e20", "id": "A01.49", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#send-logs-to-microsoft-sentinel", @@ -585,18 +585,18 @@ "waf": "オペレーションズ" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "ba0e9b26-6e0d-4ec8-8541-023c00afd5b7", "id": "A01.50", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#define-your-waf-configuration-as-code", "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "Azure Application Gateway の WAF 構成をコードとして定義します。コードを使用すると、新しいルール セット バージョンをより簡単に採用し、追加の保護を得ることができます。", + "text": "Azure Application Gateway WAF 構成をコードとして定義します。コードを使用すると、新しいルール セット バージョンをより簡単に採用し、追加の保護を得ることができます。", "waf": "オペレーションズ" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", "id": "A01.51", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", @@ -607,40 +607,40 @@ "waf": "オペレーションズ" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", "id": "A01.52", "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "バックエンドの受信トラフィックをフィルター処理して、Application Gateway サブネットからの接続 (NSG など) のみを受け入れるようにします。", + "text": "バックエンドの受信トラフィックをフィルター処理して、Application Gateway サブネット (NSG など) からの接続のみを受け入れるようにします。", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", "id": "A01.53", "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", "service": "Front Door", "severity": "中程度", "subcategory": "フロントドア", - "text": "配信元が Azure Front Door インスタンスからのトラフィックのみを受け取るようにします。", + "text": "配信元が Azure Front Door インスタンスからのトラフィックのみを受け取ることを確認します。", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", "id": "A01.54", "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", "service": "App Gateway", "severity": "高い", "subcategory": "アプリケーション・ゲートウェイ", - "text": "バックエンド・サーバーへのトラフィックを暗号化する必要があります。", + "text": "バックエンド サーバーへのトラフィックを暗号化する必要があります。", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", "id": "A01.55", "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", @@ -651,29 +651,29 @@ "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", "id": "A01.56", "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "HTTPをHTTPSにリダイレクトする", + "text": "HTTP を HTTPS にリダイレクトする", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "bb697864-1b4c-43af-8667-90cc69aaed5f", "id": "A01.57", "link": "https://learn.microsoft.com/azure/application-gateway/how-application-gateway-works#modifications-to-the-request", "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "ゲートウェイ管理の Cookie を使用して、ユーザー セッションから同じサーバーにトラフィックを送信して処理する", + "text": "ゲートウェイで管理される Cookie を使用して、ユーザーセッションからのトラフィックを同じサーバーに転送して処理する", "waf": "オペレーションズ" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", "id": "A01.58", "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", @@ -684,7 +684,7 @@ "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", "id": "A01.59", "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", @@ -695,29 +695,29 @@ "waf": "オペレーションズ" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", "id": "A01.60", "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "HTTPリクエストとレスポンスヘッダーを編集して、クライアントとサーバー間のルーティングと情報交換を容易にします", + "text": "HTTP 要求と応答ヘッダーを編集して、クライアントとサーバー間のルーティングと情報交換を容易にします", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", "id": "A01.61", "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "Front Door を構成して、グローバルな Web トラフィック ルーティングとトップレベルのエンド ユーザーのパフォーマンスを最適化し、迅速なグローバル フェールオーバーを通じて信頼性を確保します", + "text": "Front Door を構成して、グローバル Web トラフィックのルーティングと最上位のエンドユーザーのパフォーマンス、および迅速なグローバル フェイルオーバーによる信頼性を最適化する", "waf": "パフォーマンス" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "29dcc19f-a8fa-4c35-8281-290577538793", "id": "A01.62", "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", @@ -728,7 +728,7 @@ "waf": "パフォーマンス" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", "id": "A01.63", "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", @@ -739,32 +739,32 @@ "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", "id": "A01.64", "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", "service": "App Gateway", "severity": "中程度", "subcategory": "アプリケーション・ゲートウェイ", - "text": "SSL証明書管理を一元化して、バックエンドサーバーファームからの暗号化と復号化のオーバーヘッドを削減", + "text": "SSL証明書管理を一元化して、バックエンドサーバーファームからの暗号化と復号化のオーバーヘッドを削減します", "waf": "安全" }, { - "category": "ネットワークトポロジと接続性", + "category": "ネットワーク トポロジと接続性", "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", "id": "A01.65", "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", "service": "App Gateway", "severity": "低い", "subcategory": "アプリケーション・ゲートウェイ", - "text": "Application Gateway を使用して WebSocket と HTTP/2 プロトコルをネイティブにサポートする", + "text": "Application Gateway を使用して WebSocket プロトコルと HTTP/2 プロトコルをネイティブにサポートする", "waf": "安全" } ], "metadata": { "name": "Azure Application Delivery Networking", "state": "GA", - "timestamp": "March 15, 2024", + "timestamp": "August 08, 2024", "waf": "all" }, "severities": [ @@ -780,7 +780,7 @@ ], "status": [ { - "description": "このチェックはまだ検討されていません", + "description": "このチェックはまだ見ていません", "name": "未確認" }, { @@ -788,12 +788,12 @@ "name": "開ける" }, { - "description": "このチェックは検証済みで、これ以上のアクションアイテムは関連付けられていません", + "description": "このチェックは検証済みであり、これ以上のアクション アイテムは関連付けられていません", "name": "達成" }, { - "description": "推奨事項は理解されているが、現在の要件では不要", - "name": "必要なし" + "description": "推奨事項は理解されているが、現在の要件では必要ではない", + "name": "必須ではありません" }, { "description": "現在のデザインには適用されません", diff --git a/checklists/network_appdelivery_checklist.ko.json b/checklists/network_appdelivery_checklist.ko.json index 78aeb20b1..94c51c874 100644 --- a/checklists/network_appdelivery_checklist.ko.json +++ b/checklists/network_appdelivery_checklist.ko.json @@ -1,12 +1,12 @@ { "categories": [ { - "name": "네트워크 토폴로지 및 연결" + "name": "네트워크 토폴로지 및 연결성" } ], "items": [ { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "f00a69de-7076-4734-a734-6e4552cad9e1", "id": "A01.01", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-latest-version-for-customer-managed-certificates", @@ -17,18 +17,18 @@ "waf": "작업" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "b71ca41b-3a80-48f3-a6cd-22cdf197c1cf", "id": "A01.02", "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", "severity": "보통", "subcategory": "앱 제공", - "text": "랜딩 존 내에서 내부 연결(corp) 및 외부 연결 앱(온라인) 모두에 대해 앱 배달을 수행합니다.", + "text": "내부 연결(corp) 및 외부 연결 앱(온라인) 모두에 대해 landing zone 내에서 앱 배달을 수행합니다.", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "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", "id": "A01.03", @@ -41,7 +41,7 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "graph": "resources | where type == 'microsoft.network/loadbalancers' | project id, compliant=(tolower(sku.name) == 'standard')", "guid": "4e35fbf5-0ae2-48b2-97ce-753353edbd1a", "id": "A01.04", @@ -53,7 +53,7 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "9432621a-8397-4654-a882-5bc856b7ef83", "id": "A01.05", "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", @@ -64,7 +64,7 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "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", "id": "A01.06", @@ -72,12 +72,12 @@ "service": "App Gateway", "severity": "보통", "subcategory": "앱 게이트웨이", - "text": "Application Gateway v2는 IP 접두사가 /24보다 크거나 같은 서브넷에 배포해야 합니다.", + "text": "Application Gateways v2는 IP 접두사가 /24보다 크거나 같은 서브넷에 배포해야 합니다.", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "description": "일반적으로 역방향 프록시 및 특히 WAF의 관리는 네트워킹보다 애플리케이션에 더 가깝기 때문에 앱과 동일한 구독에 속합니다. 연결 구독에서 Application Gateway 및 WAF를 중앙 집중화하는 것은 단일 팀에서 관리하는 경우 괜찮을 수 있습니다.", "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", "id": "A01.07", @@ -85,12 +85,12 @@ "service": "App Gateway", "severity": "보통", "subcategory": "앱 게이트웨이", - "text": "랜딩 영역 가상 네트워크 내에서 그리고 보안 중인 앱을 사용하여 인바운드 HTTP(S) 연결을 프록시하는 데 사용되는 Azure Application Gateway v2 또는 파트너 NVA를 배포합니다.", + "text": "랜딩 존 가상 네트워크 내에서 그리고 보안 중인 앱을 사용하여 인바운드 HTTP(S) 연결을 프록시하는 데 사용되는 Azure Application Gateway v2 또는 파트너 NVA를 배포합니다.", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", "id": "A01.08", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", @@ -102,7 +102,7 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "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", "id": "A01.09", @@ -110,12 +110,12 @@ "service": "App Gateway", "severity": "보통", "subcategory": "앱 게이트웨이", - "text": "최소 인스턴스 수를 2개로 자동 크기 조정을 구성합니다.", + "text": "최소 2개의 인스턴스로 자동 크기 조정을 구성합니다.", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "신뢰도" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "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", "id": "A01.10", @@ -123,12 +123,12 @@ "service": "App Gateway", "severity": "보통", "subcategory": "앱 게이트웨이", - "text": "가용성 영역에 Application Gateway 배포", + "text": "가용성 영역에 Application Gateway 배포Deploy Application Gateway across Availability Zones", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "신뢰도" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", "id": "A01.11", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", @@ -140,7 +140,7 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "3f29812b-2363-4cef-b179-b599de0d5973", "id": "A01.12", "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", @@ -153,7 +153,7 @@ }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", "id": "A01.13", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", @@ -165,19 +165,19 @@ "waf": "신뢰도" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", "id": "A01.14", "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", "service": "Entra", "severity": "낮다", "subcategory": "앱 제공", - "text": "사용자가 내부 애플리케이션에만 액세스해야 하는 경우 Microsoft Entra ID 애플리케이션 프록시가 AVD(Azure Virtual Desktop)의 대안으로 고려되었나요?", + "text": "사용자가 내부 애플리케이션에만 액세스해야 하는 경우 Microsoft Entra ID 애플리케이션 프록시를 AVD(Azure Virtual Desktop)의 대안으로 고려했나요?", "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", "id": "A01.15", "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", @@ -190,7 +190,7 @@ }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "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", "id": "A01.16", @@ -198,12 +198,12 @@ "service": "Front Door", "severity": "높다", "subcategory": "정문", - "text": "'방지' 모드에서 Front Door에 대한 WAF 정책을 배포합니다.", + "text": "Web Application Firewall이 트래픽을 허용하거나 거부하기 위해 적절한 조치를 취하도록 Front Door에 대한 WAF 정책을 '방지' 모드'에 배포합니다.", "waf": "안전" }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "062d5839-4d36-402f-bfa4-02811eb936e9", "id": "A01.17", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", @@ -215,18 +215,18 @@ }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "5efeb96a-003f-4b18-8fcd-b4d84459c2b2", "id": "A01.18", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-the-same-domain-name-on-front-door-and-your-origin", "service": "Front Door", "severity": "높다", "subcategory": "정문", - "text": "Azure Front Door 및 원본에서 동일한 도메인 이름을 사용합니다. 호스트 이름이 일치하지 않으면 미묘한 버그가 발생할 수 있습니다.", + "text": "Azure Front Door 및 원본에서 동일한 도메인 이름을 사용합니다. 일치하지 않는 호스트 이름은 미묘한 버그를 유발할 수 있습니다.", "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "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", "id": "A01.19", @@ -238,18 +238,18 @@ "waf": "공연" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", "id": "A01.20", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", "service": "Front Door", "severity": "보통", "subcategory": "정문", - "text": "Azure Front Door에 대한 양호한 상태 프로브 엔드포인트를 선택합니다. 애플리케이션의 모든 종속성을 확인하는 상태 엔드포인트를 빌드하는 것이 좋습니다.", + "text": "Azure Front Door에 대한 양호한 상태 프로브 엔드포인트를 선택합니다. 애플리케이션의 모든 종속성을 확인하는 상태 엔드포인트를 구축하는 것이 좋습니다.", "waf": "신뢰도" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "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", "id": "A01.21", @@ -262,7 +262,7 @@ }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "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", "id": "A01.22", @@ -275,7 +275,7 @@ }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "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", "id": "A01.23", @@ -287,7 +287,7 @@ "waf": "작업" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "189ea962-3969-4863-8f5a-5ad808c2cf4b", "id": "A01.24", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#define-your-waf-configuration-as-code", @@ -299,7 +299,7 @@ }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", "id": "A01.25", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", @@ -310,43 +310,43 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", "id": "A01.26", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", "service": "Front Door", "severity": "보통", "subcategory": "정문", - "text": "Azure Front Door에서 HTTP에서 HTTPS로 리디렉션을 사용합니다. 이전 클라이언트를 HTTPS 요청으로 자동 리디렉션하여 지원합니다.", + "text": "Azure Front Door에서 HTTP를 HTTPS로 리디렉션을 사용합니다. 이전 클라이언트를 HTTPS 요청으로 자동으로 리디렉션하여 지원합니다.", "waf": "안전" }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", "id": "A01.27", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", "service": "Front Door", "severity": "높다", "subcategory": "정문", - "text": "Azure Front Door WAF를 사용하도록 설정합니다. 다양한 공격으로부터 애플리케이션을 보호합니다.", + "text": "Azure Front Door WAF를 사용하도록 설정합니다. 다양한 공격으로부터 응용 프로그램을 보호합니다.", "waf": "안전" }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "2902d8cc-1b0c-4495-afad-624ab70f7bd6", "id": "A01.28", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#tune-your-waf", "service": "Front Door", "severity": "높다", "subcategory": "정문", - "text": "워크로드에 맞게 Azure Front Door WAF를 튜닝합니다. 가양성 탐지를 줄입니다.", + "text": "검색 모드에서 WAF를 구성하여 가양성 검색을 줄이고 수정하여 워크로드에 맞게 Azure Front Door WAF를 조정합니다.", "waf": "안전" }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "17ba124b-127d-42b6-9322-388d5b2bbcfc", "id": "A01.29", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", @@ -358,7 +358,7 @@ }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "49a98f2b-ec22-4a87-9415-6a10b00d6555", "id": "A01.30", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-default-rule-sets", @@ -370,7 +370,7 @@ }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "147a13d4-2a2f-4824-a524-f5855b52b946", "id": "A01.31", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-bot-management-rules", @@ -381,7 +381,7 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "d7dcdcb9-0d99-44b9-baab-ac7570ede79a", "id": "A01.32", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#use-the-latest-ruleset-versions", @@ -392,7 +392,7 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "b9620385-1cde-418f-914b-a84a06982ffc", "id": "A01.33", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-rate-limiting", @@ -403,41 +403,41 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "6dc36c52-0124-4ffe-9eaf-23ec1282dedb", "id": "A01.34", "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", "severity": "보통", "subcategory": "정문", - "text": "Azure Front Door WAF 속도 제한에 높은 임계값을 사용합니다. 높은 속도 제한 임계값은 합법적인 트래픽 차단을 방지하는 동시에 인프라를 압도할 수 있는 매우 많은 수의 요청에 대한 보호 기능을 제공합니다. ", + "text": "Azure Front Door WAF 속도 제한에 높은 임계값을 사용합니다. 높은 속도 제한 임계값은 합법적인 트래픽 차단을 방지하는 동시에 인프라를 압도할 수 있는 매우 많은 수의 요청에 대한 보호를 제공합니다. ", "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "388a3d0e-0a43-4367-90b2-3dd2aeece5ee", "id": "A01.35", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#geo-filter-traffic", "service": "Front Door", "severity": "낮다", "subcategory": "정문", - "text": "모든 지역에서 트래픽이 발생하지 않을 것으로 예상되는 경우 지역 필터를 사용하여 예상하지 못한 국가의 트래픽을 차단합니다.", + "text": "모든 지역에서 트래픽이 발생할 것으로 예상되지 않는 경우 지역 필터를 사용하여 예상하지 못한 국가의 트래픽을 차단합니다.", "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "00acd8a9-6975-414f-8491-2be6309893b8", "id": "A01.36", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#specify-the-unknown-zz-location", "service": "Front Door", "severity": "보통", "subcategory": "정문", - "text": "Azure Front Door WAF를 사용하여 트래픽을 지리적으로 필터링할 때 알 수 없는(ZZ) 위치를 지정합니다. IP 주소를 지리적으로 일치시킬 수 없는 경우 합법적인 요청을 실수로 차단하지 않도록 합니다.", + "text": "Azure Front Door WAF를 사용하여 트래픽을 지리적으로 필터링할 때 알 수 없는(ZZ) 위치를 지정합니다. IP 주소를 지리적으로 일치시킬 수 없는 경우 합법적인 요청을 실수로 차단하지 마세요.", "waf": "안전" }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "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", "id": "A01.37", @@ -445,12 +445,12 @@ "service": "App Gateway", "severity": "높다", "subcategory": "앱 게이트웨이", - "text": "Azure Application Gateway WAF 봇 보호 규칙 집합 사용Enable the Azure Application Gateway WAF bot protection rule set 봇 규칙은 좋은 봇과 나쁜 봇을 검색합니다.", + "text": "Azure Application Gateway WAF 봇 보호 규칙 집합을 사용하도록 설정합니다. 봇 규칙은 좋은 봇과 나쁜 봇을 감지합니다.", "waf": "안전" }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "8ea8e0d4-84e8-4b33-aeab-493f6391b4d6", "id": "A01.38", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", @@ -462,19 +462,19 @@ }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", "id": "A01.39", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", "service": "App Gateway", "severity": "높다", "subcategory": "앱 게이트웨이", - "text": "워크로드에 대한 Azure Application Gateway WAF를 조정합니다. 가양성 탐지를 줄입니다.", + "text": "워크로드에 대한 검색 모드에서 Azure Application Gateway WAF를 조정합니다. 거짓 긍정 탐지를 줄입니다.", "waf": "안전" }, { "ammp": true, - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "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", "id": "A01.40", @@ -486,7 +486,7 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", "id": "A01.41", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", @@ -497,40 +497,40 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "041e0ad8-7b12-4694-a0b7-a0e25ee2470f", "id": "A01.42", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview#rate-limiting-details", "service": "App Gateway", "severity": "보통", "subcategory": "앱 게이트웨이", - "text": "Azure Application Gateway WAF 속도 제한에 높은 임계값을 사용합니다. 높은 속도 제한 임계값은 합법적인 트래픽 차단을 방지하는 동시에 인프라를 압도할 수 있는 매우 많은 수의 요청에 대한 보호 기능을 제공합니다. ", + "text": "Azure Application Gateway WAF 속도 제한에 높은 임계값을 사용합니다. 높은 속도 제한 임계값은 합법적인 트래픽 차단을 방지하는 동시에 인프라를 압도할 수 있는 매우 많은 수의 요청에 대한 보호를 제공합니다. ", "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "99937189-ff78-492a-b9ca-18d828d82b37", "id": "A01.43", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#geo-filtering-best-practices", "service": "App Gateway", "severity": "낮다", "subcategory": "앱 게이트웨이", - "text": "모든 지역에서 트래픽이 발생하지 않을 것으로 예상되는 경우 지역 필터를 사용하여 예상하지 못한 국가의 트래픽을 차단합니다.", + "text": "모든 지역에서 트래픽이 발생할 것으로 예상되지 않는 경우 지역 필터를 사용하여 예상하지 못한 국가의 트래픽을 차단합니다.", "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", "id": "A01.44", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", "service": "App Gateway", "severity": "보통", "subcategory": "앱 게이트웨이", - "text": "Azure Application Gateway WAF를 사용하여 트래픽을 지리적으로 필터링할 때 알 수 없는(ZZ) 위치를 지정합니다. IP 주소를 지리적으로 일치시킬 수 없는 경우 합법적인 요청을 실수로 차단하지 않도록 합니다.", + "text": "Azure Application Gateway WAF를 사용하여 트래픽을 지리적으로 필터링할 때 알 수 없는(ZZ) 위치를 지정합니다. IP 주소를 지리적으로 일치시킬 수 없는 경우 합법적인 요청을 실수로 차단하지 마세요.", "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "6c19dfd5-a61c-436c-9001-491b9b3d0228", "id": "A01.45", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#use-the-latest-ruleset-versions", @@ -541,7 +541,7 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "f84106a2-2e9e-42ac-add6-d3416ecfed53", "id": "A01.46", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#add-diagnostic-settings-to-save-your-wafs-logs", @@ -552,7 +552,7 @@ "waf": "작업" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "4cea4050-7946-4a7c-89e6-b021b73c352d", "id": "A01.47", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-diagnostic-settings-to-save-your-wafs-logs", @@ -563,7 +563,7 @@ "waf": "작업" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "92664c60-47e3-4591-8b1b-8d557656e686", "id": "A01.48", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#send-logs-to-microsoft-sentinel", @@ -574,7 +574,7 @@ "waf": "작업" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "845f5f91-9c21-4674-a725-5ce890850e20", "id": "A01.49", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#send-logs-to-microsoft-sentinel", @@ -585,7 +585,7 @@ "waf": "작업" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "ba0e9b26-6e0d-4ec8-8541-023c00afd5b7", "id": "A01.50", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#define-your-waf-configuration-as-code", @@ -596,7 +596,7 @@ "waf": "작업" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", "id": "A01.51", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", @@ -607,18 +607,18 @@ "waf": "작업" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", "id": "A01.52", "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", "service": "App Gateway", "severity": "보통", "subcategory": "앱 게이트웨이", - "text": "Application Gateway 서브넷의 연결(예: NSG 사용)만 허용하도록 백 엔드에서 인바운드 트래픽을 필터링합니다.", + "text": "예를 들어 NSG를 사용하여 Application Gateway 서브넷의 연결만 허용하도록 백 엔드에서 인바운드 트래픽을 필터링합니다.", "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", "id": "A01.53", "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", @@ -629,18 +629,18 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", "id": "A01.54", "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", "service": "App Gateway", "severity": "높다", "subcategory": "앱 게이트웨이", - "text": "백 엔드 서버에 대한 트래픽을 암호화해야 합니다.", + "text": "백엔드 서버에 대한 트래픽을 암호화해야 합니다.", "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", "id": "A01.55", "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", @@ -651,7 +651,7 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", "id": "A01.56", "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", @@ -662,7 +662,7 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "bb697864-1b4c-43af-8667-90cc69aaed5f", "id": "A01.57", "link": "https://learn.microsoft.com/azure/application-gateway/how-application-gateway-works#modifications-to-the-request", @@ -673,7 +673,7 @@ "waf": "작업" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", "id": "A01.58", "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", @@ -684,62 +684,62 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", "id": "A01.59", "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", "service": "App Gateway", "severity": "낮다", "subcategory": "앱 게이트웨이", - "text": "사용자 지정 오류 페이지를 만들어 개인화된 사용자 환경 표시", + "text": "사용자 지정 오류 페이지를 만들어 개인화된 사용자 환경을 표시합니다.", "waf": "작업" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", "id": "A01.60", "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", "service": "App Gateway", "severity": "보통", "subcategory": "앱 게이트웨이", - "text": "HTTP 요청 및 응답 헤더를 편집하여 클라이언트와 서버 간의 라우팅 및 정보 교환을 보다 쉽게 할 수 있습니다.", + "text": "클라이언트와 서버 간의 더 쉬운 라우팅 및 정보 교환을 위해 HTTP 요청 및 응답 헤더를 편집합니다.", "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", "id": "A01.61", "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", "service": "App Gateway", "severity": "보통", "subcategory": "앱 게이트웨이", - "text": "빠른 글로벌 장애 조치(failover)를 통해 글로벌 웹 트래픽 라우팅 및 최상위 계층 최종 사용자 성능 및 안정성을 최적화하도록 Front Door 구성", + "text": "Front Door를 구성하여 글로벌 웹 트래픽 라우팅, 최상위 최종 사용자 성능 및 빠른 글로벌 장애 조치(failover)를 통해 안정성을 최적화합니다.", "waf": "공연" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "29dcc19f-a8fa-4c35-8281-290577538793", "id": "A01.62", "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", "service": "App Gateway", "severity": "보통", "subcategory": "앱 게이트웨이", - "text": "전송 계층 부하 분산 사용Use transport layer load balancing", + "text": "전송 계층 부하 분산 사용", "waf": "공연" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", "id": "A01.63", "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", "service": "App Gateway", "severity": "보통", "subcategory": "앱 게이트웨이", - "text": "단일 게이트웨이에서 여러 웹 응용 프로그램에 대한 호스트 또는 도메인 이름을 기반으로 라우팅 구성Configure routing based on host or domain name for multiple web applications on a single gateway", + "text": "단일 게이트웨이에서 여러 웹 응용 프로그램에 대한 호스트 또는 도메인 이름을 기반으로 라우팅을 구성합니다.", "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", "id": "A01.64", "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", @@ -750,7 +750,7 @@ "waf": "안전" }, { - "category": "네트워크 토폴로지 및 연결", + "category": "네트워크 토폴로지 및 연결성", "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", "id": "A01.65", "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", @@ -764,7 +764,7 @@ "metadata": { "name": "Azure Application Delivery Networking", "state": "GA", - "timestamp": "March 15, 2024", + "timestamp": "August 08, 2024", "waf": "all" }, "severities": [ @@ -792,7 +792,7 @@ "name": "성취" }, { - "description": "권장 사항은 이해되었지만 현재 요구 사항에 필요하지 않음", + "description": "권장 사항을 이해하지만 현재 요구 사항에 필요하지 않음", "name": "필요 없음" }, { diff --git a/checklists/network_appdelivery_checklist.pt.json b/checklists/network_appdelivery_checklist.pt.json index 78c0f3099..c305ace3b 100644 --- a/checklists/network_appdelivery_checklist.pt.json +++ b/checklists/network_appdelivery_checklist.pt.json @@ -1,159 +1,159 @@ { "categories": [ { - "name": "Topologia de rede e conectividade" + "name": "Topologia e conectividade de rede" } ], "items": [ { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "f00a69de-7076-4734-a734-6e4552cad9e1", "id": "A01.01", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-latest-version-for-customer-managed-certificates", "service": "Front Door", "severity": "Média", - "subcategory": "Porta da Frente", - "text": "Se você usar certificados TLS gerenciados pelo cliente com o Azure Front Door, use a versão de certificado 'Mais recente'. Reduzir o risco de paralisações causadas pela renovação manual de certificados", + "subcategory": "Porta da frente", + "text": "Se você usar certificados TLS gerenciados pelo cliente com o Azure Front Door, use a versão do certificado 'Mais recente'. Reduza o risco de interrupções causadas pela renovação manual de certificados", "waf": "Operações" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "b71ca41b-3a80-48f3-a6cd-22cdf197c1cf", "id": "A01.02", "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", "severity": "Média", "subcategory": "Entrega de aplicativos", - "text": "Execute a entrega de aplicativos dentro das zonas de aterrissagem para aplicativos internos (corp) e externos (online).", + "text": "Execute a entrega de aplicativos em zonas de destino para aplicativos internos (corporativos) e externos (online).", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "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", "id": "A01.03", "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Verifique se você está usando o SKU do Application Gateway v2", + "subcategory": "Gateway de Aplicativo", + "text": "Verifique se você está usando o SKU do Gateway de Aplicativo v2", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "graph": "resources | where type == 'microsoft.network/loadbalancers' | project id, compliant=(tolower(sku.name) == 'standard')", "guid": "4e35fbf5-0ae2-48b2-97ce-753353edbd1a", "id": "A01.04", "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", "service": "Load Balancer", "severity": "Média", - "subcategory": "Balanceador de Carga", - "text": "Verifique se você está usando a SKU padrão para seus Balanceadores de Carga do Azure", + "subcategory": "Balanceador de carga", + "text": "Verifique se você está usando o SKU Standard para seus Azure Load Balancers", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "9432621a-8397-4654-a882-5bc856b7ef83", "id": "A01.05", "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", "service": "Load Balancer", "severity": "Média", - "subcategory": "Balanceador de Carga", - "text": "Verifique se os endereços IP de front-end dos Load Balancers são redundantes por zona (a menos que você precise de frontends zonais).", + "subcategory": "Balanceador de carga", + "text": "Verifique se os endereços IP de front-end dos Load Balancers têm redundância de zona (a menos que você precise de front-ends zonais).", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "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", "id": "A01.06", "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Seus Application Gateways v2 devem ser implantados em sub-redes com prefixos IP iguais ou maiores que /24", + "subcategory": "Gateway de Aplicativo", + "text": "Seus Gateways de Aplicativo v2 devem ser implantados em sub-redes com prefixos IP iguais ou maiores que /24", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", - "description": "A administração de proxies reversos em geral e do WAF em particular está mais próxima do aplicativo do que da rede, portanto, eles pertencem à mesma assinatura que o aplicativo. Centralizar o Application Gateway e o WAF na assinatura de conectividade pode ser OK se for gerenciado por uma única equipe.", + "category": "Topologia e conectividade de rede", + "description": "A administração de proxies reversos em geral e WAF em particular está mais próxima do aplicativo do que da rede, portanto, eles pertencem à mesma assinatura que o aplicativo. Centralizar o Gateway de Aplicativo e o WAF na assinatura de conectividade pode ser OK se ele for gerenciado por uma única equipe.", "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", "id": "A01.07", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Implante o Gateway de Aplicativo do Azure v2 ou NVAs de parceiros usados para fazer proxy de conexões HTTP(S) de entrada na rede virtual da zona de aterrissagem e com os aplicativos que eles estão protegendo.", + "subcategory": "Gateway de Aplicativo", + "text": "Implante o Gateway de Aplicativo do Azure v2 ou NVAs de parceiros usados para proxy de conexões HTTP(S) de entrada na rede virtual da zona de destino e com os aplicativos que eles estão protegendo.", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", "id": "A01.08", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Use uma rede DDoS ou planos de proteção IP para todos os endereços IP públicos nas zonas de aterrissagem do aplicativo.", + "subcategory": "Gateway de Aplicativo", + "text": "Use uma rede DDoS ou planos de proteção de IP para todos os endereços IP públicos em zonas de destino do aplicativo.", "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "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", "id": "A01.09", "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-autoscaling-zone-redundant", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Configure o dimensionamento automático com uma quantidade mínima de duas instâncias.", + "subcategory": "Gateway de Aplicativo", + "text": "Configure o dimensionamento automático com uma quantidade mínima de instâncias de duas.", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Fiabilidade" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "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", "id": "A01.10", "link": "https://learn.microsoft.com/azure/reliability/migrate-app-gateway-v2", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Implantar o Application Gateway em zonas de disponibilidade", + "subcategory": "Gateway de Aplicativo", + "text": "Implantar o Gateway de Aplicativo em Zonas de Disponibilidade", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Fiabilidade" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", "id": "A01.11", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "Front Door", "severity": "Média", - "subcategory": "Porta da Frente", - "text": "Use o Azure Front Door com políticas WAF para fornecer e ajudar a proteger aplicativos HTTP/S globais que abrangem várias regiões do Azure.", + "subcategory": "Porta da frente", + "text": "Use o Azure Front Door com políticas do WAF para fornecer e ajudar a proteger aplicativos HTTP/S globais que abrangem várias regiões do Azure.", "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "3f29812b-2363-4cef-b179-b599de0d5973", "id": "A01.12", "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", "service": "Front Door", "severity": "Média", "subcategory": "Entrega de aplicativos", - "text": "Ao usar o Front Door e o Application Gateway para ajudar a proteger aplicativos HTTP/S, use políticas WAF no Front Door. Bloqueie o Application Gateway para receber tráfego somente do Front Door.", + "text": "Ao usar o Front Door e o Gateway de Aplicativo para ajudar a proteger aplicativos HTTP/S, use políticas WAF no Front Door. Bloqueie o Gateway de Aplicativo para receber tráfego somente do Front Door.", "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "Segurança" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", "id": "A01.13", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", @@ -165,606 +165,606 @@ "waf": "Fiabilidade" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", "id": "A01.14", "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", "service": "Entra", "severity": "Baixo", "subcategory": "Entrega de aplicativos", - "text": "Se os usuários precisarem apenas de acesso a aplicativos internos, o Proxy de Aplicativo de ID do Microsoft Entra foi considerado uma alternativa à Área de Trabalho Virtual (AVD) do Azure?", + "text": "Se os usuários precisarem apenas de acesso a aplicativos internos, o Proxy de Aplicativo de ID do Microsoft Entra foi considerado como uma alternativa à AVD (Área de Trabalho Virtual) do Azure?", "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", "id": "A01.15", "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", "service": "Entra", "severity": "Média", "subcategory": "Entrega de aplicativos", - "text": "Para reduzir o número de portas de firewall abertas para conexões de entrada em sua rede, considere o uso do Microsoft Entra ID Application Proxy para dar aos usuários remotos acesso seguro e autenticado a aplicativos internos.", + "text": "Para reduzir o número de portas de firewall abertas para conexões de entrada em sua rede, considere usar o Proxy de Aplicativo de ID do Microsoft Entra para fornecer aos usuários remotos acesso seguro e autenticado a aplicativos internos.", "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", "waf": "Segurança" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "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", "id": "A01.16", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", "service": "Front Door", "severity": "Alto", - "subcategory": "Porta da Frente", - "text": "Implante sua política de WAF para Front Door no modo 'Prevenção'.", + "subcategory": "Porta da frente", + "text": "Implante sua política de WAF para o Front Door no modo 'Prevenção' para que o Firewall de Aplicativo Web tome as medidas apropriadas para permitir ou negar o tráfego.", "waf": "Segurança" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "062d5839-4d36-402f-bfa4-02811eb936e9", "id": "A01.17", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", "service": "Front Door", "severity": "Alto", - "subcategory": "Porta da Frente", + "subcategory": "Porta da frente", "text": "Evite combinar o Gerenciador de Tráfego do Azure e o Azure Front Door.", "waf": "Segurança" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "5efeb96a-003f-4b18-8fcd-b4d84459c2b2", "id": "A01.18", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-the-same-domain-name-on-front-door-and-your-origin", "service": "Front Door", "severity": "Alto", - "subcategory": "Porta da Frente", + "subcategory": "Porta da frente", "text": "Use o mesmo nome de domínio no Azure Front Door e sua origem. Nomes de host incompatíveis podem causar bugs sutis.", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "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", "id": "A01.19", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#disable-health-probes-when-theres-only-one-origin-in-an-origin-group", "service": "Front Door", "severity": "Baixo", - "subcategory": "Porta da Frente", - "text": "Desabilite os testes de integridade quando houver apenas uma origem em um grupo de origem do Azure Front Door.", + "subcategory": "Porta da frente", + "text": "Desabilite as investigações de integridade quando houver apenas uma origem em um grupo de origens do Azure Front Door.", "waf": "Desempenho" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", "id": "A01.20", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", "service": "Front Door", "severity": "Média", - "subcategory": "Porta da Frente", - "text": "Selecione bons pontos de extremidade de teste de integridade para o Azure Front Door. Considere a criação de pontos de extremidade de integridade que verifiquem todas as dependências do seu aplicativo.", + "subcategory": "Porta da frente", + "text": "Selecione pontos de extremidade de investigação de integridade boa para o Azure Front Door. Considere a criação de pontos de extremidade de integridade que verifiquem todas as dependências do aplicativo.", "waf": "Fiabilidade" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "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", "id": "A01.21", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", "service": "Front Door", "severity": "Baixo", - "subcategory": "Porta da Frente", - "text": "Use testes de integridade do HEAD com o Azure Front Door para reduzir o tráfego que o Front Door envia para seu aplicativo.", + "subcategory": "Porta da frente", + "text": "Use investigações de integridade HEAD com o Azure Front Door para reduzir o tráfego que o Front Door envia para seu aplicativo.", "waf": "Desempenho" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "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", "id": "A01.22", "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", "service": "Load Balancer", "severity": "Alto", - "subcategory": "Balanceador de Carga", - "text": "Usar o Gateway NAT do Azure em vez das regras de saída do Load Balancer para melhor escalabilidade do SNAT", + "subcategory": "Balanceador de carga", + "text": "Usar o Gateway NAT do Azure em vez das regras de saída do Load Balancer para melhorar a escalabilidade SNAT", "waf": "Fiabilidade" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "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", "id": "A01.23", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", "service": "Front Door", "severity": "Alto", - "subcategory": "Porta da Frente", - "text": "Use certificados TLS gerenciados com o Azure Front Door. Reduza o custo operacional e o risco de paralisações devido a renovações de certificados.", + "subcategory": "Porta da frente", + "text": "Use certificados TLS gerenciados com o Azure Front Door. Reduza o custo operacional e o risco de interrupções devido a renovações de certificados.", "waf": "Operações" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "189ea962-3969-4863-8f5a-5ad808c2cf4b", "id": "A01.24", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#define-your-waf-configuration-as-code", "service": "Front Door", "severity": "Média", - "subcategory": "Porta da Frente", - "text": "Defina sua configuração do WAF do Azure Front Door como código. Usando o código, você pode adotar mais facilmente a nova versão do conjunto de regras e obter proteção adicional.", + "subcategory": "Porta da frente", + "text": "Defina a configuração do WAF do Azure Front Door como código. Usando o código, você pode adotar mais facilmente a nova versão do conjunto de regras e obter proteção adicional.", "waf": "Operações" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", "id": "A01.25", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", "service": "Front Door", "severity": "Alto", - "subcategory": "Porta da Frente", + "subcategory": "Porta da frente", "text": "Use o TLS de ponta a ponta com o Azure Front Door. Use o TLS para conexões de seus clientes com o Front Door e do Front Door com sua origem.", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", "id": "A01.26", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", "service": "Front Door", "severity": "Média", - "subcategory": "Porta da Frente", - "text": "Use o redirecionamento HTTP para HTTPS com o Azure Front Door. Ofereça suporte a clientes mais antigos redirecionando-os para uma solicitação HTTPS automaticamente.", + "subcategory": "Porta da frente", + "text": "Use o redirecionamento de HTTP para HTTPS com o Azure Front Door. Ofereça suporte a clientes mais antigos redirecionando-os para uma solicitação HTTPS automaticamente.", "waf": "Segurança" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", "id": "A01.27", "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", "service": "Front Door", "severity": "Alto", - "subcategory": "Porta da Frente", - "text": "Habilite o WAF do Azure Front Door. Proteja seu aplicativo contra uma série de ataques.", + "subcategory": "Porta da frente", + "text": "Habilite o WAF do Azure Front Door. Proteja seu aplicativo contra uma variedade de ataques.", "waf": "Segurança" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "2902d8cc-1b0c-4495-afad-624ab70f7bd6", "id": "A01.28", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#tune-your-waf", "service": "Front Door", "severity": "Alto", - "subcategory": "Porta da Frente", - "text": "Ajuste o WAF do Azure Front Door para sua carga de trabalho. Reduza as detecções de falsos positivos.", + "subcategory": "Porta da frente", + "text": "Ajuste o WAF do Azure Front Door para sua carga de trabalho configurando o WAF no modo de detecção para reduzir e corrigir detecções de falsos positivos.", "waf": "Segurança" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "17ba124b-127d-42b6-9322-388d5b2bbcfc", "id": "A01.29", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", "service": "Front Door", "severity": "Alto", - "subcategory": "Porta da Frente", - "text": "Habilite o recurso de inspeção do corpo de solicitação habilitado na política WAF do Azure Front Door.", + "subcategory": "Porta da frente", + "text": "Habilite o recurso de inspeção do corpo da solicitação habilitado na política do WAF do Azure Front Door.", "waf": "Segurança" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "49a98f2b-ec22-4a87-9415-6a10b00d6555", "id": "A01.30", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-default-rule-sets", "service": "Front Door", "severity": "Alto", - "subcategory": "Porta da Frente", + "subcategory": "Porta da frente", "text": "Habilite os conjuntos de regras padrão do WAF do Azure Front Door. Os conjuntos de regras padrão detectam e bloqueiam ataques comuns.", "waf": "Segurança" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "147a13d4-2a2f-4824-a524-f5855b52b946", "id": "A01.31", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-bot-management-rules", "service": "Front Door", "severity": "Alto", - "subcategory": "Porta da Frente", - "text": "Habilite o conjunto de regras de proteção de bot do WAF do Azure Front Door. As regras de bot detectam bots bons e ruins.", + "subcategory": "Porta da frente", + "text": "Habilite o conjunto de regras de proteção contra bot do WAF do Azure Front Door. As regras de bot detectam bots bons e ruins.", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "d7dcdcb9-0d99-44b9-baab-ac7570ede79a", "id": "A01.32", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#use-the-latest-ruleset-versions", "service": "Front Door", "severity": "Média", - "subcategory": "Porta da Frente", - "text": "Use a versão mais recente do conjunto de regras do WAF do Azure Front Door. As atualizações do conjunto de regras são atualizadas regularmente para levar em conta o cenário atual de ameaças.", + "subcategory": "Porta da frente", + "text": "Use a versão mais recente do conjunto de regras do WAF do Azure Front Door. As atualizações do conjunto de regras são atualizadas regularmente para levar em conta o cenário de ameaças atual.", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "b9620385-1cde-418f-914b-a84a06982ffc", "id": "A01.33", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-rate-limiting", "service": "Front Door", "severity": "Média", - "subcategory": "Porta da Frente", - "text": "Adicione o limite de taxa ao WAF do Azure Front Door. A limitação de taxa bloqueia clientes que enviam acidentalmente ou intencionalmente grandes quantidades de tráfego em um curto período de tempo.", + "subcategory": "Porta da frente", + "text": "Adicione a limitação de taxa ao WAF do Azure Front Door. A limitação de taxa bloqueia os clientes que enviam acidentalmente ou intencionalmente grandes quantidades de tráfego em um curto período de tempo.", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "6dc36c52-0124-4ffe-9eaf-23ec1282dedb", "id": "A01.34", "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", "severity": "Média", - "subcategory": "Porta da Frente", - "text": "Use um limite alto para os limites de taxa do WAF do Azure Front Door. Limites de limite de taxa alta evitam o bloqueio de tráfego legítimo, ao mesmo tempo em que fornecem proteção contra um número extremamente alto de solicitações que podem sobrecarregar sua infraestrutura. ", + "subcategory": "Porta da frente", + "text": "Use um limite alto para os limites de taxa do WAF do Azure Front Door. Os limites de limite de taxa altos evitam o bloqueio do tráfego legítimo, ao mesmo tempo em que fornecem proteção contra números extremamente altos de solicitações que podem sobrecarregar sua infraestrutura. ", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "388a3d0e-0a43-4367-90b2-3dd2aeece5ee", "id": "A01.35", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#geo-filter-traffic", "service": "Front Door", "severity": "Baixo", - "subcategory": "Porta da Frente", - "text": "Se você não está esperando tráfego de todas as regiões geográficas, use filtros geográficos para bloquear o tráfego de países não esperados.", + "subcategory": "Porta da frente", + "text": "Se você não estiver esperando tráfego de todas as regiões geográficas, use filtros geográficos para bloquear o tráfego de países não esperados.", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "00acd8a9-6975-414f-8491-2be6309893b8", "id": "A01.36", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#specify-the-unknown-zz-location", "service": "Front Door", "severity": "Média", - "subcategory": "Porta da Frente", + "subcategory": "Porta da frente", "text": "Especifique o local desconhecido (ZZ) ao filtrar geograficamente o tráfego com o WAF do Azure Front Door. Evite bloquear acidentalmente solicitações legítimas quando os endereços IP não puderem ser correspondidos geograficamente.", "waf": "Segurança" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "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", "id": "A01.37", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/bot-protection", "service": "App Gateway", "severity": "Alto", - "subcategory": "Gateway de aplicativo", - "text": "Habilitar o conjunto de regras de proteção de bot WAF do Gateway de Aplicativo do Azure As regras de bot detectam bots bons e ruins.", + "subcategory": "Gateway de Aplicativo", + "text": "Habilite o conjunto de regras de proteção contra bot do WAF do Gateway de Aplicativo do Azure. As regras de bot detectam bots bons e ruins.", "waf": "Segurança" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "8ea8e0d4-84e8-4b33-aeab-493f6391b4d6", "id": "A01.38", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", "service": "App Gateway", "severity": "Alto", - "subcategory": "Gateway de aplicativo", - "text": "Habilite o recurso de inspeção do corpo de solicitação habilitado na política WAF do Gateway de Aplicativo do Azure.", + "subcategory": "Gateway de Aplicativo", + "text": "Habilite o recurso de inspeção do corpo da solicitação habilitado na política do WAF do Gateway de Aplicativo do Azure.", "waf": "Segurança" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", "id": "A01.39", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", "service": "App Gateway", "severity": "Alto", - "subcategory": "Gateway de aplicativo", - "text": "Ajuste o WAF do Gateway de Aplicativo do Azure para sua carga de trabalho. Reduza as detecções de falsos positivos.", + "subcategory": "Gateway de Aplicativo", + "text": "Ajuste o WAF do Gateway de Aplicativo do Azure no modo de detecção para sua carga de trabalho. Reduza as detecções de falsos positivos.", "waf": "Segurança" }, { "ammp": true, - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "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", "id": "A01.40", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", "service": "App Gateway", "severity": "Alto", - "subcategory": "Gateway de aplicativo", - "text": "Implante sua política de WAF para o Application Gateway no modo 'Prevenção'.", + "subcategory": "Gateway de Aplicativo", + "text": "Implante sua política de WAF para Gateway de Aplicativo no modo 'Prevenção'.", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", "id": "A01.41", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Adicione o limite de taxa ao WAF do Gateway de Aplicativo do Azure. A limitação de taxa bloqueia clientes que enviam acidentalmente ou intencionalmente grandes quantidades de tráfego em um curto período de tempo.", + "subcategory": "Gateway de Aplicativo", + "text": "Adicione a limitação de taxa ao WAF do Gateway de Aplicativo do Azure. A limitação de taxa bloqueia os clientes que enviam acidentalmente ou intencionalmente grandes quantidades de tráfego em um curto período de tempo.", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "041e0ad8-7b12-4694-a0b7-a0e25ee2470f", "id": "A01.42", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview#rate-limiting-details", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Use um limite alto para os limites de taxa do WAF do Gateway de Aplicativo do Azure. Limites de limite de taxa alta evitam o bloqueio de tráfego legítimo, ao mesmo tempo em que fornecem proteção contra um número extremamente alto de solicitações que podem sobrecarregar sua infraestrutura. ", + "subcategory": "Gateway de Aplicativo", + "text": "Use um limite alto para os limites de taxa do WAF do Gateway de Aplicativo do Azure. Os limites de limite de taxa altos evitam o bloqueio do tráfego legítimo, ao mesmo tempo em que fornecem proteção contra números extremamente altos de solicitações que podem sobrecarregar sua infraestrutura. ", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "99937189-ff78-492a-b9ca-18d828d82b37", "id": "A01.43", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#geo-filtering-best-practices", "service": "App Gateway", "severity": "Baixo", - "subcategory": "Gateway de aplicativo", - "text": "Se você não está esperando tráfego de todas as regiões geográficas, use filtros geográficos para bloquear o tráfego de países não esperados.", + "subcategory": "Gateway de Aplicativo", + "text": "Se você não estiver esperando tráfego de todas as regiões geográficas, use filtros geográficos para bloquear o tráfego de países não esperados.", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", "id": "A01.44", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", + "subcategory": "Gateway de Aplicativo", "text": "Especifique o local desconhecido (ZZ) ao filtrar geograficamente o tráfego com o WAF do Gateway de Aplicativo do Azure. Evite bloquear acidentalmente solicitações legítimas quando os endereços IP não puderem ser correspondidos geograficamente.", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "6c19dfd5-a61c-436c-9001-491b9b3d0228", "id": "A01.45", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#use-the-latest-ruleset-versions", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Use a versão mais recente do conjunto de regras do WAF do Gateway de Aplicativo do Azure. As atualizações do conjunto de regras são atualizadas regularmente para levar em conta o cenário atual de ameaças.", + "subcategory": "Gateway de Aplicativo", + "text": "Use a versão mais recente do conjunto de regras do WAF do Gateway de Aplicativo do Azure. As atualizações do conjunto de regras são atualizadas regularmente para levar em conta o cenário de ameaças atual.", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "f84106a2-2e9e-42ac-add6-d3416ecfed53", "id": "A01.46", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#add-diagnostic-settings-to-save-your-wafs-logs", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Adicione configurações de diagnóstico para salvar seus logs WAF do Gateway de Aplicativo do Azure.", + "subcategory": "Gateway de Aplicativo", + "text": "Adicione configurações de diagnóstico para salvar os logs do WAF do Gateway de Aplicativo do Azure.", "waf": "Operações" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "4cea4050-7946-4a7c-89e6-b021b73c352d", "id": "A01.47", "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", "severity": "Média", - "subcategory": "Porta da Frente", - "text": "Adicione configurações de diagnóstico para salvar seus logs do WAF do Azure Front Door.", + "subcategory": "Porta da frente", + "text": "Adicione configurações de diagnóstico para salvar os logs do WAF do Azure Front Door.", "waf": "Operações" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "92664c60-47e3-4591-8b1b-8d557656e686", "id": "A01.48", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#send-logs-to-microsoft-sentinel", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", + "subcategory": "Gateway de Aplicativo", "text": "Envie logs do WAF do Gateway de Aplicativo do Azure para o Microsoft Sentinel.", "waf": "Operações" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "845f5f91-9c21-4674-a725-5ce890850e20", "id": "A01.49", "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#send-logs-to-microsoft-sentinel", "service": "Front Door", "severity": "Média", - "subcategory": "Porta da Frente", + "subcategory": "Porta da frente", "text": "Envie logs do WAF do Azure Front Door para o Microsoft Sentinel.", "waf": "Operações" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "ba0e9b26-6e0d-4ec8-8541-023c00afd5b7", "id": "A01.50", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#define-your-waf-configuration-as-code", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Defina sua configuração do WAF do Gateway de Aplicativo do Azure como código. Usando o código, você pode adotar mais facilmente a nova versão do conjunto de regras e obter proteção adicional.", + "subcategory": "Gateway de Aplicativo", + "text": "Defina a configuração do WAF do Gateway de Aplicativo do Azure como código. Usando o código, você pode adotar mais facilmente a nova versão do conjunto de regras e obter proteção adicional.", "waf": "Operações" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", "id": "A01.51", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Use políticas de WAF em vez da configuração de WAF herdada.", + "subcategory": "Gateway de Aplicativo", + "text": "Use as Políticas do WAF em vez da configuração herdada do WAF.", "waf": "Operações" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", "id": "A01.52", "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Filtre o tráfego de entrada nos back-ends para que eles só aceitem conexões da sub-rede do Application Gateway, por exemplo, com NSGs.", + "subcategory": "Gateway de Aplicativo", + "text": "Filtre o tráfego de entrada nos back-ends para que eles aceitem apenas conexões da sub-rede do Gateway de Aplicativo, por exemplo, com NSGs.", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", "id": "A01.53", "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", "service": "Front Door", "severity": "Média", - "subcategory": "Porta da Frente", - "text": "Certifique-se de que suas origens recebam apenas o tráfego de sua instância do Azure Front Door.", + "subcategory": "Porta da frente", + "text": "Verifique se suas origens recebem apenas o tráfego da instância do Azure Front Door.", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", "id": "A01.54", "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", "service": "App Gateway", "severity": "Alto", - "subcategory": "Gateway de aplicativo", + "subcategory": "Gateway de Aplicativo", "text": "Você deve criptografar o tráfego para os servidores de back-end.", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", "id": "A01.55", "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", "service": "App Gateway", "severity": "Alto", - "subcategory": "Gateway de aplicativo", + "subcategory": "Gateway de Aplicativo", "text": "Você deve usar um Web Application Firewall.", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", "id": "A01.56", "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", + "subcategory": "Gateway de Aplicativo", "text": "Redirecionar HTTP para HTTPS", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "bb697864-1b4c-43af-8667-90cc69aaed5f", "id": "A01.57", "link": "https://learn.microsoft.com/azure/application-gateway/how-application-gateway-works#modifications-to-the-request", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Usar cookies gerenciados por gateway para direcionar o tráfego de uma sessão de usuário para o mesmo servidor para processamento", + "subcategory": "Gateway de Aplicativo", + "text": "Use cookies gerenciados por gateway para direcionar o tráfego de uma sessão de usuário para o mesmo servidor para processamento", "waf": "Operações" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", "id": "A01.58", "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", "service": "App Gateway", "severity": "Alto", - "subcategory": "Gateway de aplicativo", - "text": "Habilite a drenagem de conexão durante as atualizações de serviço planejadas para evitar a perda de conexão com membrs existentes do pool de back-end", + "subcategory": "Gateway de Aplicativo", + "text": "Habilitar a drenagem de conexão durante atualizações de serviço planejadas para evitar a perda de conexão para membros existentes do pool de back-end", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", "id": "A01.59", "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", "service": "App Gateway", "severity": "Baixo", - "subcategory": "Gateway de aplicativo", - "text": "Criar páginas de erro personalizadas para exibir uma experiência de usuário personalizada", + "subcategory": "Gateway de Aplicativo", + "text": "Crie páginas de erro personalizadas para exibir uma experiência de usuário personalizada", "waf": "Operações" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", "id": "A01.60", "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", + "subcategory": "Gateway de Aplicativo", "text": "Edite solicitações HTTP e cabeçalhos de resposta para facilitar o roteamento e a troca de informações entre o cliente e o servidor", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", "id": "A01.61", "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Configure o Front Door para otimizar o roteamento de tráfego global da Web e o desempenho do usuário final de nível superior e a confiabilidade por meio de failover global rápido", + "subcategory": "Gateway de Aplicativo", + "text": "Configure o Front Door para otimizar o roteamento de tráfego da Web global e o desempenho e a confiabilidade do usuário final de nível superior por meio de failover global rápido", "waf": "Desempenho" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "29dcc19f-a8fa-4c35-8281-290577538793", "id": "A01.62", "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Usar balanceamento de carga da camada de transporte", + "subcategory": "Gateway de Aplicativo", + "text": "Usar o balanceamento de carga da camada de transporte", "waf": "Desempenho" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", "id": "A01.63", "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Configurar o roteamento com base no host ou nome de domínio para vários aplicativos Web em um único gateway", + "subcategory": "Gateway de Aplicativo", + "text": "Configurar o roteamento com base no host ou no nome de domínio para vários aplicativos Web em um único gateway", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", "id": "A01.64", "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", "service": "App Gateway", "severity": "Média", - "subcategory": "Gateway de aplicativo", - "text": "Centralize o gerenciamento de certificados SSL para reduzir a sobrecarga de criptografia e descriptografia de um farm de servidores back-end", + "subcategory": "Gateway de Aplicativo", + "text": "Centralize o gerenciamento de certificados SSL para reduzir a sobrecarga de criptografia e descriptografia de um farm de servidores de back-end", "waf": "Segurança" }, { - "category": "Topologia de rede e conectividade", + "category": "Topologia e conectividade de rede", "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", "id": "A01.65", "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", "service": "App Gateway", "severity": "Baixo", - "subcategory": "Gateway de aplicativo", - "text": "Usar o Application Gateway para suporte nativo para protocolos WebSocket e HTTP/2", + "subcategory": "Gateway de Aplicativo", + "text": "Usar o Gateway de Aplicativo para obter suporte nativo para protocolos WebSocket e HTTP/2", "waf": "Segurança" } ], "metadata": { "name": "Azure Application Delivery Networking", "state": "GA", - "timestamp": "March 15, 2024", + "timestamp": "August 08, 2024", "waf": "all" }, "severities": [ @@ -788,7 +788,7 @@ "name": "Abrir" }, { - "description": "Essa verificação foi verificada e não há outros itens de ação associados a ela", + "description": "Essa verificação foi verificada e não há mais itens de ação associados a ela", "name": "Cumprido" }, { @@ -796,7 +796,7 @@ "name": "Não é necessário" }, { - "description": "Não aplicável ao projeto atual", + "description": "Não aplicável para o projeto atual", "name": "N/A" } ], diff --git a/checklists/network_appdelivery_checklist.zh-Hant.json b/checklists/network_appdelivery_checklist.zh-Hant.json index ad6337422..79dccb460 100644 --- a/checklists/network_appdelivery_checklist.zh-Hant.json +++ b/checklists/network_appdelivery_checklist.zh-Hant.json @@ -13,7 +13,7 @@ "service": "Front Door", "severity": "中等", "subcategory": "前門", - "text": "如果將客戶管理的 TLS 證書用於 Azure Front Door,請使用“最新”證書版本。降低手動續訂證書導致的中斷風險", + "text": "如果將客戶管理的 TLS 證書用於 Azure Front Door,請使用“最新”證書版本。降低手動證書續訂導致的中斷風險", "waf": "操作" }, { @@ -23,7 +23,7 @@ "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", "severity": "中等", "subcategory": "應用交付", - "text": "在面向內部 (corp) 和面向外部的應用 (online) 的登陸區域內執行應用交付。", + "text": "在登陸區域內為面向內部 (corp) 和面向外部的應用 (online) 執行應用交付。", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "安全" }, @@ -35,7 +35,7 @@ "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "確保使用應用程式閘道 v2 SKU", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "安全" @@ -49,7 +49,7 @@ "service": "Load Balancer", "severity": "中等", "subcategory": "負載均衡器", - "text": "確保將標準 SKU 用於 Azure 負載均衡器", + "text": "請確保對 Azure 負載均衡器使用標準 SKU", "waf": "安全" }, { @@ -60,7 +60,7 @@ "service": "Load Balancer", "severity": "中等", "subcategory": "負載均衡器", - "text": "確保負載均衡器前端IP位址是區域冗餘的(除非需要區域性前端)。", + "text": "確保負載均衡器前端IP位址是區域冗餘的(除非需要區域前端)。", "waf": "安全" }, { @@ -71,21 +71,21 @@ "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "應用程式閘道 v2 應部署在IP前綴等於或大於 /24 的子網中", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "安全" }, { "category": "網路拓撲和連接", - "description": "一般而言,反向代理的管理,特別是 WAF 的管理更接近應用程式而不是網路,因此它們與應用程式屬於同一訂閱。如果應用程式閘道和 WAF 由單個團隊管理,則在連接訂閱中集中應用程式閘道和 WAF 可能是可以的。", + "description": "一般而言,反向代理(尤其是 WAF)的管理更接近應用程式,而不是網路,因此它們與應用程式屬於同一訂閱。如果應用程式閘道和 WAF 由一個團隊管理,則在連接訂閱中集中管理應用程式閘道和 WAF 可能是可以的。", "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", "id": "A01.07", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", - "text": "部署 Azure 應用程式閘道 v2 或合作夥伴 NVA,用於在登陸區域虛擬網路中代理入站 HTTP(S) 連接,並使用它們所保護的應用。", + "subcategory": "應用閘道", + "text": "部署 Azure 應用程式閘道 v2 或合作夥伴 NVA,用於在登陸區域虛擬網路中代理入站 HTTP(S) 連接,並與其保護的應用一起使用。", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "安全" }, @@ -96,7 +96,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "對應用程式登陸區域中的所有公共IP位址使用 DDoS 網路或IP保護計畫。", "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "安全" @@ -109,8 +109,8 @@ "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-autoscaling-zone-redundant", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", - "text": "使用至少兩個實例數配置自動縮放。", + "subcategory": "應用閘道", + "text": "配置自動縮放,最小實例數為 2。", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "可靠性" }, @@ -122,7 +122,7 @@ "link": "https://learn.microsoft.com/azure/reliability/migrate-app-gateway-v2", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "跨可用性區域部署應用程式閘道", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "可靠性" @@ -135,7 +135,7 @@ "service": "Front Door", "severity": "中等", "subcategory": "前門", - "text": "將 Azure Front Door 與 WAF 策略配合使用,以交付和幫助保護跨多個 Azure 區域的全域 HTTP/S 應用。", + "text": "將 Azure Front Door 與 WAF 策略結合使用,以交付並幫助保護跨多個 Azure 區域的全球 HTTP/S 應用。", "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "安全" }, @@ -160,7 +160,7 @@ "service": "Traffic Manager", "severity": "高", "subcategory": "流量管理員", - "text": "使用流量管理器提供跨 HTTP/S 以外的協定的全域應用。", + "text": "使用流量管理器交付跨 HTTP/S 以外的協定的全域應用。", "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "可靠性" }, @@ -172,7 +172,7 @@ "service": "Entra", "severity": "低", "subcategory": "應用交付", - "text": "如果使用者只需要訪問內部應用程式,是否考慮將 Microsoft Entra ID 應用程式代理作為 Azure 虛擬桌面 (AVD) 的替代方法?", + "text": "如果使用者只需要存取內部應用程式,Microsoft Entra ID 應用程式代理是否被視為 Azure 虛擬桌面 (AVD) 的替代方案?", "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", "waf": "安全" }, @@ -184,7 +184,7 @@ "service": "Entra", "severity": "中等", "subcategory": "應用交付", - "text": "若要減少為網路中的傳入連接打開的防火牆埠數,請考慮使用 Microsoft Entra ID 應用程式代理為遠端使用者提供對內部應用程式的安全且經過身份驗證的訪問。", + "text": "若要減少為網路中的傳入連接打開的防火牆埠數,請考慮使用 Microsoft Entra ID 應用程式代理為遠端使用者提供對內部應用程式的安全和經過身份驗證的訪問。", "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", "waf": "安全" }, @@ -198,7 +198,7 @@ "service": "Front Door", "severity": "高", "subcategory": "前門", - "text": "在「預防」模式下部署 Front Door 的 WAF 策略。", + "text": "在「預防」模式下部署 Front Door 的 WAF 策略,以便 Web 應用程式防火牆採取適當的措施來允許或拒絕流量。", "waf": "安全" }, { @@ -210,7 +210,7 @@ "service": "Front Door", "severity": "高", "subcategory": "前門", - "text": "避免將 Azure 流量管理器和 Azure Front Door 結合使用。", + "text": "避免結合使用 Azure 流量管理器和 Azure Front Door。", "waf": "安全" }, { @@ -245,7 +245,7 @@ "service": "Front Door", "severity": "中等", "subcategory": "前門", - "text": "為 Azure Front Door 選擇良好的運行狀況探測終結點。請考慮構建運行狀況終結點,以檢查應用程式的所有依賴項。", + "text": "為 Azure Front Door 選擇良好的運行狀況探測終結點。請考慮構建用於檢查應用程式的所有依賴項的運行狀況終結點。", "waf": "可靠性" }, { @@ -270,7 +270,7 @@ "service": "Load Balancer", "severity": "高", "subcategory": "負載均衡器", - "text": "使用 Azure NAT 閘道而不是負載均衡器出站規則,以獲得更好的 SNAT 可伸縮性", + "text": "使用 Azure NAT 閘道而不是負載均衡器出站規則來提高 SNAT 可伸縮性", "waf": "可靠性" }, { @@ -283,7 +283,7 @@ "service": "Front Door", "severity": "高", "subcategory": "前門", - "text": "將託管 TLS 證書與 Azure Front Door 配合使用。降低運營成本和因證書續訂而導致的中斷風險。", + "text": "將託管 TLS 證書與 Azure Front Door 配合使用。降低運營成本和因證書續訂而導致的停機風險。", "waf": "操作" }, { @@ -306,7 +306,7 @@ "service": "Front Door", "severity": "高", "subcategory": "前門", - "text": "將端到端 TLS 與 Azure Front Door 配合使用。使用 TLS 進行從用戶端到 Front Door 的連接,以及從 Front Door 到源的連接。", + "text": "將端到端 TLS 與 Azure Front Door 配合使用。使用 TLS 建立從用戶端到 Front Door 的連接,以及從 Front Door 到源的連接。", "waf": "安全" }, { @@ -317,7 +317,7 @@ "service": "Front Door", "severity": "中等", "subcategory": "前門", - "text": "將 HTTP 到 HTTPS 重定向與 Azure Front Door 配合使用。通過自動將較舊的用戶端重定向到 HTTPS 請求來支援它們。", + "text": "將 HTTP 到 HTTPS 重定向與 Azure Front Door 配合使用。通過自動將舊用戶端重定向到 HTTPS 請求來支持它們。", "waf": "安全" }, { @@ -341,7 +341,7 @@ "service": "Front Door", "severity": "高", "subcategory": "前門", - "text": "針對工作負載優化 Azure Front Door WAF。減少誤報檢測。", + "text": "通過在檢測模式下配置 WAF,為工作負載優化 Azure Front Door WAF,以減少和修復誤報檢測。", "waf": "安全" }, { @@ -377,7 +377,7 @@ "service": "Front Door", "severity": "高", "subcategory": "前門", - "text": "啟用 Azure Front Door WAF 機器人保護規則集。機器人規則檢測好的和壞的機器人。", + "text": "啟用 Azure Front Door WAF 機器人保護規則集。機器人規則可檢測好的和壞的機器人。", "waf": "安全" }, { @@ -399,7 +399,7 @@ "service": "Front Door", "severity": "中等", "subcategory": "前門", - "text": "向 Azure Front Door WAF 添加速率限制。速率限制會阻止客戶端在短時間內意外或有意發送大量流量。", + "text": "向 Azure Front Door WAF 添加速率限制。速率限制可阻止客戶端在短時間內意外或有意發送大量流量。", "waf": "安全" }, { @@ -410,7 +410,7 @@ "service": "Front Door", "severity": "中等", "subcategory": "前門", - "text": "對 Azure Front Door WAF 速率限制使用高閾值。高速率限制閾值可避免阻止合法流量,同時仍可針對可能使基礎結構不堪重負的大量請求提供保護。", + "text": "對 Azure Front Door WAF 速率限制使用高閾值。高速率限制閾值可避免阻止合法流量,同時仍可防止可能使基礎結構不堪重負的極大量請求。", "waf": "安全" }, { @@ -421,7 +421,7 @@ "service": "Front Door", "severity": "低", "subcategory": "前門", - "text": "如果您不希望收到來自所有地理區域的流量,請使用地理篩選器來阻止來自非預期國家/地區的流量。", + "text": "如果您不希望來自所有地理區域的流量,請使用地理篩檢程式來阻止來自非預期國家/地區的流量。", "waf": "安全" }, { @@ -432,7 +432,7 @@ "service": "Front Door", "severity": "中等", "subcategory": "前門", - "text": "使用 Azure Front Door WAF 對流量進行地理篩選時,請指定未知 (ZZ) 位置。避免在IP位址無法進行地理匹配時意外阻止合法請求。", + "text": "使用 Azure Front Door WAF 對流量進行地理篩選時,指定未知 (ZZ) 位置。避免在IP位址無法進行地理匹配時意外阻止合法請求。", "waf": "安全" }, { @@ -444,8 +444,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/bot-protection", "service": "App Gateway", "severity": "高", - "subcategory": "應用程式閘道", - "text": "啟用 Azure 應用程式閘道 WAF 機器人保護規則集 機器人規則可檢測好機器人和壞機器人。", + "subcategory": "應用閘道", + "text": "啟用 Azure 應用程式閘道 WAF 機器人保護規則集。機器人規則可檢測好的和壞的機器人。", "waf": "安全" }, { @@ -456,8 +456,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", "service": "App Gateway", "severity": "高", - "subcategory": "應用程式閘道", - "text": "啟用 Azure 應用程式閘道 WAF 策略中啟用的請求正文檢查功能。", + "subcategory": "應用閘道", + "text": "啟用在 Azure 應用程式閘道 WAF 策略中啟用的請求正文檢查功能。", "waf": "安全" }, { @@ -468,8 +468,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", "service": "App Gateway", "severity": "高", - "subcategory": "應用程式閘道", - "text": "針對工作負載優化 Azure 應用程式閘道 WAF。減少誤報檢測。", + "subcategory": "應用閘道", + "text": "在檢測模式下針對工作負載優化 Azure 應用程式閘道 WAF。減少誤報檢測。", "waf": "安全" }, { @@ -481,8 +481,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", "service": "App Gateway", "severity": "高", - "subcategory": "應用程式閘道", - "text": "在「防護」模式下部署應用程式閘道的 WAF 策略。", + "subcategory": "應用閘道", + "text": "在「預防」模式下部署應用程式閘道的 WAF 策略。", "waf": "安全" }, { @@ -492,8 +492,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", - "text": "向 Azure 應用程式閘道 WAF 添加速率限制。速率限制會阻止客戶端在短時間內意外或有意發送大量流量。", + "subcategory": "應用閘道", + "text": "向 Azure 應用程式閘道 WAF 添加速率限制。速率限制可阻止客戶端在短時間內意外或有意發送大量流量。", "waf": "安全" }, { @@ -503,8 +503,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview#rate-limiting-details", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", - "text": "對 Azure 應用程式閘道 WAF 速率限制使用高閾值。高速率限制閾值可避免阻止合法流量,同時仍可針對可能使基礎結構不堪重負的大量請求提供保護。", + "subcategory": "應用閘道", + "text": "對 Azure 應用程式閘道 WAF 速率限制使用高閾值。高速率限制閾值可避免阻止合法流量,同時仍可防止可能使基礎結構不堪重負的極大量請求。", "waf": "安全" }, { @@ -514,8 +514,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#geo-filtering-best-practices", "service": "App Gateway", "severity": "低", - "subcategory": "應用程式閘道", - "text": "如果您不希望收到來自所有地理區域的流量,請使用地理篩選器來阻止來自非預期國家/地區的流量。", + "subcategory": "應用閘道", + "text": "如果您不希望來自所有地理區域的流量,請使用地理篩檢程式來阻止來自非預期國家/地區的流量。", "waf": "安全" }, { @@ -525,8 +525,8 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", - "text": "使用 Azure 應用程式閘道 WAF 對流量進行地理篩選時,請指定未知 (ZZ) 位置。避免在IP位址無法進行地理匹配時意外阻止合法請求。", + "subcategory": "應用閘道", + "text": "使用 Azure 應用程式閘道 WAF 對流量進行地理篩選時,指定未知 (ZZ) 位置。避免在IP位址無法進行地理匹配時意外阻止合法請求。", "waf": "安全" }, { @@ -536,7 +536,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#use-the-latest-ruleset-versions", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "使用最新的 Azure 應用程式閘道 WAF 規則集版本。規則集更新會定期更新,以考慮當前的威脅形勢。", "waf": "安全" }, @@ -547,7 +547,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#add-diagnostic-settings-to-save-your-wafs-logs", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "添加診斷設置以保存 Azure 應用程式閘道 WAF 紀錄。", "waf": "操作" }, @@ -569,7 +569,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#send-logs-to-microsoft-sentinel", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "將 Azure 應用程式閘道 WAF 紀錄發送到 Microsoft Sentinel。", "waf": "操作" }, @@ -591,7 +591,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#define-your-waf-configuration-as-code", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "將 Azure 應用程式閘道 WAF 設定定義為代碼。通過使用代碼,您可以更輕鬆地採用新的規則集版本並獲得額外的保護。", "waf": "操作" }, @@ -602,7 +602,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "使用 WAF 策略而不是舊版 WAF 配置。", "waf": "操作" }, @@ -613,8 +613,8 @@ "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", - "text": "篩選後端中的入站流量,以便它們僅接受來自應用程式閘道子網的連接,例如使用NSG。", + "subcategory": "應用閘道", + "text": "篩選後端中的入站流量,以便它們僅接受來自應用程式閘道子網的連接,例如與 NSG 的連接。", "waf": "安全" }, { @@ -625,7 +625,7 @@ "service": "Front Door", "severity": "中等", "subcategory": "前門", - "text": "確保源僅從 Azure Front Door 實例獲取流量。", + "text": "確保源僅接收來自 Azure Front Door 實例的流量。", "waf": "安全" }, { @@ -635,8 +635,8 @@ "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", "service": "App Gateway", "severity": "高", - "subcategory": "應用程式閘道", - "text": "您應該對發往後端伺服器的流量進行加密。", + "subcategory": "應用閘道", + "text": "您應該對流向後端伺服器的流量進行加密。", "waf": "安全" }, { @@ -646,7 +646,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", "service": "App Gateway", "severity": "高", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "您應該使用 Web 應用程式防火牆。", "waf": "安全" }, @@ -657,7 +657,7 @@ "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "將 HTTP 重定向到 HTTPS", "waf": "安全" }, @@ -668,7 +668,7 @@ "link": "https://learn.microsoft.com/azure/application-gateway/how-application-gateway-works#modifications-to-the-request", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "使用閘道管理的 Cookie 將流量從使用者工作階段定向到同一伺服器進行處理", "waf": "操作" }, @@ -679,8 +679,8 @@ "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", "service": "App Gateway", "severity": "高", - "subcategory": "應用程式閘道", - "text": "在計劃的服務更新期間啟用連接耗盡,以防止與後端池的現有 membr 的連接丟失", + "subcategory": "應用閘道", + "text": "在計劃的服務更新期間啟用連接耗盡,以防止與後端池的現有成員的連接丟失", "waf": "安全" }, { @@ -690,7 +690,7 @@ "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", "service": "App Gateway", "severity": "低", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "創建自訂錯誤頁面以顯示個人化的用戶體驗", "waf": "操作" }, @@ -701,7 +701,7 @@ "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "編輯 HTTP 請求和回應標頭,以便更輕鬆地在用戶端和伺服器之間進行路由和資訊交換", "waf": "安全" }, @@ -712,8 +712,8 @@ "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", - "text": "配置 Front Door,通過快速全域故障轉移優化全球 Web 流量路由和頂級最終使用者性能和可靠性", + "subcategory": "應用閘道", + "text": "配置 Front Door 以優化全球 Web 流量路由和頂級最終使用者性能,並通過快速全域故障轉移實現可靠性", "waf": "性能" }, { @@ -723,8 +723,8 @@ "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", - "text": "使用傳輸層負載平衡", + "subcategory": "應用閘道", + "text": "使用傳輸層負載均衡", "waf": "性能" }, { @@ -734,7 +734,7 @@ "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "根據主機名或域名為單個閘道上的多個 Web 應用程式配置路由", "waf": "安全" }, @@ -745,7 +745,7 @@ "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", "service": "App Gateway", "severity": "中等", - "subcategory": "應用程式閘道", + "subcategory": "應用閘道", "text": "集中管理 SSL 證書,以減少後端伺服器場的加密和解密開銷", "waf": "安全" }, @@ -756,15 +756,15 @@ "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", "service": "App Gateway", "severity": "低", - "subcategory": "應用程式閘道", - "text": "使用應用程式閘道對 WebSocket 和 HTTP/2 協定提供本機支援", + "subcategory": "應用閘道", + "text": "使用應用程式閘道獲得對 WebSocket 和 HTTP/2 協定的本機支援", "waf": "安全" } ], "metadata": { "name": "Azure Application Delivery Networking", "state": "GA", - "timestamp": "March 15, 2024", + "timestamp": "August 08, 2024", "waf": "all" }, "severities": [ @@ -784,11 +784,11 @@ "name": "未驗證" }, { - "description": "有一個與此檢查關聯的措施項", + "description": "有一個與此檢查關聯的操作項", "name": "打開" }, { - "description": "此檢查已通過驗證,並且沒有與之關聯的進一步操作項", + "description": "此檢查已經過驗證,並且沒有與之關聯的其他操作項", "name": "實現" }, { @@ -797,7 +797,7 @@ }, { "description": "不適用於當前設計", - "name": "不適用" + "name": "N/A" } ], "waf": [ diff --git a/checklists/waf_checklist.en.json b/checklists/waf_checklist.en.json index 0f13e838a..acb339bc5 100644 --- a/checklists/waf_checklist.en.json +++ b/checklists/waf_checklist.en.json @@ -1,2134 +1,1687 @@ { "items": [ { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", - "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", - "service": "IoT Hub DPS", - "severity": "High", - "text": "Select the right Logic App hosting plan based on your business & SLO requirements", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "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", - "severity": "High", - "text": "Protect logic apps from region failures with zone redundancy and availability zones", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", + "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", + "service": "APIM", + "severity": "Medium", + "text": "Implement an error handling policy at the global level", + "waf": "Operations" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "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", - "severity": "High", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "Medium", + "text": "Ensure all APIs policies include a element.", + "waf": "Operations" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "IoT Hub DPS", - "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", + "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", + "service": "APIM", + "severity": "Medium", + "text": "Use Policy Fragments to avoid repeating same policies definitions across multiple APIs", + "waf": "Operations" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "IoT Hub DPS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", + "link": "https://learn.microsoft.com/azure/api-management/monetization-support", + "service": "APIM", "severity": "Medium", - "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", + "text": "If you are planning to monetize your APIs, review the 'monetization support' article for best practices", "waf": "Operations" }, { - "arm-service": "Microsoft.Devices/deviceUpdateServices", - "checklist": "Device Update Review", - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "a7d0840a-c8c4-4e83-adec-5ca578eb4049", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", + "service": "APIM", "severity": "High", - "text": "Leverage Availability Zones if regionally applicable (this is automatically enabled).", - "waf": "Reliability" + "text": "Enable Diagnostics Settings to export logs to Azure Monitor", + "waf": "Operations" }, { - "arm-service": "Microsoft.Devices/deviceUpdateServices", - "checklist": "Device Update Review", - "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", - "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.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", + "service": "APIM", + "severity": "Medium", + "text": "Enable Application Insights for more detailed telemetry", + "waf": "Operations" }, { - "arm-service": "Microsoft.Devices/deviceUpdateServices", - "checklist": "Device Update Review", - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", + "service": "APIM", "severity": "High", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" + "text": "Configure alerts on the most critical metrics", + "waf": "Operations" }, { - "arm-service": "Microsoft.Devices/deviceUpdateServices", - "checklist": "Device Update Review", - "guid": "bd91245c-fe32-4e98-a085-794a40f4bfe1", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "Device Update for IoT Hub", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" + "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.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", - "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", - "service": "Logic Apps", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "High", - "text": "Select the right Logic App hosting plan based on your business & SLO requirements", - "waf": "Reliability" + "text": "Protect incoming requests to APIs (data plane) with Azure AD", + "waf": "Security" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps 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", - "severity": "High", - "text": "Protect logic apps from region failures with zone redundancy and availability zones", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", + "service": "APIM", + "severity": "Medium", + "text": "Use Microsoft Entra ID to authenticate users in the Developer Portal", + "waf": "Security" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps 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", - "severity": "High", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", + "service": "APIM", + "severity": "Medium", + "text": "Create appropriate groups to control the visibility of the products", + "waf": "Security" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", - "link": "https://learn.microsoft.com/azure/app-service/environment/intro", - "service": "Logic Apps", - "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "06862505-2d9a-4874-9491-2837b00a3475", + "link": "https://learn.microsoft.com/azure/api-management/backends", + "service": "APIM", + "severity": "Medium", + "text": "Use Backends feature to eliminate redundant API backend configurations", + "waf": "Operations" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", - "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", - "service": "Logic Apps", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", + "service": "APIM", "severity": "Medium", - "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Logic App code", + "text": "Use Named Values to store common values that can be used in policies", "waf": "Operations" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", - "service": "Bot service", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", + "service": "APIM", "severity": "Medium", - "text": "Follow reliability support recommendations in Azure Bot Service", + "text": "For DR, leverage the premium tier with deployments scaled across two or more regions for 99.99% SLA", "waf": "Reliability" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", - "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", - "service": "Bot service", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", + "link": "https://learn.microsoft.com/azure/api-management/high-availability", + "service": "APIM", "severity": "Medium", - "text": "Deploying bots with local data residency and regional compliance", + "text": "Deploy at least one unit in two or more availability zones for an increased SLA of 99.99%", "waf": "Reliability" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "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", - "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.", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "High", + "text": "Ensure there is an automated backup routine", "waf": "Reliability" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review Checklist", - "guid": "43e52f47-22d9-428c-8b1c-d521e54a29a9", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/pass-foundations-playbooks-CosmosDB_v1.docx", - "service": "CosmosDB", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", + "link": "https://learn.microsoft.com/azure/api-management/retry-policy", + "service": "APIM", "severity": "Medium", - "text": "FTA Resiliency Playbook", + "text": "Use Policies to add a fail-over backend URL and caching to reduce failing calls.", "waf": "Reliability" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review Checklist", - "guid": "de39ac0e-7c28-4dc9-9565-7202bff4564b", - "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#slas", - "service": "CosmosDB", - "severity": "High", - "text": "Leverage Availablity Zones where regionally applicable and ofcourse if the service offers it", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review Checklist", - "guid": "0d934a34-8b26-43e7-bd60-513a3649906e", - "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#replica-outages", - "service": "CosmosDB", - "severity": "Medium", - "text": "Run multiple replicas of the database (>1 ) in Prod", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", + "service": "APIM", + "severity": "Low", + "text": "If you need to log at high performance levels, consider Event Hubs policy", + "waf": "Operations" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", + "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", + "service": "APIM", "severity": "Medium", - "text": "Leverage Multi-Region Writes", - "waf": "Reliability" + "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.documentdb/databaseAccounts", - "checklist": "CosmosDB Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", + "service": "APIM", "severity": "Medium", - "text": "Distribute your data globally", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review 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", - "severity": "High", - "text": "Choose from several well-defined consistency models", - "waf": "Reliability" + "text": "Configure autoscaling to scale out the number of instances when the load increases", + "waf": "Performance" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", + "service": "APIM", "severity": "Medium", - "text": "Enable Service managed failover", - "waf": "Reliability" + "text": "Deploy self-hosted gateways where Azure doesn't have a region close to the backend APIs.", + "waf": "Performance" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", + "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", + "service": "APIM", "severity": "Medium", - "text": "Enable Automatic Backups", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "text": "Use the premium tier for production workloads.", "waf": "Reliability" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Medium", - "text": "Perform Periodic Backups", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "text": "In multi-region model, use Policies to route the requests to regional backends based on availability or latency.", "waf": "Reliability" }, { - "arm-service": "microsoft.documentdb/databaseAccounts", - "checklist": "CosmosDB Review 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", - "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/", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "High", + "text": "Be aware of APIM's limits", "waf": "Reliability" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", + "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", + "service": "APIM", "severity": "High", - "text": "Enable 2 replicas to have 99.9% availability for read operations", + "text": "Ensure that the self-hosted gateway deployments are resilient.", "waf": "Reliability" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "7519e385-a88b-4d34-966b-6269d686e890", + "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", + "service": "APIM", "severity": "Medium", - "text": "Enable 3 replicas to have 99.9% availability for read/write operations", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", - "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", - "service": "Cognitive Search", - "severity": "High", - "text": "Leverage Availability Zones by enabling read and/or write replicas", - "waf": "Reliability" + "text": "Use Azure Front Door in front of APIM for multi-region deployment", + "waf": "Performance" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "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": "Deploy the service within a Virtual Network (VNet)", + "waf": "Security" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", - "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", - "service": "Cognitive Search", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "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": "Deploy network security groups (NSG) to your subnets to restrict or monitor traffic to/from APIM.", + "waf": "Security" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Medium", - "text": "Use Azure Traffic Manager to coordinate requests", - "waf": "Reliability" + "text": "Deploy Private Endpoints to filter incoming traffic when APIM is not deployed to a VNet.", + "waf": "Security" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", - "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", - "service": "Cognitive Search", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "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" + "text": "Disable Public Network Access", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Cognitive Services Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", + "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", + "service": "APIM", "severity": "Medium", - "text": "Leverage FTA HandBook for Cognitive Services", - "waf": "Reliability" + "text": "Simplify management with PowerShell automation scripts", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Cognitive Services Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Medium", - "text": "Backup Your Prompts", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Cognitive Services Review 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", - "severity": "High", - "text": "Business Continuity and Disaster Recovery (BCDR) considerations with Azure OpenAI Service", - "waf": "Reliability" + "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.CognitiveServices/accounts", - "checklist": "Cognitive Services Review Checklist", - "guid": "325af625-ca44-4e46-a5e2-223ace8bb123", - "link": "https://github.com/abacaj/chatgpt-backup#backup-your-chatgpt-conversations", - "service": "Cognitive Services", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", + "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", + "service": "APIM", "severity": "Medium", - "text": "Backup Your ChatGPT conversations", - "waf": "Reliability" + "text": "Promote usage of Visual Studio Code APIM extension for faster API development", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Cognitive Services Review 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "354f1c03-8112-4965-85ad-c0074bddf231", + "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", + "service": "APIM", "severity": "Medium", - "text": "CI/CD for custom speech", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Cognitive Services Review Checklist", - "guid": "3687a046-7a1f-4893-9bda-43324f248116", - "link": "https://learn.microsoft.com/azure/ai-services/qnamaker/tutorials/export-knowledge-base", - "service": "Cognitive Services", - "severity": "Low", - "text": "Move a knowledge base using export-import", - "waf": "Reliability" + "text": "Implement DevOps and CI/CD in your workflow", + "waf": "Operations" }, { - "arm-service": "Microsoft.App/containerApps", - "checklist": "Container Apps Review", - "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", - "severity": "High", - "text": "Leverage Availability Zones if regionally applicable", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "b6439493-426a-45f3-9697-cf65baee208d", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", + "service": "APIM", + "severity": "Medium", + "text": "Secure APIs using client certificate authentication", + "waf": "Security" }, { - "arm-service": "Microsoft.App/containerApps", - "checklist": "Container Apps Review", - "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", - "severity": "High", - "text": "Use more than one replica and enable Zone Redundancy.", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "2a67d143-1033-4c0a-8732-680896478f08", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", + "service": "APIM", + "severity": "Medium", + "text": "Secure backend services using client certificate authentication", + "waf": "Security" }, { - "arm-service": "Microsoft.App/containerApps", - "checklist": "Container Apps Review", - "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", - "severity": "High", - "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.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", + "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", + "service": "APIM", + "severity": "Medium", + "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.App/containerApps", - "checklist": "Container Apps Review", - "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", - "severity": "High", - "text": "Use Front Door or Traffic Manager to route traffic to the closest region", - "waf": "Reliability" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", + "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", + "service": "APIM", + "severity": "Medium", + "text": "Use Authorizations feature to simplify management of OAuth 2.0 token for your backend APIs", + "waf": "Security" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Azure Functions", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", + "service": "APIM", "severity": "High", - "text": "Select the right Function hosting plan based on your business & SLO requirements", - "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.Web/sites", - "checklist": "Azure Function Review", - "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Azure Functions", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "High", - "text": "Leverage Availability Zones where regionally applicable (not available for Consumption tier)", - "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.Web/sites", - "checklist": "Azure Function Review", - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Medium", - "text": "Consider a Cross-Region DR strategy for critical workloads", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "Azure Functions", - "severity": "High", - "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", - "waf": "Reliability" + "text": "Use managed identities to authenticate to other Azure resources whenever possible", + "waf": "Security" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "Azure Functions", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "High", - "text": "Ensure 'Always On' is enabled for all Function Apps running on App Service Plan", - "waf": "Reliability" + "text": "Use web application firewall (WAF) by deploying Application Gateway in front of APIM", + "waf": "Security" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "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", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", + "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", + "service": "Spring Apps", "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", + "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.Web/sites", - "checklist": "Azure Function Review", - "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "Azure Functions", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "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", "severity": "Medium", - "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Function App code", - "waf": "Operations" + "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" }, { - "checklist": "SAP Checklist", - "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", - "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", - "service": "SAP", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", + "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", + "service": "Spring Apps", "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" + "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" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", + "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", + "service": "Spring Apps", "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" + "text": "Use more than 1 app instance for your apps", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", - "service": "SAP", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "7504c230-6035-4183-95a5-85762acc6075", + "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", + "service": "Spring Apps", "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", + "text": "Monitor Azure Spring Apps with logs, metrics and tracing. Integrate ASA with application insights and track failures and create workbooks.", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", - "service": "SAP", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", + "service": "Spring Apps", "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.", + "text": "Set up autoscaling in Spring Cloud Gateway", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "b651423c-8552-42db-a545-5cb50c05527a", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "SAP", - "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/", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "97411607-b6fd-4335-99d1-9885faf4e392", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", + "service": "Spring Apps", + "severity": "Low", + "text": "Enable autoscale for the apps with Standard consumption & dedicated plan.", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", + "link": "https://learn.microsoft.com/azure/spring-apps/overview", + "service": "Spring Apps", "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", + "text": "Use Enterprise plan for commercial support of spring boot for mission critical apps. With other tiers you get OSS support.", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", - "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", + "service": "AVS", "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": "Ensure ADDS domain controller(s) are deployed in the identity subscription in native Azure", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "SAP", - "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" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "75089c20-990d-4927-b105-885576f76fc2", + "service": "AVS", + "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", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", - "service": "SAP", - "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" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", + "service": "AVS", + "severity": "High", + "text": "Ensure that vCenter is connected to ADDS to enable authentication based on 'named user accounts'", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", - "service": "SAP", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", + "service": "AVS", + "severity": "Medium", + "text": "Ensure that the connection from vCenter to ADDS is using a secure protocol (LDAPS)", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", + "service": "AVS", + "severity": "Medium", + "text": "CloudAdmin account in vCenter IdP is used only as an emergency account (break-glass)", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", - "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", + "service": "AVS", "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 NSX-Manager is integrated with an external Identity provider (LDAPS)", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", - "service": "SAP", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", + "service": "AVS", + "severity": "Medium", + "text": "Has an RBAC model been created for use within VMware vSphere", + "waf": "Security" }, { - "checklist": "SAP 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", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", + "service": "AVS", + "severity": "Medium", + "text": "RBAC permissions should be granted on ADDS groups and not on specific users", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", + "service": "AVS", "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" + "text": "RBAC permissions on the Azure VMware Solution resource in Azure are 'locked down' to a limited set of owners only", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", + "service": "AVS", "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" + "text": "Ensure all custom roles are scoped with CloudAdmin permitted authorizations", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", - "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", + "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", + "service": "AVS", "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", - "waf": "Reliability" + "text": "Is the correct Azure VMware Solution connectivity model selected for the customer use case at hand", + "waf": "Performance" }, { - "checklist": "SAP Checklist", - "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", - "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", + "service": "AVS", "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" + "text": "Ensure ExpressRoute or VPN connections from on-premises to Azure are monitored using 'connection monitor'", + "waf": "Operations" }, { - "checklist": "SAP 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", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", - "service": "SAP", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", + "service": "AVS", "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" + "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" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", + "service": "AVS", "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" + "text": "Is Privileged Identity Management implemented for roles managing the Azure VMware Solution resource in the Azure Portal (no standing permissions allowed)", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "cbe05bbe-209d-4490-ba47-778424d11678", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", + "service": "AVS", "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": "Privileged Identity Management audit reporting should be implemented for the Azure VMware Solution PIM roles", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", - "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", + "service": "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" - }, - { - "checklist": "SAP Checklist", - "guid": "9674e7c7-7796-4181-8920-09f4429543ba", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", - "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" - }, - { - "checklist": "SAP Checklist", - "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", - "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" - }, - { - "checklist": "SAP Checklist", - "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", - "severity": "High", - "text": "Use one proximity placement group per SAP SID. Groups don't span across Availability Zones or Azure regions", - "waf": "Reliability" + "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" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", + "service": "AVS", "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" - }, - { - "checklist": "SAP Checklist", - "guid": "ed46b937-913e-4018-9c62-8393ab037e53", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", - "service": "SAP", - "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": "Limit use of CloudAdmin account to emergency access only", + "waf": "Security" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", + "service": "AVS", "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": "Create custom RBAC roles in vCenter to implement a least-privilege model inside vCenter", + "waf": "Security" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", + "service": "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" - }, - { - "checklist": "SAP Checklist", - "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", - "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" - }, - { - "checklist": "SAP Checklist", - "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", - "service": "SAP", - "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" - }, - { - "checklist": "SAP Checklist", - "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", - "service": "SAP", - "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": "Is a process defined to regularly rotate cloudadmin (vCenter) and admin (NSX) credentials", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", - "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", + "service": "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" + "text": "Use a centralized identity provider to be used for workloads (VM's) running on Azure VMware Solution", + "waf": "Security" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", + "service": "AVS", "severity": "Medium", - "text": "Automate SAP System Start-Stop to manage costs.", - "waf": "Cost" - }, - { - "checklist": "SAP Checklist", - "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", - "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" + "text": "Is East-West traffic filtering implemented within NSX-T", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "9877f353-2591-4e8b-8381-e9043fed1010", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", + "service": "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": "Auditing and logging is implemented for inbound internet requests to Azure VMware Solution and Azure VMware Solution based workloads", "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "45911475-e39e-4530-accc-d979366bcda2", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", + "service": "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": "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" }, { - "checklist": "SAP Checklist", - "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "334fdf91-c234-4182-a652-75269440b4be", + "service": "AVS", "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.", + "text": "Is DDoS standard protection enabled on ExR/VPN Gateway subnet in Azure", "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", + "service": "AVS", "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": "Use a dedicated privileged access workstation (PAW) to manage Azure VMware Solution, vCenter, NSX manager and HCX manager", "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", + "service": "AVS", "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": "Enable Advanced Threat Detection (Microsoft Defender for Cloud aka ASC) for workloads running on Azure VMware Solution", "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", + "service": "AVS", "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", + "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" }, { - "checklist": "SAP Checklist", - "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", + "service": "AVS", + "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" }, { - "checklist": "SAP 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", - "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.", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a3592718-e6e2-4051-9267-6ae46691e883", + "service": "AVS", + "severity": "Low", + "text": "When in-guest encryption is used, store encryption keys in Azure Key vault when possible", "waf": "Security" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5ac94222-3e13-4810-9230-81a941741583", + "service": "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.", + "text": "Consider using extended security update support for workloads running on Azure VMware Solution (Azure VMware Solution is eligible for ESU)", "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "a747c350-8d4c-449c-93af-393dbca77c48", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", - "service": "SAP", - "severity": "Medium", - "text": "Implement SSO to SAP HANA", - "waf": "Security" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", + "service": "AVS", + "severity": "High", + "text": "Ensure that the appropriate vSAN Data redundancy method is used (RAID specification)", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d88408f3-7273-44c8-96ba-280214590146", + "service": "AVS", + "severity": "High", + "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": "Azure VMware Solution Design Review", + "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", + "service": "AVS", + "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": "Azure VMware Solution Design Review", + "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", + "service": "AVS", "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" + "text": "Ensure that access constraints to ESXi are understood, there are access limits which might affect 3rd party solutions.", + "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", - "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", + "service": "AVS", "severity": "Medium", - "text": "For applications that access SAP, you might want to use principal propagation to establish SSO.", - "waf": "Security" + "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" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", + "service": "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.", - "waf": "Security" + "text": "Ensure a good cost management process is in place for Azure VMware Solution - Azure Cost Management can be used", + "waf": "Cost" }, { - "checklist": "SAP Checklist", - "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", + "service": "AVS", + "severity": "Low", + "text": "Are Azure reserved instances used to optimize cost for using Azure VMware Solution", + "waf": "Cost" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6691e883-5ac9-4422-83e1-3810523081a9", + "service": "AVS", "severity": "Medium", - "text": "Implement SSO to SAP BTP", + "text": "Consider the use of Azure Private-Link when using other Azure Native Services", "waf": "Security" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", + "service": "AVS", + "severity": "High", + "text": "Ensure all required resource reside within the same Azure availability zone(s)", + "waf": "Performance" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", + "service": "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.", + "text": "Enable Microsoft Defender for Cloud for Azure VMware Solution guest VM workloads", "waf": "Security" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", + "service": "AVS", "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" + "text": "Use Azure Arc enabled servers to manage your Azure VMware Solution guest VM workloads", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", + "service": "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", + "text": "Enable Diagnostic and metric logging on Azure VMware Solution", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", + "service": "AVS", + "severity": "Medium", + "text": "Deploy the Log Analytics Agents to Azure VMware Solution guest VM workloads", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", - "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "589d457a-927c-4397-9d11-02cad6aae11e", + "service": "AVS", + "severity": "Medium", + "text": "Ensure you have a documented and implemented backup policy and solution for Azure VMware Solution VM workloads", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", - "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", - "service": "SAP", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ee29711b-d352-4caa-ab79-b198dab81932", + "service": "AVS", + "severity": "Medium", + "text": "Use Microsoft Defender for Cloud for compliance monitoring of workloads running on Azure VMware Solution", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", - "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", + "service": "AVS", + "severity": "Medium", + "text": "Are the applicable compliance baselines added to Microsoft Defender for Cloud", + "waf": "Security" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", + "service": "AVS", "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" + "text": "Was data residency evaluated when selecting Azure regions to use for Azure VMware Solution deployment", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "e6e20617-3686-4af4-9791-f8935ada4332", - "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", + "service": "AVS", "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" + "text": "Are data processing implications (service provider / service consumer model) clear and documented", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "547c1747-dc56-4068-a714-435cd19dd244", + "service": "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": "Consider using CMK (Customer Managed Key) for vSAN only if needed for compliance reason(s).", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", + "service": "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" + "text": "Create dashboards to enable core Azure VMware Solution monitoring insights", + "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", - "service": "SAP", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9659e396-80e7-4828-ac93-5657d02bff45", + "service": "AVS", "severity": "High", - "text": "Ensure time-zone matches between the operating system and the SAP system.", + "text": "Ensure critical alert is created to monitor if vSAN consumption is below 75% as this is a support threshold from VMware", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "c3c7abc0-716c-4486-893c-40e181d65539", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", - "service": "SAP", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", + "service": "AVS", + "severity": "High", + "text": "Ensure alerts are configured for Azure Service Health alerts and notifications", + "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "a491dfc4-9353-4213-9217-eef0949f9467", - "link": "https://azure.microsoft.com/pricing/offers/dev-test/", - "service": "SAP", - "severity": "Low", - "text": "Consider running dev/test systems in a snooze model to save and optimize Azure run costs.", - "waf": "Cost" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", + "service": "AVS", + "severity": "Medium", + "text": "Configure Azure VMware Solution logging to be send to an Azure Storage account or Azure EventHub for processing", + "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", - "link": "https://learn.microsoft.com/azure/lighthouse/overview", - "service": "SAP", - "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.", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", + "service": "AVS", + "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" }, { - "checklist": "SAP 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", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", - "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", + "service": "AVS", + "severity": "Medium", + "text": "Ensure vSphere content libraries are not placed on vSAN as vSAN is a finite resource", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "14591147-5e39-4e53-89cc-cd979366bcda", - "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", + "service": "AVS", "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", + "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" }, { - "checklist": "SAP Checklist", - "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", - "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", + "service": "AVS", "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/", + "text": "Ensure workloads running on Azure VMware Solution are monitored using Azure Log Analytics and Azure Monitor", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", - "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", + "service": "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", + "text": "Include workloads running on Azure VMware Solution in existing update management tooling or in Azure Update Management", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "73686af4-6791-4f89-95ad-a43324e13811", - "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", + "service": "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.", + "text": "Use Azure Policy to onboard Azure VMware Solution workloads in the Azure Management, Monitoring and Security solutions", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "616785d6-fa96-4c96-ad88-518f482734c8", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", + "service": "AVS", + "severity": "Medium", + "text": "Ensure workloads running on Azure VMware Solution are onboarded to Microsoft Defender for Cloud", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", - "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", + "service": "AVS", "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/", + "text": "Ensure backups are not stored on vSAN as vSAN is a finite resource", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", - "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", + "service": "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": "Have all DR solutions been considered and a solution that is best for your business been decided upon? [SRM/JetStream/Zerto/Veeam/...]", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", - "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", + "service": "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", - "waf": "Operations" + "text": "Use Azure Site Recovery when the Disaster Recovery technology is native Azure IaaS", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", - "service": "SAP", - "severity": "Low", - "text": "Use inter-VM latency monitoring for latency-sensitive applications.", - "waf": "Performance" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", + "service": "AVS", + "severity": "High", + "text": "Use Automated recovery plans with either of the Disaster solutions, avoid manual tasks as much as possible", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "8255461e-2aee-4345-9aec-8339248b262d", + "service": "AVS", "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", + "text": "Use the geopolitical region pair as the secondary disaster recovery environment", "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", + "service": "AVS", + "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": "Azure VMware Solution Design Review", + "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", + "service": "AVS", "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": "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" }, { - "checklist": "SAP Checklist", - "guid": "c027f893-f404-41a9-b33d-39d625a14964", - "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", - "service": "SAP", - "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" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", + "service": "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": "Deploy your backup solution in the same region as your Azure VMware Solution private cloud", + "waf": "Reliability" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", + "service": "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": "Deploy your backup solution outside of vSan, on Azure native components", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", - "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" - }, - { - "checklist": "SAP Checklist", - "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "SAP", - "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/", - "waf": "Security" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", + "service": "AVS", + "severity": "Low", + "text": "Is a process in place to request a restore of the VMware components managed by the Azure Platform?", + "waf": "Reliability" }, { - "checklist": "SAP 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", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", + "service": "AVS", + "severity": "Low", + "text": "For manual deployments, all configuration and deployments must be documented", "waf": "Operations" }, { - "checklist": "SAP 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", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", + "service": "AVS", + "severity": "Low", + "text": "For manual deployments, consider implementing resource locks to prevent accidental actions on your Azure VMware Solution Private Cloud", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "a3592829-e6e2-4061-9368-6af46791f893", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", - "service": "SAP", - "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", - "waf": "Reliability" - }, - { - "checklist": "SAP Checklist", - "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", - "service": "SAP", - "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" - }, - { - "checklist": "SAP Checklist", - "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", - "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", + "service": "AVS", + "severity": "Low", + "text": "For automated deployments, deploy a minimal private cloud and scale as needed", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", - "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", + "service": "AVS", + "severity": "Low", + "text": "For automated deployments, request or reserve quota prior to starting the deployment", "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", - "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", + "service": "AVS", + "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" }, { - "checklist": "SAP 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", - "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" - }, - { - "checklist": "SAP 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", - "severity": "High", - "text": "Consider reserving IP address on DR side when configuring ASR", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", + "service": "AVS", + "severity": "Low", + "text": "Implement human understandable names for ExR authorization keys to allow for easy identification of the keys purpose/use", "waf": "Operations" }, { - "checklist": "SAP 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", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "255461e2-aee3-4553-afc8-339248b262d6", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "6e154e3a-a359-4282-ae6e-206173686af4", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", - "service": "SAP", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", + "service": "AVS", + "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" }, { - "checklist": "SAP 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", - "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" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", - "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", + "service": "AVS", "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" + "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" }, { - "checklist": "SAP Checklist", - "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", + "service": "AVS", "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" + "text": "When intending to use automated scale-in, be sure to take storage policy requirements into account before performing such action", + "waf": "Performance" }, { - "checklist": "SAP Checklist", - "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", + "service": "AVS", "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" + "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" }, { - "checklist": "SAP Checklist", - "guid": "5ada4332-4e13-4811-9231-81aa41742694", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", + "service": "AVS", "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" + "text": "Consider and validate scaling operations on 3rd party solutions used in the architecture (supported or not)", + "waf": "Performance" }, { - "checklist": "SAP Checklist", - "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", + "service": "AVS", "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", + "text": "Define and enforce scale in/out maximum limits for your environment in the automations", "waf": "Performance" }, { - "checklist": "SAP Checklist", - "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", - "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", + "service": "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" + "text": "Implement monitoring rules to monitor automated scaling operations and monitor success and failure to enable appropriate (automated) responses", + "waf": "Operations" }, { - "checklist": "SAP Checklist", - "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", - "service": "SAP", - "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" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c5972cd4-cd21-4b07-9036-f5e6b4bfd3d5", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", - "service": "SAP", - "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" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "be1f38cf-03a8-422b-b463-cbbbc8ac299e", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "6791f893-5ada-4433-84e1-3811523181aa", - "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", + "service": "AVS", "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" - }, - { - "checklist": "SAP Checklist", - "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", - "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", + "text": "If using a VPN connection for migrations, adjust your MTU size accordingly.", "waf": "Performance" }, { - "checklist": "SAP Checklist", - "guid": "fa96c96a-d885-418f-9827-34c886ba2802", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e614658d-d457-4e92-9139-b821102cad6e", + "service": "AVS", "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": "For low connectivity regions connecting into Azure (500Mbps or less), considering deploying the HCX WAN optimization appliance", "waf": "Performance" }, { - "checklist": "SAP Checklist", - "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", - "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", - "waf": "Performance" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", - "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" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", + "service": "AVS", + "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" }, { - "checklist": "SAP Checklist", - "guid": "402a9846-d515-4061-aff8-cd30088693fa", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", - "service": "SAP", - "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" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bff4564b-0d93-44a3-98b2-63e7dd60513a", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", + "service": "AVS", + "severity": "Medium", + "text": "Ensure that a dedicated ExpressRoute Gateway is being used for external data storage solutions", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "87585797-5551-4d53-bb7d-a94ee415734d", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "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", "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" + "text": "Ensure that FastPath is enabled on the ExpressRoute Gateway that is being used for external data storage solutions", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "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", "severity": "High", - "text": "Review SAP HANA database backups for Azure VMs.", - "waf": "Cost" + "text": "If using stretched cluster, ensure that your selected Disaster Recovery solution is supported by the vendor", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", - "severity": "Medium", - "text": "Review Site Recovery built-in monitoring, where used for SAP.", - "waf": "Cost" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", + "service": "AVS", + "severity": "High", + "text": "If using stretched cluster, ensure that the SLA provided will meet your requirements", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", - "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", + "service": "AVS", "severity": "High", - "text": "Review the Monitoring the SAP HANA System Landscape guidance.", - "waf": "Operations" + "text": "If using stretched cluster, ensure that both ExpressRoute circuits are connected to your connectivity hub.", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", - "service": "SAP", - "severity": "Medium", - "text": "Review Oracle Database in Azure Linux VM backup strategies.", - "waf": "Operations" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", + "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", + "service": "AVS", + "severity": "High", + "text": "If using stretched cluster, ensure that both ExpressRoute circuits have GlobalReach enabled.", + "waf": "Reliability" }, { - "checklist": "SAP 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", - "severity": "Medium", - "text": "Review the use of Azure Blob Storage with SQL Server 2016.", - "waf": "Operations" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", + "service": "AVS", + "severity": "High", + "text": "Have site disaster tolerance settings been properly considered and changed for your business if needed.", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", - "service": "SAP", - "severity": "Medium", - "text": "Review the use of Automated Backup v2 for Azure VMs.", - "waf": "Operations" + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", + "severity": "High", + "text": "Disable Azure Container Registry image export", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "severity": "High", - "text": "Enabling Write accelerator for M series when using premium disks(V1)", - "waf": "Operations" + "text": "Enable Azure Policies for Azure Container Registry", + "waf": "Security" }, { - "checklist": "SAP 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", - "severity": "Medium", - "text": "Test availability zone latency.", - "waf": "Performance" + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", + "severity": "High", + "text": "Sign and Verify containers with notation (Notary v2)", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", - "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "severity": "Medium", - "text": "Activate SAP EarlyWatch Alert for all SAP components.", - "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", - "waf": "Performance" + "text": "Encrypt registry with a customer managed key", + "waf": "Security" }, { - "checklist": "SAP 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", - "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" - }, - { - "checklist": "SAP Checklist", - "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", - "service": "SAP", - "severity": "Medium", - "text": "Review SQL Server performance monitoring using CCMS.", - "waf": "Performance" - }, - { - "checklist": "SAP Checklist", - "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", - "link": "https://me.sap.com/notes/500235", - "service": "SAP", - "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" - }, - { - "checklist": "SAP Checklist", - "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", - "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", - "service": "SAP", - "severity": "Medium", - "text": "Review SAP HANA studio alerts.", - "waf": "Performance" + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", + "severity": "High", + "text": "Use Managed Identities to connect instead of Service Principals", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", - "link": "https://me.sap.com/notes/1969700", - "service": "SAP", - "severity": "Medium", - "text": "Perform SAP HANA health checks using HANA_Configuration_Minichecks.", - "waf": "Performance" + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", + "severity": "High", + "text": "Disable local authentication for management plane access", + "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", - "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", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", + "severity": "High", + "text": "Assign AcrPull & AcrPush RBAC roles rather than granting Administrative access to identity principals", "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "08951710-79a2-492a-adbc-06d7a401545b", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "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", + "text": "Disable Anonymous pull access", "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", - "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.", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", + "severity": "High", + "text": "Disable repository-scoped access tokens", "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "description": "Deploy container images to an ACR behind a Private endpoint within a trusted network", + "guid": "b3bec3d4-f343-47c1-936d-b55f27a71eee", + "service": "ACR", "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": "Deploy images from a trusted environment", "waf": "Security" }, { - "checklist": "SAP 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", - "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", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", + "severity": "Medium", + "text": "Disable Azure ARM audience tokens for authentication", "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", - "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "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", + "text": "Enable diagnostics logging", "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", - "link": "https://learn.microsoft.com/azure/key-vault/general/overview", - "service": "SAP", - "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", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", + "severity": "Medium", + "text": "Control inbound network access with Private Link", "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "829e2edb-2173-4676-aff6-691b4935ada4", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "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 Public Network access", "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", "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": "Use an Azure Container Registry SKU that supports Private Link (Premium SKU)", "waf": "Security" }, { - "checklist": "SAP Checklist", - "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", - "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", - "service": "SAP", - "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", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "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", + "severity": "Low", + "text": "Enable Defender for Containers to scan Azure Container Registry for vulnerabilities", "waf": "Security" }, { - "checklist": "SAP 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", - "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", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "description": "Deploy trusted code that was validated and scanned for vulnerabilities according to DevSecOps practices.", + "guid": "4451e1a2-d345-4293-a763-9637a551c5c0", + "service": "ACR", + "severity": "Medium", + "text": "Deploy validated container images", "waf": "Security" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure Container Registry Security Review", + "description": "Use the latest versions of supported platforms, programming languages, protocols, and frameworks.", + "guid": "4e401955-387e-45ce-b126-cd132af5b20c", + "service": "ACR", "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", + "text": "Use up-to-date platforms, languages, protocols and frameworks", "waf": "Security" }, { - "checklist": "SAP 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", - "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.BotService/botServices", + "checklist": "Azure Bot Service", + "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", + "service": "Bot service", + "severity": "Medium", + "text": "Follow reliability support recommendations in Azure Bot Service", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", - "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", - "service": "SAP", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", + "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", + "service": "Bot service", "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", - "waf": "Security" + "text": "Deploying bots with local data residency and regional compliance", + "waf": "Reliability" }, { - "checklist": "SAP Checklist", - "guid": "4935ada4-2223-4ece-a1b1-23181a541741", - "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", - "service": "SAP", - "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" - }, - { - "checklist": "SAP Checklist", - "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", - "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", - "service": "SAP", - "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" - }, - { - "checklist": "SAP Checklist", - "guid": "209d490d-a477-4784-84d1-16785d2fa56c", - "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", - "service": "SAP", - "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" - }, - { - "checklist": "SAP Checklist", - "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", - "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", - "service": "SAP", - "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" - }, - { - "checklist": "SAP 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", - "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" - }, - { - "checklist": "SAP 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", - "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" - }, - { - "checklist": "SAP Checklist", - "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", - "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" - }, - { - "checklist": "SAP 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", - "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": "SAP Checklist", - "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", - "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", - "service": "SAP", - "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", - "waf": "Security" - }, - { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", - "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", - "service": "Spring Apps", - "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": "Azure Spring Apps Review", - "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", - "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": "Azure Spring Apps Review", - "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", - "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", - "service": "Spring Apps", - "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": "Azure Spring Apps Review", - "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", - "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", - "service": "Spring Apps", - "severity": "Medium", - "text": "Use more than 1 app instance for your apps", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "7504c230-6035-4183-95a5-85762acc6075", - "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", - "service": "Spring Apps", - "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": "Azure Spring Apps Review", - "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", - "service": "Spring Apps", - "severity": "Medium", - "text": "Set up autoscaling in Spring Cloud Gateway", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "97411607-b6fd-4335-99d1-9885faf4e392", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", - "service": "Spring Apps", - "severity": "Low", - "text": "Enable autoscale for the apps with Standard consumption & dedicated plan.", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", - "link": "https://learn.microsoft.com/azure/spring-apps/overview", - "service": "Spring Apps", - "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" - }, - { - "checklist": "Identity Review Checklist", - "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", - "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", - "service": "Entra", - "severity": "Medium", - "text": "Use long-live revocable token, cache your token and acquire your silently using Microsoft Identity Library", - "waf": "Reliability" - }, - { - "checklist": "Identity Review Checklist", - "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", - "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", - "service": "AAD B2C", - "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" - }, - { - "checklist": "Identity Review 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", - "severity": "Medium", - "text": "Custom brand assets should be hosted on a CDN", - "waf": "Performance" - }, - { - "checklist": "Identity Review Checklist", - "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", - "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", - "service": "AAD B2C", - "severity": "Low", - "text": "Have multiple identiy providers (i.e., login with your microsoft, google, facebook accounts)", - "waf": "Reliability" - }, - { - "checklist": "Identity Review 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", - "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" - }, - { - "checklist": "Identity Review 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", - "severity": "Medium", - "text": "Don't replicate! Replication can create issues with directory synchronization", - "waf": "Reliability" - }, - { - "checklist": "Identity Review 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", - "severity": "Medium", - "text": "Have active-active for multi-regions", - "waf": "Reliability" - }, - { - "checklist": "Identity Review Checklist", - "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", - "severity": "Medium", - "text": "Add Azure AD Domain service stamps to additional regions and locations", - "waf": "Reliability" - }, - { - "checklist": "Identity Review Checklist", - "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "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", "severity": "Medium", - "text": "Use Replica Sets for DR", + "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" }, { @@ -2228,455 +1781,164 @@ "waf": "Security" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", - "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", - "service": "APIM", - "severity": "Medium", - "text": "Implement an error handling policy at the global level", - "waf": "Operations" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Medium", - "text": "Ensure all APIs policies include a element.", - "waf": "Operations" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", - "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", - "service": "APIM", - "severity": "Medium", - "text": "Use Policy Fragments to avoid repeating same policies definitions across multiple APIs", - "waf": "Operations" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", - "link": "https://learn.microsoft.com/azure/api-management/monetization-support", - "service": "APIM", - "severity": "Medium", - "text": "If you are planning to monetize your APIs, review the 'monetization support' article for best practices", - "waf": "Operations" + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Azure Functions", + "severity": "High", + "text": "Select the right Function hosting plan based on your business & SLO requirements", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "a7d0840a-c8c4-4e83-adec-5ca578eb4049", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", - "service": "APIM", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Azure Functions", "severity": "High", - "text": "Enable Diagnostics Settings to export logs to Azure Monitor", - "waf": "Operations" + "text": "Leverage Availability Zones where regionally applicable (not available for Consumption tier)", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", - "service": "APIM", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "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", "severity": "Medium", - "text": "Enable Application Insights for more detailed telemetry", - "waf": "Operations" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", - "service": "APIM", - "severity": "High", - "text": "Configure alerts on the most critical metrics", - "waf": "Operations" + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "Azure Functions", "severity": "High", - "text": "Ensure that custom SSL certificates are stored an Azure Key Vault so they can be securely accessed and updated", - "waf": "Security" + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "Azure Functions", "severity": "High", - "text": "Protect incoming requests to APIs (data plane) with Azure AD", - "waf": "Security" + "text": "Ensure 'Always On' is enabled for all Function Apps running on App Service Plan", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", - "service": "APIM", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "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", "severity": "Medium", - "text": "Use Microsoft Entra ID to authenticate users in the Developer Portal", - "waf": "Security" + "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.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", - "service": "APIM", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "Azure Functions", "severity": "Medium", - "text": "Create appropriate groups to control the visibility of the products", - "waf": "Security" + "text": "Leverage Azure DevOps or GitHub to streamline CI/CD and safeguard your Function App code", + "waf": "Operations" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "06862505-2d9a-4874-9491-2837b00a3475", - "link": "https://learn.microsoft.com/azure/api-management/backends", - "service": "APIM", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Cognitive Services Review 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", "severity": "Medium", - "text": "Use Backends feature to eliminate redundant API backend configurations", - "waf": "Operations" + "text": "Leverage FTA HandBook for Cognitive Services", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", - "service": "APIM", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Cognitive Services Review 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", "severity": "Medium", - "text": "Use Named Values to store common values that can be used in policies", - "waf": "Operations" + "text": "Backup Your Prompts", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", - "service": "APIM", - "severity": "Medium", - "text": "For DR, leverage the premium tier with deployments scaled across two or more regions for 99.99% SLA", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Cognitive Services Review 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", + "severity": "High", + "text": "Business Continuity and Disaster Recovery (BCDR) considerations with Azure OpenAI Service", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", - "link": "https://learn.microsoft.com/azure/api-management/high-availability", - "service": "APIM", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Cognitive Services Review Checklist", + "guid": "325af625-ca44-4e46-a5e2-223ace8bb123", + "link": "https://github.com/abacaj/chatgpt-backup#backup-your-chatgpt-conversations", + "service": "Cognitive Services", "severity": "Medium", - "text": "Deploy at least one unit in two or more availability zones for an increased SLA of 99.99%", + "text": "Backup Your ChatGPT conversations", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "High", - "text": "Ensure there is an automated backup routine", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Cognitive Services Review 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", + "severity": "Medium", + "text": "CI/CD for custom speech", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", - "link": "https://learn.microsoft.com/azure/api-management/retry-policy", - "service": "APIM", - "severity": "Medium", - "text": "Use Policies to add a fail-over backend URL and caching to reduce failing calls.", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Cognitive Services Review Checklist", + "guid": "3687a046-7a1f-4893-9bda-43324f248116", + "link": "https://learn.microsoft.com/azure/ai-services/qnamaker/tutorials/export-knowledge-base", + "service": "Cognitive Services", + "severity": "Low", + "text": "Move a knowledge base using export-import", "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", - "service": "APIM", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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", "severity": "Low", - "text": "If you need to log at high performance levels, consider Event Hubs policy", - "waf": "Operations" + "text": "Refer to baseline highly available zone-redundant web application architecture for best practices", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", - "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", - "service": "APIM", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", + "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", + "service": "App Services", "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": "Use Premium and Standard tiers. These tiers support staging slots and automated backups.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", - "service": "APIM", - "severity": "Medium", - "text": "Configure autoscaling to scale out the number of instances when the load increases", - "waf": "Performance" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", - "service": "APIM", - "severity": "Medium", - "text": "Deploy self-hosted gateways where Azure doesn't have a region close to the backend APIs.", - "waf": "Performance" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", - "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", - "service": "APIM", - "severity": "Medium", - "text": "Use the premium tier for production workloads.", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "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.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "High", - "text": "Be aware of APIM's limits", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", - "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", - "service": "APIM", - "severity": "High", - "text": "Ensure that the self-hosted gateway deployments are resilient.", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "7519e385-a88b-4d34-966b-6269d686e890", - "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", - "service": "APIM", - "severity": "Medium", - "text": "Use Azure Front Door in front of APIM for multi-region deployment", - "waf": "Performance" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Medium", - "text": "Deploy the service within a Virtual Network (VNet)", - "waf": "Security" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Medium", - "text": "Deploy network security groups (NSG) to your subnets to restrict or monitor traffic to/from APIM.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Medium", - "text": "Deploy Private Endpoints to filter incoming traffic when APIM is not deployed to a VNet.", - "waf": "Security" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "High", - "text": "Disable Public Network Access", - "waf": "Security" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", - "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", - "service": "APIM", - "severity": "Medium", - "text": "Simplify management with PowerShell automation scripts", - "waf": "Operations" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Medium", - "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": "Azure API Management Review", - "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", - "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", - "service": "APIM", - "severity": "Medium", - "text": "Promote usage of Visual Studio Code APIM extension for faster API development", - "waf": "Operations" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "354f1c03-8112-4965-85ad-c0074bddf231", - "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", - "service": "APIM", - "severity": "Medium", - "text": "Implement DevOps and CI/CD in your workflow", - "waf": "Operations" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "b6439493-426a-45f3-9697-cf65baee208d", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", - "service": "APIM", - "severity": "Medium", - "text": "Secure APIs using client certificate authentication", - "waf": "Security" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "2a67d143-1033-4c0a-8732-680896478f08", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", - "service": "APIM", - "severity": "Medium", - "text": "Secure backend services using client certificate authentication", - "waf": "Security" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", - "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", - "service": "APIM", - "severity": "Medium", - "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": "Azure API Management Review", - "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", - "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", - "service": "APIM", - "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": "Azure API Management Review", - "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", - "service": "APIM", - "severity": "High", - "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": "Azure API Management Review", - "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", - "severity": "High", - "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": "Azure API Management Review", - "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", - "severity": "Medium", - "text": "Use managed identities to authenticate to other Azure resources whenever possible", - "waf": "Security" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "High", - "text": "Use web application firewall (WAF) by deploying Application Gateway in front of APIM", - "waf": "Security" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", - "severity": "Low", - "text": "Refer to baseline highly available zone-redundant web application architecture for best practices", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", - "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", - "service": "App Services", - "severity": "Medium", - "text": "Use Premium and Standard tiers. These tiers support staging slots and automated backups.", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", - "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", - "service": "App Services", - "severity": "High", - "text": "Leverage Availability Zones where regionally applicable (requires Premium v2 or v3 tier)", - "waf": "Reliability" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", + "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", + "service": "App Services", + "severity": "High", + "text": "Leverage Availability Zones where regionally applicable (requires Premium v2 or v3 tier)", + "waf": "Reliability" }, { "arm-service": "microsoft.web/sites", @@ -3069,1310 +2331,2059 @@ "waf": "Security" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review Checklist", - "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", - "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", - "service": "Azure MySQL", - "severity": "Medium", - "text": "Leverage Flexible Server", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "Medium", + "text": "Consider the 'Azure security baseline for storage'", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "High", + "text": "Consider using private endpoints for Azure Storage", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "Medium", + "text": "Ensure older storage accounts are not using 'classic deployment model'", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "High", + "text": "Enable Microsoft Defender for all of your storage accounts", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "Medium", + "text": "Enable 'soft delete' for blobs", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "Medium", + "text": "Disable 'soft delete' for blobs", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "High", + "text": "Enable 'soft delete' for containers", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "Medium", + "text": "Disable 'soft delete' for containers", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "High", + "text": "Enable resource locks on storage accounts", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "High", + "text": "Consider immutable blobs", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "High", + "text": "Require HTTPS, i.e. disable port 80 on the storage account", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "High", + "text": "When enforcing HTTPS (disabling HTTP), check that you do not use custom domains (CNAME) for the storage account.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "Medium", + "text": "Limit shared access signature (SAS) tokens to HTTPS connections only", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "High", + "text": "Use Azure Active Directory (Azure AD) tokens for blob access", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "Medium", + "text": "Least privilege in IaM permissions", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "High", + "text": "When using SAS, prefer 'user delegation SAS' over storage-account-key based SAS.", + "waf": "Security" + }, + { + "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. ", + "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.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "High", + "text": "Consider using Azure Monitor to audit control plane operations on the storage account", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "Medium", + "text": "When using storage account keys, consider enabling a 'key expiration policy'", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "Medium", + "text": "Consider configuring an SAS expiration policy", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "Medium", + "text": "Consider linking SAS to a stored access policy", + "waf": "Security" + }, + { + "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": "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.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "High", + "text": "Consider storing connection strings in Azure KeyVault (in scenarios where managed identities are not possible)", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "High", + "text": "Strive for short validity periods for ad-hoc SAS", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "Medium", + "text": "Apply a narrow scope to a SAS", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "Medium", + "text": "Consider scoping SAS to a specific client IP address, wherever possible", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "Low", + "text": "Consider checking uploaded data, after clients used a SAS to upload a file. ", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "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.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": "Medium", + "text": "SFTP: The SFTP endpoint does not support POSIX-like ACLs.", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "High", + "text": "Avoid overly broad CORS policies", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Storage Review 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", + "severity": "High", + "text": "Determine how data at rest should be encrypted. Understand the thread model for data.", + "waf": "Security" + }, + { + "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": "Medium", + "text": "Determine which/if platform encryption should be used.", + "waf": "Security" + }, + { + "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": "Medium", + "text": "Determine which/if client-side encryption should be used.", + "waf": "Security" + }, + { + "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.", + "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. ", + "waf": "Security" + }, + { + "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": "High", + "text": "Leverage a storagev2 account type for better performance and reliability", + "waf": "Reliability" + }, + { + "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": "High", + "text": "Leverage GRS, ZRS or GZRS storage for the highest availability", + "waf": "Reliability" + }, + { + "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": "Medium", + "text": "For write operation after failover, use customer-Managed Failover ", + "waf": "Reliability" + }, + { + "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": "Medium", + "text": "Understand Microsoft-Managed Failover details", + "waf": "Reliability" + }, + { + "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": "Medium", + "text": "Enable Soft Delete", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", + "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.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", + "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.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", + "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.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", + "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.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", + "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.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", + "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.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", + "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.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", + "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/", + "waf": "Security" + }, + { + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "31d41e36-11c8-417b-8afb-c410d4391898", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-AEH_v1.docx", + "service": "Event Hubs", + "severity": "Medium", + "text": "Leverage FTA Resillency HandBook", "waf": "Reliability" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review 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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", + "severity": "High", + "text": "Leverage Availability Zones if regionally applicable", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "20b56c56-ad58-4519-8f82-735c586bb281", + "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", + "service": "Event Hubs", + "severity": "Medium", + "text": "Use the Premium or Dedicated SKUs for predicable performance", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", + "severity": "High", + "text": "Plan for Geo Disaster Recovery using Active Passive configuration", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "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", + "severity": "Medium", + "text": "For Business Critical Applications, use Active Active configuration", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", + "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", + "service": "Event Hubs", + "severity": "Medium", + "text": "Design Resilient Event Hubs", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "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": "Azure Application Delivery Networking", + "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", + "severity": "Medium", + "text": "Ensure you are using Application Gateway v2 SKU", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medium", + "text": "Ensure you are using the Standard SKU for your Azure Load Balancers", + "waf": "Security" + }, + { + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "guid": "9432621a-8397-4654-a882-5bc856b7ef83", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", + "service": "Load Balancer", + "severity": "Medium", + "text": "Ensure your Load Balancers frontend IP addresses are zone-redundant (unless you require zonal frontends).", + "waf": "Security" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "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.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "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" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "App Gateway", + "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.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "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" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medium", + "text": "Deploy Application Gateway across Availability Zones", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Front Door", + "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.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "3f29812b-2363-4cef-b179-b599de0d5973", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "Front Door", + "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" + }, + { + "ammp": true, + "arm-service": "microsoft.network/trafficManagerProfiles", + "checklist": "Azure Application Delivery Networking", + "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Traffic Manager", + "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" + }, + { + "checklist": "Azure Application Delivery Networking", + "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "Entra", + "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" + }, + { + "checklist": "Azure Application Delivery Networking", + "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "Entra", + "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" + }, + { + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "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" + }, + { + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "High", - "text": "Leverage Availability Zones where regionally applicable", - "waf": "Reliability" + "text": "Avoid combining Azure Traffic Manager and Azure Front Door.", + "waf": "Security" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review 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", - "severity": "Medium", - "text": "Leverage Data-in replication for cross-region DR scenarios", - "waf": "Reliability" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "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", - "checklist": "Azure Data Explorer Review 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", - "text": "Leverage External Tables and Continuous data export overview to reduce costs", - "waf": "Reliability" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "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", - "checklist": "Azure Data Explorer Review 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", - "text": "To share data, explore Leader-follower cluster configuration", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", + "service": "Front Door", + "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", - "checklist": "Azure Data Explorer Review 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", - "text": "To protect against regional failure, create Multiple independent clusters, preferably in two Azure Paired regions", - "waf": "Reliability" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "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.Kusto/clusters", - "checklist": "Azure Data Explorer Review 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", - "text": "Replicate all management activities such as creating new tables or managing user roles on each cluster.", + "ammp": true, + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "High", + "text": "Use Azure NAT Gateway instead of Load Balancer outbound rules for better SNAT scalability", "waf": "Reliability" }, { - "arm-service": "Microsoft.Kusto/clusters", - "checklist": "Azure Data Explorer Review Checklist", - "guid": "18ca6017-0265-4f4b-a46a-393af7f31728", - "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-create-solution", - "service": "Azure Data Explorer", - "text": "Ingest data into each cluster in parallel", - "waf": "Reliability" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "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.Kusto/clusters", - "checklist": "Azure Data Explorer Review 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", - "text": "For critical application with no tolerance for outages, create Active-Active-Active (always-on) configuration", - "waf": "Reliability" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "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" }, { - "arm-service": "Microsoft.Kusto/clusters", - "checklist": "Azure Data Explorer Review 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", - "text": "For critical applications, create Active-Active configuration in two paired regions", - "waf": "Reliability" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", + "service": "Front Door", + "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.Kusto/clusters", - "checklist": "Azure Data Explorer Review 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", - "text": "For applications, which required only read during failure, create Active-Hot standby configuration", - "waf": "Reliability" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", + "service": "Front Door", + "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.Kusto/clusters", - "checklist": "Azure Data Explorer Review 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", - "text": "For applications, where cost is a concern and can withstand some downtime during failure, create on-demand data recovery cluster configuration", - "waf": "Reliability" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", + "service": "Front Door", + "severity": "High", + "text": "Enable the Azure Front Door WAF. Protect your application from a range of attacks.", + "waf": "Security" }, { - "arm-service": "Microsoft.Kusto/clusters", - "checklist": "Azure Data Explorer Review 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", - "text": "Wrap DevOps and source control around all your code", - "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", - "waf": "Reliability" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "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.Kusto/clusters", - "checklist": "Azure Data Explorer Review Checklist", - "guid": "1559ab91-53e8-4908-ae28-b84c33b6b780", - "link": "https://learn.microsoft.com/azure/data-explorer/devops", - "service": "Azure Data Explorer", - "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" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "High", + "text": "Enable request body inspection feature enabled in Azure Front Door WAF policy.", + "waf": "Security" }, { - "arm-service": "Microsoft.Kusto/clusters", - "checklist": "Azure Data Explorer Review Checklist", - "guid": "8b9fe5c4-1049-4d40-9a82-2c3474d00f18", - "link": "https://learn.microsoft.com/azure/data-explorer/devops", - "service": "Azure Data Explorer", - "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" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "High", + "text": "Enable the Azure Front Door WAF default rule sets. The default rule sets detect and block common attacks.", + "waf": "Security" }, { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency checklist", - "guid": "65285269-440b-44be-9d3e-0844276d4bdc", - "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-zone-redundancy", - "service": "Redis", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "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" + "text": "Enable the Azure Front Door WAF bot protection rule set. The bot rules detect good and bad bots.", + "waf": "Security" }, { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency 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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "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" + "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.cache/redis", - "checklist": "Redis Resiliency 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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "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": "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.cache/redis", - "checklist": "Redis Resiliency checklist", - "guid": "a8c26c9b-32ab-45bd-bc69-98a135e33789", - "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-geo-replication", - "service": "Redis", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "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" + "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", - "checklist": "Azure Event Hub Review", - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "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/", + "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", - "checklist": "Azure Event Hub Review", - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "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/", + "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", - "checklist": "Azure Event Hub Review", - "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", - "severity": "Medium", - "text": "Avoid using root account when it is not necessary", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "High", + "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", - "checklist": "Azure Event Hub Review", - "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", - "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/", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "High", + "text": "Enable request body inspection feature enabled in Azure Application Gateway WAF policy.", "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", + "service": "App Gateway", "severity": "High", - "text": "Use least privilege data plane RBAC", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "text": "Tune the Azure Application Gateway WAF in detection mode for your workload. Reduce false positive detections.", "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", - "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/", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "High", + "text": "Deploy your WAF policy for Application Gateway in 'Prevention' mode.", "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", + "service": "App Gateway", "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": "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.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "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": "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.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "31d41e36-11c8-417b-8afb-c410d4391898", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-AEH_v1.docx", - "service": "Event Hubs", - "severity": "Medium", - "text": "Leverage FTA Resillency HandBook", - "waf": "Reliability" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "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", - "checklist": "Azure Event Hub Review", - "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", - "severity": "High", - "text": "Leverage Availability Zones if regionally applicable", - "waf": "Reliability" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", + "service": "App Gateway", + "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.", + "waf": "Security" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "20b56c56-ad58-4519-8f82-735c586bb281", - "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", - "service": "Event Hubs", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Medium", - "text": "Use the Premium or Dedicated SKUs for predicable performance", - "waf": "Reliability" + "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.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", - "severity": "High", - "text": "Plan for Geo Disaster Recovery using Active Passive configuration", - "waf": "Reliability" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medium", + "text": "Add diagnostic settings to save your Azure Application Gateway WAF logs.", + "waf": "Operations" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Medium", - "text": "For Business Critical Applications, use Active Active configuration", - "waf": "Reliability" + "text": "Add diagnostic settings to save your Azure Front Door WAF logs.", + "waf": "Operations" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", - "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", - "service": "Event Hubs", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Medium", - "text": "Design Resilient Event Hubs", - "waf": "Reliability" + "text": "Send Azure Application Gateway WAF logs to Microsoft Sentinel.", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", - "service": "AVS", - "severity": "High", - "text": "Ensure ADDS domain controller(s) are deployed in the identity subscription in native Azure", - "waf": "Security" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medium", + "text": "Send Azure Front Door WAF logs to Microsoft Sentinel.", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "75089c20-990d-4927-b105-885576f76fc2", - "service": "AVS", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "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", - "waf": "Security" + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", - "service": "AVS", - "severity": "High", - "text": "Ensure that vCenter is connected to ADDS to enable authentication based on 'named user accounts'", - "waf": "Security" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", + "service": "App Gateway", + "severity": "Medium", + "text": "Use WAF Policies instead of the legacy WAF configuration.", + "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", - "service": "AVS", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", + "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", + "service": "App Gateway", "severity": "Medium", - "text": "Ensure that the connection from vCenter to ADDS is using a secure protocol (LDAPS)", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", - "service": "AVS", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", + "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", + "service": "Front Door", "severity": "Medium", - "text": "CloudAdmin account in vCenter IdP is used only as an emergency account (break-glass)", + "text": "Make sure your origins only take traffic from your Azure Front Door instance.", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", - "service": "AVS", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", + "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", + "service": "App Gateway", "severity": "High", - "text": "Ensure that NSX-Manager is integrated with an external Identity provider (LDAPS)", + "text": "You should encrypt traffic to the backend servers.", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", - "service": "AVS", - "severity": "Medium", - "text": "Has an RBAC model been created for use within VMware vSphere", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", + "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", + "service": "App Gateway", + "severity": "High", + "text": "You should use a Web Application Firewall.", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", - "service": "AVS", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", + "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", + "service": "App Gateway", "severity": "Medium", - "text": "RBAC permissions should be granted on ADDS groups and not on specific users", + "text": "Redirect HTTP to HTTPS", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", - "service": "AVS", - "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.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medium", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", - "service": "AVS", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", + "service": "App Gateway", "severity": "High", - "text": "Ensure all custom roles are scoped with CloudAdmin permitted authorizations", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", - "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", - "service": "AVS", - "severity": "High", - "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": "Azure VMware Solution Design Review", - "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", - "service": "AVS", - "severity": "High", - "text": "Ensure ExpressRoute or VPN connections from on-premises to Azure are monitored using 'connection monitor'", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", + "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", + "service": "App Gateway", + "severity": "Low", + "text": "Create custom error pages to display a personalized user experience", "waf": "Operations" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", - "service": "AVS", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", + "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", + "service": "App Gateway", "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": "Edit HTTP requests and response headers for easier routing and information exchange between the client and server", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", - "service": "AVS", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "App Gateway", "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": "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.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", - "service": "AVS", - "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.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "29dcc19f-a8fa-4c35-8281-290577538793", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "App Gateway", + "severity": "Medium", + "text": "Use transport layer load balancing", + "waf": "Performance" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", - "service": "AVS", - "severity": "High", - "text": "Is Privileged Identity Management implemented for roles managing the Azure VMware Solution resource in the Azure Portal (no standing permissions allowed)", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", + "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", + "service": "App Gateway", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", - "service": "AVS", - "severity": "High", - "text": "Privileged Identity Management audit reporting should be implemented for the Azure VMware Solution PIM roles", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", + "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", + "service": "App Gateway", + "severity": "Medium", + "text": "Centralize SSL certificate management to reduce encryption and decryption overhead from a backend server farm", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", - "service": "AVS", - "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)", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", + "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", + "service": "App Gateway", + "severity": "Low", + "text": "Use Application Gateway for native support for WebSocket and HTTP/2 protocols", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", + "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", + "service": "Logic Apps", "severity": "High", - "text": "Limit use of CloudAdmin account to emergency access only", - "waf": "Security" + "text": "Select the right Logic App hosting plan based on your business & SLO requirements", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", - "service": "AVS", - "severity": "Medium", - "text": "Create custom RBAC roles in vCenter to implement a least-privilege model inside vCenter", - "waf": "Security" + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps 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", + "severity": "High", + "text": "Protect logic apps from region failures with zone redundancy and availability zones", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", - "service": "AVS", - "severity": "Medium", - "text": "Is a process defined to regularly rotate cloudadmin (vCenter) and admin (NSX) credentials", - "waf": "Security" + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps 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", + "severity": "High", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", + "link": "https://learn.microsoft.com/azure/app-service/environment/intro", + "service": "Logic Apps", "severity": "High", - "text": "Use a centralized identity provider to be used for workloads (VM's) running on Azure VMware Solution", - "waf": "Security" + "text": "If deploying to an Isolated environment, use or migrate to App Service Environment (ASE) v3", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", + "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", + "service": "Logic Apps", "severity": "Medium", - "text": "Is East-West traffic filtering implemented within NSX-T", - "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "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" + "text": "Follow Metaprompting guardrails for resonsible AI", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", + "link": "https://github.com/Azure-Samples/AI-Gateway", + "service": "Azure OpenAI", "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": "Azure VMware Solution Design Review", - "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", - "service": "AVS", - "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" + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "334fdf91-c234-4182-a652-75269440b4be", - "service": "AVS", - "severity": "Medium", - "text": "Is DDoS standard protection enabled on ExR/VPN Gateway subnet in Azure", - "waf": "Security" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "High", + "text": "Enable monitoring for your AOAI instances", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", - "service": "AVS", - "severity": "Medium", - "text": "Use a dedicated privileged access workstation (PAW) to manage Azure VMware Solution, vCenter, NSX manager and HCX manager", - "waf": "Security" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "697cb391-ed16-4b2d-886f-0a0241addde6", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", - "service": "AVS", - "severity": "Medium", - "text": "Enable Advanced Threat Detection (Microsoft Defender for Cloud aka ASC) for workloads running on Azure VMware Solution", - "waf": "Security" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "Azure OpenAI", + "severity": "High", + "text": "Monitor token usage to prevent service disruptions due to capacity", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "Azure OpenAI", "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" + "text": "observe metrics like processed inference tokens, generated completion tokens monitor for rate limit", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "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" + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "a3592718-e6e2-4051-9267-6ae46691e883", - "service": "AVS", - "severity": "Low", - "text": "When in-guest encryption is used, store encryption keys in Azure Key vault when possible", - "waf": "Security" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", + "link": "https://github.com/Azure-Samples/openai-enterprise-iac", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "5ac94222-3e13-4810-9230-81a941741583", - "service": "AVS", - "severity": "Medium", - "text": "Consider using extended security update support for workloads running on Azure VMware Solution (Azure VMware Solution is eligible for ESU)", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "4350d092-d234-4292-a752-8537a551c5bf", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", + "service": "Azure OpenAI", + "severity": "High", + "text": "Use Microsoft Entra Authentication with Managed Identity instead of API Key", "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "High", - "text": "Ensure that the appropriate vSAN Data redundancy method is used (RAID specification)", - "waf": "Reliability" + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "d88408f3-7273-44c8-96ba-280214590146", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "High", - "text": "Ensure that the Failure-to-tolerate policy is in place to meet your vSAN storage needs", - "waf": "Reliability" + "text": "Evaluate usage of Provisioned throughput model ", + "waf": "Performance" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", + "service": "Azure OpenAI", "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": "Azure VMware Solution Design Review", - "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", - "service": "AVS", - "severity": "Medium", - "text": "Ensure that access constraints to ESXi are understood, there are access limits which might affect 3rd party solutions.", - "waf": "Operations" + "text": "Review and implement Azure AI content safety", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1193846d-697c-4b39-8ed1-6b2d186f0a02", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#system-level-throughput", + "service": "Azure OpenAI", + "severity": "High", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", + "service": "Azure OpenAI", "severity": "Medium", - "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": "Azure VMware Solution Design Review", - "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", - "service": "AVS", - "severity": "Low", - "text": "Are Azure reserved instances used to optimize cost for using Azure VMware Solution", - "waf": "Cost" + "text": "Improve latency of the system by limiting token sizes, streaming options", + "waf": "Performance" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6691e883-5ac9-4422-83e1-3810523081a9", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "service": "Azure OpenAI", "severity": "Medium", - "text": "Consider the use of Azure Private-Link when using other Azure Native Services", - "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "5bda4332-4f24-4811-9331-82ba51752694", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "Azure OpenAI", "severity": "High", - "text": "Ensure all required resource reside within the same Azure availability zone(s)", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", - "service": "AVS", - "severity": "Medium", - "text": "Enable Microsoft Defender for Cloud for Azure VMware Solution guest VM workloads", - "waf": "Security" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Medium", - "text": "Use Azure Arc enabled servers to manage your Azure VMware Solution guest VM workloads", - "waf": "Security" + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", + "service": "Azure OpenAI", "severity": "High", - "text": "Enable Diagnostic and metric logging on Azure VMware Solution", - "waf": "Operations" + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e9951904-8384-45c9-a6cb-2912156a1147", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "Azure OpenAI", "severity": "Medium", - "text": "Deploy the Log Analytics Agents to Azure VMware Solution guest VM workloads", - "waf": "Operations" + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "589d457a-927c-4397-9d11-02cad6aae11e", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "Low", + "text": "Deploy multiple OAI instances across regions", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ee29711b-d352-4caa-ab79-b198dab81932", - "service": "AVS", - "severity": "Medium", - "text": "Use Microsoft Defender for Cloud for compliance monitoring of workloads running on Azure VMware Solution", - "waf": "Security" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "High", + "text": "Implement retry & healthchecks with Gateway pattern like APIM", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Medium", - "text": "Are the applicable compliance baselines added to Microsoft Defender for Cloud", - "waf": "Security" + "text": "Ensure having adequate quotas of TPM & RPM for the workload", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", - "service": "AVS", - "severity": "High", - "text": "Was data residency evaluated when selecting Azure regions to use for Azure VMware Solution deployment", - "waf": "Security" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", + "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", + "service": "Azure OpenAI", + "severity": "Medium", + "text": "Review the considerations in HAI toolkit guidance and apply those interaction practices for the slution", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", - "service": "AVS", - "severity": "High", - "text": "Are data processing implications (service provider / service consumer model) clear and documented", - "waf": "Security" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7f154e3a-a369-4282-ae7e-316183687a04", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", + "service": "Azure OpenAI", + "severity": "Medium", + "text": "Deploy separate fine tuned models across regions if finetuning is employed", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "547c1747-dc56-4068-a714-435cd19dd244", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "77a1f893-5bda-4433-84f2-4811633182ba", + "link": "https://learn.microsoft.com/azure/backup/backup-overview", + "service": "Azure OpenAI", "severity": "Medium", - "text": "Consider using CMK (Customer Managed Key) for vSAN only if needed for compliance reason(s).", - "waf": "Security" + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "High", - "text": "Create dashboards to enable core Azure VMware Solution monitoring insights", - "waf": "Operations" + "text": "Azure AI search service tiers should be choosen to have a SLA ", + "waf": "Reliability" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", + "link": "https://learn.microsoft.com/purview/purview", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "9659e396-80e7-4828-ac93-5657d02bff45", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "4fda1dbf-3dd9-45d4-ac7c-891dca1f6d56", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/use-your-data-securely", + "service": "Azure OpenAI", "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": "Encrypt data used for RAG with SSE/Disk encryption with optional BYOK", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", + "link": "https://learn.microsoft.com/azure/search/search-security-overview", + "service": "Azure OpenAI", "severity": "High", - "text": "Ensure alerts are configured for Azure Service Health alerts and notifications", - "waf": "Operations" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", - "service": "AVS", - "severity": "Medium", - "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": "Azure VMware Solution Design Review", - "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", - "service": "AVS", - "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" + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7b94ef6e-047d-42ea-8992-b1cd6e2054b2", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", + "service": "Azure OpenAI", "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", + "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", + "service": "Azure OpenAI", "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", - "service": "AVS", - "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" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", - "service": "AVS", - "severity": "Medium", - "text": "Ensure workloads running on Azure VMware Solution are monitored using Azure Log Analytics and Azure Monitor", - "waf": "Operations" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", + "service": "Azure OpenAI", + "severity": "High", + "text": "Implement Prompt shields and groundedness detection using Content Safety ", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", - "service": "AVS", - "severity": "Medium", - "text": "Include workloads running on Azure VMware Solution in existing update management tooling or in Azure Update Management", - "waf": "Operations" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", + "link": "https://learn.microsoft.com/azure/compliance/", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", + "service": "Azure OpenAI", "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", - "service": "AVS", - "severity": "Medium", - "text": "Ensure workloads running on Azure VMware Solution are onboarded to Microsoft Defender for Cloud", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", + "service": "Azure OpenAI", "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", + "service": "Azure OpenAI", "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", - "service": "AVS", - "severity": "Medium", - "text": "Use Azure Site Recovery when the Disaster Recovery technology is native Azure IaaS", - "waf": "Reliability" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3571449a-b805-43d8-af89-dc7b33be2a1a", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", + "service": "Azure OpenAI", "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "8255461e-2aee-4345-9aec-8339248b262d", - "service": "AVS", - "severity": "Medium", - "text": "Use the geopolitical region pair as the secondary disaster recovery environment", - "waf": "Reliability" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "High", + "text": "Configure private endpoint for AI services to restrict service access within your network", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", + "service": "Azure OpenAI", "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", - "service": "AVS", - "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" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", + "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", + "service": "Azure OpenAI", "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", - "service": "AVS", - "severity": "Medium", - "text": "Deploy your backup solution in the same region as your Azure VMware Solution private cloud", - "waf": "Reliability" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Medium", - "text": "Deploy your backup solution outside of vSan, on Azure native components", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", - "service": "AVS", - "severity": "Low", - "text": "Is a process in place to request a restore of the VMware components managed by the Azure Platform?", - "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", - "service": "AVS", - "severity": "Low", - "text": "For manual deployments, all configuration and deployments must be documented", - "waf": "Operations" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "93555620-2bfe-4456-9b0d-834a348b263e", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", + "service": "Azure OpenAI", "severity": "Low", - "text": "For automated deployments, deploy a minimal private cloud and scale as needed", - "waf": "Operations" + "text": "Azure AI Services are properly tagged for better management", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", + "service": "Azure OpenAI", "severity": "Low", - "text": "For automated deployments, request or reserve quota prior to starting the deployment", - "waf": "Operations" + "text": "Azure AI Service accounts follows organizational naming conventions", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", + "service": "Azure OpenAI", + "severity": "High", + "text": "Diagnostic logs in Azure AI services resources should be enabled", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "link": "https://learn.microsoft.com/azure/ai-services/authentication", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "255461e2-aee3-4553-afc8-339248b262d6", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "adfe27be-e297-401a-a352-baaab79b088d", + "link": "https://github.com/openai/tiktoken", + "service": "Azure OpenAI", + "severity": "High", + "text": "Use tiktoken to understand token sizes for token optimizations in conversational mode", + "waf": "Cost Optimization" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", - "service": "AVS", - "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" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", + "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", - "service": "AVS", - "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" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e29711b1-352b-4eee-879b-588defc4972c", + "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Medium", - "text": "Consider and validate scaling operations on 3rd party solutions used in the architecture (supported or not)", - "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", - "service": "AVS", - "severity": "Medium", - "text": "Define and enforce scale in/out maximum limits for your environment in the automations", - "waf": "Performance" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "service": "Azure OpenAI", + "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", + "service": "Azure OpenAI", "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 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", - "checklist": "Azure VMware Solution Design Review", - "guid": "c5972cd4-cd21-4b07-9036-f5e6b4bfd3d5", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", - "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" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "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" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "be1f38cf-03a8-422b-b463-cbbbc8ac299e", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", + "link": "https://learn.microsoft.com/azure/search/search-reliability", + "service": "Azure OpenAI", + "severity": "Medium", + "text": "Review the guidance provided on setting up AI search for Reliability", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3266b225-86f4-4a16-92bd-ddea8a487cde", + "link": "https://learn.microsoft.com/azure/search/vector-search-index-size?tabs=portal-vector-quota", + "service": "Azure OpenAI", "severity": "Medium", - "text": "If using a VPN connection for migrations, adjust your MTU size accordingly.", - "waf": "Performance" + "text": "Plan and manage AI Search Vector storage", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e614658d-d457-4e92-9139-b821102cad6e", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Medium", - "text": "For low connectivity regions connecting into Azure (500Mbps or less), considering deploying the HCX WAN optimization appliance", - "waf": "Performance" + "text": "Apply LLMOps practices to automate the lifecycle management of your GenAI applications", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", - "service": "AVS", - "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.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "High", + "text": "Evaluate usage of billing models - PAYG vs PTU", + "waf": "Cost Optimization" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "Medium", + "text": "Evaluate the quality of prompts and applications when switching between model versions", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "bff4564b-0d93-44a3-98b2-63e7dd60513a", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "294798b1-578b-4219-a46c-eb5443513592", + "service": "Azure OpenAI", "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", - "checklist": "Azure VMware Solution Design Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "2744293b-b628-4537-a551-19b08e8f5854", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", + "service": "Azure OpenAI", "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", - "checklist": "Azure VMware Solution Design Review", - "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", - "severity": "High", - "text": "If using stretched cluster, ensure that your selected Disaster Recovery solution is supported by the vendor", - "waf": "Reliability" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "Medium", + "text": "Use prompt engineering techniques to improve the accuracy of LLM responses", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "AVS", - "severity": "High", - "text": "If using stretched cluster, ensure that the SLA provided will meet your requirements", - "waf": "Reliability" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e737897e-71ca-47da-acfa-962a1594946d", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", + "service": "Azure OpenAI", + "severity": "Medium", + "text": "Red team your GenAI applications", + "waf": "Security" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", - "service": "AVS", - "severity": "High", - "text": "If using stretched cluster, ensure that both ExpressRoute circuits are connected to your connectivity hub.", - "waf": "Reliability" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", + "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", + "service": "Azure OpenAI", + "severity": "Medium", + "text": "Provide end users with scoring options for LLM responses and track these scores. ", + "waf": "Operational Excellence" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", - "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", - "service": "AVS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "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", - "checklist": "Azure VMware Solution Design Review", - "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", - "service": "AVS", - "severity": "High", - "text": "Have site disaster tolerance settings been properly considered and changed for your business if needed.", - "waf": "Reliability" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", + "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", + "service": "Azure OpenAI", + "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", @@ -4425,3538 +4436,3486 @@ "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "Microsoft.App/containerApps", + "checklist": "Container Apps Review", + "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", "severity": "High", - "text": "Follow Metaprompting guardrails for resonsible AI", - "waf": "Operational Excellence" + "text": "Leverage Availability Zones if regionally applicable", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", - "link": "https://github.com/Azure-Samples/AI-Gateway", - "service": "Azure OpenAI", + "arm-service": "Microsoft.App/containerApps", + "checklist": "Container Apps Review", + "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", "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": "Use more than one replica and enable Zone Redundancy.", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "Microsoft.App/containerApps", + "checklist": "Container Apps Review", + "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", "severity": "High", - "text": "Enable monitoring for your AOAI instances", - "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", - "checklist": "Azure OpenAI Review", - "guid": "697cb391-ed16-4b2d-886f-0a0241addde6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", - "service": "Azure OpenAI", + "arm-service": "Microsoft.App/containerApps", + "checklist": "Container Apps Review", + "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", "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": "Use Front Door or Traffic Manager to route traffic to the closest region", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", + "arm-service": "Microsoft.DBforPostgreSQL/servers", + "checklist": "PostgreSQL Review Checklist", + "guid": "65285269-441c-44bf-9d3e-0844276d4bdc", + "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview", + "service": "PostgreSQL", + "severity": "Medium", + "text": "Leverage Flexible Server", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.DBforPostgreSQL/servers", + "checklist": "PostgreSQL Review Checklist", + "guid": "016ccf31-ae5a-41eb-9888-9535e227896d", + "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview#architecture-and-high-availability", + "service": "PostgreSQL", "severity": "High", - "text": "Monitor token usage to prevent service disruptions due to capacity", - "waf": "Operational Excellence" + "text": "Leverage Availability Zones where regionally applicable", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", + "arm-service": "Microsoft.DBforPostgreSQL/servers", + "checklist": "PostgreSQL Review 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", "severity": "Medium", - "text": "observe metrics like processed inference tokens, generated completion tokens monitor for rate limit", - "waf": "Operational Excellence" + "text": "Leverage cross-region read replicas for BCDR", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", + "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", + "service": "AKS", "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" + "text": "If required for AKS Windows workloads HostProcess containers can be used", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", - "link": "https://github.com/Azure-Samples/openai-enterprise-iac", - "service": "Azure OpenAI", - "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.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", + "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", + "service": "AKS", + "severity": "Low", + "text": "Use KEDA if running event-driven workloads", + "waf": "Performance" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "4350d092-d234-4292-a752-8537a551c5bf", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "Azure OpenAI", - "severity": "High", - "text": "Use Microsoft Entra Authentication with Managed Identity instead of API Key", - "waf": "Security" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", + "link": "https://dapr.io/", + "service": "AKS", + "severity": "Low", + "text": "Use Dapr to ease microservice development", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "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" + "text": "Use the SLA-backed AKS offering", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "High", - "text": "Evaluate usage of Provisioned throughput model ", - "waf": "Performance" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", + "severity": "Low", + "text": "Use Disruption Budgets in your pod and deployment definitions", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure AKS Review", + "guid": "3c763963-7a55-42d5-a15e-401955387e5c", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", + "service": "ACR", "severity": "High", - "text": "Review and implement Azure AI content safety", - "waf": "Operational Excellence" + "text": "If using a private registry, configure region replication to store images in multiple regions", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1193846d-697c-4b39-8ed1-6b2d186f0a02", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#system-level-throughput", - "service": "Azure OpenAI", - "severity": "High", - "text": "Define and evaluate the throughput of the system based on tokens & response per minute and align with requirements", - "waf": "Performance" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", + "service": "AKS", + "severity": "Low", + "text": "Use an external application such as kubecost to allocate costs to different users", + "waf": "Cost" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", - "service": "Azure OpenAI", - "severity": "Medium", - "text": "Improve latency of the system by limiting token sizes, streaming options", - "waf": "Performance" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", + "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", + "service": "AKS", + "severity": "Low", + "text": "Use scale down mode to delete/deallocate nodes", + "waf": "Cost" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", + "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", + "service": "AKS", "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" + "text": "When required use multi-instance partitioning GPU on AKS Clusters", + "waf": "Cost" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "5bda4332-4f24-4811-9331-82ba51752694", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", - "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" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", + "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", + "service": "AKS", + "severity": "Low", + "text": "If running a Dev/Test cluster use NodePool Start/Stop", + "waf": "Cost" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "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" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", - "service": "Azure OpenAI", - "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" + "text": "Use Azure Policy for Kubernetes to ensure cluster compliance", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e9951904-8384-45c9-a6cb-2912156a1147", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "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": "Separate applications from the control plane with user/system node pools", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", + "link": "https://learn.microsoft.com/azure/aks/use-system-pools", + "service": "AKS", "severity": "Low", - "text": "Deploy multiple OAI instances across regions", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "High", - "text": "Implement retry & healthchecks with Gateway pattern like APIM", - "waf": "Reliability" + "text": "Add taint to your system nodepool to make it dedicated", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", + "link": "https://learn.microsoft.com/azure/container-registry/", + "service": "AKS", "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", - "checklist": "Azure OpenAI Review", - "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", - "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure AKS Review", + "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", + "link": "https://learn.microsoft.com/azure/security-center/container-security", + "service": "ACR", "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", - "checklist": "Azure OpenAI Review", - "guid": "7f154e3a-a369-4282-ae7e-316183687a04", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", - "service": "Azure OpenAI", - "severity": "Medium", - "text": "Deploy separate fine tuned models across regions if finetuning is employed", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", + "service": "AKS", + "severity": "High", + "text": "Define app separation requirements (namespace/nodepool/cluster)", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "77a1f893-5bda-4433-84f2-4811633182ba", - "link": "https://learn.microsoft.com/azure/backup/backup-overview", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", + "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", + "service": "AKS", "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", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", + "link": "https://learn.microsoft.com/azure/aks/update-credentials", + "service": "AKS", "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.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", + "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", + "service": "AKS", + "severity": "Medium", + "text": "If required add Key Management Service etcd encryption", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", - "link": "https://learn.microsoft.com/purview/purview", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", + "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", + "service": "AKS", "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", + "text": "If required consider using Confidential Compute for AKS", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "4fda1dbf-3dd9-45d4-ac7c-891dca1f6d56", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/use-your-data-securely", - "service": "Azure OpenAI", - "severity": "High", - "text": "Encrypt data used for RAG with SSE/Disk encryption with optional BYOK", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", + "service": "AKS", + "severity": "Medium", + "text": "Consider using Defender for Containers", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", - "link": "https://learn.microsoft.com/azure/search/search-security-overview", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "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", + "text": "Use managed identities instead of Service Principals", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7b94ef6e-047d-42ea-8992-b1cd6e2054b2", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "Azure OpenAI", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Medium", + "text": "Integrate authentication with AAD (using the managed integration)", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", - "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", + "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", + "service": "AKS", "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": "Limit access to admin kubeconfig (get-credentials --admin)", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", + "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", + "service": "AKS", + "severity": "Medium", + "text": "Integrate authorization with AAD RBAC", + "waf": "Security" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", + "service": "AKS", "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", + "text": "Use namespaces for restricting RBAC privilege in Kubernetes", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", + "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", + "service": "AKS", "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": "For Pod Identity Access Management use Azure AD Workload Identity (preview)", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", - "service": "Azure OpenAI", - "severity": "High", - "text": "Implement Prompt shields and groundedness detection using Content Safety ", - "waf": "Operational Excellence" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", + "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", + "service": "AKS", + "severity": "Medium", + "text": "For AKS non-interactive logins use kubelogin (preview)", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", - "link": "https://learn.microsoft.com/azure/compliance/", - "service": "Azure OpenAI", - "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.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Medium", + "text": "Disable AKS local accounts", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", - "service": "Azure OpenAI", - "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.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Low", + "text": "Configure if required Just-in-time cluster access", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", - "service": "Azure OpenAI", - "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.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Low", + "text": "Configure if required AAD conditional access for AKS", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", - "service": "Azure OpenAI", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", + "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", + "service": "AKS", + "severity": "Low", + "text": "If required for Windows AKS workloads configure gMSA ", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "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", + "text": "For finer control consider using a managed Kubelet Identity", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", - "service": "Azure OpenAI", - "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.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", + "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", + "service": "AKS", + "severity": "Medium", + "text": "If using AGIC, do not share an AppGW across clusters", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3571449a-b805-43d8-af89-dc7b33be2a1a", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "High", - "text": "Apply RBAC to th data stores having embeddings and vectors and scope access based on role's access requirements", - "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", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", + "service": "AKS", + "severity": "Medium", + "text": "For Windows workloads use Accelerated Networking", + "waf": "Performance" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "High", - "text": "Configure private endpoint for AI services to restrict service access within your network", + "text": "Use the standard ALB (as opposed to the basic one)", + "waf": "Reliability" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Medium", + "text": "If using Azure CNI, consider using different Subnets for NodePools", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", - "service": "Azure OpenAI", - "severity": "High", - "text": "Enforce strict inbound and outbound traffic control with Azure Firewall and UDRs and limit the external integration points", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", + "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", + "service": "AKS", + "severity": "Medium", + "text": "Use Private Endpoints (preferred) or Virtual Network Service Endpoints to access PaaS services from the cluster", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "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": "Choose the best CNI network plugin for your requirements (Azure CNI recommended)", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", - "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", - "service": "Azure OpenAI", - "severity": "Medium", - "text": "Use prompt compression tools like LLMLingua or gprtrim", - "waf": "Cost Optimization" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", + "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", - "checklist": "Azure OpenAI Review", - "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "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": "If using Azure CNI, check the maximum pods/node (default 30)", + "waf": "Performance" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Low", + "text": "If using private-IP LoadBalancer services, use a dedicated subnet (not the AKS subnet)", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "93555620-2bfe-4456-9b0d-834a348b263e", - "service": "Azure OpenAI", - "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.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", + "severity": "High", + "text": "Size the service IP address range accordingly (it is going to limit the cluster scalability)", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", - "service": "Azure OpenAI", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", + "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", + "service": "AKS", + "severity": "Low", + "text": "If required add your own CNI plugin", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Low", - "text": "Azure AI Services are properly tagged for better management", - "waf": "Operational Excellence" + "text": "If required configure Public IP per node in AKS", + "waf": "Performance" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", - "service": "Azure OpenAI", - "severity": "Low", - "text": "Azure AI Service accounts follows organizational naming conventions", - "waf": "Operational Excellence" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", + "link": "https://learn.microsoft.com/azure/aks/concepts-network", + "service": "AKS", + "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", - "checklist": "Azure OpenAI Review", - "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", - "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", - "service": "Azure OpenAI", - "severity": "High", - "text": "Diagnostic logs in Azure AI services resources should be enabled", - "waf": "Operational Excellence" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", + "link": "https://learn.microsoft.com/azure/aks/nat-gateway", + "service": "AKS", + "severity": "Low", + "text": "Use Azure NAT Gateway as outboundType for scaling egress traffic", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", - "link": "https://learn.microsoft.com/azure/ai-services/authentication", - "service": "Azure OpenAI", - "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.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Medium", + "text": "Use Dynamic allocations of IPs in order to avoid Azure CNI IP exhaustion", + "waf": "Reliability" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "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", + "text": "Filter egress traffic with AzFW/NVA if your security requirements mandate it", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Azure OpenAI", - "severity": "High", - "text": "Regularly rotate and expire keys stored in Azure Key Vault to minimize the risk of unauthorized access.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Medium", + "text": "If using a public API endpoint, restrict the IP addresses that can access it", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "adfe27be-e297-401a-a352-baaab79b088d", - "link": "https://github.com/openai/tiktoken", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "High", - "text": "Use tiktoken to understand token sizes for token optimizations in conversational mode", - "waf": "Cost Optimization" + "text": "Use private clusters if your requirements mandate it", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", - "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", - "service": "Azure OpenAI", - "severity": "High", - "text": "Follow secure coding practices to prevent common vulnerabilities such as injection attacks, cross-site scripting (XSS), or security misconfigurations", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Medium", + "text": "For Windows 2019 and 2022 AKS nodes Calico Network Policies can be used ", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "High", - "text": "Setup a process to regularly update and patch the LLM libraries and other system components", + "text": "Enable a Kubernetes Network Policy option (Calico/Azure)", "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e29711b1-352b-4eee-879b-588defc4972c", - "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", "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.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Medium", - "text": "Understand difference in cost of base models and fine tuned models and token step sizes", - "waf": "Cost Optimization" + "text": "Use Kubernetes network policies to increase intra-cluster security", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", "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 a WAF for web workloads (UIs or APIs)", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "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": "Use DDoS Standard in the AKS Virtual Network", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "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" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Low", + "text": "If required add company HTTP Proxy", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", - "link": "https://learn.microsoft.com/azure/search/search-reliability", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", + "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", + "service": "AKS", "severity": "Medium", - "text": "Review the guidance provided on setting up AI search for Reliability", - "waf": "Operational Excellence" + "text": "Consider using a service mesh for advanced microservice communication management", + "waf": "Security" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3266b225-86f4-4a16-92bd-ddea8a487cde", - "link": "https://learn.microsoft.com/azure/search/vector-search-index-size?tabs=portal-vector-quota", - "service": "Azure OpenAI", - "severity": "Medium", - "text": "Plan and manage AI Search Vector storage", - "waf": "Operational Excellence" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", + "service": "AKS", + "severity": "High", + "text": "Configure alerts on the most critical metrics (see Container Insights for recommendations)", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Medium", - "text": "Apply LLMOps practices to automate the lifecycle management of your GenAI applications", - "waf": "Operational Excellence" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "337453a3-cc63-4963-9a65-22ac19e80696", + "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", + "service": "AKS", + "severity": "Low", + "text": "Check regularly Azure Advisor for recommendations on your cluster", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "High", - "text": "Evaluate usage of billing models - PAYG vs PTU", - "waf": "Cost Optimization" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", + "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", + "service": "AKS", + "severity": "Low", + "text": "Enable AKS auto-certificate rotation", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Medium", - "text": "Evaluate the quality of prompts and applications when switching between model versions", - "waf": "Operational Excellence" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", + "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", + "service": "AKS", + "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", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Medium", - "text": "Evaluate, monitor and refine your GenAI apps for features like groundedness, relevance, accuracy, coherence, fluency, �", - "waf": "Operational Excellence" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", + "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", + "service": "AKS", + "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", - "checklist": "Azure OpenAI Review", - "guid": "294798b1-578b-4219-a46c-eb5443513592", - "service": "Azure OpenAI", - "severity": "Medium", - "text": "Evaluate your Azure AI Search results based on different search parameters", - "waf": "Operational Excellence" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", + "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", + "service": "AKS", + "severity": "High", + "text": "Have a regular process to upgrade the cluster node images periodically (weekly, for example)", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "2744293b-b628-4537-a551-19b08e8f5854", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", - "service": "Azure OpenAI", - "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" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", + "service": "AKS", + "severity": "Low", + "text": "Consider gitops to deploy applications or cluster configuration to multiple clusters", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Medium", - "text": "Use prompt engineering techniques to improve the accuracy of LLM responses", - "waf": "Operational Excellence" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d7672c26-7602-4482-85a4-14527fbe855c", + "link": "https://learn.microsoft.com/azure/aks/command-invoke", + "service": "AKS", + "severity": "Low", + "text": "Consider using AKS command invoke on private clusters", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e737897e-71ca-47da-acfa-962a1594946d", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", - "service": "Azure OpenAI", - "severity": "Medium", - "text": "Red team your GenAI applications", - "waf": "Security" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", + "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", + "service": "AKS", + "severity": "Low", + "text": "For planned events consider using Node Auto Drain", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", - "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", - "service": "Azure OpenAI", - "severity": "Medium", - "text": "Provide end users with scoring options for LLM responses and track these scores. ", - "waf": "Operational Excellence" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", + "link": "https://learn.microsoft.com/azure/aks/faq", + "service": "AKS", + "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" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "High", - "text": "Consider Quota management practices", - "waf": "Cost Optimization" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Low", + "text": "Use custom Node RG (aka 'Infra RG') name", + "waf": "Operations" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", - "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", - "service": "Azure OpenAI", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", + "link": "https://kubernetes.io/docs/setup/release/notes/", + "service": "AKS", "severity": "Medium", - "text": "Use Load balancer solutions like APIM based gateway for balancing load and capacity across services and regions", - "waf": "Operational Excellence" + "text": "Do not use deprecated Kubernetes APIs in your YAML manifests", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "1fc2fc14-eea6-4e69-b8d9-a3edc218e687", - "link": "https://polite-sea-0995b240f.2.azurestaticapps.net/technical-delivery-playbook/azure-services/analytics/purview/", - "service": "Purview", - "severity": "Medium", - "text": "Leverage FTA Resillency Handbook", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", + "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", + "service": "AKS", + "severity": "Low", + "text": "Taint Windows nodes", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "ab067acb-49e5-4b96-8332-4ecf8cc13318", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", - "severity": "High", - "text": "Plan for Data Center level outage", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Low", + "text": "Keep windows containers patch level in sync with host patch level", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review 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", - "severity": "Medium", - "text": "Practice Failover for BCDR", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "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", - "checklist": "Microsoft Purview Review Checklist", - "guid": "97b15b8a-219a-44ab-bb57-879024d22678", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", - "severity": "High", - "text": "Plan a backup strategy and take regular backups", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", + "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", + "service": "AKS", + "severity": "Low", + "text": "If required use nodePool snapshots", + "waf": "Cost" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "6d20b56c-56a9-4581-89bf-8d8e5c586b7d", - "link": "https://learn.microsoft.com/purview/manage-kafka-dotnet", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", + "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", + "service": "AKS", "severity": "Low", - "text": "Use Microsoft Purview's Event Hubs to subscribe and create entities to another account", - "waf": "Reliability" + "text": "Consider spot node pools for non time-sensitive workloads", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "8cdc15ac-c075-4ee9-a130-a8889579e76b", - "link": "https://learn.microsoft.com/purview/deployment-best-practices", - "service": "Purview", - "severity": "Medium", - "text": "Follow Purview accounts architectures and deployment best practices", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Low", + "text": "Consider AKS virtual node for quick bursting", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "896e710a-7da7-4be9-a56d-14d3c49d997c", - "link": "https://learn.microsoft.com/purview/concept-best-practices-collections", - "service": "Purview", - "severity": "Medium", - "text": "Follow Collection Architectures and best practices", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", + "service": "AKS", + "severity": "High", + "text": "Monitor your cluster metrics with Container Insights (or other tools like Prometheus)", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "b3d1325a-a225-4c6f-9e06-85edddea8a4b", - "link": "https://learn.microsoft.com/purview/concept-best-practices-asset-lifecycle", - "service": "Purview", - "severity": "Medium", - "text": "Follow Assest lifecycle best practices", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "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", - "checklist": "Microsoft Purview Review Checklist", - "guid": "7cdeb3c6-1fc2-4fc1-9eea-6e69d8d9a3ed", - "link": "https://learn.microsoft.com/purview/concept-best-practices-automation", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", + "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", + "service": "AKS", "severity": "Medium", - "text": "Follow automation best practices", - "waf": "Reliability" + "text": "Monitor CPU and memory utilization of the nodes", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "c218e687-ab06-47ac-a49e-5b9603324ecf", - "link": "https://learn.microsoft.com/purview/disaster-recovery", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "1a4835ac-9422-423e-ae80-b123081a5417", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "severity": "Medium", - "text": "Follow Backup and Migration Best practices", - "waf": "Reliability" + "text": "If using Azure CNI, monitor % of pod IPs consumed per node", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "8cc13318-da61-4170-869f-4fb4aa3d3ef7", - "link": "https://learn.microsoft.com/purview/concept-best-practices-glossary", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Medium", - "text": "Follow Purview Glossary Best Practices", - "waf": "Reliability" + "text": "Monitor OS disk queue depth in nodes", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "f3176c4b-97b1-45b8-a219-a4abeb578790", - "link": "https://learn.microsoft.com/purview/concept-workflow", - "service": "Purview", - "severity": "Low", - "text": "Leverage Workflows ", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "be209d39-fda4-4777-a424-d116785c2fa5", + "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", + "service": "AKS", + "severity": "Medium", + "text": "If not using egress filtering with AzFW/NVA, monitor standard ALB allocated SNAT ports", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "24d22678-6d20-4b56-a56a-958119bf8d8e", - "link": "https://learn.microsoft.com/purview/concept-best-practices-security", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", + "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", + "service": "AKS", "severity": "Medium", - "text": "Follow Purview Security Best Practices", - "waf": "Reliability" + "text": "Subscribe to resource health notifications for your AKS cluster", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "5c586b7d-8cdc-415a-ac07-5ee9b130a888", - "link": "https://learn.microsoft.com/purview/concept-best-practices-lineage-azure-data-factory", - "service": "Purview", - "severity": "Medium", - "text": "Follow Purview Data Lineage Best Practices", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", + "severity": "High", + "text": "Configure requests and limits in your pod specs", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "9579e76b-896e-4710-a7da-7be9956d14d3", - "link": "https://learn.microsoft.com/purview/concept-best-practices-scanning", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "769ef669-1a48-435a-a942-223ece80b123", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", "severity": "Medium", - "text": "Follow Best Practices for Scanning Registered Sources", - "waf": "Reliability" + "text": "Enforce resource quotas for namespaces", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "c49d997c-b3d1-4325-aa22-5c6f4e0685ed", - "link": "https://learn.microsoft.com/purview/concept-best-practices-classification", - "service": "Purview", - "severity": "Medium", - "text": "Follow Classification Best Practices in Governance Portal", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "081a5417-4158-433e-a3ad-3c2de733165c", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", + "service": "AKS", + "severity": "High", + "text": "Ensure your subscription has enough quota to scale out your nodepools", + "waf": "Operations" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "ddea8a4b-7cde-4b3c-91fc-2fc14eea6e69", - "link": "https://learn.microsoft.com/purview/sensitivity-labels-frequently-asked-questions", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f4fd0602-7ab5-46f1-b66a-e9dea9654a65", + "link": "https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/", + "service": "AKS", + "severity": "High", + "text": "Configure Liveness and Readiness probes for all deployments", + "waf": "Operations" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Medium", - "text": "Perform Sensitivity Labelling in the Purview Data Map", - "waf": "Reliability" + "text": "Use the Cluster Autoscaler", + "waf": "Performance" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "d8d9a3ed-c218-4e68-9ab0-67acb49e5b96", - "link": "https://learn.microsoft.com/purview/concept-data-share", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Low", - "text": "Leverage Azure Storage in-place data sharing with Microsoft Purview", - "waf": "Reliability" + "text": "Customize node configuration for AKS node pools", + "waf": "Performance" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "03324ecf-8cc1-4331-ada6-1170269f4fb4", - "link": "https://learn.microsoft.com/purview/concept-insights", - "service": "Purview", - "severity": "Low", - "text": "Leverage Data Estate Insights", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", + "link": "https://learn.microsoft.com/azure/aks/concepts-scale", + "service": "AKS", + "severity": "Medium", + "text": "Use the Horizontal Pod Autoscaler when required", + "waf": "Performance" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "aa3d3ef7-f317-46c4-a97b-15b8a219a4ab", - "link": "https://learn.microsoft.com/purview/catalog-adoption-insights", - "service": "Purview", - "severity": "Low", - "text": "Use Data stewardship and Catalog adoption", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "High", + "text": "Consider an appropriate node size, not too large or too small", + "waf": "Performance" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "eb578790-24d2-4267-a6d2-0b56c56a9581", - "link": "https://learn.microsoft.com/purview/concept-insights", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", + "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", + "service": "AKS", "severity": "Low", - "text": "Use Inventory and Ownership", - "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", - "checklist": "Microsoft Purview Review Checklist", - "guid": "19bf8d8e-5c58-46b7-b8cd-c15acc075ee9", - "link": "https://learn.microsoft.com/purview/glossary-insights", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", + "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", + "service": "AKS", "severity": "Low", - "text": "Leverage Insights for Glossary, Classifications, Sensitivity Labels", - "waf": "Reliability" - }, - { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "b130a888-9579-4e76-a896-e710a7da7be9", - "link": "https://learn.microsoft.com/purview/compliance-manager", - "service": "Purview", - "severity": "Medium", - "text": "Generate assessment scores", - "waf": "Reliability" + "text": "Consider subscribing to EventGrid Events for AKS automation", + "waf": "Performance" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "956d14d3-c49d-4997-ab3d-1325aa225c6f", - "link": "https://learn.microsoft.com/purview/compliance-manager-scoring", - "service": "Purview", - "severity": "Medium", - "text": "Profiling- get summaries of data content", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", + "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", + "service": "AKS", + "severity": "Low", + "text": "For long running operation on an AKS cluster consider event termination", + "waf": "Performance" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "4e0685ed-ddea-48a4-a7cd-eb3c61fc2fc1", - "link": "https://learn.microsoft.com/purview/concept-policies-data-owner#microsoft-purview-policy-concepts", - "service": "Purview", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", + "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", + "service": "AKS", "severity": "Low", - "text": "Follow Microsoft Purview Data Owner access policies", - "waf": "Reliability" + "text": "If required consider using Azure Dedicated Hosts for AKS nodes", + "waf": "Performance" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "4eea6e69-d8d9-4a3e-bc21-8e687ab067ac", - "link": "https://learn.microsoft.com/purview/concept-self-service-data-access-policy", - "service": "Purview", - "severity": "Low", - "text": "Follow Self-service access policies", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "High", + "text": "Use ephemeral OS disks", + "waf": "Performance" }, { - "arm-service": "Microsoft.Purview/accounts", - "checklist": "Microsoft Purview Review Checklist", - "guid": "b49e5b96-0332-44ec-b8cc-13318da61170", - "link": "https://learn.microsoft.com/purview/concept-policies-devops", - "service": "Purview", - "severity": "Low", - "text": "Follow DevOps policies", - "waf": "Reliability" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", + "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", + "service": "AKS", + "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" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", - "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", + "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", + "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", "service": "AKS", "severity": "Low", - "text": "If required for AKS Windows workloads HostProcess containers can be used", - "waf": "Reliability" + "text": "For hyper performance storage option use Ultra Disks on AKS", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", - "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", + "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", "service": "AKS", - "severity": "Low", - "text": "Use KEDA if running event-driven workloads", + "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": "Azure AKS Review", - "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", - "link": "https://dapr.io/", + "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", "service": "AKS", - "severity": "Low", - "text": "Use Dapr to ease microservice development", - "waf": "Operations" + "severity": "Medium", + "text": "If using AzFiles Standard, consider AzFiles Premium and/or ANF for performance reasons", + "waf": "Performance" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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": "83958a8c-2689-4b32-ab57-cfc64546135a", + "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", "service": "AKS", - "severity": "High", - "text": "Use the SLA-backed AKS offering", - "waf": "Reliability" + "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.Insights/components", + "checklist": "Cost Optimization Checklist", + "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", + "service": "Azure Monitor", + "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" + }, + { + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "severity": "Medium", + "text": "check backup instances with the underlying datasource not found", + "waf": "Cost" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "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", + "severity": "Medium", + "text": "Delete or archive unassociated services (disks, nics, ip addresses etc)", + "waf": "Cost" + }, + { + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "severity": "Medium", + "text": "Consider a good balance between site recovery storage and backup for non mission critical applications", + "waf": "Cost" + }, + { + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization 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", + "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.Insights/components", + "checklist": "Cost Optimization 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", + "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" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", - "severity": "Low", - "text": "Use Disruption Budgets in your pod and deployment definitions", - "waf": "Reliability" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization 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", + "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.containerregistry/registries", - "checklist": "Azure AKS Review", - "guid": "3c763963-7a55-42d5-a15e-401955387e5c", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", - "service": "ACR", - "severity": "High", - "text": "If using a private registry, configure region replication to store images in multiple regions", - "waf": "Reliability" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "VM", + "severity": "Medium", + "text": "Make sure advisor is configured for VM right sizing ", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", - "service": "AKS", - "severity": "Low", - "text": "Use an external application such as kubecost to allocate costs to different users", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "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", - "checklist": "Azure AKS Review", - "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", - "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", - "service": "AKS", - "severity": "Low", - "text": "Use scale down mode to delete/deallocate nodes", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "service": "VM", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", - "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", - "service": "AKS", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", + "service": "VM", "severity": "Medium", - "text": "When required use multi-instance partitioning GPU on AKS Clusters", + "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", - "checklist": "Azure AKS Review", - "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", - "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", - "service": "AKS", - "severity": "Low", - "text": "If running a Dev/Test cluster use NodePool Start/Stop", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", + "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", + "service": "VM", "severity": "Medium", - "text": "Use Azure Policy for Kubernetes to ensure cluster compliance", - "waf": "Security" + "text": "Only larger disks can be reserved => 1 TiB -", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", + "service": "VM", "severity": "Medium", - "text": "Separate applications from the control plane with user/system node pools", - "waf": "Security" + "text": "After the right-sizing optimization", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", - "link": "https://learn.microsoft.com/azure/aks/use-system-pools", - "service": "AKS", - "severity": "Low", - "text": "Add taint to your system nodepool to make it dedicated", - "waf": "Security" + "arm-service": "Microsoft.Sql/servers", + "checklist": "Cost Optimization Checklist", + "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", + "service": "Azure SQL", + "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.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", - "link": "https://learn.microsoft.com/azure/container-registry/", - "service": "AKS", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", + "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", + "service": "VM", "severity": "Medium", - "text": "Use a private registry for your images, such as ACR", - "waf": "Security" + "text": "The VM + license part discount (ahub + 3YRI) is around 70% discount", + "waf": "Cost" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure AKS Review", - "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", - "link": "https://learn.microsoft.com/azure/security-center/container-security", - "service": "ACR", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", "severity": "Medium", - "text": "Scan your images for vulnerabilities", - "waf": "Security" + "text": "Consider using a VMSS to match demand rather than flat sizing", + "waf": "Cost" }, { "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", + "checklist": "Cost Optimization Checklist", + "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", "service": "AKS", - "severity": "High", - "text": "Define app separation requirements (namespace/nodepool/cluster)", - "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", - "checklist": "Azure AKS Review", - "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", - "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", - "service": "AKS", + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", "severity": "Medium", - "text": "Store your secrets in Azure Key Vault with the CSI Secrets Store driver", - "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", - "checklist": "Azure AKS Review", - "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", - "link": "https://learn.microsoft.com/azure/aks/update-credentials", - "service": "AKS", - "severity": "High", - "text": "If using Service Principals for the cluster, refresh credentials periodically (like quarterly)", - "waf": "Security" + "arm-service": "Microsoft.Databricks/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", + "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", + "service": "Databricks", + "severity": "Medium", + "text": "Consider using Spot VMs with fallback where possible. Consider autotermination of clusters.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", - "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", - "service": "AKS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", + "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", + "service": "Azure Functions", "severity": "Medium", - "text": "If required add Key Management Service etcd encryption", - "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", - "checklist": "Azure AKS Review", - "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", - "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", - "service": "AKS", - "severity": "Low", - "text": "If required consider using Confidential Compute for AKS", - "waf": "Security" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", + "link": "https://learn.microsoft.com/azure/automation/update-management/overview", + "service": "Azure Functions", + "severity": "Medium", + "text": "Functions - Cache data locally", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", - "service": "AKS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", + "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", + "service": "Azure Functions", "severity": "Medium", - "text": "Consider using Defender for Containers", - "waf": "Security" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "High", - "text": "Use managed identities instead of Service Principals", - "waf": "Security" + "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", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "Azure Functions", "severity": "Medium", - "text": "Integrate authentication with AAD (using the managed integration)", - "waf": "Security" + "text": "Functions - Keep your functions warm", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", - "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", - "service": "AKS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Azure Functions", "severity": "Medium", - "text": "Limit access to admin kubeconfig (get-credentials --admin)", - "waf": "Security" + "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", - "checklist": "Azure AKS Review", - "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", - "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", - "service": "AKS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", + "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", + "service": "Azure Functions", "severity": "Medium", - "text": "Integrate authorization with AAD RBAC", - "waf": "Security" + "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", - "checklist": "Azure AKS Review", - "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", - "service": "AKS", - "severity": "High", - "text": "Use namespaces for restricting RBAC privilege in Kubernetes", - "waf": "Security" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", + "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", + "service": "Azure Functions", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", - "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", - "service": "AKS", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Cost Optimization Checklist", + "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Front Door", "severity": "Medium", - "text": "For Pod Identity Access Management use Azure AD Workload Identity (preview)", - "waf": "Security" + "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", - "checklist": "Azure AKS Review", - "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", - "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", - "service": "AKS", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Cost Optimization 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", "severity": "Medium", - "text": "For AKS non-interactive logins use kubelogin (preview)", - "waf": "Security" + "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", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", + "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", + "service": "Storage", "severity": "Medium", - "text": "Disable AKS local accounts", - "waf": "Security" + "text": "Consider archiving tiers for less used data", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "Configure if required Just-in-time cluster access", - "waf": "Security" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", + "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", + "service": "VM", + "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", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "Configure if required AAD conditional access for AKS", - "waf": "Security" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", + "service": "Storage", + "severity": "Medium", + "text": "Consider using standard SSD rather than Premium or Ultra where possible", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", - "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", - "service": "AKS", - "severity": "Low", - "text": "If required for Windows AKS workloads configure gMSA ", - "waf": "Security" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization 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", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization Checklist", + "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", + "service": "Site Recovery", "severity": "Medium", - "text": "For finer control consider using a managed Kubelet Identity", - "waf": "Security" + "text": "For ASR, consider using Standard SSD disks if the RPO/RTO and replication throughput allow it", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", - "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", - "service": "AKS", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", + "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", + "service": "Storage", "severity": "Medium", - "text": "If using AGIC, do not share an AppGW across clusters", - "waf": "Reliability" + "text": "Storage accounts: check hot tier and/or GRS necessary", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "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" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", + "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", + "service": "VM", + "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", - "checklist": "Azure AKS Review", - "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", - "service": "AKS", + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", + "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", + "service": "Synapse", "severity": "Medium", - "text": "For Windows workloads use Accelerated Networking", - "waf": "Performance" + "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", - "checklist": "Azure AKS Review", - "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", - "severity": "High", - "text": "Use the standard ALB (as opposed to the basic one)", - "waf": "Reliability" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "Synapse", + "severity": "Medium", + "text": "Export cost data to a storage account for additional data analysis.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "Synapse", + "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.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", + "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", + "service": "Synapse", "severity": "Medium", - "text": "If using Azure CNI, consider using different Subnets for NodePools", - "waf": "Security" + "text": "Enable the serverless Apache Spark automatic pause feature and set your timeout value accordingly.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", - "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", - "service": "AKS", + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization 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", "severity": "Medium", - "text": "Use Private Endpoints (preferred) or Virtual Network Service Endpoints to access PaaS services from the cluster", - "waf": "Security" + "text": "Create multiple Apache Spark pool definitions of various sizes.", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "High", - "text": "Choose the best CNI network plugin for your requirements (Azure CNI recommended)", - "waf": "Reliability" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization 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", + "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", - "checklist": "Azure AKS Review", - "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", - "severity": "High", - "text": "If using Azure CNI, size your subnet accordingly considering the maximum number of pods per node", - "waf": "Performance" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", + "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", + "service": "VM", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", - "severity": "High", - "text": "If using Azure CNI, check the maximum pods/node (default 30)", - "waf": "Performance" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "544451e1-92d3-4442-a3c7-628637a551c5", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "VM", + "severity": "Medium", + "text": "Right-sizing all VMs", + "waf": "Cost" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "If using private-IP LoadBalancer services, use a dedicated subnet (not the AKS subnet)", - "waf": "Security" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", + "service": "VM", + "severity": "Medium", + "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", - "checklist": "Azure AKS Review", - "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", - "severity": "High", - "text": "Size the service IP address range accordingly (it is going to limit the cluster scalability)", - "waf": "Reliability" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", + "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", - "checklist": "Azure AKS Review", - "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", - "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", - "service": "AKS", - "severity": "Low", - "text": "If required add your own CNI plugin", - "waf": "Security" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "If required configure Public IP per node in AKS", - "waf": "Performance" + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", + "severity": "High", + "text": "Enable 2 replicas to have 99.9% availability for read operations", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", - "link": "https://learn.microsoft.com/azure/aks/concepts-network", - "service": "AKS", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", "severity": "Medium", - "text": "Use an ingress controller to expose web-based apps instead of exposing them with LoadBalancer-type services", + "text": "Enable 3 replicas to have 99.9% availability for read/write operations", "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", - "link": "https://learn.microsoft.com/azure/aks/nat-gateway", - "service": "AKS", - "severity": "Low", - "text": "Use Azure NAT Gateway as outboundType for scaling egress traffic", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", + "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", + "service": "Cognitive Search", + "severity": "High", + "text": "Leverage Availability Zones by enabling read and/or write replicas", "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review 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", "severity": "Medium", - "text": "Use Dynamic allocations of IPs in order to avoid Azure CNI IP exhaustion", + "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", - "checklist": "Azure AKS Review", - "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", - "severity": "High", - "text": "Filter egress traffic with AzFW/NVA if your security requirements mandate it", - "waf": "Security" + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", + "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", + "service": "Cognitive Search", + "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", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review 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", "severity": "Medium", - "text": "If using a public API endpoint, restrict the IP addresses that can access it", - "waf": "Security" + "text": "Use Azure Traffic Manager to coordinate requests", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", + "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", + "service": "Cognitive Search", "severity": "High", - "text": "Use private clusters if your requirements mandate it", - "waf": "Security" + "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", - "checklist": "Azure AKS Review", - "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", - "severity": "Medium", - "text": "For Windows 2019 and 2022 AKS nodes Calico Network Policies can be used ", - "waf": "Security" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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", + "text": "Leverage External Tables and Continuous data export overview to reduce costs", + "waf": "Reliability" }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "High", - "text": "Enable a Kubernetes Network Policy option (Calico/Azure)", - "waf": "Security" + { + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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", + "text": "To share data, explore Leader-follower cluster configuration", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", - "severity": "High", - "text": "Use Kubernetes network policies to increase intra-cluster security", - "waf": "Security" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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", + "text": "To protect against regional failure, create Multiple independent clusters, preferably in two Azure Paired regions", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", - "severity": "High", - "text": "Use a WAF for web workloads (UIs or APIs)", - "waf": "Security" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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", + "text": "Replicate all management activities such as creating new tables or managing user roles on each cluster.", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Medium", - "text": "Use DDoS Standard in the AKS Virtual Network", - "waf": "Security" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review Checklist", + "guid": "18ca6017-0265-4f4b-a46a-393af7f31728", + "link": "https://learn.microsoft.com/azure/data-explorer/business-continuity-create-solution", + "service": "Azure Data Explorer", + "text": "Ingest data into each cluster in parallel", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "If required add company HTTP Proxy", - "waf": "Security" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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", + "text": "For critical application with no tolerance for outages, create Active-Active-Active (always-on) configuration", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", - "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", - "service": "AKS", - "severity": "Medium", - "text": "Consider using a service mesh for advanced microservice communication management", - "waf": "Security" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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", + "text": "For critical applications, create Active-Active configuration in two paired regions", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", - "service": "AKS", - "severity": "High", - "text": "Configure alerts on the most critical metrics (see Container Insights for recommendations)", - "waf": "Operations" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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", + "text": "For applications, which required only read during failure, create Active-Hot standby configuration", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "337453a3-cc63-4963-9a65-22ac19e80696", - "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", - "service": "AKS", - "severity": "Low", - "text": "Check regularly Azure Advisor for recommendations on your cluster", - "waf": "Operations" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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", + "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", - "checklist": "Azure AKS Review", - "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", - "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", - "service": "AKS", - "severity": "Low", - "text": "Enable AKS auto-certificate rotation", - "waf": "Operations" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review 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", + "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", - "checklist": "Azure AKS Review", - "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", - "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", - "service": "AKS", - "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.Kusto/clusters", + "checklist": "Azure Data Explorer Review Checklist", + "guid": "1559ab91-53e8-4908-ae28-b84c33b6b780", + "link": "https://learn.microsoft.com/azure/data-explorer/devops", + "service": "Azure Data Explorer", + "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", - "checklist": "Azure AKS Review", - "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", - "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", - "service": "AKS", - "severity": "High", - "text": "Use kured for Linux node upgrades in case you are not using node-image upgrade", - "waf": "Operations" + "arm-service": "Microsoft.Kusto/clusters", + "checklist": "Azure Data Explorer Review Checklist", + "guid": "8b9fe5c4-1049-4d40-9a82-2c3474d00f18", + "link": "https://learn.microsoft.com/azure/data-explorer/devops", + "service": "Azure Data Explorer", + "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": "Azure AKS Review", - "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", - "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", - "service": "AKS", - "severity": "High", - "text": "Have a regular process to upgrade the cluster node images periodically (weekly, for example)", - "waf": "Operations" + "checklist": "Identity Review Checklist", + "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", + "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", + "service": "Entra", + "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": "Azure AKS Review", - "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", - "service": "AKS", - "severity": "Low", - "text": "Consider gitops to deploy applications or cluster configuration to multiple clusters", - "waf": "Operations" + "checklist": "Identity Review Checklist", + "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", + "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", + "service": "AAD B2C", + "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": "Azure AKS Review", - "guid": "d7672c26-7602-4482-85a4-14527fbe855c", - "link": "https://learn.microsoft.com/azure/aks/command-invoke", - "service": "AKS", - "severity": "Low", - "text": "Consider using AKS command invoke on private clusters", - "waf": "Operations" + "checklist": "Identity Review 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", + "severity": "Medium", + "text": "Custom brand assets should be hosted on a CDN", + "waf": "Performance" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", - "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", - "service": "AKS", + "checklist": "Identity Review Checklist", + "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", + "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", + "service": "AAD B2C", "severity": "Low", - "text": "For planned events consider using Node Auto Drain", - "waf": "Operations" + "text": "Have multiple identiy providers (i.e., login with your microsoft, google, facebook accounts)", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", - "link": "https://learn.microsoft.com/azure/aks/faq", - "service": "AKS", - "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" + "checklist": "Identity Review 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", + "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": "Azure AKS Review", - "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", - "severity": "Low", - "text": "Use custom Node RG (aka 'Infra RG') name", - "waf": "Operations" + "checklist": "Identity Review 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", + "severity": "Medium", + "text": "Don't replicate! Replication can create issues with directory synchronization", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", - "link": "https://kubernetes.io/docs/setup/release/notes/", - "service": "AKS", + "checklist": "Identity Review 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", "severity": "Medium", - "text": "Do not use deprecated Kubernetes APIs in your YAML manifests", - "waf": "Operations" + "text": "Have active-active for multi-regions", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", - "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", - "service": "AKS", - "severity": "Low", - "text": "Taint Windows nodes", - "waf": "Operations" + "checklist": "Identity Review Checklist", + "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", + "severity": "Medium", + "text": "Add Azure AD Domain service stamps to additional regions and locations", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "Keep windows containers patch level in sync with host patch level", - "waf": "Operations" + "checklist": "Identity Review Checklist", + "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", + "severity": "Medium", + "text": "Use Replica Sets for DR", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "Send master logs (aka API logs) to Azure Monitor or your preferred log management solution", - "waf": "Operations" + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review Checklist", + "guid": "43e52f47-22d9-428c-8b1c-d521e54a29a9", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/pass-foundations-playbooks-CosmosDB_v1.docx", + "service": "CosmosDB", + "severity": "Medium", + "text": "FTA Resiliency Playbook", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", - "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", - "service": "AKS", - "severity": "Low", - "text": "If required use nodePool snapshots", - "waf": "Cost" + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review Checklist", + "guid": "de39ac0e-7c28-4dc9-9565-7202bff4564b", + "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#slas", + "service": "CosmosDB", + "severity": "High", + "text": "Leverage Availablity Zones where regionally applicable and ofcourse if the service offers it", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", - "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", - "service": "AKS", - "severity": "Low", - "text": "Consider spot node pools for non time-sensitive workloads", - "waf": "Operations" + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review Checklist", + "guid": "0d934a34-8b26-43e7-bd60-513a3649906e", + "link": "https://learn.microsoft.com/azure/cosmos-db/high-availability#replica-outages", + "service": "CosmosDB", + "severity": "Medium", + "text": "Run multiple replicas of the database (>1 ) in Prod", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Low", - "text": "Consider AKS virtual node for quick bursting", - "waf": "Operations" + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review 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", + "severity": "Medium", + "text": "Leverage Multi-Region Writes", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", - "service": "AKS", - "severity": "High", - "text": "Monitor your cluster metrics with Container Insights (or other tools like Prometheus)", - "waf": "Operations" + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review 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", + "severity": "Medium", + "text": "Distribute your data globally", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review 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", "severity": "High", - "text": "Store and analyze your cluster logs with Container Insights (or other tools like Telegraf/ElasticSearch)", - "waf": "Operations" + "text": "Choose from several well-defined consistency models", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", - "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", - "service": "AKS", + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review 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", "severity": "Medium", - "text": "Monitor CPU and memory utilization of the nodes", - "waf": "Operations" + "text": "Enable Service managed failover", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "1a4835ac-9422-423e-ae80-b123081a5417", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review 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", "severity": "Medium", - "text": "If using Azure CNI, monitor % of pod IPs consumed per node", - "waf": "Operations" + "text": "Enable Automatic Backups", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review 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", "severity": "Medium", - "text": "Monitor OS disk queue depth in nodes", - "waf": "Operations" + "text": "Perform Periodic Backups", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "be209d39-fda4-4777-a424-d116785c2fa5", - "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", - "service": "AKS", + "arm-service": "microsoft.documentdb/databaseAccounts", + "checklist": "CosmosDB Review 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", "severity": "Medium", - "text": "If not using egress filtering with AzFW/NVA, monitor standard ALB allocated SNAT ports", - "waf": "Operations" + "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": "Azure AKS Review", - "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", - "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", + "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", + "service": "SAP", "severity": "Medium", - "text": "Subscribe to resource health notifications for your AKS cluster", + "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": "Azure AKS Review", - "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", - "severity": "High", - "text": "Configure requests and limits in your pod specs", + "checklist": "SAP 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", + "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": "Azure AKS Review", - "guid": "769ef669-1a48-435a-a942-223ece80b123", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", + "service": "SAP", "severity": "Medium", - "text": "Enforce resource quotas for namespaces", - "waf": "Operations" + "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" + }, + { + "checklist": "SAP Checklist", + "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", + "service": "SAP", + "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": "Azure AKS Review", - "guid": "081a5417-4158-433e-a3ad-3c2de733165c", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "b651423c-8552-42db-a545-5cb50c05527a", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "service": "SAP", "severity": "High", - "text": "Ensure your subscription has enough quota to scale out your nodepools", - "waf": "Operations" + "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": "Azure AKS Review", - "guid": "f4fd0602-7ab5-46f1-b66a-e9dea9654a65", - "link": "https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/", - "service": "AKS", - "severity": "High", - "text": "Configure Liveness and Readiness probes for all deployments", - "waf": "Operations" + "checklist": "SAP Checklist", + "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", + "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": "Azure AKS Review", - "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", - "severity": "Medium", - "text": "Use the Cluster Autoscaler", - "waf": "Performance" + "checklist": "SAP Checklist", + "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", + "service": "SAP", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "SAP", "severity": "Low", - "text": "Customize node configuration for AKS node pools", - "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": "Azure AKS Review", - "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", - "link": "https://learn.microsoft.com/azure/aks/concepts-scale", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", + "service": "SAP", "severity": "Medium", - "text": "Use the Horizontal Pod Autoscaler when required", - "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": "Azure AKS Review", - "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", - "severity": "High", - "text": "Consider an appropriate node size, not too large or too small", - "waf": "Performance" + "checklist": "SAP Checklist", + "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", + "service": "SAP", + "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": "Azure AKS Review", - "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", - "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", - "service": "AKS", - "severity": "Low", - "text": "If more than 5000 nodes are required for scalability then consider using an additional AKS cluster", - "waf": "Performance" + "checklist": "SAP Checklist", + "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", + "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.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", - "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", - "service": "AKS", - "severity": "Low", - "text": "Consider subscribing to EventGrid Events for AKS automation", - "waf": "Performance" + "checklist": "SAP Checklist", + "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", + "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", + "service": "SAP", + "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" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", - "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", - "service": "AKS", - "severity": "Low", - "text": "For long running operation on an AKS cluster consider event termination", - "waf": "Performance" + "checklist": "SAP Checklist", + "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", + "service": "SAP", + "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.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", - "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", - "service": "AKS", - "severity": "Low", - "text": "If required consider using Azure Dedicated Hosts for AKS nodes", - "waf": "Performance" + "checklist": "SAP 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", + "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.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", + "service": "SAP", "severity": "High", - "text": "Use ephemeral OS disks", - "waf": "Performance" + "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.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", - "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", "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": "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.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", - "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", - "service": "AKS", - "severity": "Low", - "text": "For hyper performance storage option use Ultra Disks on AKS", - "waf": "Performance" + "checklist": "SAP Checklist", + "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", + "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", + "service": "SAP", + "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", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", - "service": "AKS", - "severity": "Medium", - "text": "Avoid keeping state in the cluster, and store data outside (AzStorage, AzSQL, Cosmos, etc)", - "waf": "Performance" + "checklist": "SAP Checklist", + "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", + "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", + "service": "SAP", + "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.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", - "service": "AKS", - "severity": "Medium", - "text": "If using AzFiles Standard, consider AzFiles Premium and/or ANF for performance reasons", - "waf": "Performance" + "checklist": "SAP 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", + "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.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", - "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", - "service": "AKS", - "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" + "checklist": "SAP Checklist", + "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", + "service": "SAP", + "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": "Azure Key Vault", - "guid": "6d37a33b-531c-4a91-871a-b69d8044f04e", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Key Vault", + "checklist": "SAP Checklist", + "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "SAP", "severity": "High", - "text": "Familiarize yourself with the Key Vault's best practices such as isolation recommendations, access control, data protection, backup, and logging.", + "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.KeyVault/vaults", - "checklist": "Azure Key Vault", - "guid": "7ba4d380-7b9e-4a8b-a0c3-2d8e49c11872", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "Key Vault", - "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.", + "checklist": "SAP 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", + "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.KeyVault/vaults", - "checklist": "Azure Key Vault", - "guid": "17fb86a2-eb45-42a4-9c34-52b92a2a1842", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#data-replication", - "service": "Key Vault", - "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.", + "checklist": "SAP Checklist", + "guid": "cbe05bbe-209d-4490-ba47-778424d11678", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", + "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" }, { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "Azure Key Vault", - "guid": "614682ca-6e0c-4f34-9f03-c6d3f2b99a32", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#failover-across-regions", - "service": "Key Vault", + "checklist": "SAP Checklist", + "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", + "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", + "service": "SAP", "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.", + "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.KeyVault/vaults", - "checklist": "Azure Key Vault", - "guid": "9ef2b0d2-3206-4c94-b47a-4f07e6a1c509", - "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#design-considerations", - "service": "Key Vault", - "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.", + "checklist": "SAP Checklist", + "guid": "9674e7c7-7796-4181-8920-09f4429543ba", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", + "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" }, { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "Azure Key Vault", - "guid": "2df045b1-c0f6-47d3-9a9b-99cf6999684e", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "Key Vault", + "checklist": "SAP Checklist", + "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "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": "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.KeyVault/vaults", - "checklist": "Azure Key Vault", - "guid": "cbfa96b0-5249-4e6f-947c-d0e79509708c", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "Key Vault", - "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.", + "checklist": "SAP Checklist", + "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", + "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.KeyVault/vaults", - "checklist": "Azure Key Vault", - "guid": "e8659d11-7e02-4db0-848c-c6541dbab68c", - "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", - "service": "Key Vault", - "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.", + "checklist": "SAP 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", + "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" }, { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "Azure Key Vault", - "guid": "45c25e29-d0ef-4f07-aa04-0f8c64cbcc04", - "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", - "service": "Key Vault", - "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.", + "checklist": "SAP Checklist", + "guid": "ed46b937-913e-4018-9c62-8393ab037e53", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", + "service": "SAP", + "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" }, { - "arm-service": "Microsoft.KeyVault/vaults", - "checklist": "Azure Key Vault", - "guid": "0f15640b-31e5-4de6-85a7-d2c652fa09d3", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview#purge-protection", - "service": "Key Vault", + "checklist": "SAP 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", "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.", + "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": "Azure Storage Review 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", + "checklist": "SAP 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", "severity": "Medium", - "text": "Consider the 'Azure security baseline for storage'", - "waf": "Security" + "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": "Azure Storage Review 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", + "checklist": "SAP Checklist", + "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", "severity": "High", - "text": "Consider using private endpoints for Azure Storage", - "waf": "Security" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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", - "severity": "Medium", - "text": "Ensure older storage accounts are not using 'classic deployment model'", - "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": "Azure Storage Review 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", + "checklist": "SAP Checklist", + "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", + "service": "SAP", "severity": "High", - "text": "Enable Microsoft Defender for all of your storage accounts", - "waf": "Security" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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", - "severity": "Medium", - "text": "Enable 'soft delete' for blobs", - "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": "Azure Storage Review 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", - "severity": "Medium", - "text": "Disable 'soft delete' for blobs", - "waf": "Security" + "checklist": "SAP Checklist", + "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", + "service": "SAP", + "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": "Azure Storage Review 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", + "checklist": "SAP Checklist", + "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", + "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", + "service": "SAP", "severity": "High", - "text": "Enable 'soft delete' for containers", - "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": "Azure Storage Review 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", + "checklist": "SAP 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", "severity": "Medium", - "text": "Disable 'soft delete' for containers", - "waf": "Security" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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", - "severity": "High", - "text": "Enable resource locks on storage accounts", - "waf": "Security" + "text": "Automate SAP System Start-Stop to manage costs.", + "waf": "Cost" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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", - "severity": "High", - "text": "Consider immutable blobs", - "waf": "Security" + "checklist": "SAP Checklist", + "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", + "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": "Azure Storage Review 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", - "severity": "High", - "text": "Require HTTPS, i.e. disable port 80 on the storage account", - "waf": "Security" + "checklist": "SAP Checklist", + "guid": "9877f353-2591-4e8b-8381-e9043fed1010", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", + "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": "Azure Storage Review 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", + "checklist": "SAP Checklist", + "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", + "service": "SAP", "severity": "High", - "text": "When enforcing HTTPS (disabling HTTP), check that you do not use custom domains (CNAME) for 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": "Azure Storage Review 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", + "checklist": "SAP Checklist", + "guid": "45911475-e39e-4530-accc-d979366bcda2", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", "severity": "Medium", - "text": "Limit shared access signature (SAS) tokens to HTTPS connections only", + "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": "Azure Storage Review 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", - "severity": "High", - "text": "Use Azure Active Directory (Azure AD) tokens for blob access", + "checklist": "SAP Checklist", + "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", + "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.", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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", + "checklist": "SAP Checklist", + "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", "severity": "Medium", - "text": "Least privilege in IaM permissions", + "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": "Azure Storage Review 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", - "severity": "High", - "text": "When using SAS, prefer 'user delegation SAS' over storage-account-key based SAS.", + "checklist": "SAP Checklist", + "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", + "service": "SAP", + "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", "waf": "Security" }, { - "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. ", - "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.", + "checklist": "SAP Checklist", + "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", + "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": "Azure Storage Review 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", - "severity": "High", - "text": "Consider using Azure Monitor to audit control plane operations on the storage account", + "checklist": "SAP Checklist", + "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", + "service": "SAP", + "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": "Azure Storage Review 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", + "checklist": "SAP 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", "severity": "Medium", - "text": "When using storage account keys, consider enabling a 'key expiration policy'", + "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": "Azure Storage Review 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", + "checklist": "SAP 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", "severity": "Medium", - "text": "Consider configuring an SAS expiration policy", + "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": "Azure Storage Review 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", + "checklist": "SAP Checklist", + "guid": "a747c350-8d4c-449c-93af-393dbca77c48", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", + "service": "SAP", "severity": "Medium", - "text": "Consider linking SAS to a stored access policy", + "text": "Implement SSO to SAP HANA", "waf": "Security" }, { - "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", + "checklist": "SAP Checklist", + "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", + "service": "SAP", "severity": "Medium", - "text": "Consider configuring your application's source code repository to detect checked-in connection strings and storage account keys.", + "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": "Azure Storage Review 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", - "severity": "High", - "text": "Consider storing connection strings in Azure KeyVault (in scenarios where managed identities are not possible)", + "checklist": "SAP Checklist", + "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", + "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", + "service": "SAP", + "severity": "Medium", + "text": "For applications that access SAP, you might want to use principal propagation to establish SSO.", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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", - "severity": "High", - "text": "Strive for short validity periods for ad-hoc SAS", + "checklist": "SAP 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", + "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": "Azure Storage Review 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", + "checklist": "SAP Checklist", + "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", + "service": "SAP", "severity": "Medium", - "text": "Apply a narrow scope to a SAS", + "text": "Implement SSO to SAP BTP", "waf": "Security" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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", + "checklist": "SAP 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", "severity": "Medium", - "text": "Consider scoping SAS to a specific client IP address, wherever possible", + "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": "Azure Storage Review 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", - "severity": "Low", - "text": "Consider checking uploaded data, after clients used a SAS to upload a file. ", - "waf": "Security" + "checklist": "SAP 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", + "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" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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", + "checklist": "SAP Checklist", + "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "severity": "High", - "text": "SFTP: Limit the amount of 'local users' for SFTP access, and audit whether access is needed over time.", - "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": "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": "Medium", - "text": "SFTP: The SFTP endpoint does not support POSIX-like ACLs.", - "waf": "Security" + "checklist": "SAP Checklist", + "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", + "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" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Storage Review 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", + "checklist": "SAP Checklist", + "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", + "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", + "service": "SAP", "severity": "High", - "text": "Avoid overly broad CORS policies", - "waf": "Security" + "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": "Azure Storage Review 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", + "checklist": "SAP Checklist", + "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", + "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", + "service": "SAP", + "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" + }, + { + "checklist": "SAP Checklist", + "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", + "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", + "service": "SAP", "severity": "High", - "text": "Determine how data at rest should be encrypted. Understand the thread model for data.", - "waf": "Security" + "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" }, { - "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": "Medium", - "text": "Determine which/if platform encryption should be used.", - "waf": "Security" + "checklist": "SAP Checklist", + "guid": "e6e20617-3686-4af4-9791-f8935ada4332", + "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", + "service": "SAP", + "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": "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", + "checklist": "SAP Checklist", + "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", + "service": "SAP", "severity": "Medium", - "text": "Determine which/if client-side encryption should be used.", - "waf": "Security" + "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" }, { - "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.", - "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", + "checklist": "SAP Checklist", + "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", "severity": "High", - "text": "Consider whether public blob access is needed, or whether it can be disabled for certain storage accounts. ", - "waf": "Security" + "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.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": "High", - "text": "Leverage a storagev2 account type for better performance and reliability", + "checklist": "SAP Checklist", + "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", + "service": "SAP", + "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.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", + "checklist": "SAP Checklist", + "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", "severity": "High", - "text": "Leverage GRS, ZRS or GZRS storage for the highest availability", - "waf": "Reliability" + "text": "Ensure time-zone matches between the operating system and the SAP system.", + "waf": "Operations" }, { - "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", + "checklist": "SAP Checklist", + "guid": "c3c7abc0-716c-4486-893c-40e181d65539", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", + "service": "SAP", "severity": "Medium", - "text": "For write operation after failover, use customer-Managed Failover ", + "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.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": "Medium", - "text": "Understand Microsoft-Managed Failover details", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "a491dfc4-9353-4213-9217-eef0949f9467", + "link": "https://azure.microsoft.com/pricing/offers/dev-test/", + "service": "SAP", + "severity": "Low", + "text": "Consider running dev/test systems in a snooze model to save and optimize Azure run costs.", + "waf": "Cost" }, { - "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", + "checklist": "SAP Checklist", + "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", + "link": "https://learn.microsoft.com/azure/lighthouse/overview", + "service": "SAP", "severity": "Medium", - "text": "Enable Soft Delete", - "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/virtualMachineScaleSets", - "checklist": "Resiliency Review", - "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", - "severity": "Low", - "text": "Enable automatic instance repairs for enhanced VM Scale Sets resiliency", - "waf": "Reliability" + "checklist": "SAP 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", + "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", + "waf": "Operations" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Resiliency Review", - "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", - "severity": "High", - "text": "Consider Azure Backup to meet your resiliency requirements for Azure VMs", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", + "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", + "service": "SAP", + "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": "Resiliency Review", - "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", - "severity": "High", - "text": "Use Premium or Ultra disks for production VMs", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "14591147-5e39-4e53-89cc-cd979366bcda", + "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", + "service": "SAP", + "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": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", + "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", + "service": "SAP", "severity": "High", - "text": "Ensure Managed Disks are used for all VMs", - "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": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "SAP", "severity": "Medium", - "text": "Do not use the Temp disk for anything that is not acceptable to be lost", - "waf": "Reliability" + "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": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", + "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", + "service": "SAP", "severity": "Medium", - "text": "Leverage Availability Zones for your VMs in regions where they are supported", - "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": "Resiliency Review", - "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", + { + "checklist": "SAP Checklist", + "guid": "73686af4-6791-4f89-95ad-a43324e13811", + "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", + "service": "SAP", "severity": "Medium", - "text": "For regions that do not support Availability Zones deploy VMs into Availability Sets", - "waf": "Reliability" + "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.Compute/virtualMachines", - "checklist": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "616785d6-fa96-4c96-ad88-518f482734c8", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", "severity": "High", - "text": "Avoid running a production workload on a single VM", - "waf": "Reliability" + "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.Compute/virtualMachines", - "checklist": "Resiliency Review", - "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", - "severity": "High", - "text": "For Azure and on-premises VMs (Hyper-V/Phyiscal/VMware) with low RTO requirements use Azure Site Recovery", + "checklist": "SAP Checklist", + "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", + "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", + "service": "SAP", + "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.Compute/virtualMachines", - "checklist": "Resiliency Review", - "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", - "severity": "Low", - "text": "Use Capacity Reservations for critical workloads that require guaranteed capacity", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", + "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", + "service": "SAP", + "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.Compute/virtualMachines", - "checklist": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", + "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", + "service": "SAP", "severity": "Medium", - "text": "Increase quotas in DR region before testing failover with ASR", - "waf": "Reliability" + "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.Compute/virtualMachines", - "checklist": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", + "service": "SAP", "severity": "Low", - "text": "Utilize Scheduled Events to prepare for VM maintenance", - "waf": "Reliability" + "text": "Use inter-VM latency monitoring for latency-sensitive applications.", + "waf": "Performance" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", "severity": "Medium", - "text": "Choose the most appropriate data redundancy option for Azure Storage based on your requirements", + "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.Storage/storageAccounts", - "checklist": "Resiliency Review", - "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", - "severity": "Low", - "text": "Apply a Delete lock to prevent accidental or malicious deletion of storage accounts", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", + "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.Storage/storageAccounts", - "checklist": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "c027f893-f404-41a9-b33d-39d625a14964", + "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", + "service": "SAP", "severity": "Low", - "text": "Enable soft delete for Storage Account Containers", - "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.Storage/storageAccounts", - "checklist": "Resiliency Review", - "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", - "severity": "Low", - "text": "Enable soft delete for blobs", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", + "service": "SAP", + "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" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Resiliency Review", - "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", + "checklist": "SAP 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", "severity": "Medium", - "text": "Enable Azure Backup enhanced soft delete for improved data protection and recovery", - "waf": "Reliability" + "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.RecoveryServices/vaults", - "checklist": "Resiliency Review", - "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", - "severity": "Low", - "text": "Implement multi-user authorization for Azure Backup to ensure secure and controlled access to backup resources", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", + "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.RecoveryServices/vaults", - "checklist": "Resiliency Review", - "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", - "severity": "Low", - "text": "Implement Immutable Storage for your vaults to protect against ransomware and prevent unauthorized modifications to backups", - "waf": "Reliability" + "checklist": "SAP Checklist", + "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "SAP", + "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/", + "waf": "Security" }, { - "arm-service": "Microsoft.Network/dnsZones", - "checklist": "Resiliency Review", - "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", - "severity": "Low", - "text": "Implement DNS Failover using Azure DNS Private Resolvers", - "waf": "Reliability" + "checklist": "SAP 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", + "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" }, { - "arm-service": "Microsoft.PowerBI/gateways", - "checklist": "Resiliency Review", - "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", + "checklist": "SAP 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", "severity": "Medium", - "text": "Use on-premises data gateway clusters to ensure high availability for business-critical data", + "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" + }, + { + "checklist": "SAP Checklist", + "guid": "a3592829-e6e2-4061-9368-6af46791f893", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", + "service": "SAP", + "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", "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Resiliency Review", - "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", + "checklist": "SAP Checklist", + "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", + "service": "SAP", "severity": "High", - "text": "Deploy Network Virtual Appliances (NVAs) in a vendor supported configuration for High Availability", - "waf": "Reliability" + "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/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", + "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", + "service": "SAP", "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", + "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": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", + "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", + "service": "SAP", "severity": "Medium", - "text": "Ensure you are using Application Gateway v2 SKU", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Security" + "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/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", + "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", + "service": "SAP", "severity": "Medium", - "text": "Ensure you are using the Standard SKU for your Azure Load Balancers", - "waf": "Security" + "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/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "guid": "9432621a-8397-4654-a882-5bc856b7ef83", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", - "service": "Load Balancer", - "severity": "Medium", - "text": "Ensure your Load Balancers frontend IP addresses are zone-redundant (unless you require zonal frontends).", + "checklist": "SAP 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", + "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/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "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" + "checklist": "SAP 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", + "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" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "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" + "checklist": "SAP 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", + "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" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "App Gateway", + "checklist": "SAP Checklist", + "guid": "6e154e3a-a359-4282-ae6e-206173686af4", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", + "service": "SAP", "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": "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" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP 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", "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": "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" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", + "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", + "service": "SAP", "severity": "Medium", - "text": "Deploy Application Gateway across Availability Zones", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Reliability" + "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" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", + "checklist": "SAP Checklist", + "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "Front Door", + "service": "SAP", "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/", + "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" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "3f29812b-2363-4cef-b179-b599de0d5973", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "Front Door", + "checklist": "SAP Checklist", + "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", + "service": "SAP", "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/", + "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/trafficManagerProfiles", - "checklist": "Azure Application Delivery Networking", - "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", + "checklist": "SAP Checklist", + "guid": "5ada4332-4e13-4811-9231-81aa41742694", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "Traffic Manager", - "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" - }, - { - "checklist": "Azure Application Delivery Networking", - "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "Entra", - "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/", + "service": "SAP", + "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" }, { - "checklist": "Azure Application Delivery Networking", - "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "Entra", + "checklist": "SAP Checklist", + "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "SAP", "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" + "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" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "High", - "text": "Deploy your WAF policy for Front Door in 'Prevention' mode.", + "checklist": "SAP Checklist", + "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", + "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", + "service": "SAP", + "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" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", + "service": "SAP", "severity": "High", - "text": "Avoid combining Azure Traffic Manager and Azure Front Door.", - "waf": "Security" + "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/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "High", - "text": "Use the same domain name on Azure Front Door and your origin. Mismatched host names can cause subtle bugs.", + "checklist": "SAP Checklist", + "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", + "service": "SAP", + "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" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Low", - "text": "Disable health probes when there is only one origin in an Azure Front Door origin group.", + "checklist": "SAP Checklist", + "guid": "6791f893-5ada-4433-84e1-3811523181aa", + "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "service": "SAP", + "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" + }, + { + "checklist": "SAP Checklist", + "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", + "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", "waf": "Performance" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "Front Door", + "checklist": "SAP Checklist", + "guid": "fa96c96a-d885-418f-9827-34c886ba2802", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "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": "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" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Low", - "text": "Use HEAD health probes with Azure Front Door, to reduce the traffic that Front Door sends to your application.", + "checklist": "SAP Checklist", + "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", + "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", "waf": "Performance" }, { - "ammp": true, - "arm-service": "Microsoft.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "severity": "High", - "text": "Use Azure NAT Gateway instead of Load Balancer outbound rules for better SNAT scalability", - "waf": "Reliability" + "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": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "402a9846-d515-4061-aff8-cd30088693fa", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", + "service": "SAP", "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": "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" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "87585797-5551-4d53-bb7d-a94ee415734d", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", + "service": "SAP", "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 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": "Azure Application Delivery Networking", - "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", - "service": "Front Door", + "checklist": "SAP Checklist", + "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", "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": "Review SAP HANA database backups for Azure VMs.", + "waf": "Cost" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", - "service": "Front Door", + "checklist": "SAP Checklist", + "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", "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" + "text": "Review Site Recovery built-in monitoring, where used for SAP.", + "waf": "Cost" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", - "service": "Front Door", + "checklist": "SAP Checklist", + "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", + "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", + "service": "SAP", "severity": "High", - "text": "Enable the Azure Front Door WAF. Protect your application from a range of attacks.", - "waf": "Security" + "text": "Review the Monitoring the SAP HANA System Landscape guidance.", + "waf": "Operations" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "High", - "text": "Tune the Azure Front Door WAF for your workload. Reduce false positive detections.", - "waf": "Security" + "checklist": "SAP Checklist", + "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", + "service": "SAP", + "severity": "Medium", + "text": "Review Oracle Database in Azure Linux VM backup strategies.", + "waf": "Operations" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "High", - "text": "Enable request body inspection feature enabled in Azure Front Door WAF policy.", - "waf": "Security" + "checklist": "SAP 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", + "severity": "Medium", + "text": "Review the use of Azure Blob Storage with SQL Server 2016.", + "waf": "Operations" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "High", - "text": "Enable the Azure Front Door WAF default rule sets. The default rule sets detect and block common attacks.", - "waf": "Security" + "checklist": "SAP Checklist", + "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", + "service": "SAP", + "severity": "Medium", + "text": "Review the use of Automated Backup v2 for Azure VMs.", + "waf": "Operations" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", + "service": "SAP", "severity": "High", - "text": "Enable the Azure Front Door WAF bot protection rule set. The bot rules detect good and bad bots.", - "waf": "Security" + "text": "Enabling Write accelerator for M series when using premium disks(V1)", + "waf": "Operations" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP 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", "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": "Test availability zone latency.", + "waf": "Performance" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", + "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", + "service": "SAP", "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": "Activate SAP EarlyWatch Alert for all SAP components.", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", + "waf": "Performance" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP 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", "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" - }, - { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "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" + "text": "Review SAP application server to database server latency using SAP ABAPMeter report /SSA/CAT.", + "training": "https://me.sap.com/notes/0002879613", + "waf": "Performance" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", + "service": "SAP", "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" - }, - { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "High", - "text": "Enable the Azure Application Gateway WAF bot protection rule set The bot rules detect good and bad bots.", - "waf": "Security" + "text": "Review SQL Server performance monitoring using CCMS.", + "waf": "Performance" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "High", - "text": "Enable request body inspection feature enabled in Azure Application Gateway WAF policy.", - "waf": "Security" + "checklist": "SAP Checklist", + "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", + "link": "https://me.sap.com/notes/500235", + "service": "SAP", + "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" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", - "service": "App Gateway", - "severity": "High", - "text": "Tune the Azure Application Gateway WAF for your workload. Reduce false positive detections.", - "waf": "Security" + "checklist": "SAP Checklist", + "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", + "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", + "service": "SAP", + "severity": "Medium", + "text": "Review SAP HANA studio alerts.", + "waf": "Performance" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "High", - "text": "Deploy your WAF policy for Application Gateway in 'Prevention' mode.", - "waf": "Security" + "checklist": "SAP Checklist", + "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", + "link": "https://me.sap.com/notes/1969700", + "service": "SAP", + "severity": "Medium", + "text": "Perform SAP HANA health checks using HANA_Configuration_Minichecks.", + "waf": "Performance" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", - "service": "App Gateway", + "checklist": "SAP Checklist", + "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "service": "SAP", "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.", + "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": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "08951710-79a2-492a-adbc-06d7a401545b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "service": "SAP", "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. ", + "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": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", "severity": "Low", - "text": "If you are not expecting traffic from all geographical regions, use geo-filters to block traffic from non-expected countries.", + "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": "Azure Application Delivery Networking", - "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", - "service": "App Gateway", - "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.", + "checklist": "SAP Checklist", + "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", + "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/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "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.", + "checklist": "SAP 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", + "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": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "SAP", "severity": "Medium", - "text": "Add diagnostic settings to save your Azure Application Gateway WAF logs.", - "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": "Azure Application Delivery Networking", - "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", - "severity": "Medium", - "text": "Add diagnostic settings to save your Azure Front Door WAF logs.", - "waf": "Operations" + "checklist": "SAP Checklist", + "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview", + "service": "SAP", + "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": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "829e2edb-2173-4676-aff6-691b4935ada4", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "SAP", "severity": "Medium", - "text": "Send Azure Application Gateway WAF logs to Microsoft Sentinel.", - "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/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "SAP", "severity": "Medium", - "text": "Send Azure Front Door WAF logs to Microsoft Sentinel.", - "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": "Azure Application Delivery Networking", - "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", - "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" + "checklist": "SAP Checklist", + "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", + "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", + "service": "SAP", + "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/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", - "service": "App Gateway", - "severity": "Medium", - "text": "Use WAF Policies instead of the legacy WAF configuration.", - "waf": "Operations" + "checklist": "SAP 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", + "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": "Azure Application Delivery Networking", - "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", - "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", - "service": "App Gateway", - "severity": "Medium", - "text": "Filter inbound traffic in the backends so that they only accept connections from the Application Gateway subnet, for example with NSGs.", + "checklist": "SAP 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", + "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", "waf": "Security" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", - "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", - "service": "Front Door", - "severity": "Medium", - "text": "Make sure your origins only take traffic from your Azure Front Door instance.", + "checklist": "SAP 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", + "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": "Azure Application Delivery Networking", - "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", - "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", - "service": "App Gateway", - "severity": "High", - "text": "You should encrypt traffic to the backend servers.", + "checklist": "SAP Checklist", + "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", + "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", + "service": "SAP", + "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", "waf": "Security" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", - "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", - "service": "App Gateway", + "checklist": "SAP Checklist", + "guid": "4935ada4-2223-4ece-a1b1-23181a541741", + "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", + "service": "SAP", "severity": "High", - "text": "You should use a Web Application Firewall.", + "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": "Azure Application Delivery Networking", - "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", - "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", - "service": "App Gateway", - "severity": "Medium", - "text": "Redirect HTTP to HTTPS", + "checklist": "SAP Checklist", + "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", + "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", + "service": "SAP", + "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" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Medium", - "text": "Use gateway-managed cookies to direct traffic from a user session to the same server for processing", - "waf": "Operations" + "checklist": "SAP Checklist", + "guid": "209d490d-a477-4784-84d1-16785d2fa56c", + "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", + "service": "SAP", + "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": "Azure Application Delivery Networking", - "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", - "service": "App Gateway", + "checklist": "SAP Checklist", + "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", + "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", + "service": "SAP", "severity": "High", - "text": "Enable connection draining during planned service updates to prevent connection loss to existing membrs of the backend pool", + "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": "Azure Application Delivery Networking", - "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", - "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", - "service": "App Gateway", + "checklist": "SAP 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", "severity": "Low", - "text": "Create custom error pages to display a personalized user experience", - "waf": "Operations" - }, - { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", - "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", - "service": "App Gateway", - "severity": "Medium", - "text": "Edit HTTP requests and response headers for easier routing and information exchange between the client and server", + "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": "Azure Application Delivery Networking", - "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "App Gateway", - "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" + "checklist": "SAP 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", + "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": "Azure Application Delivery Networking", - "guid": "29dcc19f-a8fa-4c35-8281-290577538793", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "App Gateway", - "severity": "Medium", - "text": "Use transport layer load balancing", - "waf": "Performance" + "checklist": "SAP Checklist", + "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", + "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": "Azure Application Delivery Networking", - "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", - "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", - "service": "App Gateway", - "severity": "Medium", - "text": "Configure routing based on host or domain name for multiple web applications on a single gateway", + "checklist": "SAP 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", + "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" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", - "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", - "service": "App Gateway", + "checklist": "SAP Checklist", + "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", + "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", + "service": "SAP", "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", - "checklist": "Azure Application Delivery Networking", - "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", - "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", - "service": "App Gateway", - "severity": "Low", - "text": "Use Application Gateway for native support for WebSocket and HTTP/2 protocols", - "waf": "Security" + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency checklist", + "guid": "65285269-440b-44be-9d3e-0844276d4bdc", + "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-zone-redundancy", + "service": "Redis", + "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", - "checklist": "PostgreSQL Review Checklist", - "guid": "65285269-441c-44bf-9d3e-0844276d4bdc", - "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview", - "service": "PostgreSQL", + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency 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", "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", - "checklist": "PostgreSQL Review Checklist", - "guid": "016ccf31-ae5a-41eb-9888-9535e227896d", - "link": "https://learn.microsoft.com/azure/postgresql/flexible-server/overview#architecture-and-high-availability", - "service": "PostgreSQL", - "severity": "High", - "text": "Leverage Availability Zones where regionally applicable", + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency 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", + "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", - "checklist": "PostgreSQL Review 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", + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency checklist", + "guid": "a8c26c9b-32ab-45bd-bc69-98a135e33789", + "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-geo-replication", + "service": "Redis", "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" }, { @@ -8017,705 +7976,746 @@ "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", "service": "Azure Data Factory", "severity": "Low", - "text": "If using Keyvault integration, use SLA of Keyvault to understand your availablity", - "waf": "Reliability" - }, - { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "High", - "text": "Disable Azure Container Registry image export", - "waf": "Security" - }, - { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "High", - "text": "Enable Azure Policies for Azure Container Registry", - "waf": "Security" - }, - { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "High", - "text": "Sign and Verify containers with notation (Notary v2)", - "waf": "Security" - }, - { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "Medium", - "text": "Encrypt registry with a customer managed key", - "waf": "Security" - }, - { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "High", - "text": "Use Managed Identities to connect instead of Service Principals", - "waf": "Security" - }, - { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "High", - "text": "Disable local authentication for management plane access", - "waf": "Security" - }, - { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "High", - "text": "Assign AcrPull & AcrPush RBAC roles rather than granting Administrative access to identity principals", - "waf": "Security" + "text": "If using Keyvault integration, use SLA of Keyvault to understand your availablity", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review Checklist", + "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", + "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", + "service": "Azure MySQL", "severity": "Medium", - "text": "Disable Anonymous pull access", - "waf": "Security" + "text": "Leverage Flexible Server", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review 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", "severity": "High", - "text": "Disable repository-scoped access tokens", - "waf": "Security" + "text": "Leverage Availability Zones where regionally applicable", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "description": "Deploy container images to an ACR behind a Private endpoint within a trusted network", - "guid": "b3bec3d4-f343-47c1-936d-b55f27a71eee", - "service": "ACR", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review 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", + "severity": "Medium", + "text": "Leverage Data-in replication for cross-region DR scenarios", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "6d37a33b-531c-4a91-871a-b69d8044f04e", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", "severity": "High", - "text": "Deploy images from a trusted environment", - "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", - "checklist": "Azure Container Registry Security Review", - "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", + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "7ba4d380-7b9e-4a8b-a0c3-2d8e49c11872", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "Key Vault", "severity": "Medium", - "text": "Disable Azure ARM audience tokens for authentication", - "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", - "checklist": "Azure Container Registry Security Review", - "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", + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "17fb86a2-eb45-42a4-9c34-52b92a2a1842", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#data-replication", + "service": "Key Vault", "severity": "Medium", - "text": "Enable diagnostics logging", - "waf": "Security" + "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.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "614682ca-6e0c-4f34-9f03-c6d3f2b99a32", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance#failover-across-regions", + "service": "Key Vault", "severity": "Medium", - "text": "Control inbound network access with Private Link", - "waf": "Security" + "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.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "9ef2b0d2-3206-4c94-b47a-4f07e6a1c509", + "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#design-considerations", + "service": "Key Vault", "severity": "Medium", - "text": "Disable Public Network access", - "waf": "Security" + "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", - "checklist": "Azure Container Registry Security Review", - "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", - "severity": "Medium", - "text": "Use an Azure Container Registry SKU that supports Private Link (Premium SKU)", - "waf": "Security" + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "2df045b1-c0f6-47d3-9a9b-99cf6999684e", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "Key Vault", + "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.", + "waf": "Reliability" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure Container Registry Security Review", - "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", + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "cbfa96b0-5249-4e6f-947c-d0e79509708c", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "Key Vault", "severity": "Low", - "text": "Enable Defender for Containers to scan Azure Container Registry for vulnerabilities", - "waf": "Security" + "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", - "checklist": "Azure Container Registry Security Review", - "description": "Deploy trusted code that was validated and scanned for vulnerabilities according to DevSecOps practices.", - "guid": "4451e1a2-d345-4293-a763-9637a551c5c0", - "service": "ACR", - "severity": "Medium", - "text": "Deploy validated container images", - "waf": "Security" + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "e8659d11-7e02-4db0-848c-c6541dbab68c", + "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", + "service": "Key Vault", + "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", - "checklist": "Azure Container Registry Security Review", - "description": "Use the latest versions of supported platforms, programming languages, protocols, and frameworks.", - "guid": "4e401955-387e-45ce-b126-cd132af5b20c", - "service": "ACR", - "severity": "High", - "text": "Use up-to-date platforms, languages, protocols and frameworks", - "waf": "Security" + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "45c25e29-d0ef-4f07-aa04-0f8c64cbcc04", + "link": "https://learn.microsoft.com/azure/key-vault/general/backup?tabs=azure-cli#limitations", + "service": "Key Vault", + "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.Insights/components", - "checklist": "Cost Optimization Checklist", - "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", - "service": "Azure Monitor", + "arm-service": "Microsoft.KeyVault/vaults", + "checklist": "Azure Key Vault", + "guid": "0f15640b-31e5-4de6-85a7-d2c652fa09d3", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview#purge-protection", + "service": "Key Vault", "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" + "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.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "severity": "Medium", - "text": "check backup instances with the underlying datasource not found", - "waf": "Cost" + "arm-service": "Microsoft.Compute/virtualMachineScaleSets", + "checklist": "Resiliency Review", + "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", + "severity": "Low", + "text": "Enable automatic instance repairs for enhanced VM Scale Sets resiliency", + "waf": "Reliability" }, { "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "64f9a19a-f29c-495d-94c6-c7919ca0f6c5", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/multi-tenant/lighthouse", + "checklist": "Resiliency Review", + "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", - "severity": "Medium", - "text": "Delete or archive unassociated services (disks, nics, ip addresses etc)", - "waf": "Cost" + "severity": "High", + "text": "Consider Azure Backup to meet your resiliency requirements for Azure VMs", + "waf": "Reliability" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "severity": "Medium", - "text": "Consider a good balance between site recovery storage and backup for non mission critical applications", - "waf": "Cost" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Resiliency Review", + "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", + "severity": "High", + "text": "Use Premium or Ultra disks for production VMs", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization 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", - "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.Compute/virtualMachines", + "checklist": "Resiliency Review", + "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", + "severity": "High", + "text": "Ensure Managed Disks are used for all VMs", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization 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", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Resiliency Review", + "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", "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" + "text": "Do not use the Temp disk for anything that is not acceptable to be lost", + "waf": "Reliability" }, { "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", + "checklist": "Resiliency Review", + "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", "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" + "text": "Leverage Availability Zones for your VMs in regions where they are supported", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization 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", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Resiliency Review", + "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", "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" + "text": "For regions that do not support Availability Zones deploy VMs into Availability Sets", + "waf": "Reliability" }, { "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "checklist": "Resiliency Review", + "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", - "severity": "Medium", - "text": "Make sure advisor is configured for VM right sizing ", - "waf": "Cost" + "severity": "High", + "text": "Avoid running a production workload on a single VM", + "waf": "Reliability" }, { "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", + "checklist": "Resiliency Review", + "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", - "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": "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.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", - "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "checklist": "Resiliency Review", + "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", - "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" + "severity": "Low", + "text": "Use Capacity Reservations for critical workloads that require guaranteed capacity", + "waf": "Reliability" }, { "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", + "checklist": "Resiliency Review", + "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", "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" + "text": "Increase quotas in DR region before testing failover with ASR", + "waf": "Reliability" }, { "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", + "checklist": "Resiliency Review", + "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", + "severity": "Low", + "text": "Utilize Scheduled Events to prepare for VM maintenance", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Resiliency Review", + "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", "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": "Choose the most appropriate data redundancy option for Azure Storage based on your requirements", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", - "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", - "service": "VM", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Resiliency Review", + "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", + "severity": "Low", + "text": "Apply a Delete lock to prevent accidental or malicious deletion of storage accounts", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Resiliency Review", + "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", + "severity": "Low", + "text": "Enable soft delete for Storage Account Containers", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Resiliency Review", + "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", + "severity": "Low", + "text": "Enable soft delete for blobs", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Resiliency Review", + "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", "severity": "Medium", - "text": "Only larger disks can be reserved => 1 TiB -", - "waf": "Cost" + "text": "Enable Azure Backup enhanced soft delete for improved data protection and recovery", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Resiliency Review", + "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", + "severity": "Low", + "text": "Implement multi-user authorization for Azure Backup to ensure secure and controlled access to backup resources", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Resiliency Review", + "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", + "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": "Resiliency Review", + "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", + "severity": "Low", + "text": "Implement DNS Failover using Azure DNS Private Resolvers", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.PowerBI/gateways", + "checklist": "Resiliency Review", + "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", + "severity": "Medium", + "text": "Use on-premises data gateway clusters to ensure high availability for business-critical data", + "waf": "Reliability" }, { "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", - "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", - "service": "VM", + "checklist": "Resiliency Review", + "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", + "severity": "High", + "text": "Deploy Network Virtual Appliances (NVAs) in a vendor supported configuration for High Availability", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "1fc2fc14-eea6-4e69-b8d9-a3edc218e687", + "link": "https://polite-sea-0995b240f.2.azurestaticapps.net/technical-delivery-playbook/azure-services/analytics/purview/", + "service": "Purview", "severity": "Medium", - "text": "After the right-sizing optimization", - "waf": "Cost" + "text": "Leverage FTA Resillency Handbook", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "ab067acb-49e5-4b96-8332-4ecf8cc13318", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", + "severity": "High", + "text": "Plan for Data Center level outage", + "waf": "Reliability" + }, + { + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review 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", + "severity": "Medium", + "text": "Practice Failover for BCDR", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Sql/servers", - "checklist": "Cost Optimization Checklist", - "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", - "service": "Azure SQL", - "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.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "97b15b8a-219a-44ab-bb57-879024d22678", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", + "severity": "High", + "text": "Plan a backup strategy and take regular backups", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", - "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", - "service": "VM", - "severity": "Medium", - "text": "The VM + license part discount (ahub + 3YRI) is around 70% discount", - "waf": "Cost" + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "6d20b56c-56a9-4581-89bf-8d8e5c586b7d", + "link": "https://learn.microsoft.com/purview/manage-kafka-dotnet", + "service": "Purview", + "severity": "Low", + "text": "Use Microsoft Purview's Event Hubs to subscribe and create entities to another account", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "8cdc15ac-c075-4ee9-a130-a8889579e76b", + "link": "https://learn.microsoft.com/purview/deployment-best-practices", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "AKS", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "896e710a-7da7-4be9-a56d-14d3c49d997c", + "link": "https://learn.microsoft.com/purview/concept-best-practices-collections", + "service": "Purview", "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", - "checklist": "Cost Optimization 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", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "b3d1325a-a225-4c6f-9e06-85edddea8a4b", + "link": "https://learn.microsoft.com/purview/concept-best-practices-asset-lifecycle", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", - "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", - "service": "Databricks", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "7cdeb3c6-1fc2-4fc1-9eea-6e69d8d9a3ed", + "link": "https://learn.microsoft.com/purview/concept-best-practices-automation", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", - "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", - "service": "Azure Functions", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "c218e687-ab06-47ac-a49e-5b9603324ecf", + "link": "https://learn.microsoft.com/purview/disaster-recovery", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", - "link": "https://learn.microsoft.com/azure/automation/update-management/overview", - "service": "Azure Functions", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "8cc13318-da61-4170-869f-4fb4aa3d3ef7", + "link": "https://learn.microsoft.com/purview/concept-best-practices-glossary", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", - "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", - "service": "Azure Functions", - "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.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "f3176c4b-97b1-45b8-a219-a4abeb578790", + "link": "https://learn.microsoft.com/purview/concept-workflow", + "service": "Purview", + "severity": "Low", + "text": "Leverage Workflows ", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "Azure Functions", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "24d22678-6d20-4b56-a56a-958119bf8d8e", + "link": "https://learn.microsoft.com/purview/concept-best-practices-security", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "Azure Functions", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "5c586b7d-8cdc-415a-ac07-5ee9b130a888", + "link": "https://learn.microsoft.com/purview/concept-best-practices-lineage-azure-data-factory", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", - "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", - "service": "Azure Functions", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "9579e76b-896e-4710-a7da-7be9956d14d3", + "link": "https://learn.microsoft.com/purview/concept-best-practices-scanning", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", - "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", - "service": "Azure Functions", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "c49d997c-b3d1-4325-aa22-5c6f4e0685ed", + "link": "https://learn.microsoft.com/purview/concept-best-practices-classification", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "Front Door", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "ddea8a4b-7cde-4b3c-91fc-2fc14eea6e69", + "link": "https://learn.microsoft.com/purview/sensitivity-labels-frequently-asked-questions", + "service": "Purview", "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", - "checklist": "Cost Optimization 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", - "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.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "d8d9a3ed-c218-4e68-9ab0-67acb49e5b96", + "link": "https://learn.microsoft.com/purview/concept-data-share", + "service": "Purview", + "severity": "Low", + "text": "Leverage Azure Storage in-place data sharing with Microsoft Purview", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", - "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", - "service": "Storage", - "severity": "Medium", - "text": "Consider archiving tiers for less used data", - "waf": "Cost" + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "03324ecf-8cc1-4331-ada6-1170269f4fb4", + "link": "https://learn.microsoft.com/purview/concept-insights", + "service": "Purview", + "severity": "Low", + "text": "Leverage Data Estate Insights", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", - "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", - "service": "VM", - "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.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "aa3d3ef7-f317-46c4-a97b-15b8a219a4ab", + "link": "https://learn.microsoft.com/purview/catalog-adoption-insights", + "service": "Purview", + "severity": "Low", + "text": "Use Data stewardship and Catalog adoption", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", - "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", - "service": "Storage", - "severity": "Medium", - "text": "Consider using standard SSD rather than Premium or Ultra where possible", - "waf": "Cost" + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "eb578790-24d2-4267-a6d2-0b56c56a9581", + "link": "https://learn.microsoft.com/purview/concept-insights", + "service": "Purview", + "severity": "Low", + "text": "Use Inventory and Ownership", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization 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", - "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" + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "19bf8d8e-5c58-46b7-b8cd-c15acc075ee9", + "link": "https://learn.microsoft.com/purview/glossary-insights", + "service": "Purview", + "severity": "Low", + "text": "Leverage Insights for Glossary, Classifications, Sensitivity Labels", + "waf": "Reliability" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization Checklist", - "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", - "service": "Site Recovery", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "b130a888-9579-4e76-a896-e710a7da7be9", + "link": "https://learn.microsoft.com/purview/compliance-manager", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", - "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", - "service": "Storage", + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "956d14d3-c49d-4997-ab3d-1325aa225c6f", + "link": "https://learn.microsoft.com/purview/compliance-manager-scoring", + "service": "Purview", "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", - "checklist": "Cost Optimization Checklist", - "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", - "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", - "service": "VM", - "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.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "4e0685ed-ddea-48a4-a7cd-eb3c61fc2fc1", + "link": "https://learn.microsoft.com/purview/concept-policies-data-owner#microsoft-purview-policy-concepts", + "service": "Purview", + "severity": "Low", + "text": "Follow Microsoft Purview Data Owner access policies", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", - "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", - "service": "Synapse", - "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.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "4eea6e69-d8d9-4a3e-bc21-8e687ab067ac", + "link": "https://learn.microsoft.com/purview/concept-self-service-data-access-policy", + "service": "Purview", + "severity": "Low", + "text": "Follow Self-service access policies", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "Synapse", - "severity": "Medium", - "text": "Export cost data to a storage account for additional data analysis.", - "waf": "Cost" + "arm-service": "Microsoft.Purview/accounts", + "checklist": "Microsoft Purview Review Checklist", + "guid": "b49e5b96-0332-44ec-b8cc-13318da61170", + "link": "https://learn.microsoft.com/purview/concept-policies-devops", + "service": "Purview", + "severity": "Low", + "text": "Follow DevOps policies", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "Synapse", - "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.Devices/deviceUpdateServices", + "checklist": "Device Update Review", + "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", + "severity": "High", + "text": "Leverage Availability Zones if regionally applicable (this is automatically enabled).", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", - "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", - "service": "Synapse", - "severity": "Medium", - "text": "Enable the serverless Apache Spark automatic pause feature and set your timeout value accordingly.", - "waf": "Cost" + "arm-service": "Microsoft.Devices/deviceUpdateServices", + "checklist": "Device Update Review", + "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", + "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", - "checklist": "Cost Optimization 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", - "severity": "Medium", - "text": "Create multiple Apache Spark pool definitions of various sizes.", - "waf": "Cost" + "arm-service": "Microsoft.Devices/deviceUpdateServices", + "checklist": "Device Update Review", + "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", + "severity": "High", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization 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", - "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.Devices/deviceUpdateServices", + "checklist": "Device Update Review", + "guid": "bd91245c-fe32-4e98-a085-794a40f4bfe1", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "Device Update for IoT Hub", + "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", - "checklist": "Cost Optimization Checklist", - "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", - "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", - "service": "VM", - "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" + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", + "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", + "service": "IoT Hub DPS", + "severity": "High", + "text": "Select the right Logic App hosting plan based on your business & SLO requirements", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "544451e1-92d3-4442-a3c7-628637a551c5", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "VM", - "severity": "Medium", - "text": "Right-sizing all VMs", - "waf": "Cost" + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "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", + "severity": "High", + "text": "Protect logic apps from region failures with zone redundancy and availability zones", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", - "service": "VM", - "severity": "Medium", - "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.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "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", + "severity": "High", + "text": "Consider a Cross-Region DR strategy for critical workloads", + "waf": "Reliability" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", - "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.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "IoT Hub DPS", + "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", - "checklist": "Cost Optimization Checklist", - "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "IoT Hub DPS", "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" } ], "metadata": { "name": "WAF checklist", - "timestamp": "August 05, 2024" + "timestamp": "August 08, 2024" }, "severities": [ { diff --git a/checklists/waf_checklist.es.json b/checklists/waf_checklist.es.json index 123857f95..2e5c33a23 100644 --- a/checklists/waf_checklist.es.json +++ b/checklists/waf_checklist.es.json @@ -1,5709 +1,5338 @@ { "items": [ { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", - "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", - "service": "IoT Hub DPS", - "severity": "Alto", - "text": "Seleccione el plan de hospedaje de aplicaciones lógicas adecuado en función de los requisitos empresariales y de SLO", - "waf": "Fiabilidad" + "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": "Medio", + "text": "Use un inquilino de Entra para administrar los recursos de Azure, a menos que tenga un requisito normativo o empresarial claro para varios inquilinos.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "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", + "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": "Bajo", + "text": "Use el enfoque de automatización multiinquilino para administrar los inquilinos de Microsoft Entra ID.", + "waf": "Operaciones" + }, + { + "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": "Alto", - "text": "Proteja las aplicaciones lógicas de errores de región con redundancia de zona y zonas de disponibilidad", - "waf": "Fiabilidad" + "text": "Use Azure Lighthouse para la administración de varios inquilinos con los mismos identificadores.", + "training": "https://learn.microsoft.com/azure/lighthouse/concepts/cross-tenant-management-experience", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "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", + "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": "Alto", - "text": "Considere la posibilidad de una estrategia de recuperación ante desastres entre regiones para cargas de trabajo críticas", - "waf": "Fiabilidad" + "text": "Si concede a un asociado acceso para administrar el inquilino, use Azure Lighthouse.", + "waf": "Costar" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "IoT Hub DPS", + "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": "Alto", - "text": "Si se implementa en un entorno aislado, use o migre a App Service Environment (ASE) v3", - "waf": "Fiabilidad" + "text": "Aplique un modelo RBAC que se alinee con su modelo operativo en la nube. Ámbito y asignación entre grupos de administración y suscripciones.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "IoT Hub DPS", - "severity": "Medio", - "text": "Aproveche Azure DevOps o GitHub para simplificar la CI/CD y proteger el código de la aplicación lógica", - "waf": "Operaciones" + "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": "Alto", + "text": "Utilice únicamente el tipo de autenticación Cuenta profesional o educativa para todos los tipos de cuenta. Evite usar la cuenta de Microsoft", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review Checklist", - "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", - "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", - "service": "Azure MySQL", + "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": "Medio", - "text": "Aproveche el servidor flexible", - "waf": "Fiabilidad" + "text": "Utilice solo grupos para asignar permisos. Agregue grupos locales al grupo Solo ID de Entra si ya existe un sistema de administración de grupos.", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review 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", + "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": "Alto", - "text": "Aproveche las zonas de disponibilidad cuando corresponda regionalmente", - "waf": "Fiabilidad" - }, - { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review 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", - "severity": "Medio", - "text": "Aproveche la replicación de entrada de datos para escenarios de recuperación ante desastres entre regiones", - "waf": "Fiabilidad" + "text": "Aplique directivas de acceso condicional de identificador de Microsoft Entra para cualquier usuario con derechos sobre entornos de Azure.", + "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "ac1d6380-f866-4bbd-a9b4-b1ee5d7908b8", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#availability-zones", - "service": "IoT", + "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": "Alto", - "text": "Aproveche las zonas de disponibilidad si corresponden regionalmente (esto se habilita automáticamente)", - "waf": "Fiabilidad" + "text": "Aplique la autenticación multifactor para cualquier usuario con derechos en los entornos de Azure.", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "35f651e8-0124-4ef7-8c57-658e38609e6e", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", - "service": "IoT", + "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": "Medio", - "text": "Tenga en cuenta las conmutaciones por error iniciadas por Microsoft. Microsoft los ejerce en situaciones excepcionales para conmutar por error todos los centros de IoT de una región afectada a la región emparejada geográficamente correspondiente.", - "waf": "Fiabilidad" + "text": "Aplique la administración de identidades privilegiadas (PIM) de Microsoft Entra ID para establecer un acceso permanente cero y privilegios mínimos.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "4ed3e490-dc06-4a1e-b467-5d0239d85540", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#cross-region-dr", - "service": "IoT", - "severity": "Alto", - "text": "Considere la posibilidad de una estrategia de recuperación ante desastres entre regiones para cargas de trabajo críticas", - "waf": "Fiabilidad" + "checklist": "Azure Landing Zone Review", + "guid": "8b9fe5c4-1049-4d40-9a92-3c3474d00018", + "link": "https://learn.microsoft.com/en-us/entra/identity/domain-services/overview", + "service": "Entra", + "severity": "Medio", + "text": "Si planea cambiar de Servicios de dominio de Active Directory a Servicios de dominio Entra, evalúe la compatibilidad de todas las cargas de trabajo.", + "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "a11ecab0-db47-46f7-9aa7-17764e7e45a1", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", - "service": "IoT", - "severity": "Alto", - "text": "Obtenga información sobre cómo desencadenar una conmutación por error manual.", - "waf": "Fiabilidad" + "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": "Medio", + "text": "Integre los registros de identificador de Microsoft Entra con Azure Monitor central de la plataforma. Azure Monitor permite una única fuente de información sobre los datos de registro y supervisión en Azure, lo que proporciona a las organizaciones opciones nativas en la nube para cumplir con los requisitos relacionados con la recopilación y retención de registros.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "f9db8dfb-1194-460b-aedd-34dd6a69db22", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#failback", - "service": "IoT", + "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": "Alto", - "text": "Obtenga información sobre cómo conmutar por recuperación después de una conmutación por error.", - "waf": "Fiabilidad" + "text": "Implemente un acceso de emergencia o cuentas de emergencia para evitar el bloqueo de cuentas en todo el inquilino.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", - "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", - "service": "Spring Apps", + "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": "Medio", - "text": "Azure Spring Apps permite dos implementaciones para cada aplicación, de las cuales solo una recibe tráfico de producción. Puede lograr cero tiempo de inactividad con estrategias de implementación azul verde. La implementación azul verde solo está disponible en los niveles Estándar y Enterprise. Puede automatizar la implementación mediante CI/CD con acciones de ADO/GitHub", - "waf": "Fiabilidad" + "text": "No use cuentas sincronizadas locales para las asignaciones de roles de identificador de Microsoft Entra, a menos que tenga un escenario que lo requiera específicamente.", + "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "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", + "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": "Medio", - "text": "Las instancias de Azure Spring Apps se pueden crear en varias regiones para las aplicaciones y el tráfico se puede enrutar mediante Traffic Manager o Front Door.", - "waf": "Fiabilidad" + "text": "Al usar el proxy de aplicación de Microsoft Entra ID para proporcionar a los usuarios remotos acceso a las aplicaciones, adminístrelo como un recurso de plataforma, ya que solo puede tener una instancia por inquilino.", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", - "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", - "service": "Spring Apps", + "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": "Medio", - "text": "En la región admitida, Azure Spring Apps se puede implementar como zona redundante, lo que significa que las instancias se distribuyen automáticamente entre las zonas de disponibilidad. Esta función solo está disponible en los niveles Standard y Enterprise.", - "waf": "Fiabilidad" + "text": "Utilice una topología de red en estrella tipo hub-and-spoke para escenarios de red que requieran la máxima flexibilidad.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", - "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", - "service": "Spring Apps", - "severity": "Medio", - "text": "Usar más de 1 instancia de aplicación para las aplicaciones", - "waf": "Fiabilidad" + "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": "Alto", + "text": "Implemente servicios de red compartidos, incluidas puertas de enlace de ExpressRoute, puertas de enlace de VPN y Azure Firewall o aplicaciones virtuales de red de asociados en la red virtual del centro central. Si es necesario, implemente también servicios DNS.", + "waf": "Costar" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "7504c230-6035-4183-95a5-85762acc6075", - "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", - "service": "Spring Apps", - "severity": "Medio", - "text": "Supervise Azure Spring Apps con registros, métricas y seguimiento. Integre ASA con la información de las aplicaciones, realice un seguimiento de los errores y cree libros de trabajo.", - "waf": "Fiabilidad" + "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": "Alto", + "text": "Utilice un plan de protección de IP o red DDoS para todas las direcciones IP públicas en las zonas de aterrizaje de aplicaciones.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", - "service": "Spring Apps", + "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": "Medio", - "text": "Configuración del escalado automático en Spring Cloud Gateway", + "text": "Al implementar tecnologías de redes de asociados o NVA, siga las instrucciones del proveedor del asociado.", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "97411607-b6fd-4335-99d1-9885faf4e392", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", - "service": "Spring Apps", + "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": "Bajo", - "text": "Habilite el escalado automático para las aplicaciones con el consumo estándar y el plan dedicado.", - "waf": "Fiabilidad" + "text": "Si necesita tránsito entre ExpressRoute y puertas de enlace de VPN en escenarios tipo hub-and-spoke, use Azure Route Server.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", - "link": "https://learn.microsoft.com/azure/spring-apps/overview", - "service": "Spring Apps", + "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": "Bajo", + "text": "Si utiliza el servidor de rutas, utilice un prefijo /27 para la subred del servidor de rutas.", + "waf": "Seguridad" + }, + { + "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": "Medio", - "text": "Use el plan Enterprise para obtener soporte comercial de Spring Boot para aplicaciones de misión crítica. Con otros niveles, obtienes soporte OSS.", - "waf": "Fiabilidad" + "text": "En el caso de las arquitecturas de red con varias topologías en estrella tipo hub-and-spoke en las regiones de Azure, use emparejamientos de red virtual global entre las redes virtuales del centro para conectar las regiones entre sí.", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-virtual-networks/", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", - "severity": "Bajo", - "text": "Consulte la arquitectura de aplicación web de redundancia de zona de alta disponibilidad de línea de base para conocer los procedimientos recomendados", + "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": "Medio", + "text": "Use Azure Monitor para redes para supervisar el estado de un extremo a otro de las redes de Azure.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "waf": "Operaciones" + }, + { + "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": "Medio", + "text": "Si tiene más de 400 redes radiales en una región, implemente un centro adicional para omitir los límites de emparejamiento de red virtual (500) y el número máximo de prefijos que se pueden anunciar a través de ExpressRoute (1000).", "waf": "Fiabilidad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", - "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", - "service": "App Services", + "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": "Medio", - "text": "Utilice los niveles Premium y Estándar. Estos niveles admiten ranuras de ensayo y copias de seguridad automatizadas.", + "text": "Limite el número de rutas por tabla de rutas a 400.", "waf": "Fiabilidad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", - "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", - "service": "App Services", + "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": "Alto", - "text": "Aproveche las zonas de disponibilidad cuando corresponda regionalmente (requiere el nivel Premium v2 o v3)", + "text": "Use la opción \"Permitir tráfico a la red virtual remota\" al configurar emparejamientos de red virtual.", "waf": "Fiabilidad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Services", + "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": "Medio", - "text": "Implementación de comprobaciones de estado", - "waf": "Fiabilidad" + "text": "Cuando use ExpressRoute Direct, configure MACsec para cifrar el tráfico en el nivel de capa dos entre los enrutadores de la organización y MSEE. El diagrama muestra este cifrado en el flujo.", + "waf": "Seguridad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", - "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", - "service": "App Services", - "severity": "Alto", - "text": "Consulte los procedimientos recomendados de copia de seguridad y restauración para Azure App Service", - "waf": "Fiabilidad" + "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": "Medio", + "text": "En escenarios en los que MACsec no es una opción (por ejemplo, no usar ExpressRoute Direct), use una puerta de enlace de VPN para establecer túneles IPsec a través del emparejamiento privado de ExpressRoute.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "Seguridad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", + "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": "Alto", - "text": "Implementación de los procedimientos recomendados de confiabilidad de Azure App Service", - "waf": "Fiabilidad" + "text": "Asegúrese de que no se usen espacios de direcciones IP superpuestos entre regiones de Azure y ubicaciones locales.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Seguridad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", - "severity": "Bajo", - "text": "Familiarizarse con cómo mover una aplicación de App Service a otra región durante un desastre", - "waf": "Fiabilidad" + "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": "Medio", + "text": "Utilice las direcciones IP de los rangos de asignación de direcciones para Internet privadas (RFC 1918).", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Seguridad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", - "service": "App Services", + "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": "Alto", - "text": "Familiarizarse con la compatibilidad con la confiabilidad en Azure App Service", - "waf": "Fiabilidad" + "text": "Asegúrese de que no se desperdicie el espacio de direcciones IP, no cree redes virtuales innecesariamente grandes (por ejemplo, /16).", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "App Services", - "severity": "Medio", - "text": "Asegúrese de que \"Siempre activado\" está habilitado para las aplicaciones de funciones que se ejecutan en un plan de App Service", + "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": "Alto", + "text": "No utilice intervalos de direcciones IP superpuestos para los sitios de producción y recuperación ante desastres.", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", "waf": "Fiabilidad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Services", + "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": "Medio", - "text": "Supervisión de instancias de App Service mediante comprobaciones de estado", - "waf": "Fiabilidad" + "text": "En entornos en los que la resolución de nombres en Azure es todo lo necesario, use Azure Private DNS para la resolución con una zona delegada para la resolución de nombres (como 'azure.contoso.com').", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "Operaciones" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", - "service": "App Services", + "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": "Medio", - "text": "Supervisión de la disponibilidad y la capacidad de respuesta de la aplicación web o el sitio web mediante pruebas de disponibilidad de Application Insights", - "waf": "Fiabilidad" + "text": "En el caso de los entornos en los que se requiere la resolución de nombres en Azure y en el entorno local y no existe ningún servicio DNS empresarial como Active Directory, use Azure DNS Private Resolver para enrutar las solicitudes DNS a Azure o a servidores DNS locales.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-dns-private-resolver/", + "waf": "Seguridad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "b4e3f2d5-a5c6-4d7e-8b2f-c5d9e7a8f0ea", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", - "service": "App Services", + "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": "Bajo", - "text": "Uso de la prueba estándar de Application Insights para supervisar la disponibilidad y la capacidad de respuesta de la aplicación web o el sitio web", - "waf": "Fiabilidad" + "text": "Las cargas de trabajo especiales que requieren e implementan su propio DNS (como Red Hat OpenShift) deben usar su solución de DNS preferida.", + "waf": "Operaciones" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Use Azure Key Vault para almacenar los secretos que necesita la aplicación. Key Vault proporciona un entorno seguro y auditado para almacenar secretos y está bien integrado con App Service a través del SDK de Key Vault o las referencias de Key Vault de App Service.", - "guid": "834ac932-223e-4ce8-8b12-3071a5416415", - "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", - "service": "App Services", + "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": "Alto", - "text": "Uso de Key Vault para almacenar secretos", - "waf": "Seguridad" + "text": "Habilite el registro automático de Azure DNS para administrar automáticamente el ciclo de vida de los registros DNS de las máquinas virtuales implementadas en una red virtual.", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "Operaciones" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Use una identidad administrada para conectarse a Key Vault mediante el SDK de Key Vault o a través de las referencias de Key Vault de App Service.", - "guid": "833ea3ad-2c2d-4e73-8165-c3acbef4abe1", - "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", - "service": "App Services", - "severity": "Alto", - "text": "Uso de la identidad administrada para conectarse a Key Vault", + "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": "Medio", + "text": "Use Azure Bastion para conectarse de forma segura a la red.", "waf": "Seguridad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Almacene el certificado TLS de App Service en Key Vault.", - "guid": "f8d39fda-4776-4831-9c11-5775c2ea55b4", - "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-certificate", - "service": "App Services", - "severity": "Alto", - "text": "Use Key Vault para almacenar el certificado TLS.", + "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": "Medio", + "text": "Use Azure Bastion en una subred /26 o superior.", "waf": "Seguridad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Los sistemas que procesan información confidencial deben estar aislados. Para ello, use planes del Servicio de aplicaciones o entornos del Servicio de aplicaciones independientes y considere la posibilidad de usar suscripciones o grupos de administración diferentes.", - "guid": "6ad48408-ee72-4734-a475-ba18fdbf590c", - "link": "https://learn.microsoft.com/azure/app-service/overview-hosting-plans", - "service": "App Services", + "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": "Medio", - "text": "Aísle los sistemas que procesan información confidencial", + "text": "Use las directivas de Azure Front Door y WAF para proporcionar protección global en todas las regiones de Azure para las conexiones HTTP/S entrantes a una zona de aterrizaje.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Seguridad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Los discos locales de App Service no están cifrados y los datos confidenciales no deben almacenarse en ellos. (Por ejemplo: D:\\\\Local y %TMP%).", - "guid": "e65de8e0-3f9b-4cbd-9682-66abca264f9a", - "link": "https://learn.microsoft.com/azure/app-service/operating-system-functionality#file-access", - "service": "App Services", - "severity": "Medio", - "text": "No almacene datos confidenciales en el disco local", + "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": "Bajo", + "text": "Al usar Azure Front Door y Azure Application Gateway para ayudar a proteger las aplicaciones HTTP/S, use directivas de WAF en Azure Front Door. Bloquee Azure Application Gateway para recibir tráfico solo de Azure Front Door.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Seguridad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "En el caso de la aplicación web autenticada, use un proveedor de identidades bien establecido, como Azure AD o Azure AD B2C. Aproveche el marco de aplicaciones de su elección para integrarse con este proveedor o use la característica de autenticación o autorización del Servicio de aplicaciones.", - "guid": "919ca0b2-c121-459e-814b-933df574eccc", - "link": "https://learn.microsoft.com/azure/app-service/overview-authentication-authorization", - "service": "App Services", - "severity": "Medio", - "text": "Usar un proveedor de identidades establecido para la autenticación", + "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": "Alto", + "text": "Cuando se requieran WAF y otros servidores proxy inversos para las conexiones HTTP/S entrantes, impleméntelos dentro de una red virtual de zona de aterrizaje y junto con las aplicaciones que protegen y exponen a Internet.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", "waf": "Seguridad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Implemente código en App Service desde un entorno controlado y de confianza, como una canalización de implementación de DevOps bien administrada y segura. De este modo, se evita el código que no se ha controlado la versión y se ha comprobado que se implementará desde un host malintencionado.", - "guid": "3f9bcbd4-6826-46ab-aa26-4f9a19aed9c5", - "link": "https://learn.microsoft.com/azure/app-service/deploy-best-practices", - "service": "App Services", + "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": "Alto", - "text": "Implementación desde un entorno de confianza", + "text": "Use los planes de protección IP o de red DDoS de Azure para ayudar a proteger los puntos de conexión de direcciones IP públicas dentro de las redes virtuales.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "Seguridad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Deshabilite la autenticación básica tanto para FTP/FTPS como para WebDeploy/SCM. Esto deshabilita el acceso a estos servicios y exige el uso de puntos de conexión protegidos de Azure AD para la implementación. Tenga en cuenta que el sitio de SCM también se puede abrir con credenciales de Azure AD.", - "guid": "5d04c2c3-919c-4a0b-8c12-159e114b933d", - "link": "https://learn.microsoft.com/azure/app-service/deploy-configure-credentials#disable-basic-authentication", - "service": "App Services", + "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": "Alto", - "text": "Deshabilitar la autenticación básica", - "waf": "Seguridad" + "text": "Planifique cómo administrar la configuración y la estrategia del tráfico saliente de su red antes del próximo cambio importante. El 30 de septiembre de 2025, se retirará el acceso saliente predeterminado para las nuevas implementaciones y solo se permitirán configuraciones de acceso explícitas.", + "waf": "Fiabilidad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Siempre que sea posible, use Managed Identity para conectarse a los recursos protegidos de Azure AD. Si esto no es posible, almacene los secretos en Key Vault y conéctese a Key Vault mediante una identidad administrada en su lugar.", - "guid": "f574eccc-d9bd-43ba-bcda-3b54eb2eb03d", - "link": "https://learn.microsoft.com/azure/app-service/overview-managed-identity?tabs=portal%2Chttp", - "service": "App Services", + "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": "Alto", - "text": "Uso de la identidad administrada para conectarse a los recursos", + "text": "Agregue configuraciones de diagnóstico para guardar los registros relacionados con DDoS para todas las direcciones IP públicas protegidas (IP DDoS o Protección de red).", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "Seguridad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Cuando use imágenes almacenadas en Azure Container Registry, extráigalas mediante una identidad administrada.", - "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", + "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": "Alto", - "text": "Extracción de contenedores mediante una identidad administrada", + "text": "Asegúrese de que haya una asignación de directiva para denegar las direcciones IP públicas vinculadas directamente a las máquinas virtuales. Use exclusiones si se necesitan direcciones IP públicas en máquinas virtuales específicas.", "waf": "Seguridad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Al configurar las opciones de diagnóstico de App Service, puede enviar todos los datos de telemetría a Log Analytics como destino central para el registro y la supervisión. Esto le permite supervisar la actividad en tiempo de ejecución de App Service, como los registros HTTP, los registros de aplicaciones, los registros de plataforma, ...", - "guid": "47768314-c115-4775-a2ea-55b46ad48408", - "link": "https://learn.microsoft.com/azure/app-service/troubleshoot-diagnostic-logs", - "service": "App Services", + "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": "Medio", - "text": "Envío de registros en tiempo de ejecución de App Service a Log Analytics", - "waf": "Seguridad" + "text": "Use ExpressRoute como conexión principal a Azure. Utilice las VPN como fuente de conectividad de respaldo.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Configure una configuración de diagnóstico para enviar el registro de actividad a Log Analytics como destino central para el registro y la supervisión. Esto le permite supervisar la actividad del plano de control en el propio recurso de App Service.", - "guid": "ee72734b-475b-4a18-bdbf-590ce65de8e0", - "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", - "service": "App Services", + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "description": "Puede usar la anteposición de AS y los pesos de conexión para influir en el tráfico de Azure al entorno local, y la gama completa de atributos BGP en sus propios enrutadores para influir en el tráfico del entorno local a Azure.", + "guid": "f29812b2-363c-4efe-879b-599de0d5973c", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-routing", + "service": "ExpressRoute", "severity": "Medio", - "text": "Envío de registros de actividad de App Service a Log Analytics", - "waf": "Seguridad" + "text": "Cuando use varios circuitos ExpressRoute o varias ubicaciones locales, use atributos BGP para optimizar el enrutamiento.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Fiabilidad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Controle el acceso saliente a la red mediante una combinación de integración de red virtual regional, grupos de seguridad de red y UDR. El tráfico debe enrutarse a una aplicación virtual de red, como Azure Firewall. Asegúrese de supervisar los registros del cortafuegos.", - "guid": "c12159e1-14b9-433d-b574-ecccd9bd3baf", - "link": "https://learn.microsoft.com/azure/app-service/overview-vnet-integration", - "service": "App Services", + "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": "Medio", - "text": "El acceso a la red saliente debe controlarse", - "waf": "Seguridad" + "text": "Seleccione la SKU correcta para las puertas de enlace de ExpressRoute/VPN en función de los requisitos de ancho de banda y rendimiento.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Puede proporcionar una dirección IP de salida estable mediante la integración de red virtual y una puerta de enlace NAT de red virtual o una aplicación virtual de red como Azure Firewall. Esto permite a la parte receptora incluir en la lista de permitidos en función de la IP, en caso de que sea necesario. Tenga en cuenta que para las comunicaciones con los servicios de Azure, a menudo no es necesario depender de la dirección IP y, en su lugar, se deben usar mecanismos como los puntos de conexión de servicio. (Además, el uso de puntos de conexión privados en el extremo receptor evita que se produzca SNAT y proporciona un intervalo de IP de salida estable).", - "guid": "cda3b54e-b2eb-403d-b9a2-582718d2ddb1", - "link": "https://learn.microsoft.com/azure/app-service/networking/nat-gateway-integration", - "service": "App Services", - "severity": "Bajo", - "text": "Garantizar una IP estable para las comunicaciones salientes hacia las direcciones de Internet", - "waf": "Seguridad" + "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": "Alto", + "text": "Asegúrese de que usa circuitos ExpressRoute de datos ilimitados solo si alcanza el ancho de banda que justifica su costo.", + "waf": "Costar" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Controle el acceso entrante a la red mediante una combinación de restricciones de acceso al Servicio de aplicaciones, puntos de conexión de servicio o puntos de conexión privados. Se pueden requerir y configurar diferentes restricciones de acceso para la propia aplicación web y el sitio de SCM.", - "guid": "0725769e-e669-41a4-a34a-c932223ece80", - "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", - "service": "App Services", + "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": "Alto", - "text": "El acceso a la red entrante debe controlarse", - "waf": "Seguridad" + "text": "Aproveche la SKU local de ExpressRoute para reducir el costo de los circuitos, si la ubicación de emparejamiento de circuitos admite las regiones de Azure para la SKU local.", + "waf": "Costar" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Protéjase contra el tráfico entrante malintencionado mediante un firewall de aplicaciones web como Application Gateway o Azure Front Door. Asegúrese de supervisar los registros del WAF.", - "guid": "b123071a-5416-4415-a33e-a3ad2c2de732", - "link": "https://learn.microsoft.com/azure/app-service/networking/app-gateway-with-service-endpoints", - "service": "App Services", - "severity": "Alto", - "text": "Uso de un WAF delante de App Service", - "waf": "Seguridad" + "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": "Medio", + "text": "Implemente una puerta de enlace de ExpressRoute con redundancia de zona en las regiones de Azure admitidas.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Fiabilidad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Asegúrese de que no se pueda omitir el WAF bloqueando el acceso solo al WAF. Use una combinación de restricciones de acceso, puntos de conexión de servicio y puntos de conexión privados.", - "guid": "165c3acb-ef4a-4be1-b8d3-9fda47768314", - "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", - "service": "App Services", - "severity": "Alto", - "text": "Evite que se omita WAF", - "waf": "Seguridad" + "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": "Medio", + "text": "En escenarios que requieren un ancho de banda superior a 10 Gbps o puertos dedicados de 10/100 Gbps, use ExpressRoute Direct.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Establezca la directiva TLS mínima en 1.2 en la configuración de App Service.", - "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", + "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": "Medio", - "text": "Establezca la directiva TLS mínima en 1.2", - "waf": "Seguridad" + "text": "Cuando se requiera una latencia baja o el rendimiento del entorno local a Azure debe ser superior a 10 Gbps, habilite FastPath para omitir la puerta de enlace de ExpressRoute de la ruta de acceso de datos.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Configure App Service para que use solo HTTPS. Esto hace que App Service se redirija de HTTP a HTTPS. Considere seriamente el uso de HTTP Strict Transport Security (HSTS) en su código o desde su WAF, que informa a los navegadores que solo se debe acceder al sitio mediante 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", - "severity": "Alto", - "text": "Usar solo HTTPS", - "waf": "Seguridad" + "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": "Medio", + "text": "Use puertas de enlace de VPN con redundancia de zona para conectar sucursales o ubicaciones remotas a Azure (donde estén disponibles).", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", + "waf": "Fiabilidad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "No utilice caracteres comodín en la configuración de CORS, ya que esto permite que todos los orígenes accedan al servicio (lo que anula el propósito de CORS). En concreto, solo permite los orígenes que esperas poder acceder al servicio.", - "guid": "68266abc-a264-4f9a-89ae-d9c55d04c2c3", - "link": "https://learn.microsoft.com/azure/app-service/app-service-web-tutorial-rest-api", - "service": "App Services", - "severity": "Alto", - "text": "Los comodines no deben usarse para CORS", - "waf": "Seguridad" + "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": "Medio", + "text": "Utilice dispositivos VPN redundantes en las instalaciones (activo/activo o activo/pasivo).", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", + "waf": "Fiabilidad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "La depuración remota no debe estar activada en producción, ya que esto abre puertos adicionales en el servicio, lo que aumenta la superficie expuesta a ataques. Tenga en cuenta que el servicio desactiva la depuración remota automáticamente después de 48 horas.", - "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", + "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": "Alto", - "text": "Desactivar la depuración remota", - "waf": "Seguridad" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Habilite Defender para App Service. Esto (entre otras amenazas) detecta comunicaciones a direcciones IP maliciosas conocidas. Revise las recomendaciones de Defender para App Service como parte de las operaciones.", - "guid": "18d2ddb1-0725-4769-be66-91a4834ac932", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-app-service-introduction", - "service": "App Services", - "severity": "Medio", - "text": "Habilitación de Defender for Cloud: Defender for App Service", - "waf": "Seguridad" + "text": "Si usa ExpressRoute Direct, considere la posibilidad de usar circuitos locales de ExpressRoute a las regiones locales de Azure para ahorrar costos.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Costar" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Azure proporciona protección básica contra DDoS en su red, que se puede mejorar con funcionalidades inteligentes de DDoS Standard que aprenden sobre los patrones de tráfico normales y pueden detectar comportamientos inusuales. DDoS Standard se aplica a una red virtual, por lo que debe configurarse para el recurso de red delante de la aplicación, como Application Gateway o una aplicación virtual de red.", - "guid": "223ece80-b123-4071-a541-6415833ea3ad", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "App Services", + "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": "Medio", - "text": "Habilitación del estándar de protección DDoS en la red virtual de WAF", + "text": "Cuando se requiera aislamiento de tráfico o ancho de banda dedicado, por ejemplo, para separar entornos de producción y no de producción, use diferentes circuitos ExpressRoute. Le ayudará a garantizar dominios de enrutamiento aislados y a aliviar los riesgos de vecinos ruidosos.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "Seguridad" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Cuando use imágenes almacenadas en Azure Container Registry, extráigalas a través de una red virtual desde Azure Container Registry mediante su punto de conexión privado y la configuración de la aplicación \"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", + "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": "Medio", - "text": "Extracción de contenedores a través de una red virtual", - "waf": "Seguridad" + "text": "Supervise la disponibilidad y el uso de ExpressRoute mediante Express Route Insights integrado.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Operaciones" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Realice una prueba de penetración en la aplicación web siguiendo las reglas de participación de las pruebas de penetración.", - "guid": "eb2eb03d-d9a2-4582-918d-2ddb10725769", - "link": "https://learn.microsoft.com/azure/security/fundamentals/pen-testing", - "service": "App Services", + "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": "Medio", - "text": "Realizar una prueba de penetración", - "waf": "Seguridad" + "text": "Use el Monitor de conexión para la supervisión de la conectividad en toda la red, especialmente entre el entorno local y Azure.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Operaciones" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Implemente código de confianza que se haya validado y analizado en busca de vulnerabilidades de acuerdo con las prácticas de DevSecOps.", - "guid": "19aed9c5-5d04-4c2c-9919-ca0b2c12159e", - "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/devsecops-in-azure", - "service": "App Services", + "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": "Medio", - "text": "Implementación de código validado", - "waf": "Seguridad" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Utilice las versiones más recientes de plataformas, lenguajes de programación, protocolos y marcos compatibles.", - "guid": "114b933d-f574-4ecc-ad9b-d3bafcda3b54", - "link": "https://learn.microsoft.com/azure/app-service/overview-patch-os-runtime", - "service": "App Services", - "severity": "Alto", - "text": "Utilizar plataformas, lenguajes, protocolos y marcos actualizados", - "waf": "Seguridad" + "text": "Use circuitos ExpressRoute de diferentes ubicaciones de emparejamiento para obtener redundancia.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "ab91932c-9fc9-4d1b-a881-37f5e6c0cb9e", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ADF_v1.docx", - "service": "Azure Data Factory", + "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": "Medio", - "text": "Aproveche el cuaderno de estrategias de resistencia de FTA para Azure Data Factory", + "text": "Use VPN de sitio a sitio como conmutación por error de ExpressRoute, si solo usa un único circuito ExpressRoute.", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "e503547c-d447-4e82-9138-a7200f1cac6d", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", + "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": "Alto", - "text": "Uso de canalizaciones con redundancia de zona en regiones que admiten zonas de disponibilidad", + "text": "Si utiliza una tabla de rutas en GatewaySubnet, asegúrese de que se propaguen las rutas de puerta de enlace.", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "9ef1d6e8-32e5-42e3-911c-818b1a0bc511", - "link": "https://learn.microsoft.com/azure/data-factory/source-control", - "service": "Azure Data Factory", - "severity": "Medio", - "text": "Uso de DevOps para realizar copias de seguridad de las plantillas de ARM con la integración de Github/Azure DevOps ", + "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": "Alto", + "text": "Si usa ExpressRoute, el enrutamiento local debe ser dinámico: en caso de que se produzca un error de conexión, debe converger a la conexión restante del circuito. La carga debe compartirse entre ambas conexiones, idealmente como activa/activa, aunque también se admite activa/pasiva.", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "e43a18a9-cd29-49cf-b7b1-7db8255562f2", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", + "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": "Medio", - "text": "Asegúrese de replicar las máquinas virtuales de Integration Runtime autohospedadas en otra región ", + "text": "Asegúrese de que los dos vínculos físicos del circuito ExpressRoute están conectados a dos dispositivos perimetrales distintos de la red.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "aee4563a-fd83-4393-98b2-62d6dc5f512a", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", + "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": "Medio", - "text": "Asegúrese de replicar o duplicar la red en la región hermana. Tiene que hacer una copia de la red virtual en otra región", + "text": "Asegúrese de que la detección de reenvío bidireccional (BFD) esté habilitada y configurada en los dispositivos de enrutamiento perimetral del cliente o proveedor.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "description": "Si las canalizaciones de ADF usan Key Vault, no tiene que hacer nada para replicar Key Vault. Key Vault es un servicio administrado y Microsoft se encarga de ello por ti", - "guid": "25498f6d-bad3-47da-a43b-c6ce1d7aa9b2", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "Azure Data Factory", - "severity": "Bajo", - "text": "Si utiliza la integración de Keyvault, utilice el Acuerdo de Nivel de Servicio de Keyvault para comprender su disponibilidad", + "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": "Alto", + "text": "Conecte la puerta de enlace de ExpressRoute a dos o más circuitos de diferentes ubicaciones de emparejamiento para una mayor resistencia.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "Fiabilidad" }, { + "arm-service": "microsoft.network/expressRouteCircuits", "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", + "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": "Medio", - "text": "Use un inquilino de Entra para administrar los recursos de Azure, a menos que tenga un requisito normativo o empresarial claro para varios inquilinos.", + "text": "Configure registros de diagnóstico y alertas para la puerta de enlace de red virtual de ExpressRoute.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "Operaciones" }, { + "arm-service": "microsoft.network/expressRouteCircuits", "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", + "guid": "5234c93f-b651-41dd-80c1-234177b91ced", + "link": "https://learn.microsoft.com/azure/expressroute/virtual-network-connectivity-guidance", + "service": "ExpressRoute", + "severity": "Medio", + "text": "No use circuitos ExpressRoute para la comunicación de red virtual a red virtual.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Rendimiento" + }, + { + "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": "Bajo", - "text": "Use el enfoque de automatización multiinquilino para administrar los inquilinos de Microsoft Entra ID.", - "waf": "Operaciones" + "text": "No envíe el tráfico de Azure a ubicaciones híbridas para su inspección. En su lugar, siga el principio \"el tráfico de Azure permanece en Azure\" para que la comunicación entre los recursos de Azure se produzca a través de la red troncal de Microsoft.", + "waf": "Rendimiento" }, { + "arm-service": "Microsoft.Network/azureFirewalls", "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", + "guid": "e6c4cfd3-e504-4547-a244-7ec66138a720", + "link": "https://learn.microsoft.com/azure/firewall/overview", + "service": "Firewall", "severity": "Alto", - "text": "Use Azure Lighthouse para la administración de varios inquilinos con los mismos identificadores.", - "training": "https://learn.microsoft.com/azure/lighthouse/concepts/cross-tenant-management-experience", - "waf": "Operaciones" + "text": "Use Azure Firewall para controlar el tráfico de salida de Azure a Internet, las conexiones de entrada que no son HTTP/S y el filtrado del tráfico Este/Oeste (si la organización lo requiere).", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Seguridad" }, { + "arm-service": "Microsoft.Network/azureFirewalls", "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": "Alto", - "text": "Si concede a un asociado acceso para administrar el inquilino, use Azure Lighthouse.", - "waf": "Costar" + "guid": "5a4b1511-e43a-458a-ac22-99c4d7b57d0c", + "link": "https://learn.microsoft.com/azure/firewall-manager/policy-overview", + "service": "Firewall", + "severity": "Medio", + "text": "Cree una directiva global de Azure Firewall para controlar la posición de seguridad en todo el entorno de red global y asígnela a todas las instancias de Azure Firewall. Permita que las directivas granulares cumplan los requisitos de regiones específicas delegando directivas de firewall incrementales a los equipos de seguridad locales a través del control de acceso basado en roles de Azure.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Seguridad" }, { + "arm-service": "Microsoft.Network/azureFirewalls", "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": "Alto", - "text": "Aplique un modelo RBAC que se alinee con su modelo operativo en la nube. Ámbito y asignación entre grupos de administración y suscripciones.", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "guid": "655562f2-b3e4-4563-a4d8-739748b662d6", + "link": "https://learn.microsoft.com/azure/firewall-manager/deploy-trusted-security-partner", + "service": "Firewall", + "severity": "Bajo", + "text": "Configure los proveedores de seguridad SaaS de socios compatibles dentro de Firewall Manager si la organización desea utilizar dichas soluciones para ayudar a proteger las conexiones salientes.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "Seguridad" }, { + "arm-service": "Microsoft.Network/azureFirewalls", "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", + "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": "Alto", - "text": "Utilice únicamente el tipo de autenticación Cuenta profesional o educativa para todos los tipos de cuenta. Evite usar la cuenta de Microsoft", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "text": "Utilice las reglas de la aplicación para filtrar el tráfico saliente en el nombre de host de destino para los protocolos compatibles. Use reglas de red basadas en FQDN y Azure Firewall con proxy DNS para filtrar el tráfico de salida a Internet a través de otros protocolos.", "waf": "Seguridad" }, { + "arm-service": "Microsoft.Network/azureFirewalls", "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": "Medio", - "text": "Utilice solo grupos para asignar permisos. Agregue grupos locales al grupo Solo ID de Entra si ya existe un sistema de administración de grupos.", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "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": "Alto", + "text": "Use Azure Firewall Premium para habilitar características de seguridad adicionales.", "waf": "Seguridad" }, { + "arm-service": "Microsoft.Network/azureFirewalls", "checklist": "Azure Landing Zone Review", - "guid": "53e8908a-e28c-484c-93b6-b7808b9fe5c4", - "link": "https://learn.microsoft.com/azure/active-directory/conditional-access/overview", - "service": "Entra", + "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": "Alto", - "text": "Aplique directivas de acceso condicional de identificador de Microsoft Entra para cualquier usuario con derechos sobre entornos de Azure.", - "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "text": "Configure el modo de Inteligencia sobre amenazas de Azure Firewall en Alerta y Denegar para obtener protección adicional.", "waf": "Seguridad" }, { + "arm-service": "Microsoft.Network/azureFirewalls", "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", + "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": "Alto", - "text": "Aplique la autenticación multifactor para cualquier usuario con derechos en los entornos de Azure.", - "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "text": "Configure el modo IDPS de Azure Firewall en Denegar para obtener protección adicional.", "waf": "Seguridad" }, { + "arm-service": "Microsoft.Network/azureFirewalls", "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": "Medio", - "text": "Aplique la administración de identidades privilegiadas (PIM) de Microsoft Entra ID para establecer un acceso permanente cero y privilegios mínimos.", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "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": "Alto", + "text": "En el caso de las subredes de las redes virtuales que no están conectadas a Virtual WAN, adjunte una tabla de rutas para que el tráfico de Internet se redirija a Azure Firewall o a una aplicación virtual de red.", "waf": "Seguridad" }, { + "arm-service": "Microsoft.Network/azureFirewalls", "checklist": "Azure Landing Zone Review", - "guid": "8b9fe5c4-1049-4d40-9a92-3c3474d00018", - "link": "https://learn.microsoft.com/en-us/entra/identity/domain-services/overview", - "service": "Entra", + "guid": "715d833d-4708-4527-90ac-1b142c7045ba", + "link": "https://learn.microsoft.com/azure/firewall/firewall-structured-logs", + "service": "Firewall", "severity": "Medio", - "text": "Si planea cambiar de Servicios de dominio de Active Directory a Servicios de dominio Entra, evalúe la compatibilidad de todas las cargas de trabajo.", - "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", - "waf": "Seguridad" + "text": "Agregue la configuración de diagnóstico para guardar registros, mediante la tabla de destino Recurso específico, para todas las implementaciones de Azure Firewall.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Operaciones" }, { + "arm-service": "Microsoft.Network/azureFirewalls", "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": "Medio", - "text": "Integre los registros de identificador de Microsoft Entra con Azure Monitor central de la plataforma. Azure Monitor permite una única fuente de información sobre los datos de registro y supervisión en Azure, lo que proporciona a las organizaciones opciones nativas en la nube para cumplir con los requisitos relacionados con la recopilación y retención de registros.", - "waf": "Seguridad" + "guid": "e960fc6b-4ab2-4db6-9609-3745135f9ffa", + "link": "https://learn.microsoft.com/azure/firewall-manager/migrate-to-policy", + "service": "Firewall", + "severity": "Importante", + "text": "Migre de las reglas de Azure Firewall clásico (si existen) a la directiva de firewall.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Operaciones" }, { - "ammp": true, + "arm-service": "Microsoft.Network/azureFirewalls", "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", + "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": "Alto", - "text": "Implemente un acceso de emergencia o cuentas de emergencia para evitar el bloqueo de cuentas en todo el inquilino.", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "text": "Use un prefijo /26 para las subredes de Azure Firewall.", "waf": "Seguridad" }, { + "arm-service": "Microsoft.Network/azureFirewalls", "checklist": "Azure Landing Zone Review", - "guid": "35037e68-9349-4c15-b371-228514f4cdff", - "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", - "service": "Entra", + "guid": "828cec2e-af6c-40c2-8fa2-1b681ee63eb7", + "link": "https://learn.microsoft.com/azure/firewall-manager/rule-hierarchy", + "service": "Firewall", "severity": "Medio", - "text": "No use cuentas sincronizadas locales para las asignaciones de roles de identificador de Microsoft Entra, a menos que tenga un escenario que lo requiera específicamente.", - "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", - "waf": "Seguridad" + "text": "Organice las reglas dentro de la política de firewall en grupos de colecciones de reglas y colecciones de reglas, en función de su frecuencia de uso.", + "waf": "Rendimiento" }, { + "arm-service": "Microsoft.Network/azureFirewalls", "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", + "guid": "0da83bb1-2f39-49af-b5c9-835fc455e3d1", + "link": "https://learn.microsoft.com/azure/firewall/ip-groups", + "service": "Firewall", "severity": "Medio", - "text": "Al usar el proxy de aplicación de Microsoft Entra ID para proporcionar a los usuarios remotos acceso a las aplicaciones, adminístrelo como un recurso de plataforma, ya que solo puede tener una instancia por inquilino.", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", - "waf": "Seguridad" + "text": "Utilice grupos de direcciones IP o prefijos de direcciones IP para reducir el número de reglas de tabla de direcciones IP.", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.Network/virtualNetworks", + "arm-service": "Microsoft.Network/azureFirewalls", "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", + "guid": "c44c6f0e-1642-4a61-a17b-0922f835c93a", + "link": "https://learn.microsoft.com/azure/firewall/tutorial-firewall-dnat", + "service": "Firewall", "severity": "Medio", - "text": "Utilice una topología de red en estrella tipo hub-and-spoke para escenarios de red que requieran la máxima flexibilidad.", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "Seguridad" + "text": "No utilice caracteres comodín como IP de origen para DNATS, como * o cualquiera, debe especificar IP de origen para los DNAT entrantes.", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.Network/virtualNetworks", + "arm-service": "Microsoft.Network/azureFirewalls", "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": "Alto", - "text": "Implemente servicios de red compartidos, incluidas puertas de enlace de ExpressRoute, puertas de enlace de VPN y Azure Firewall o aplicaciones virtuales de red de asociados en la red virtual del centro central. Si es necesario, implemente también servicios DNS.", - "waf": "Costar" + "guid": "7371dc21-251a-47a3-af14-6e01b9da4757", + "link": "https://learn.microsoft.com/azure/firewall/integrate-with-nat-gateway", + "service": "Firewall", + "severity": "Medio", + "text": "Evite el agotamiento del puerto SNAT supervisando el uso del puerto SNAT, evaluando la configuración de la puerta de enlace NAT y garantizando una conmutación por error sin problemas. Si el número de puertos se acerca al límite, es una señal de que el agotamiento de SNAT podría ser inminente.", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.Network/virtualNetworks", + "arm-service": "Microsoft.Network/azureFirewalls", "checklist": "Azure Landing Zone Review", - "guid": "143b16c3-1d7a-4a9b-9470-4489a8042d88", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "VNet", + "guid": "346840b8-1064-496e-8396-4b1340172d52", + "link": "https://learn.microsoft.com/azure/firewall/premium-features#tls-inspection", + "service": "Firewall", "severity": "Alto", - "text": "Utilice un plan de protección de IP o red DDoS para todas las direcciones IP públicas en las zonas de aterrizaje de aplicaciones.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Seguridad" - }, - { - "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": "Medio", - "text": "Al implementar tecnologías de redes de asociados o NVA, siga las instrucciones del proveedor del asociado.", - "waf": "Fiabilidad" + "text": "Si usa Azure Firewall Premium, habilite la inspección de TLS.", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Network/azureFirewalls", "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", + "guid": "39990a13-915c-45f9-a2d3-562d7d6c4b7c", + "link": "https://learn.microsoft.com/azure/firewall/premium-features#web-categories", + "service": "Firewall", "severity": "Bajo", - "text": "Si necesita tránsito entre ExpressRoute y puertas de enlace de VPN en escenarios tipo hub-and-spoke, use Azure Route Server.", - "waf": "Seguridad" + "text": "Utilice categorías web para permitir o denegar el acceso saliente a temas específicos.", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.Network/virtualHubs", + "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 == '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": "Bajo", - "text": "Si utiliza el servidor de rutas, utilice un prefijo /27 para la subred del servidor de rutas.", - "waf": "Seguridad" - }, - { - "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", + "guid": "6eff7e6c-6c4a-43d7-be3f-6641c2cb3d4a", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/gateway/application-gateway-before-azure-firewall", + "service": "Firewall", "severity": "Medio", - "text": "En el caso de las arquitecturas de red con varias topologías en estrella tipo hub-and-spoke en las regiones de Azure, use emparejamientos de red virtual global entre las redes virtuales del centro para conectar las regiones entre sí.", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-virtual-networks/", + "text": "Como parte de la inspección de TLS, planee la recepción de tráfico de Azure App Gateways para su inspección.", "waf": "Rendimiento" }, { - "arm-service": "Microsoft.Network/virtualNetworks", + "arm-service": "Microsoft.Network/azureFirewalls", "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", + "guid": "94f3eede-9aa3-4088-92a3-bb9a56509fad", + "link": "https://learn.microsoft.com/azure/firewall/dns-details", + "service": "Firewall", "severity": "Medio", - "text": "Use Azure Monitor para redes para supervisar el estado de un extremo a otro de las redes de Azure.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", - "waf": "Operaciones" + "text": "Habilite la configuración del proxy DNS de Azure Firewall.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/virtualNetworks", + "arm-service": "Microsoft.Network/azureFirewalls", "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": "Medio", - "text": "Si tiene más de 400 redes radiales en una región, implemente un centro adicional para omitir los límites de emparejamiento de red virtual (500) y el número máximo de prefijos que se pueden anunciar a través de ExpressRoute (1000).", - "waf": "Fiabilidad" + "guid": "1dc04554-dece-4ffb-a49e-5c683e09f8da", + "link": "https://learn.microsoft.com/azure/firewall/firewall-diagnostics", + "service": "Firewall", + "severity": "Alto", + "text": "Integre Azure Firewall con Azure Monitor y habilite el registro de diagnóstico para almacenar y analizar los registros de firewall.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Network/virtualNetworks", + "arm-service": "Microsoft.Network/azureFirewalls", "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": "Medio", - "text": "Limite el número de rutas por tabla de rutas a 400.", - "waf": "Fiabilidad" + "guid": "64e7000e-3c06-485e-b455-ced7f454cba3", + "link": "https://learn.microsoft.com/azure/well-architected/service-guides/azure-firewall", + "service": "Firewall", + "severity": "Bajo", + "text": "Implementación de copias de seguridad para las reglas de firewall", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Network/virtualNetworks", + "arm-service": "microsoft.network/applicationGateways", "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", + "guid": "d301d6e8-72e5-42e3-911c-c58b5a4b1511", + "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", + "service": "App Gateway", "severity": "Alto", - "text": "Use la opción \"Permitir tráfico a la red virtual remota\" al configurar emparejamientos de red virtual.", - "waf": "Fiabilidad" + "text": "No interrumpa la comunicación del plano de control para los servicios PaaS de Azure insertados en una red virtual, por ejemplo, con una ruta 0.0.0.0/0 o una regla de NSG que bloquee el tráfico del plano de control.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "Seguridad" }, { "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", + "guid": "b3e4563a-4d87-4397-98b6-62d6d15f512a", + "link": "https://learn.microsoft.com/azure/private-link/private-endpoint-overview", "service": "ExpressRoute", "severity": "Medio", - "text": "Cuando use ExpressRoute Direct, configure MACsec para cifrar el tráfico en el nivel de capa dos entre los enrutadores de la organización y MSEE. El diagrama muestra este cifrado en el flujo.", + "text": "Acceda a los servicios PaaS de Azure desde el entorno local a través de puntos de conexión privados y el emparejamiento privado de ExpressRoute. Este método evita el tránsito a través de la Internet pública.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Network/virtualNetworks", "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", + "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": "Alto", + "text": "No habilite los puntos de conexión de servicio de red virtual de forma predeterminada en todas las subredes.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "Seguridad" + }, + { + "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": "Medio", - "text": "En escenarios en los que MACsec no es una opción (por ejemplo, no usar ExpressRoute Direct), use una puerta de enlace de VPN para establecer túneles IPsec a través del emparejamiento privado de ExpressRoute.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "text": "Filtre el tráfico de salida a los servicios PaaS de Azure mediante FQDN en lugar de direcciones IP en Azure Firewall o una NVA para evitar la filtración de datos. Si usa Private Link, puede bloquear todos los FQDN, de lo contrario, permitir solo los servicios PaaS necesarios.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", "waf": "Seguridad" }, { "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", + "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": "Alto", - "text": "Asegúrese de que no se usen espacios de direcciones IP superpuestos entre regiones de Azure y ubicaciones locales.", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "text": "Utilice al menos un prefijo /27 para las subredes de puerta de enlace.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/virtualNetworks", + "arm-service": "Microsoft.Network/networkSecurityGroups", "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": "Medio", - "text": "Utilice las direcciones IP de los rangos de asignación de direcciones para Internet privadas (RFC 1918).", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "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": "Alto", + "text": "No confíe en las reglas predeterminadas de entrada de NSG que usan la etiqueta de servicio VirtualNetwork para limitar la conectividad.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/virtualNetworks", + "arm-service": "Microsoft.Network/networkSecurityGroups", "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": "Alto", - "text": "Asegúrese de que no se desperdicie el espacio de direcciones IP, no cree redes virtuales innecesariamente grandes (por ejemplo, /16).", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "Rendimiento" + "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": "Medio", + "text": "Use los grupos de seguridad de red para ayudar a proteger el tráfico a través de las subredes, así como el tráfico este/oeste a través de la plataforma (tráfico entre zonas de aterrizaje).", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/virtualNetworks", + "arm-service": "Microsoft.Network/networkSecurityGroups", "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": "Alto", - "text": "No utilice intervalos de direcciones IP superpuestos para los sitios de producción y recuperación ante desastres.", - "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", - "waf": "Fiabilidad" + "guid": "a4d87397-48b6-462d-9d15-f512a65498f6", + "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "service": "NSG", + "severity": "Medio", + "text": "Use grupos de seguridad de red y grupos de seguridad de aplicaciones para microsegmentar el tráfico dentro de la zona de aterrizaje y evite usar una NVA central para filtrar los flujos de tráfico.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/dnsZones", + "arm-service": "Microsoft.Network/networkSecurityGroups", "checklist": "Azure Landing Zone Review", - "guid": "153e8908-ae28-4c84-a33b-6b7808b9fe5c", - "link": "https://learn.microsoft.com/azure/dns/private-dns-getstarted-portal", - "service": "DNS", + "guid": "dfe237de-143b-416c-91d7-aa9b64704489", + "link": "https://learn.microsoft.com/azure/network-watcher/vnet-flow-logs-overview", + "service": "NSG", "severity": "Medio", - "text": "En entornos en los que la resolución de nombres en Azure es todo lo necesario, use Azure Private DNS para la resolución con una zona delegada para la resolución de nombres (como 'azure.contoso.com').", - "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", - "waf": "Operaciones" + "text": "Habilite los registros de flujo de red virtual e introdúzcalos en Traffic Analytics para obtener información sobre los flujos de tráfico internos y externos.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/dnsZones", + "arm-service": "Microsoft.Network/networkSecurityGroups", "checklist": "Azure Landing Zone Review", - "guid": "41049d40-3a92-43c3-974d-00018ac6a9e0", - "link": "https://learn.microsoft.com/azure/dns/dns-private-resolver-overview", - "service": "DNS", + "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": "Medio", - "text": "En el caso de los entornos en los que se requiere la resolución de nombres en Azure y en el entorno local y no existe ningún servicio DNS empresarial como Active Directory, use Azure DNS Private Resolver para enrutar las solicitudes DNS a Azure o a servidores DNS locales.", - "training": "https://learn.microsoft.com/training/modules/intro-to-azure-dns-private-resolver/", - "waf": "Seguridad" + "text": "No implemente más de 900 reglas de NSG por NSG, debido al límite de 1000 reglas.", + "training": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Network/dnsZones", + "arm-service": "microsoft.network/virtualWans", "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": "Bajo", - "text": "Las cargas de trabajo especiales que requieren e implementan su propio DNS (como Red Hat OpenShift) deben usar su solución de DNS preferida.", + "guid": "412e7f98-3f63-4047-82dd-69c5b5c2622f", + "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-any-to-any", + "service": "VWAN", + "severity": "Medio", + "text": "Use Virtual WAN si el escenario se describe explícitamente en la lista de diseños de enrutamiento de Virtual WAN.", + "training": "https://learn.microsoft.com/learn/modules/introduction-azure-virtual-wan/", "waf": "Operaciones" }, { - "arm-service": "Microsoft.Network/dnsZones", + "arm-service": "microsoft.network/virtualWans", "checklist": "Azure Landing Zone Review", - "guid": "614658d3-558f-4d77-849b-821112df27ee", - "link": "https://learn.microsoft.com/azure/dns/private-dns-autoregistration", - "service": "DNS", - "severity": "Alto", - "text": "Habilite el registro automático de Azure DNS para administrar automáticamente el ciclo de vida de los registros DNS de las máquinas virtuales implementadas en una red virtual.", - "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", - "waf": "Operaciones" + "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": "Medio", + "text": "Use un centro de conectividad de Virtual WAN por región de Azure para conectar varias zonas de aterrizaje juntas en regiones de Azure a través de una instancia global común de Azure Virtual WAN.", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.network/bastionHosts", + "arm-service": "microsoft.network/virtualWans", "checklist": "Azure Landing Zone Review", - "guid": "ee1ac551-c4d5-46cf-b035-d0a3c50d87ad", - "link": "https://learn.microsoft.com/azure/bastion/bastion-overview", - "service": "Bastion", + "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": "Medio", - "text": "Use Azure Bastion para conectarse de forma segura a la red.", + "text": "Para la protección y el filtrado del tráfico de Internet saliente, implemente Azure Firewall en centros seguros.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/bastionHosts", + "arm-service": "microsoft.network/virtualWans", "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", + "guid": "6667313b-4f56-464b-9e98-4a859c773e7d", + "link": "https://learn.microsoft.com/azure/virtual-wan/migrate-from-hub-spoke-topology", + "service": "VWAN", "severity": "Medio", - "text": "Use Azure Bastion en una subred /26 o superior.", - "waf": "Seguridad" + "text": "Asegúrese de que la arquitectura de red WAN virtual se alinee con un escenario de arquitectura identificado.", + "waf": "Fiabilidad" }, { - "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", + "arm-service": "microsoft.network/virtualWans", "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", + "guid": "261623a7-65a9-417e-8f34-8ef254c27d42", + "link": "https://learn.microsoft.com/azure/virtual-wan/azure-monitor-insights", + "service": "VWAN", "severity": "Medio", - "text": "Use las directivas de Azure Front Door y WAF para proporcionar protección global en todas las regiones de Azure para las conexiones HTTP/S entrantes a una zona de aterrizaje.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Seguridad" + "text": "Use Azure Monitor Insights para Virtual WAN para supervisar la topología de un extremo a otro de Virtual WAN, el estado y las métricas clave.", + "waf": "Operaciones" }, { - "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": "Bajo", - "text": "Al usar Azure Front Door y Azure Application Gateway para ayudar a proteger las aplicaciones HTTP/S, use directivas de WAF en Azure Front Door. Bloquee Azure Application Gateway para recibir tráfico solo de Azure Front Door.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Seguridad" - }, - { - "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", + "arm-service": "microsoft.network/virtualWans", "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": "Alto", - "text": "Cuando se requieran WAF y otros servidores proxy inversos para las conexiones HTTP/S entrantes, impleméntelos dentro de una red virtual de zona de aterrizaje y junto con las aplicaciones que protegen y exponen a Internet.", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "Seguridad" + "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": "Medio", + "text": "No deshabilite el tráfico de rama a rama en Virtual WAN, a menos que estos flujos deban bloquearse explícitamente.", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Network/virtualNetworks", + "arm-service": "microsoft.network/virtualWans", "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": "Alto", - "text": "Use los planes de protección IP o de red DDoS de Azure para ayudar a proteger los puntos de conexión de direcciones IP públicas dentro de las redes virtuales.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Seguridad" + "guid": "d49ac006-6670-4bc9-9948-d3e0a3a94f4d", + "link": "https://learn.microsoft.com/azure/virtual-wan/about-virtual-hub-routing-preference", + "service": "VWAN", + "severity": "Medio", + "text": "Use AS-Path como preferencia de enrutamiento del concentrador, ya que es más flexible que ExpressRoute o VPN.", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Network/virtualNetworks", + "arm-service": "microsoft.network/virtualWans", "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": "Alto", - "text": "Planifique cómo administrar la configuración y la estrategia del tráfico saliente de su red antes del próximo cambio importante. El 30 de septiembre de 2025, se retirará el acceso saliente predeterminado para las nuevas implementaciones y solo se permitirán configuraciones de acceso explícitas.", + "guid": "2586b854-237e-47f1-84a1-d45d4cd2310d", + "link": "https://learn.microsoft.com/azure/virtual-wan/about-virtual-hub-routing#labels", + "service": "VWAN", + "severity": "Medio", + "text": "Configure la propagación basada en etiquetas en Virtual WAN, de lo contrario, la conectividad entre los centros virtuales se verá afectada.", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Network/virtualNetworks", + "arm-service": "microsoft.network/virtualWans", "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", + "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": "Alto", - "text": "Agregue configuraciones de diagnóstico para guardar los registros relacionados con DDoS para todas las direcciones IP públicas protegidas (IP DDoS o Protección de red).", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Seguridad" + "text": "Asigne al menos un prefijo /23 a los centros virtuales para asegurarse de que haya suficiente espacio IP disponible.", + "waf": "Fiabilidad" }, { "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", + "guid": "5c986cb2-9131-456a-8247-6e49f541acdc", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", "service": "Policy", "severity": "Alto", - "text": "Asegúrese de que haya una asignación de directiva para denegar las direcciones IP públicas vinculadas directamente a las máquinas virtuales. Use exclusiones si se necesitan direcciones IP públicas en máquinas virtuales específicas.", + "text": "Aproveche Azure Policy de forma estratégica, defina controles para su entorno mediante iniciativas de directivas para agrupar directivas relacionadas.", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Authorization/policyDefinitions", "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", + "guid": "d8a2adb1-17d6-4326-af62-5ca44e5695f2", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", "severity": "Medio", - "text": "Use ExpressRoute como conexión principal a Azure. Utilice las VPN como fuente de conectividad de respaldo.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Rendimiento" + "text": "Asigne los requisitos normativos y de cumplimiento a las definiciones de Azure Policy y las asignaciones de roles de Azure.", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Authorization/policyDefinitions", "checklist": "Azure Landing Zone Review", - "description": "Puede usar la anteposición de AS y los pesos de conexión para influir en el tráfico de Azure al entorno local, y la gama completa de atributos BGP en sus propios enrutadores para influir en el tráfico del entorno local a Azure.", - "guid": "f29812b2-363c-4efe-879b-599de0d5973c", - "link": "https://learn.microsoft.com/azure/expressroute/expressroute-routing", - "service": "ExpressRoute", + "guid": "223ace8c-b123-408c-a501-7f154e3ab369", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", "severity": "Medio", - "text": "Cuando use varios circuitos ExpressRoute o varias ubicaciones locales, use atributos BGP para optimizar el enrutamiento.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Fiabilidad" + "text": "Establezca definiciones de Azure Policy en el grupo de administración raíz intermedio para que se puedan asignar en ámbitos heredados.", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Authorization/policyDefinitions", "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": "Medio", - "text": "Seleccione la SKU correcta para las puertas de enlace de ExpressRoute/VPN en función de los requisitos de ancho de banda y rendimiento.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Rendimiento" + "guid": "3829e7e3-1618-4368-9a04-77a209945bda", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", + "severity": "Alto", + "text": "Administre las asignaciones de políticas en el nivel más alto apropiado con exclusiones en los niveles inferiores, si es necesario.", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Authorization/policyDefinitions", "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": "Alto", - "text": "Asegúrese de que usa circuitos ExpressRoute de datos ilimitados solo si alcanza el ancho de banda que justifica su costo.", - "waf": "Costar" + "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": "Bajo", + "text": "Use Azure Policy para controlar qué servicios pueden aprovisionar los usuarios en el nivel de suscripción o grupo de administración.", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Authorization/policyDefinitions", "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", + "guid": "be7d7e48-4327-46d8-adc0-55bcf619e8a1", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", "severity": "Alto", - "text": "Aproveche la SKU local de ExpressRoute para reducir el costo de los circuitos, si la ubicación de emparejamiento de circuitos admite las regiones de Azure para la SKU local.", - "waf": "Costar" + "text": "Utilice políticas integradas siempre que sea posible para minimizar la sobrecarga operativa.", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Authorization/policyDefinitions", "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", + "description": "La asignación del rol Colaborador de directivas de recursos a ámbitos específicos le permite delegar la administración de directivas a los equipos pertinentes. Por ejemplo, un equipo de TI central puede supervisar las políticas a nivel de grupo de administración, mientras que los equipos de aplicaciones se encargan de las políticas de sus suscripciones, lo que permite la gobernanza distribuida con el cumplimiento de los estándares de la organización.", + "guid": "3f988795-25d6-4268-a6d7-0ba6c97be995", + "link": "https://learn.microsoft.com/azure/governance/policy/overview#azure-rbac-permissions-in-azure-policy", + "service": "Policy", "severity": "Medio", - "text": "Implemente una puerta de enlace de ExpressRoute con redundancia de zona en las regiones de Azure admitidas.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Fiabilidad" + "text": "Asigne el rol integrado Colaborador de directiva de recursos en un ámbito determinado para habilitar la gobernanza de nivel de aplicación.", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Authorization/policyDefinitions", "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", + "guid": "19048384-5c98-46cb-8913-156a12476e49", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Policy", "severity": "Medio", - "text": "En escenarios que requieren un ancho de banda superior a 10 Gbps o puertos dedicados de 10/100 Gbps, use ExpressRoute Direct.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Rendimiento" + "text": "Limite el número de asignaciones de Azure Policy realizadas en el ámbito del grupo de administración raíz para evitar la administración a través de exclusiones en ámbitos heredados.", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Authorization/policyDefinitions", "checklist": "Azure Landing Zone Review", - "guid": "c2299c4d-7b57-4d0c-9555-62f2b3e4563a", - "link": "https://learn.microsoft.com/azure/expressroute/about-fastpath", - "service": "ExpressRoute", + "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": "Medio", - "text": "Cuando se requiera una latencia baja o el rendimiento del entorno local a Azure debe ser superior a 10 Gbps, habilite FastPath para omitir la puerta de enlace de ExpressRoute de la ruta de acceso de datos.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Rendimiento" + "text": "Si existen requisitos de soberanía de datos, se deben implementar Azure Policies para aplicarlos.", + "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/virtualNetworkGateways", + "arm-service": "Microsoft.Authorization/policyDefinitions", "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", + "guid": "78b22132-b41c-460b-a4d3-df8f73a67dc2", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/sovereign-landing-zone", + "service": "Policy", "severity": "Medio", - "text": "Use puertas de enlace de VPN con redundancia de zona para conectar sucursales o ubicaciones remotas a Azure (donde estén disponibles).", - "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", - "waf": "Fiabilidad" + "text": "Para la zona de aterrizaje soberana, implemente la línea base de la política de soberanía y asígnela en el nivel de grupo de administración correcto.", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/virtualNetworkGateways", + "arm-service": "Microsoft.Authorization/policyDefinitions", "checklist": "Azure Landing Zone Review", - "guid": "45866df8-cf85-4ca9-bbe2-65ec1478919e", - "link": "https://learn.microsoft.com/azure/vpn-gateway/vpn-gateway-highlyavailable", - "service": "VPN", + "guid": "caeea0e9-1024-41df-a52e-d99c3f22a6f4", + "link": "https://learn.microsoft.com/industry/sovereignty/policy-portfolio-baseline", + "service": "Policy", "severity": "Medio", - "text": "Utilice dispositivos VPN redundantes en las instalaciones (activo/activo o activo/pasivo).", - "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", - "waf": "Fiabilidad" - }, - { - "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": "Alto", - "text": "Si usa ExpressRoute Direct, considere la posibilidad de usar circuitos locales de ExpressRoute a las regiones locales de Azure para ahorrar costos.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Costar" + "text": "En el caso de la Zona de Aterrizaje Soberana, documente los objetivos del Control Soberano para el mapeo de políticas.", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Authorization/policyDefinitions", "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", + "guid": "9b461617-db7b-4399-8ac6-d4eb7153893a", + "link": "https://learn.microsoft.com/industry/sovereignty/policy-portfolio-baseline#sovereignty-baseline-policy-initiatives", + "service": "Policy", "severity": "Medio", - "text": "Cuando se requiera aislamiento de tráfico o ancho de banda dedicado, por ejemplo, para separar entornos de producción y no de producción, use diferentes circuitos ExpressRoute. Le ayudará a garantizar dominios de enrutamiento aislados y a aliviar los riesgos de vecinos ruidosos.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "text": "En el caso de la Zona de Aterrizaje Soberana, garantizar que exista un proceso para la gestión de los \"objetivos de control soberano para el mapeo de políticas\".", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Insights/components", "checklist": "Azure Landing Zone Review", - "guid": "b30e38c3-f298-412b-8363-cefe179b599d", - "link": "https://learn.microsoft.com/azure/expressroute/expressroute-monitoring-metrics-alerts", - "service": "ExpressRoute", + "guid": "67e7a8ed-4b30-4e38-a3f2-9812b2363cef", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Monitor", "severity": "Medio", - "text": "Supervise la disponibilidad y el uso de ExpressRoute mediante Express Route Insights integrado.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "text": "Use un único área de trabajo de registros de monitor para administrar las plataformas de forma centralizada, excepto cuando el control de acceso basado en rol de Azure (Azure RBAC), los requisitos de soberanía de datos o las directivas de retención de datos exijan áreas de trabajo independientes.", + "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", "waf": "Operaciones" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Insights/components", "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": "Medio", - "text": "Use el Monitor de conexión para la supervisión de la conectividad en toda la red, especialmente entre el entorno local y Azure.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Operaciones" - }, - { - "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": "Medio", - "text": "Use circuitos ExpressRoute de diferentes ubicaciones de emparejamiento para obtener redundancia.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Fiabilidad" + "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": "Alto", + "text": "Exporte registros a Azure Storage si los requisitos de retención de registros superan los doce años. Use el almacenamiento inmutable con una política de escritura única y lectura múltiple para que los datos no se puedan borrar ni modificar durante un intervalo especificado por el usuario.", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "waf": "Operaciones" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Compute/virtualMachines", "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", + "guid": "e7d7e484-3276-4d8b-bc05-5bcf619e8a13", + "link": "https://learn.microsoft.com/azure/governance/machine-configuration/overview", + "service": "VM", "severity": "Medio", - "text": "Use VPN de sitio a sitio como conmutación por error de ExpressRoute, si solo usa un único circuito ExpressRoute.", - "waf": "Fiabilidad" - }, - { - "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": "Alto", - "text": "Si utiliza una tabla de rutas en GatewaySubnet, asegúrese de que se propaguen las rutas de puerta de enlace.", - "waf": "Fiabilidad" + "text": "Supervise el desfase de la configuración de la máquina virtual (VM) a nivel de sistema operativo mediante Azure Policy. La habilitación de las funcionalidades de auditoría de Azure Automanage Machine Configuration a través de la directiva ayuda a las cargas de trabajo del equipo de aplicaciones a consumir inmediatamente las funcionalidades de características con poco esfuerzo.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Operaciones" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Compute/virtualMachines", "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": "Alto", - "text": "Si usa ExpressRoute, el enrutamiento local debe ser dinámico: en caso de que se produzca un error de conexión, debe converger a la conexión restante del circuito. La carga debe compartirse entre ambas conexiones, idealmente como activa/activa, aunque también se admite activa/pasiva.", - "waf": "Fiabilidad" + "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": "Medio", + "text": "Use Azure Update Manager como mecanismo de aplicación de revisiones para máquinas virtuales Windows y Linux en Azure.", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "waf": "Operaciones" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Compute/virtualMachines", "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", + "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": "Medio", - "text": "Asegúrese de que los dos vínculos físicos del circuito ExpressRoute están conectados a dos dispositivos perimetrales distintos de la red.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Fiabilidad" + "text": "Use Azure Update Manager como mecanismo de aplicación de revisiones para máquinas virtuales Windows y Linux fuera de Azure mediante Azure Arc.", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "waf": "Operaciones" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "microsoft.network/networkWatchers", "checklist": "Azure Landing Zone Review", - "guid": "fe2a1b53-6fbd-4c67-b58a-85d7c7a0afcb", - "link": "https://learn.microsoft.com/azure/expressroute/expressroute-bfd", - "service": "ExpressRoute", + "guid": "90483845-c986-4cb2-a131-56a12476e49f", + "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", + "service": "Network Watcher", "severity": "Medio", - "text": "Asegúrese de que la detección de reenvío bidireccional (BFD) esté habilitada y configurada en los dispositivos de enrutamiento perimetral del cliente o proveedor.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Fiabilidad" + "text": "Utilice Network Watcher para supervisar de forma proactiva los flujos de tráfico.", + "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", + "waf": "Operaciones" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Insights/components", "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": "Alto", - "text": "Conecte la puerta de enlace de ExpressRoute a dos o más circuitos de diferentes ubicaciones de emparejamiento para una mayor resistencia.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Fiabilidad" + "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": "Medio", + "text": "Use los registros de Azure Monitor para obtener información e informes.", + "waf": "Operaciones" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Insights/components", "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", + "guid": "97be9951-9048-4384-9c98-6cb2913156a1", + "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/alerts-overview", + "service": "Monitor", "severity": "Medio", - "text": "Configure registros de diagnóstico y alertas para la puerta de enlace de red virtual de ExpressRoute.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "text": "Use alertas de Azure Monitor para la generación de alertas operativas.", "waf": "Operaciones" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Insights/components", "checklist": "Azure Landing Zone Review", - "guid": "5234c93f-b651-41dd-80c1-234177b91ced", - "link": "https://learn.microsoft.com/azure/expressroute/virtual-network-connectivity-guidance", - "service": "ExpressRoute", + "guid": "fed3c55f-a67e-4875-aadd-3aba3f9fde31", + "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", + "service": "Monitor", "severity": "Medio", - "text": "No use circuitos ExpressRoute para la comunicación de red virtual a red virtual.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Rendimiento" + "text": "Al usar el seguimiento de cambios e inventario a través de cuentas de Azure Automation, asegúrese de que ha seleccionado las regiones admitidas para vincular el área de trabajo de Log Analytics y las cuentas de automatización.", + "waf": "Operaciones" }, { + "arm-service": "Microsoft.RecoveryServices/vaults", "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", + "guid": "eba8cf22-45c6-4dc1-9b57-2cceb3b97ce5", + "link": "https://learn.microsoft.com/azure/storage/common/storage-redundancy", + "service": "Backup", "severity": "Bajo", - "text": "No envíe el tráfico de Azure a ubicaciones híbridas para su inspección. En su lugar, siga el principio \"el tráfico de Azure permanece en Azure\" para que la comunicación entre los recursos de Azure se produzca a través de la red troncal de Microsoft.", - "waf": "Rendimiento" + "text": "Al usar Azure Backup, use los tipos de copia de seguridad correctos (GRS, ZRS Y LRS) para la copia de seguridad, ya que la configuración predeterminada es GRS.", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "Azure Landing Zone Review", - "guid": "e6c4cfd3-e504-4547-a244-7ec66138a720", - "link": "https://learn.microsoft.com/azure/firewall/overview", - "service": "Firewall", - "severity": "Alto", - "text": "Use Azure Firewall para controlar el tráfico de salida de Azure a Internet, las conexiones de entrada que no son HTTP/S y el filtrado del tráfico Este/Oeste (si la organización lo requiere).", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "guid": "f541acdc-e979-4377-acdb-3751ab2ab13a", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", + "service": "VM", + "severity": "Medio", + "text": "Use directivas de invitado de Azure para implementar automáticamente configuraciones de software a través de extensiones de máquina virtual y aplicar una configuración de máquina virtual de línea base compatible.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "Azure Landing Zone Review", - "guid": "5a4b1511-e43a-458a-ac22-99c4d7b57d0c", - "link": "https://learn.microsoft.com/azure/firewall-manager/policy-overview", - "service": "Firewall", + "description": "Use las características de configuración de invitado de Azure Policy para auditar y corregir la configuración de la máquina (por ejemplo, el sistema operativo, la aplicación, el entorno) para asegurarse de que los recursos se alinean con las configuraciones esperadas, y Update Management puede aplicar la administración de revisiones para las máquinas virtuales.", + "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": "Medio", - "text": "Cree una directiva global de Azure Firewall para controlar la posición de seguridad en todo el entorno de red global y asígnela a todas las instancias de Azure Firewall. Permita que las directivas granulares cumplan los requisitos de regiones específicas delegando directivas de firewall incrementales a los equipos de seguridad locales a través del control de acceso basado en roles de Azure.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "Supervise el desfase de la configuración de seguridad de la máquina virtual a través de Azure Policy.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.Compute/virtualMachines", "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": "Bajo", - "text": "Configure los proveedores de seguridad SaaS de socios compatibles dentro de Firewall Manager si la organización desea utilizar dichas soluciones para ayudar a proteger las conexiones salientes.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Seguridad" + "guid": "2476e49f-541a-4cdc-b979-377bcdb3751a", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", + "service": "VM", + "severity": "Medio", + "text": "Use Azure Site Recovery para escenarios de recuperación ante desastres de Azure a Azure Virtual Machines. Esto le permite replicar cargas de trabajo en todas las regiones.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.RecoveryServices/vaults", "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": "Alto", - "text": "Utilice las reglas de la aplicación para filtrar el tráfico saliente en el nombre de host de destino para los protocolos compatibles. Use reglas de red basadas en FQDN y Azure Firewall con proxy DNS para filtrar el tráfico de salida a Internet a través de otros protocolos.", - "waf": "Seguridad" + "guid": "f625ca44-e569-45f2-823a-ce8cb12308ca", + "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", + "service": "Backup", + "severity": "Medio", + "text": "Use funcionalidades de copia de seguridad nativas de Azure o una solución de copia de seguridad de terceros compatible con Azure.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", "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", + "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": "Alto", - "text": "Use Azure Firewall Premium para habilitar características de seguridad adicionales.", - "waf": "Seguridad" + "text": "Agregue configuración de diagnóstico para guardar los registros de WAF de los servicios de entrega de aplicaciones, como Azure Front Door y Azure Application Gateway. Revise periódicamente los registros para comprobar si hay ataques y detecciones de falsos positivos.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "microsoft.network/frontdoorwebApplicationFirewalls", "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": "Alto", - "text": "Configure el modo de Inteligencia sobre amenazas de Azure Firewall en Alerta y Denegar para obtener protección adicional.", - "waf": "Seguridad" + "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": "Medio", + "text": "Envíe registros de WAF desde los servicios de entrega de aplicaciones, como Azure Front Door y Azure Application Gateway, a Microsoft Sentinel. Detecte ataques e integre la telemetría de WAF en su entorno general de Azure.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.KeyVault/vaults", "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", + "guid": "5017f154-e3ab-4369-9829-e7e316183687", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview", + "service": "Key Vault", "severity": "Alto", - "text": "Configure el modo IDPS de Azure Firewall en Denegar para obtener protección adicional.", + "text": "Use Azure Key Vault para almacenar sus secretos y credenciales.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.KeyVault/vaults", "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": "Alto", - "text": "En el caso de las subredes de las redes virtuales que no están conectadas a Virtual WAN, adjunte una tabla de rutas para que el tráfico de Internet se redirija a Azure Firewall o a una aplicación virtual de red.", + "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": "Medio", + "text": "Use diferentes Azure Key Vaults para diferentes aplicaciones y regiones para evitar límites de escala de transacciones y restringir el acceso a los secretos.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.KeyVault/vaults", "checklist": "Azure Landing Zone Review", - "guid": "715d833d-4708-4527-90ac-1b142c7045ba", - "link": "https://learn.microsoft.com/azure/firewall/firewall-structured-logs", - "service": "Firewall", + "guid": "2ba52752-6944-4008-ae7d-7e4843276d8b", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", "severity": "Medio", - "text": "Agregue la configuración de diagnóstico para guardar registros, mediante la tabla de destino Recurso específico, para todas las implementaciones de Azure Firewall.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Operaciones" + "text": "Aprovisione Azure Key Vault con las directivas de eliminación temporal y purga habilitadas para permitir la protección de retención para los objetos eliminados.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.KeyVault/vaults", "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": "Importante", - "text": "Migre de las reglas de Azure Firewall clásico (si existen) a la directiva de firewall.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Operaciones" + "guid": "dc055bcf-619e-48a1-9f98-879525d62688", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medio", + "text": "Siga un modelo de privilegios mínimos limitando la autorización para eliminar claves, secretos y certificados de forma permanente a roles de identificador personalizados especializados de Microsoft Entra.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.KeyVault/vaults", "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": "Alto", - "text": "Use un prefijo /26 para las subredes de Azure Firewall.", + "guid": "6d70ba6c-97be-4995-8904-83845c986cb2", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medio", + "text": "Automatice el proceso de gestión y renovación de certificados con autoridades de certificación públicas para facilitar la administración.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.KeyVault/vaults", "checklist": "Azure Landing Zone Review", - "guid": "828cec2e-af6c-40c2-8fa2-1b681ee63eb7", - "link": "https://learn.microsoft.com/azure/firewall-manager/rule-hierarchy", - "service": "Firewall", + "guid": "913156a1-2476-4e49-b541-acdce979377b", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", "severity": "Medio", - "text": "Organice las reglas dentro de la política de firewall en grupos de colecciones de reglas y colecciones de reglas, en función de su frecuencia de uso.", - "waf": "Rendimiento" + "text": "Establezca un proceso automatizado para la rotación de claves y certificados.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.KeyVault/vaults", "checklist": "Azure Landing Zone Review", - "guid": "0da83bb1-2f39-49af-b5c9-835fc455e3d1", - "link": "https://learn.microsoft.com/azure/firewall/ip-groups", - "service": "Firewall", + "guid": "cdb3751a-b2ab-413a-ba6e-55d7d8a2adb1", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", "severity": "Medio", - "text": "Utilice grupos de direcciones IP o prefijos de direcciones IP para reducir el número de reglas de tabla de direcciones IP.", - "waf": "Rendimiento" + "text": "Habilite el firewall y el punto de conexión de servicio de red virtual o el punto de conexión privado en el almacén para controlar el acceso al almacén de claves.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.KeyVault/vaults", "checklist": "Azure Landing Zone Review", - "guid": "c44c6f0e-1642-4a61-a17b-0922f835c93a", - "link": "https://learn.microsoft.com/azure/firewall/tutorial-firewall-dnat", - "service": "Firewall", + "guid": "17d6326a-f625-4ca4-9e56-95f2223ace8c", + "link": "https://learn.microsoft.com/azure/key-vault/general/monitor-key-vault", + "service": "Key Vault", "severity": "Medio", - "text": "No utilice caracteres comodín como IP de origen para DNATS, como * o cualquiera, debe especificar IP de origen para los DNAT entrantes.", - "waf": "Rendimiento" + "text": "Use el área de trabajo de Log Analytics de Azure Monitor central de la plataforma para auditar el uso de claves, certificados y secretos en cada instancia de Key Vault.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.KeyVault/vaults", "checklist": "Azure Landing Zone Review", - "guid": "7371dc21-251a-47a3-af14-6e01b9da4757", - "link": "https://learn.microsoft.com/azure/firewall/integrate-with-nat-gateway", - "service": "Firewall", + "guid": "b12308ca-5017-4f15-9e3a-b3693829e7e3", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", "severity": "Medio", - "text": "Evite el agotamiento del puerto SNAT supervisando el uso del puerto SNAT, evaluando la configuración de la puerta de enlace NAT y garantizando una conmutación por error sin problemas. Si el número de puertos se acerca al límite, es una señal de que el agotamiento de SNAT podría ser inminente.", - "waf": "Rendimiento" + "text": "Delegue la creación de instancias de Key Vault y el acceso con privilegios, y use Azure Policy para aplicar una configuración coherente y conforme.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.KeyVault/vaults", "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": "Alto", - "text": "Si usa Azure Firewall Premium, habilite la inspección de TLS.", - "waf": "Rendimiento" + "guid": "91163418-2ba5-4275-8694-4008be7d7e48", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medio", + "text": "Use una instancia de Azure Key Vault por aplicación, por entorno, por región.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.KeyVault/vaults", "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": "Bajo", - "text": "Utilice categorías web para permitir o denegar el acceso saliente a temas específicos.", - "waf": "Rendimiento" + "guid": "25d62688-6d70-4ba6-a97b-e99519048384", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Key Vault", + "severity": "Medio", + "text": "Si desea traer sus propias claves, es posible que esto no sea compatible con todos los servicios considerados. Implemente la mitigación pertinente para que las inconsistencias no obstaculicen los resultados deseados. Elija los pares de regiones y las regiones de recuperación ante desastres adecuados que minimicen la latencia.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.KeyVault/vaults", "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", + "guid": "4ac6b67c-b3a4-4ff9-8e87-b07a7ce7bbdb", + "link": "https://learn.microsoft.com/industry/sovereignty/key-management", + "service": "Key Vault", "severity": "Medio", - "text": "Como parte de la inspección de TLS, planee la recepción de tráfico de Azure App Gateways para su inspección.", - "waf": "Rendimiento" + "text": "En el caso de la zona de aterrizaje soberana, use el HSM administrado de Azure Key Vault para almacenar los secretos y las credenciales.", + "waf": "Seguridad" }, { - "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", + "guid": "4e5695f2-223a-4ce8-ab12-308ca5017f15", + "link": "https://learn.microsoft.com/azure/active-directory/reports-monitoring/overview-reports", + "service": "Entra", "severity": "Medio", - "text": "Habilite la configuración del proxy DNS de Azure Firewall.", + "text": "Use las capacidades de generación de informes de Microsoft Entra ID para generar informes de auditoría de control de acceso.", "waf": "Seguridad" }, { - "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", + "guid": "09945bda-4333-44f2-9911-634182ba5275", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/concept-cloud-security-posture-management", + "service": "Defender", "severity": "Alto", - "text": "Integre Azure Firewall con Azure Monitor y habilite el registro de diagnóstico para almacenar y analizar los registros de firewall.", - "waf": "Operaciones" - }, - { - "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": "Bajo", - "text": "Implementación de copias de seguridad para las reglas de firewall", - "waf": "Operaciones" + "text": "Habilite la administración de la posición de seguridad en la nube de Defender para todas las suscripciones.", + "waf": "Seguridad" }, { - "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", + "guid": "36a72a48-fffe-4c40-9747-0ab5064355ba", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/plan-defender-for-servers-select-plan", + "service": "Defender", "severity": "Alto", - "text": "No interrumpa la comunicación del plano de control para los servicios PaaS de Azure insertados en una red virtual, por ejemplo, con una ruta 0.0.0.0/0 o una regla de NSG que bloquee el tráfico del plano de control.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "text": "Habilite un plan de protección de cargas de trabajo en la nube de Defender para servidores en todas las suscripciones.", "waf": "Seguridad" }, { - "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": "Medio", - "text": "Acceda a los servicios PaaS de Azure desde el entorno local a través de puntos de conexión privados y el emparejamiento privado de ExpressRoute. Este método evita el tránsito a través de la Internet pública.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "guid": "77425f48-ecba-43a0-aeac-a3ac733ccc6a", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/connect-azure-subscription", + "service": "Defender", + "severity": "Alto", + "text": "Habilite los planes de protección de cargas de trabajo en la nube de Defender para recursos de Azure en todas las suscripciones.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/virtualNetworks", + "arm-service": "Microsoft.Compute/virtualMachines", "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", + "guid": "24d96b30-61ee-4436-a1cc-d6ef08bc574b", + "link": "https://learn.microsoft.com/mem/configmgr/protect/deploy-use/endpoint-protection", + "service": "VM", "severity": "Alto", - "text": "No habilite los puntos de conexión de servicio de red virtual de forma predeterminada en todas las subredes.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "text": "Habilite la protección de puntos de conexión en servidores IaaS.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/azureFirewalls", + "arm-service": "Microsoft.Compute/virtualMachines", "checklist": "Azure Landing Zone Review", - "guid": "7e7a8ed4-b30e-438c-9f29-812b2363cefe", - "link": "azure/private-link/inspect-traffic-with-azure-firewall", - "service": "Firewall", + "guid": "15833ee7-ad6c-46d3-9331-65c7acbe44ab", + "link": "https://learn.microsoft.com/azure/security-center/", + "service": "VM", "severity": "Medio", - "text": "Filtre el tráfico de salida a los servicios PaaS de Azure mediante FQDN en lugar de direcciones IP en Azure Firewall o una NVA para evitar la filtración de datos. Si usa Private Link, puede bloquear todos los FQDN, de lo contrario, permitir solo los servicios PaaS necesarios.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "text": "Supervise el desfase de revisiones del sistema operativo base a través de los registros de Azure Monitor y Defender for Cloud.", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/expressRouteCircuits", + "arm-service": "Microsoft.Insights/components", "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": "Alto", - "text": "Utilice al menos un prefijo /27 para las subredes de puerta de enlace.", + "guid": "e5f8d79f-2e87-4768-924c-516775c6ea95", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Monitor", + "severity": "Medio", + "text": "Conecte las configuraciones de recursos predeterminadas a un área de trabajo centralizada de Log Analytics de Azure Monitor.", "waf": "Seguridad" }, { - "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": "Alto", - "text": "No confíe en las reglas predeterminadas de entrada de NSG que usan la etiqueta de servicio VirtualNetwork para limitar la conectividad.", + "guid": "1761e147-f65e-4d09-bbc2-f464f23e2eba", + "link": "https://learn.microsoft.com/industry/sovereignty/transparency-logs", + "service": "Entra", + "severity": "Medio", + "text": "Para Sovereign Landing Zone, habilite los registros de transparencia en el inquilino de Entra ID.", "waf": "Seguridad" }, { - "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", + "guid": "d21a922d-5ca7-427a-82a6-35f7b21f1bfc", + "link": "https://learn.microsoft.com/azure/security/fundamentals/customer-lockbox-overview", + "service": "Entra", "severity": "Medio", - "text": "Use los grupos de seguridad de red para ayudar a proteger el tráfico a través de las subredes, así como el tráfico este/oeste a través de la plataforma (tráfico entre zonas de aterrizaje).", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "text": "Para Sovereign Landing Zone, habilite la caja de seguridad del cliente en el inquilino de Entra ID.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/networkSecurityGroups", + "arm-service": "Microsoft.Storage/storageAccounts", "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": "Medio", - "text": "Use grupos de seguridad de red y grupos de seguridad de aplicaciones para microsegmentar el tráfico dentro de la zona de aterrizaje y evite usar una NVA central para filtrar los flujos de tráfico.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "guid": "b03ed428-4617-4067-a787-85468b9ccf3f", + "link": "https://learn.microsoft.com/azure/storage/common/storage-require-secure-transfer", + "service": "Storage", + "severity": "Alto", + "text": "Habilite la transferencia segura a cuentas de almacenamiento.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/networkSecurityGroups", + "arm-service": "Microsoft.Storage/storageAccounts", "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": "Medio", - "text": "Habilite los registros de flujo de red virtual e introdúzcalos en Traffic Analytics para obtener información sobre los flujos de tráfico internos y externos.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "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": "Alto", + "text": "Habilite la eliminación temporal de contenedor para que la cuenta de almacenamiento recupere un contenedor eliminado y su contenido.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/networkSecurityGroups", + "arm-service": "Microsoft.KeyVault/vaults", "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": "Medio", - "text": "No implemente más de 900 reglas de NSG por NSG, debido al límite de 1000 reglas.", - "training": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", - "waf": "Fiabilidad" - }, - { - "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": "Medio", - "text": "Use Virtual WAN si el escenario se describe explícitamente en la lista de diseños de enrutamiento de Virtual WAN.", - "training": "https://learn.microsoft.com/learn/modules/introduction-azure-virtual-wan/", + "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": "Alto", + "text": "Use secretos de Key Vault para evitar codificar de forma rígida información confidencial, como credenciales (máquinas virtuales, contraseñas de usuario), certificados o claves.", "waf": "Operaciones" }, { - "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": "Medio", - "text": "Use un centro de conectividad de Virtual WAN por región de Azure para conectar varias zonas de aterrizaje juntas en regiones de Azure a través de una instancia global común de Azure Virtual WAN.", - "waf": "Rendimiento" + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "ac1d6380-f866-4bbd-a9b4-b1ee5d7908b8", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#availability-zones", + "service": "IoT", + "severity": "Alto", + "text": "Aproveche las zonas de disponibilidad si corresponden regionalmente (esto se habilita automáticamente)", + "waf": "Fiabilidad" }, { - "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", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "35f651e8-0124-4ef7-8c57-658e38609e6e", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", + "service": "IoT", "severity": "Medio", - "text": "Para la protección y el filtrado del tráfico de Internet saliente, implemente Azure Firewall en centros seguros.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Seguridad" + "text": "Tenga en cuenta las conmutaciones por error iniciadas por Microsoft. Microsoft los ejerce en situaciones excepcionales para conmutar por error todos los centros de IoT de una región afectada a la región emparejada geográficamente correspondiente.", + "waf": "Fiabilidad" }, { - "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": "Medio", - "text": "Asegúrese de que la arquitectura de red WAN virtual se alinee con un escenario de arquitectura identificado.", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "4ed3e490-dc06-4a1e-b467-5d0239d85540", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#cross-region-dr", + "service": "IoT", + "severity": "Alto", + "text": "Considere la posibilidad de una estrategia de recuperación ante desastres entre regiones para cargas de trabajo críticas", "waf": "Fiabilidad" }, { - "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": "Medio", - "text": "Use Azure Monitor Insights para Virtual WAN para supervisar la topología de un extremo a otro de Virtual WAN, el estado y las métricas clave.", - "waf": "Operaciones" + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "a11ecab0-db47-46f7-9aa7-17764e7e45a1", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", + "service": "IoT", + "severity": "Alto", + "text": "Obtenga información sobre cómo desencadenar una conmutación por error manual.", + "waf": "Fiabilidad" }, { - "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": "Medio", - "text": "No deshabilite el tráfico de rama a rama en Virtual WAN, a menos que estos flujos deban bloquearse explícitamente.", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "f9db8dfb-1194-460b-aedd-34dd6a69db22", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#failback", + "service": "IoT", + "severity": "Alto", + "text": "Obtenga información sobre cómo conmutar por recuperación después de una conmutación por error.", "waf": "Fiabilidad" }, { - "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", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", + "service": "Bot service", "severity": "Medio", - "text": "Use AS-Path como preferencia de enrutamiento del concentrador, ya que es más flexible que ExpressRoute o VPN.", + "text": "Siga las recomendaciones de soporte técnico de confiabilidad en Azure Bot Service", "waf": "Fiabilidad" }, { - "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", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", + "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", + "service": "Bot service", "severity": "Medio", - "text": "Configure la propagación basada en etiquetas en Virtual WAN, de lo contrario, la conectividad entre los centros virtuales se verá afectada.", + "text": "Implementación de bots con residencia de datos local y cumplimiento regional", "waf": "Fiabilidad" }, { - "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": "Alto", - "text": "Asigne al menos un prefijo /23 a los centros virtuales para asegurarse de que haya suficiente espacio IP disponible.", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "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", + "severity": "Medio", + "text": "Azure Bot Service se ejecuta en modo activo-activo para los servicios globales y regionales. Cuando se produce una interrupción, no es necesario detectar errores ni administrar el servicio. Azure Bot Service realiza automáticamente la conmutación por error y la recuperación automáticas en una arquitectura geográfica de varias regiones. En el caso del servicio regional de bots de la UE, Azure Bot Service proporciona dos regiones completas dentro de Europa con replicación activa/activa para garantizar la redundancia. En el caso del servicio de bot global, todas las regiones o zonas geográficas disponibles se pueden servir como superficie global.", "waf": "Fiabilidad" }, { - "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": "Alto", - "text": "Aproveche Azure Policy de forma estratégica, defina controles para su entorno mediante iniciativas de directivas para agrupar directivas relacionadas.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Aplicación de las instrucciones de la prueba comparativa 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.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": "Medio", - "text": "Asigne los requisitos normativos y de cumplimiento a las definiciones de Azure Policy y las asignaciones de roles de Azure.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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 proceso de Azure 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.Authorization/policyDefinitions", - "checklist": "Azure Landing Zone Review", - "guid": "223ace8c-b123-408c-a501-7f154e3ab369", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "Policy", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Las cuentas de almacenamiento recién creadas se crean mediante el modelo de implementación de ARM, de modo que RBAC, auditoría, etc. están habilitados. Asegúrese de que no hay cuentas de almacenamiento antiguas con el modelo de implementación clásica 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": "Establezca definiciones de Azure Policy en el grupo de administración raíz intermedio para que se puedan asignar en ámbitos heredados.", + "text": "Asegúrese de que las cuentas de almacenamiento más antiguas no usan el \"modelo de implementación clásica\"", "waf": "Seguridad" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Aproveche Microsoft Defender para obtener información sobre la actividad sospechosa y los errores de configuración.", + "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", + "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure", + "service": "Azure Storage", "severity": "Alto", - "text": "Administre las asignaciones de políticas en el nivel más alto apropiado con exclusiones en los niveles inferiores, si es necesario.", + "text": "Habilitación de Microsoft Defender para todas las cuentas de almacenamiento", "waf": "Seguridad" }, { - "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": "Bajo", - "text": "Use Azure Policy para controlar qué servicios pueden aprovisionar los usuarios en el nivel de suscripción o grupo de administración.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.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": "Alto", - "text": "Utilice políticas integradas siempre que sea posible para minimizar la sobrecarga operativa.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Considere la posibilidad de deshabilitar de forma selectiva la \"eliminación temporal\" para determinados contenedores de blobs, por ejemplo, si la aplicación debe asegurarse de que la información eliminada se elimina 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\" de blobs", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "Azure Landing Zone Review", - "description": "La asignación del rol Colaborador de directivas de recursos a ámbitos específicos le permite delegar la administración de directivas a los equipos pertinentes. Por ejemplo, un equipo de TI central puede supervisar las políticas a nivel de grupo de administración, mientras que los equipos de aplicaciones se encargan de las políticas de sus suscripciones, lo que permite la gobernanza distribuida con el cumplimiento de los estándares de la organización.", - "guid": "3f988795-25d6-4268-a6d7-0ba6c97be995", - "link": "https://learn.microsoft.com/azure/governance/policy/overview#azure-rbac-permissions-in-azure-policy", - "service": "Policy", - "severity": "Medio", - "text": "Asigne el rol integrado Colaborador de directiva de recursos en un ámbito determinado para habilitar la gobernanza de nivel de aplicación.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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 los contenedores", "waf": "Seguridad" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Considere la posibilidad de deshabilitar de forma selectiva la \"eliminación temporal\" para determinados contenedores de blobs, por ejemplo, si la aplicación debe asegurarse de que la información eliminada se elimina 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": "Limite el número de asignaciones de Azure Policy realizadas en el ámbito del grupo de administración raíz para evitar la administración a través de exclusiones en ámbitos heredados.", + "text": "Deshabilitación de la \"eliminación temporal\" para contenedores", "waf": "Seguridad" }, { - "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": "Medio", - "text": "Si existen requisitos de soberanía de datos, se deben implementar Azure Policies para aplicarlos.", - "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.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": "Medio", - "text": "Para la zona de aterrizaje soberana, implemente la línea base de la política de soberanía y asígnela en el nivel de grupo de administración correcto.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Considere la posibilidad de aplicar directivas de \"retención legal\" o \"retención basada en el 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.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": "Medio", - "text": "En el caso de la Zona de Aterrizaje Soberana, documente los objetivos del Control Soberano para el mapeo de políticas.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Considere la posibilidad de deshabilitar el acceso HTTP/80 sin protección a la cuenta de almacenamiento, de modo que todas las transferencias de datos estén cifradas, protegidas por 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.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": "Medio", - "text": "En el caso de la Zona de Aterrizaje Soberana, garantizar que exista un proceso para la gestión de los \"objetivos de control soberano para el mapeo de políticas\".", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Requerir HTTPS cuando un cliente usa un token de SAS para acceder a los datos de blobs 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": "Use un único área de trabajo de registros de monitor para administrar las plataformas de forma centralizada, excepto cuando el control de acceso basado en rol de Azure (Azure RBAC), los requisitos de soberanía de datos o las directivas de retención de datos exijan áreas de trabajo independientes.", - "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "waf": "Operaciones" + "text": "Limitar los tokens de firma de acceso compartido (SAS) solo a las conexiones HTTPS", + "waf": "Seguridad" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Los tokens de AAD 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": "Exporte registros a Azure Storage si los requisitos de retención de registros superan los doce años. Use el almacenamiento inmutable con una política de escritura única y lectura múltiple para que los datos no se puedan borrar ni modificar durante un intervalo especificado por el usuario.", - "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", - "waf": "Operaciones" + "text": "Uso de tokens de Azure Active Directory (Azure AD) para el acceso a blobs", + "waf": "Seguridad" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "Supervise el desfase de la configuración de la máquina virtual (VM) a nivel de sistema operativo mediante Azure Policy. La habilitación de las funcionalidades de auditoría de Azure Automanage Machine Configuration a través de la directiva ayuda a las cargas de trabajo del equipo de aplicaciones a consumir inmediatamente las funcionalidades de características con poco esfuerzo.", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "Operaciones" + "text": "Privilegios mínimos en los permisos de IaM", + "waf": "Seguridad" }, { - "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": "Medio", - "text": "Use Azure Update Manager como mecanismo de aplicación de revisiones para máquinas virtuales Windows y Linux en Azure.", - "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", - "waf": "Operaciones" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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 sobre 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 claves de cuenta de almacenamiento.", + "waf": "Seguridad" }, { - "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": "Medio", - "text": "Use Azure Update Manager como mecanismo de aplicación de revisiones para máquinas virtuales Windows y Linux fuera de Azure mediante Azure Arc.", - "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", - "waf": "Operaciones" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Las claves de la cuenta de almacenamiento (\"claves compartidas\") tienen muy pocas funcionalidades 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 AAD facilita la vinculación del acceso al almacenamiento a un usuario. ", + "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 AAD (y la SAS de delegación de usuarios).", + "waf": "Seguridad" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Use 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.).", + "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 Blob Storage Review", + "description": "Una directiva de expiración de claves le permite establecer un recordatorio para la rotación de las claves de acceso a 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": "Utilice Network Watcher para supervisar de forma proactiva los flujos de tráfico.", - "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", - "waf": "Operaciones" + "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.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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Una directiva de expiración de SAS especifica un intervalo recomendado durante el cual la SAS es válida. Las directivas de expiración 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": "Use los registros de Azure Monitor para obtener información e informes.", - "waf": "Operaciones" + "text": "Considere la posibilidad de configurar una directiva de expiración de SAS", + "waf": "Seguridad" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "Use alertas de Azure Monitor para la generación de alertas operativas.", - "waf": "Operaciones" + "text": "Considere la posibilidad de vincular SAS a una directiva de acceso almacenada", + "waf": "Seguridad" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "Al usar el seguimiento de cambios e inventario a través de cuentas de Azure Automation, asegúrese de que ha seleccionado las regiones admitidas para vincular el área de trabajo de Log Analytics y las cuentas de automatización.", - "waf": "Operaciones" + "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.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": "Bajo", - "text": "Al usar Azure Backup, use los tipos de copia de seguridad correctos (GRS, ZRS Y LRS) para la copia de seguridad, ya que la configuración predeterminada es GRS.", - "waf": "Fiabilidad" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Lo ideal es que la aplicación use una identidad administrada para autenticarse en Azure Storage. Si esto 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.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": "Medio", - "text": "Use directivas de invitado de Azure para implementar automáticamente configuraciones de software a través de extensiones de máquina virtual y aplicar una configuración de máquina virtual de línea base compatible.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Use los tiempos de expiración 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, es válida solo por un corto tiempo. Esta práctica es especialmente importante si no puede hacer referencia a una directiva 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 cargarlo.", + "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 obtener períodos de validez cortos para SAS ad-hoc", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Azure Landing Zone Review", - "description": "Use las características de configuración de invitado de Azure Policy para auditar y corregir la configuración de la máquina (por ejemplo, el sistema operativo, la aplicación, el entorno) para asegurarse de que los recursos se alinean con las configuraciones esperadas, y Update Management puede aplicar la administración de revisiones para las máquinas virtuales.", - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "Supervise el desfase de la configuración de seguridad de la máquina virtual a través de Azure Policy.", + "text": "Aplicación de un ámbito limitado a una SAS", "waf": "Seguridad" }, { - "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": "Medio", - "text": "Use Azure Site Recovery para escenarios de recuperación ante desastres de Azure a Azure Virtual Machines. Esto le permite replicar cargas de trabajo en todas las regiones.", - "waf": "Operaciones" - }, - { - "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": "Medio", - "text": "Use funcionalidades de copia de seguridad nativas de Azure o una solución de copia de seguridad de terceros compatible con Azure.", - "waf": "Operaciones" - }, - { - "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": "Alto", - "text": "Agregue configuración de diagnóstico para guardar los registros de WAF de los servicios de entrega de aplicaciones, como Azure Front Door y Azure Application Gateway. Revise periódicamente los registros para comprobar si hay ataques y detecciones de falsos positivos.", - "waf": "Operaciones" - }, - { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Una SAS puede incluir parámetros en los que las direcciones IP de cliente o los intervalos de direcciones 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": "Envíe registros de WAF desde los servicios de entrega de aplicaciones, como Azure Front Door y Azure Application Gateway, a Microsoft Sentinel. Detecte ataques e integre la telemetría de WAF en su entorno general de Azure.", - "waf": "Operaciones" - }, - { - "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": "Alto", - "text": "Use Azure Key Vault para almacenar sus secretos y credenciales.", + "text": "Considere la posibilidad de definir el ámbito de SAS en una dirección IP de cliente específica, siempre que sea posible", "waf": "Seguridad" }, { - "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": "Medio", - "text": "Use diferentes Azure Key Vaults para diferentes aplicaciones y regiones para evitar límites de escala de transacciones y restringir el acceso a los secretos.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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 contenido de gran tamaño malintencionado.", + "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 usado una SAS para cargar un archivo. ", "waf": "Seguridad" }, { - "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": "Medio", - "text": "Aprovisione Azure Key Vault con las directivas de eliminación temporal y purga habilitadas para permitir la protección de retención para los objetos eliminados.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Al acceder a Blob Storage 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 se admite para 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.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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "Siga un modelo de privilegios mínimos limitando la autorización para eliminar claves, secretos y certificados de forma permanente a roles de identificador personalizados especializados de Microsoft Entra.", + "text": "SFTP: El punto de conexión SFTP no admite ACL similares a POSIX.", "waf": "Seguridad" }, { - "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": "Medio", - "text": "Automatice el proceso de gestión y renovación de certificados con autoridades de certificación públicas para facilitar la administración.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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 relajar 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.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": "Medio", - "text": "Establezca un proceso automatizado para la rotación de claves y certificados.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Los datos en reposo siempre están cifrados 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 realizarse mediante una clave administrada por la plataforma (predeterminada) 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 a Azure Storage 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.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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "Habilite el firewall y el punto de conexión de servicio de red virtual o el punto de conexión privado en el almacén para controlar el acceso al almacén de claves.", + "text": "Determine qué cifrado de plataforma se debe usar o si se debe usar.", "waf": "Seguridad" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", + "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", + "service": "Azure Storage", "severity": "Medio", - "text": "Use el área de trabajo de Log Analytics de Azure Monitor central de la plataforma para auditar el uso de claves, certificados y secretos en cada instancia de Key Vault.", + "text": "Determine qué cifrado del lado del cliente se debe usar o si.", "waf": "Seguridad" }, { - "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": "Medio", - "text": "Delegue la creación de instancias de Key Vault y el acceso con privilegios, y use Azure Policy para aplicar una configuración coherente y conforme.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.", + "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 se necesita acceso público a blobs o si se puede deshabilitar para determinadas cuentas de almacenamiento. ", "waf": "Seguridad" }, { - "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": "Medio", - "text": "Use una instancia de Azure Key Vault por aplicación, por entorno, por región.", - "waf": "Seguridad" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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", + "severity": "Bajo", + "text": "Consulte la arquitectura de aplicación web de redundancia de zona de alta disponibilidad de línea de base para conocer los procedimientos recomendados", + "waf": "Fiabilidad" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", + "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", + "service": "App Services", "severity": "Medio", - "text": "Si desea traer sus propias claves, es posible que esto no sea compatible con todos los servicios considerados. Implemente la mitigación pertinente para que las inconsistencias no obstaculicen los resultados deseados. Elija los pares de regiones y las regiones de recuperación ante desastres adecuados que minimicen la latencia.", - "waf": "Seguridad" + "text": "Utilice los niveles Premium y Estándar. Estos niveles admiten ranuras de ensayo y copias de seguridad automatizadas.", + "waf": "Fiabilidad" }, { - "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": "Medio", - "text": "En el caso de la zona de aterrizaje soberana, use el HSM administrado de Azure Key Vault para almacenar los secretos y las credenciales.", - "waf": "Seguridad" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", + "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", + "service": "App Services", + "severity": "Alto", + "text": "Aproveche las zonas de disponibilidad cuando corresponda regionalmente (requiere el nivel Premium v2 o v3)", + "waf": "Fiabilidad" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Services", "severity": "Medio", - "text": "Use las capacidades de generación de informes de Microsoft Entra ID para generar informes de auditoría de control de acceso.", - "waf": "Seguridad" + "text": "Implementación de comprobaciones de estado", + "waf": "Fiabilidad" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", + "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", + "service": "App Services", "severity": "Alto", - "text": "Habilite la administración de la posición de seguridad en la nube de Defender para todas las suscripciones.", - "waf": "Seguridad" + "text": "Consulte los procedimientos recomendados de copia de seguridad y restauración para Azure App Service", + "waf": "Fiabilidad" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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", "severity": "Alto", - "text": "Habilite un plan de protección de cargas de trabajo en la nube de Defender para servidores en todas las suscripciones.", - "waf": "Seguridad" + "text": "Implementación de los procedimientos recomendados de confiabilidad de Azure App Service", + "waf": "Fiabilidad" }, { - "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": "Alto", - "text": "Habilite los planes de protección de cargas de trabajo en la nube de Defender para recursos de Azure en todas las suscripciones.", - "waf": "Seguridad" - }, + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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", + "severity": "Bajo", + "text": "Familiarizarse con cómo mover una aplicación de App Service a otra región durante un desastre", + "waf": "Fiabilidad" + }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", + "service": "App Services", "severity": "Alto", - "text": "Habilite la protección de puntos de conexión en servidores IaaS.", - "waf": "Seguridad" + "text": "Familiarizarse con la compatibilidad con la confiabilidad en Azure App Service", + "waf": "Fiabilidad" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "App Services", "severity": "Medio", - "text": "Supervise el desfase de revisiones del sistema operativo base a través de los registros de Azure Monitor y Defender for Cloud.", - "waf": "Seguridad" + "text": "Asegúrese de que \"Siempre activado\" está habilitado para las aplicaciones de funciones que se ejecutan en un plan de App Service", + "waf": "Fiabilidad" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Services", "severity": "Medio", - "text": "Conecte las configuraciones de recursos predeterminadas a un área de trabajo centralizada de Log Analytics de Azure Monitor.", - "waf": "Seguridad" + "text": "Supervisión de instancias de App Service mediante comprobaciones de estado", + "waf": "Fiabilidad" }, { - "checklist": "Azure Landing Zone Review", - "guid": "1761e147-f65e-4d09-bbc2-f464f23e2eba", - "link": "https://learn.microsoft.com/industry/sovereignty/transparency-logs", - "service": "Entra", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", + "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", + "service": "App Services", "severity": "Medio", - "text": "Para Sovereign Landing Zone, habilite los registros de transparencia en el inquilino de Entra ID.", - "waf": "Seguridad" + "text": "Supervisión de la disponibilidad y la capacidad de respuesta de la aplicación web o el sitio web mediante pruebas de disponibilidad de Application Insights", + "waf": "Fiabilidad" }, { - "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": "Medio", - "text": "Para Sovereign Landing Zone, habilite la caja de seguridad del cliente en el inquilino de Entra ID.", - "waf": "Seguridad" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "b4e3f2d5-a5c6-4d7e-8b2f-c5d9e7a8f0ea", + "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", + "service": "App Services", + "severity": "Bajo", + "text": "Uso de la prueba estándar de Application Insights para supervisar la disponibilidad y la capacidad de respuesta de la aplicación web o el sitio web", + "waf": "Fiabilidad" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Use Azure Key Vault para almacenar los secretos que necesita la aplicación. Key Vault proporciona un entorno seguro y auditado para almacenar secretos y está bien integrado con App Service a través del SDK de Key Vault o las referencias de Key Vault de App Service.", + "guid": "834ac932-223e-4ce8-8b12-3071a5416415", + "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", + "service": "App Services", "severity": "Alto", - "text": "Habilite la transferencia segura a cuentas de almacenamiento.", + "text": "Uso de Key Vault para almacenar secretos", "waf": "Seguridad" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Use una identidad administrada para conectarse a Key Vault mediante el SDK de Key Vault o a través de las referencias de Key Vault de App Service.", + "guid": "833ea3ad-2c2d-4e73-8165-c3acbef4abe1", + "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", + "service": "App Services", "severity": "Alto", - "text": "Habilite la eliminación temporal de contenedor para que la cuenta de almacenamiento recupere un contenedor eliminado y su contenido.", + "text": "Uso de la identidad administrada para conectarse a Key Vault", "waf": "Seguridad" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Almacene el certificado TLS de App Service en Key Vault.", + "guid": "f8d39fda-4776-4831-9c11-5775c2ea55b4", + "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-certificate", + "service": "App Services", "severity": "Alto", - "text": "Use secretos de Key Vault para evitar codificar de forma rígida información confidencial, como credenciales (máquinas virtuales, contraseñas de usuario), certificados o claves.", - "waf": "Operaciones" + "text": "Use Key Vault para almacenar el certificado TLS.", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", - "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", - "service": "SAP", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Los sistemas que procesan información confidencial deben estar aislados. Para ello, use planes del Servicio de aplicaciones o entornos del Servicio de aplicaciones independientes y considere la posibilidad de usar suscripciones o grupos de administración diferentes.", + "guid": "6ad48408-ee72-4734-a475-ba18fdbf590c", + "link": "https://learn.microsoft.com/azure/app-service/overview-hosting-plans", + "service": "App Services", "severity": "Medio", - "text": "Azure Center for SAP Solutions (ACSS) es una oferta de Azure que convierte a SAP en una carga de trabajo de nivel superior en Azure. ACSS es una solución integral que permite crear y ejecutar sistemas SAP como una carga de trabajo unificada en Azure y proporciona una base más fluida para la innovación. Puede aprovechar las funcionalidades de administración de los sistemas SAP nuevos y existentes basados en Azure.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-center-sap-solutions/?source=recommendations", - "waf": "Operaciones" + "text": "Aísle los sistemas que procesan información confidencial", + "waf": "Seguridad" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Los discos locales de App Service no están cifrados y los datos confidenciales no deben almacenarse en ellos. (Por ejemplo: D:\\\\Local y %TMP%).", + "guid": "e65de8e0-3f9b-4cbd-9682-66abca264f9a", + "link": "https://learn.microsoft.com/azure/app-service/operating-system-functionality#file-access", + "service": "App Services", "severity": "Medio", - "text": "Azure admite la automatización de implementaciones de SAP en Linux y Windows. SAP Deployment Automation Framework es una herramienta de orquestación de código abierto que puede implementar, instalar y mantener entornos SAP.", - "training": "https://github.com/Azure/sap-automation", - "waf": "Operaciones" + "text": "No almacene datos confidenciales en el disco local", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", - "service": "SAP", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "En el caso de la aplicación web autenticada, use un proveedor de identidades bien establecido, como Azure AD o Azure AD B2C. Aproveche el marco de aplicaciones de su elección para integrarse con este proveedor o use la característica de autenticación o autorización del Servicio de aplicaciones.", + "guid": "919ca0b2-c121-459e-814b-933df574eccc", + "link": "https://learn.microsoft.com/azure/app-service/overview-authentication-authorization", + "service": "App Services", "severity": "Medio", - "text": "Realice una recuperación a un momento dado de sus bases de datos de producción en cualquier momento y en un período de tiempo que cumpla con su RTO; La recuperación a un momento dado suele incluir errores del operador al eliminar datos en la capa DBMS o a través de SAP, por cierto", - "waf": "Fiabilidad" + "text": "Usar un proveedor de identidades establecido para la autenticación", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", - "service": "SAP", - "severity": "Medio", - "text": "Pruebe los tiempos de copia de seguridad y recuperación para verificar que cumplen con los requisitos de RTO para restaurar todos los sistemas simultáneamente después de un desastre.", - "waf": "Fiabilidad" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Implemente código en App Service desde un entorno controlado y de confianza, como una canalización de implementación de DevOps bien administrada y segura. De este modo, se evita el código que no se ha controlado la versión y se ha comprobado que se implementará desde un host malintencionado.", + "guid": "3f9bcbd4-6826-46ab-aa26-4f9a19aed9c5", + "link": "https://learn.microsoft.com/azure/app-service/deploy-best-practices", + "service": "App Services", + "severity": "Alto", + "text": "Implementación desde un entorno de confianza", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "b651423c-8552-42db-a545-5cb50c05527a", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "SAP", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Deshabilite la autenticación básica tanto para FTP/FTPS como para WebDeploy/SCM. Esto deshabilita el acceso a estos servicios y exige el uso de puntos de conexión protegidos de Azure AD para la implementación. Tenga en cuenta que el sitio de SCM también se puede abrir con credenciales de Azure AD.", + "guid": "5d04c2c3-919c-4a0b-8c12-159e114b933d", + "link": "https://learn.microsoft.com/azure/app-service/deploy-configure-credentials#disable-basic-authentication", + "service": "App Services", "severity": "Alto", - "text": "Puede replicar el almacenamiento estándar entre regiones emparejadas, pero no puede usar el almacenamiento estándar para almacenar las bases de datos o los discos duros virtuales. Las copias de seguridad solo se pueden replicar entre las regiones emparejadas que utilice. Para todos los demás datos, ejecute la replicación mediante características nativas de DBMS, como SQL Server Always On o SAP HANA System Replication. Use una combinación de Site Recovery, rsync o robocopy y otro software de terceros para la capa de aplicación de SAP.", - "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", - "waf": "Fiabilidad" + "text": "Deshabilitar la autenticación básica", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", - "severity": "Medio", - "text": "Al usar Azure Availability Zones para lograr una alta disponibilidad, debe tener en cuenta la latencia entre los servidores de aplicaciones SAP y los servidores de bases de datos. En el caso de las zonas con latencias altas, es necesario implementar procedimientos operativos para garantizar que los servidores de aplicaciones SAP y los servidores de bases de datos se ejecuten en la misma zona en todo momento.", - "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", - "waf": "Fiabilidad" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Siempre que sea posible, use Managed Identity para conectarse a los recursos protegidos de Azure AD. Si esto no es posible, almacene los secretos en Key Vault y conéctese a Key Vault mediante una identidad administrada en su lugar.", + "guid": "f574eccc-d9bd-43ba-bcda-3b54eb2eb03d", + "link": "https://learn.microsoft.com/azure/app-service/overview-managed-identity?tabs=portal%2Chttp", + "service": "App Services", + "severity": "Alto", + "text": "Uso de la identidad administrada para conectarse a los recursos", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", - "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", - "service": "SAP", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Cuando use imágenes almacenadas en Azure Container Registry, extráigalas mediante una identidad administrada.", + "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", "severity": "Alto", - "text": "Configure conexiones de ExpressRoute desde el entorno local a las regiones de recuperación ante desastres de Azure principal y secundaria. Además, como alternativa al uso de ExpressRoute, considere la posibilidad de configurar conexiones VPN desde el entorno local a las regiones de recuperación ante desastres de Azure principal y secundaria.", - "training": "https://learn.microsoft.com/azure/expressroute/use-s2s-vpn-as-backup-for-expressroute-privatepeering", - "waf": "Fiabilidad" + "text": "Extracción de contenedores mediante una identidad administrada", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "SAP", - "severity": "Bajo", - "text": "Replique el contenido del almacén de claves, como certificados, secretos o claves, en todas las regiones para poder descifrar los datos de la región de recuperación ante desastres.", - "waf": "Fiabilidad" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Al configurar las opciones de diagnóstico de App Service, puede enviar todos los datos de telemetría a Log Analytics como destino central para el registro y la supervisión. Esto le permite supervisar la actividad en tiempo de ejecución de App Service, como los registros HTTP, los registros de aplicaciones, los registros de plataforma, ...", + "guid": "47768314-c115-4775-a2ea-55b46ad48408", + "link": "https://learn.microsoft.com/azure/app-service/troubleshoot-diagnostic-logs", + "service": "App Services", + "severity": "Medio", + "text": "Envío de registros en tiempo de ejecución de App Service a Log Analytics", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", - "service": "SAP", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Configure una configuración de diagnóstico para enviar el registro de actividad a Log Analytics como destino central para el registro y la supervisión. Esto le permite supervisar la actividad del plano de control en el propio recurso de App Service.", + "guid": "ee72734b-475b-4a18-bdbf-590ce65de8e0", + "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", + "service": "App Services", "severity": "Medio", - "text": "Empareje las redes virtuales principal y de recuperación ante desastres. Por ejemplo, para la replicación del sistema HANA, una red virtual de base de datos de SAP HANA debe estar emparejada con la red virtual de base de datos de SAP HANA del sitio de recuperación ante desastres.", - "waf": "Fiabilidad" + "text": "Envío de registros de actividad de App Service a Log Analytics", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", - "service": "SAP", - "severity": "Bajo", - "text": "Si usa el almacenamiento de Azure NetApp Files para las implementaciones de SAP, como mínimo, cree dos cuentas de Azure NetApp Files en el nivel Premium, en dos regiones.", - "training": "https://learn.microsoft.com/training/modules/choose-service-level-azure-netapp-files-hpc-applications/2-identify-decision-criteria", - "waf": "Fiabilidad" - }, - { - "checklist": "SAP Checklist", - "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", - "severity": "Alto", - "text": "Se debe usar la tecnología de replicación de bases de datos nativas para sincronizar la base de datos en un par de alta disponibilidad.", - "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/?source=recommendations", - "waf": "Fiabilidad" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Controle el acceso saliente a la red mediante una combinación de integración de red virtual regional, grupos de seguridad de red y UDR. El tráfico debe enrutarse a una aplicación virtual de red, como Azure Firewall. Asegúrese de supervisar los registros del cortafuegos.", + "guid": "c12159e1-14b9-433d-b574-ecccd9bd3baf", + "link": "https://learn.microsoft.com/azure/app-service/overview-vnet-integration", + "service": "App Services", + "severity": "Medio", + "text": "El acceso a la red saliente debe controlarse", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", - "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", - "service": "SAP", - "severity": "Alto", - "text": "El CIDR de la red virtual (VNet) principal no debe entrar en conflicto ni superponerse con el CIDR de la red virtual del sitio de recuperación ante desastres", - "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", - "waf": "Fiabilidad" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Puede proporcionar una dirección IP de salida estable mediante la integración de red virtual y una puerta de enlace NAT de red virtual o una aplicación virtual de red como Azure Firewall. Esto permite a la parte receptora incluir en la lista de permitidos en función de la IP, en caso de que sea necesario. Tenga en cuenta que para las comunicaciones con los servicios de Azure, a menudo no es necesario depender de la dirección IP y, en su lugar, se deben usar mecanismos como los puntos de conexión de servicio. (Además, el uso de puntos de conexión privados en el extremo receptor evita que se produzca SNAT y proporciona un intervalo de IP de salida estable).", + "guid": "cda3b54e-b2eb-403d-b9a2-582718d2ddb1", + "link": "https://learn.microsoft.com/azure/app-service/networking/nat-gateway-integration", + "service": "App Services", + "severity": "Bajo", + "text": "Garantizar una IP estable para las comunicaciones salientes hacia las direcciones de Internet", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", - "service": "SAP", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Controle el acceso entrante a la red mediante una combinación de restricciones de acceso al Servicio de aplicaciones, puntos de conexión de servicio o puntos de conexión privados. Se pueden requerir y configurar diferentes restricciones de acceso para la propia aplicación web y el sitio de SCM.", + "guid": "0725769e-e669-41a4-a34a-c932223ece80", + "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", + "service": "App Services", "severity": "Alto", - "text": "Use Site Recovery para replicar un servidor de aplicaciones en un sitio de recuperación ante desastres. Site Recovery también puede ayudar a replicar máquinas virtuales de clúster de servicios centrales en el sitio de recuperación ante desastres. Al invocar la recuperación ante desastres, deberá volver a configurar el clúster de Linux Pacemaker en el sitio de recuperación ante desastres (por ejemplo, reemplazar el VIP o SBD, ejecutar corosync.conf, etc.).", - "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", - "waf": "Fiabilidad" + "text": "El acceso a la red entrante debe controlarse", + "waf": "Seguridad" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Protéjase contra el tráfico entrante malintencionado mediante un firewall de aplicaciones web como Application Gateway o Azure Front Door. Asegúrese de supervisar los registros del WAF.", + "guid": "b123071a-5416-4415-a33e-a3ad2c2de732", + "link": "https://learn.microsoft.com/azure/app-service/networking/app-gateway-with-service-endpoints", + "service": "App Services", "severity": "Alto", - "text": "Considere la disponibilidad del software de SAP frente a puntos únicos de fallo. Esto incluye puntos únicos de falla dentro de aplicaciones como DBMS utilizados en las arquitecturas SAP NetWeaver y SAP S/4HANA, SAP ABAP y ASCS + SCS. También, otras herramientas como 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": "Fiabilidad" + "text": "Uso de un WAF delante de App Service", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", - "service": "SAP", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Asegúrese de que no se pueda omitir el WAF bloqueando el acceso solo al WAF. Use una combinación de restricciones de acceso, puntos de conexión de servicio y puntos de conexión privados.", + "guid": "165c3acb-ef4a-4be1-b8d3-9fda47768314", + "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", + "service": "App Services", "severity": "Alto", - "text": "En el caso de SAP y bases de datos de SAP, considere la posibilidad de implementar clústeres de conmutación por error automática. En Windows, los clústeres de conmutación por error de Windows Server admiten la conmutación por error. En Linux, Linux Pacemaker o herramientas de terceros como SIOS Protection Suite y Veritas InfoScale admiten la conmutación por error.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Fiabilidad" + "text": "Evite que se omita WAF", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", - "severity": "Alto", - "text": "Azure no admite arquitecturas en las que las máquinas virtuales principal y secundaria compartan el almacenamiento de los datos de DBMS. Para la capa DBMS, el patrón de arquitectura común es replicar bases de datos al mismo tiempo y con pilas de almacenamiento diferentes a las que usan las máquinas virtuales principal y secundaria.", - "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": "Fiabilidad" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Establezca la directiva TLS mínima en 1.2 en la configuración de App Service.", + "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", + "severity": "Medio", + "text": "Establezca la directiva TLS mínima en 1.2", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", - "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", - "service": "SAP", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Configure App Service para que use solo HTTPS. Esto hace que App Service se redirija de HTTP a HTTPS. Considere seriamente el uso de HTTP Strict Transport Security (HSTS) en su código o desde su WAF, que informa a los navegadores que solo se debe acceder al sitio mediante 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", "severity": "Alto", - "text": "Los datos de DBMS y los archivos de registro de transacciones y puesta al día se almacenan en el almacenamiento en bloque compatible con Azure o en Azure NetApp Files. Azure Files o Azure Premium Files no se admiten como almacenamiento para datos de DBMS o archivos de registro de puesta al día con la carga de trabajo de SAP.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-databases/2-explore-database-support-azure-for-sap-workloads", - "waf": "Fiabilidad" + "text": "Usar solo HTTPS", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", - "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", - "service": "SAP", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "No utilice caracteres comodín en la configuración de CORS, ya que esto permite que todos los orígenes accedan al servicio (lo que anula el propósito de CORS). En concreto, solo permite los orígenes que esperas poder acceder al servicio.", + "guid": "68266abc-a264-4f9a-89ae-d9c55d04c2c3", + "link": "https://learn.microsoft.com/azure/app-service/app-service-web-tutorial-rest-api", + "service": "App Services", "severity": "Alto", - "text": "Puede usar discos compartidos de Azure en Windows para componentes ASCS + SCS y escenarios específicos de alta disponibilidad. Configure los clústeres de conmutación por error por separado para los componentes de la capa de aplicación de SAP y la capa de DBMS. Actualmente, Azure no admite arquitecturas de alta disponibilidad que combinen componentes de la capa de aplicación de SAP y la capa de DBMS en un clúster de conmutación por error.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Fiabilidad" + "text": "Los comodines no deben usarse para CORS", + "waf": "Seguridad" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "La depuración remota no debe estar activada en producción, ya que esto abre puertos adicionales en el servicio, lo que aumenta la superficie expuesta a ataques. Tenga en cuenta que el servicio desactiva la depuración remota automáticamente después de 48 horas.", + "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", "severity": "Alto", - "text": "La mayoría de los clústeres de conmutación por error para los componentes de la capa de aplicación (ASCS) de SAP y la capa de DBMS requieren una dirección IP virtual para un clúster de conmutación por error. Azure Load Balancer debe controlar la dirección IP virtual para todos los demás casos. Un principio de diseño es usar un equilibrador de carga por configuración de clúster. Te recomendamos que utilices la versión estándar del equilibrador de carga (SKU de equilibrador de carga estándar).", - "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", - "waf": "Fiabilidad" + "text": "Desactivar la depuración remota", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", - "service": "SAP", - "severity": "Alto", - "text": "Asegúrese de que la IP flotante esté habilitada en el equilibrador de carga", - "training": "https://learn.microsoft.com/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", - "waf": "Fiabilidad" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Habilite Defender para App Service. Esto (entre otras amenazas) detecta comunicaciones a direcciones IP maliciosas conocidas. Revise las recomendaciones de Defender para App Service como parte de las operaciones.", + "guid": "18d2ddb1-0725-4769-be66-91a4834ac932", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-app-service-introduction", + "service": "App Services", + "severity": "Medio", + "text": "Habilitación de Defender for Cloud: Defender for App Service", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "SAP", - "severity": "Alto", - "text": "Antes de implementar la infraestructura de alta disponibilidad, y en función de la región que elija, determine si desea realizar la implementación con un conjunto de disponibilidad de Azure o una zona de disponibilidad.", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "Fiabilidad" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Azure proporciona protección básica contra DDoS en su red, que se puede mejorar con funcionalidades inteligentes de DDoS Standard que aprenden sobre los patrones de tráfico normales y pueden detectar comportamientos inusuales. DDoS Standard se aplica a una red virtual, por lo que debe configurarse para el recurso de red delante de la aplicación, como Application Gateway o una aplicación virtual de red.", + "guid": "223ece80-b123-4071-a541-6415833ea3ad", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "App Services", + "severity": "Medio", + "text": "Habilitación del estándar de protección DDoS en la red virtual de WAF", + "waf": "Seguridad" }, { - "checklist": "SAP 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", - "severity": "Alto", - "text": "Si desea cumplir los acuerdos de nivel de servicio de infraestructura para las aplicaciones de los componentes de SAP (servicios centrales, servidores de aplicaciones y bases de datos), debe elegir las mismas opciones de alta disponibilidad (máquinas virtuales, conjuntos de disponibilidad, zonas de disponibilidad) para todos los componentes.", - "waf": "Fiabilidad" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Cuando use imágenes almacenadas en Azure Container Registry, extráigalas a través de una red virtual desde Azure Container Registry mediante su punto de conexión privado y la configuración de la aplicación \"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", + "severity": "Medio", + "text": "Extracción de contenedores a través de una red virtual", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "cbe05bbe-209d-4490-ba47-778424d11678", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", - "severity": "Alto", - "text": "No mezcle servidores de diferentes roles en el mismo conjunto de disponibilidad. Mantenga las máquinas virtuales de servicios centrales, las máquinas virtuales de base de datos y las máquinas virtuales de aplicaciones en sus propios conjuntos de disponibilidad", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "Fiabilidad" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Realice una prueba de penetración en la aplicación web siguiendo las reglas de participación de las pruebas de penetración.", + "guid": "eb2eb03d-d9a2-4582-918d-2ddb10725769", + "link": "https://learn.microsoft.com/azure/security/fundamentals/pen-testing", + "service": "App Services", + "severity": "Medio", + "text": "Realizar una prueba de penetración", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", - "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", - "service": "SAP", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Implemente código de confianza que se haya validado y analizado en busca de vulnerabilidades de acuerdo con las prácticas de DevSecOps.", + "guid": "19aed9c5-5d04-4c2c-9919-ca0b2c12159e", + "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/devsecops-in-azure", + "service": "App Services", "severity": "Medio", - "text": "No se pueden implementar conjuntos de disponibilidad de Azure dentro de una zona de disponibilidad de Azure a menos que se usen grupos de selección de ubicación de proximidad.", - "training": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "waf": "Fiabilidad" + "text": "Implementación de código validado", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "9674e7c7-7796-4181-8920-09f4429543ba", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Utilice las versiones más recientes de plataformas, lenguajes de programación, protocolos y marcos compatibles.", + "guid": "114b933d-f574-4ecc-ad9b-d3bafcda3b54", + "link": "https://learn.microsoft.com/azure/app-service/overview-patch-os-runtime", + "service": "App Services", "severity": "Alto", - "text": "Al crear conjuntos de disponibilidad, use el número máximo de dominios de error y dominios de actualización disponibles. Por ejemplo, si implementa más de dos máquinas virtuales en un conjunto de disponibilidad, use el número máximo de dominios de error (tres) y suficientes dominios de actualización para limitar el efecto de posibles errores de hardware físico, interrupciones de red o interrupciones de energía, además del mantenimiento planeado de Azure. El número predeterminado de dominios de error es dos y no puede cambiarlo en línea más adelante.", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "Fiabilidad" + "text": "Utilizar plataformas, lenguajes, protocolos y marcos actualizados", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", - "severity": "Alto", - "text": "Cuando se usan grupos de selección con selección de ubicación de proximidad de Azure en una implementación de conjunto de disponibilidad, los tres componentes de SAP (servicios centrales, servidor de aplicaciones y base de datos) deben estar en el mismo grupo con selección de ubicación de proximidad.", - "waf": "Fiabilidad" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "Alto", + "text": "Siga las barreras de seguridad de Metaprompting para una IA responsable", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", + "link": "https://github.com/Azure-Samples/AI-Gateway", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Use un grupo de selección de ubicación de proximidad por SID de SAP. Los grupos no abarcan zonas de disponibilidad ni regiones de Azure", - "waf": "Fiabilidad" + "text": "Considere la posibilidad de crear patrones de puerta de enlace con APIM o soluciones como AI Central para mejorar la limitación de velocidad, el equilibrio de carga, la autenticación y el registro", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Alto", - "text": "Utilice uno de los siguientes servicios para ejecutar clústeres de servicios centrales de SAP, en función del sistema operativo.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Fiabilidad" + "text": "Habilitación de la supervisión para las instancias de AOAI", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "ed46b937-913e-4018-9c62-8393ab037e53", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", - "service": "SAP", - "severity": "Medio", - "text": "Actualmente, Azure no admite la combinación de ASCS y alta disponibilidad de base de datos en el mismo clúster de Linux Pacemaker; sepáralos en grupos individuales. Sin embargo, puede combinar hasta cinco clústeres de servicios centrales en un par de máquinas virtuales.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Fiabilidad" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "697cb391-ed16-4b2d-886f-0a0241addde6", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Cree alertas para notificar a los equipos de eventos, como una entrada en el registro de actividad creada por una acción realizada en el recurso, como la regeneración de sus claves de suscripción, o un umbral de métrica, como el número de errores que superan los 10 en una hora", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP 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", - "severity": "Medio", - "text": "Implemente ambas máquinas virtuales en el par de alta disponibilidad en un conjunto de disponibilidad o en zonas de disponibilidad. Estas máquinas virtuales deben tener el mismo tamaño y la misma configuración de almacenamiento.", - "waf": "Fiabilidad" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Supervise el uso de tokens para evitar interrupciones del servicio debido a la capacidad", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Azure admite la instalación y configuración de SAP HANA y las instancias de ASCS/SCS y ERS en el mismo clúster de alta disponibilidad que se ejecuta en Red Hat Enterprise Linux (RHEL).", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Fiabilidad" + "text": "Observe métricas como tokens de inferencia procesados, tokens de finalización generados, monitoree el límite de velocidad", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", - "severity": "Alto", - "text": "Ejecute todos los sistemas de producción en SSD administradas Premium y use Azure NetApp Files o Ultra Disk Storage. Al menos el disco del sistema operativo debe estar en el nivel Premium para que pueda lograr un mejor rendimiento y el mejor Acuerdo de Nivel de Servicio.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", - "waf": "Fiabilidad" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "Bajo", + "text": "Si los diagnósticos no son suficientes para usted, considere la posibilidad de usar una puerta de enlace como Azure API Managements frente a Azure OpenAI para registrar tanto los mensajes entrantes como las respuestas salientes, cuando esté permitido", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", + "link": "https://github.com/Azure-Samples/openai-enterprise-iac", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Debe ejecutar SAP HANA en Azure solo en los tipos de almacenamiento certificados por SAP. Tenga en cuenta que ciertos volúmenes deben ejecutarse en determinadas configuraciones de disco, cuando corresponda. Estas configuraciones incluyen la habilitación del acelerador de escritura y el uso del almacenamiento premium. También debe asegurarse de que el sistema de archivos que se ejecuta en el almacenamiento es compatible con el DBMS que se ejecuta en la máquina.", - "training": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1?source=recommendations", - "waf": "Fiabilidad" + "text": "Use la infraestructura como código para implementar el servicio Azure OpenAI, las implementaciones de modelos y todos los recursos relacionados", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "4350d092-d234-4292-a752-8537a551c5bf", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Considere la posibilidad de configurar la alta disponibilidad en función del tipo de almacenamiento que utilice para las cargas de trabajo de SAP. Algunos servicios de almacenamiento disponibles en Azure no son compatibles con Azure Site Recovery, por lo que la configuración de alta disponibilidad puede diferir.", - "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/2-explore-disaster-recovery-sap-workloads", - "waf": "Fiabilidad" + "text": "Uso de la autenticación de Microsoft Entra con identidad administrada en lugar de clave de API", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", - "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Alto", - "text": "Es posible que los diferentes servicios de almacenamiento nativos de Azure (como Azure Files, Azure NetApp Files, Azure Shared Disk) no estén disponibles en todas las regiones. Por lo tanto, para tener una configuración de SAP similar en la región de recuperación ante desastres después de la conmutación por error, asegúrese de que el servicio de almacenamiento correspondiente se ofrece en el sitio de recuperación ante desastres.", - "waf": "Fiabilidad" - }, - { - "checklist": "SAP 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", - "severity": "Medio", - "text": "Automatice SAP System Start-Stop para gestionar los costes.", - "waf": "Costar" + "text": "Evalúe el rendimiento/precisión del sistema con un conjunto de datos dorado conocido que tenga las entradas y las respuestas correctas. Aproveche las capacidades de PromptFlow para la evaluación.", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", - "severity": "Bajo", - "text": "En el caso de usar Azure Premium Storage con SAP HANA, se puede usar el almacenamiento SSD estándar de Azure para seleccionar una solución de almacenamiento rentable. Sin embargo, tenga en cuenta que la elección de SSD estándar o almacenamiento de Azure HDD estándar afectará al Acuerdo de Nivel de Servicio de las máquinas virtuales individuales. Además, para sistemas con menor rendimiento de E/S y baja latencia, como entornos que no son de producción, se pueden usar máquinas virtuales de series inferiores.", - "waf": "Costar" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "Alto", + "text": "Evaluación del uso del modelo de rendimiento aprovisionado ", + "waf": "Rendimiento" }, { - "checklist": "SAP Checklist", - "guid": "9877f353-2591-4e8b-8381-e9043fed1010", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", - "severity": "Bajo", - "text": "Como configuración alternativa de menor costo (multipropósito), puede elegir una SKU de bajo rendimiento para las máquinas virtuales del servidor de base de datos de HANA que no son de producción. Sin embargo, es importante tener en cuenta que algunos tipos de máquinas virtuales, como la serie E, no están certificadas para HANA (directorio de hardware de SAP HANA) o no pueden alcanzar una latencia de almacenamiento inferior a 1 ms.", - "waf": "Costar" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Revisión e implementación de la seguridad del contenido de Azure AI", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1193846d-697c-4b39-8ed1-6b2d186f0a02", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#system-level-throughput", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Aplicación de un modelo RBAC para grupos de administración, suscripciones, grupos de recursos y recursos", - "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", - "waf": "Seguridad" + "text": "Defina y evalúe el rendimiento del sistema en función de los tokens y la respuesta por minuto y alinee con los requisitos", + "waf": "Rendimiento" }, { - "checklist": "SAP Checklist", - "guid": "45911475-e39e-4530-accc-d979366bcda2", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Aplicación de la propagación de la entidad de seguridad para reenviar la identidad de la aplicación en la nube de SAP a SAP local (incluida IaaS) a través del conector en la nube", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/2-explore-azure-virtual-machine-auth-access-control", - "waf": "Seguridad" + "text": "Mejore la latencia del sistema limitando el tamaño de los tokens, las opciones de transmisión", + "waf": "Rendimiento" }, { - "checklist": "SAP Checklist", - "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Implemente SSO en aplicaciones SAP SaaS como SAP Analytics Cloud, SAP Cloud Platform, Business by design, SAP Qualtrics y SAP C4C con Azure AD mediante SAML.", - "waf": "Seguridad" + "text": "Calcule las demandas de elasticidad para determinar la segregación de solicitudes sincrónicas y por lotes en función de la prioridad. Para la prioridad alta, utilice el enfoque sincrónico y para la prioridad baja, se prefiere el procesamiento por lotes asincrónico con cola", + "waf": "Rendimiento" }, { - "checklist": "SAP Checklist", - "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", - "severity": "Medio", - "text": "Implemente SSO en aplicaciones web basadas en SAP NetWeaver, como SAP Fiori y SAP Web GUI mediante SAML.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", - "waf": "Seguridad" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "5bda4332-4f24-4811-9331-82ba51752694", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Compare los requisitos de consumo de tokens en función de las demandas estimadas de los consumidores. Considere la posibilidad de usar la herramienta de pruebas comparativas de Azure OpenAI para ayudarle a validar el rendimiento si usa implementaciones de unidades de rendimiento aprovisionadas", + "waf": "Rendimiento" }, { - "checklist": "SAP Checklist", - "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Medio", - "text": "Implemente SSO en aplicaciones web basadas en SAP NetWeaver, como SAP Fiori y SAP Web GUI mediante SAML.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/6-exercise-integrate-azure-active-directory-sap-fiori", - "waf": "Seguridad" + "text": "Si usa unidades de rendimiento aprovisionadas (PTU), considere la posibilidad de implementar una implementación de token por minuto (TPM) para las solicitudes de desbordamiento. Use una puerta de enlace para enrutar las solicitudes a la implementación de TPM cuando se alcancen los límites de PTU.", + "waf": "Rendimiento" }, { - "checklist": "SAP Checklist", - "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", - "severity": "Medio", - "text": "Puede implementar SSO en la GUI de SAP mediante SAP NetWeaver SSO o una solución de partner.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", - "waf": "Seguridad" - }, + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Elija el modelo adecuado para la tarea correcta. Elija modelos con el equilibrio adecuado entre velocidad, calidad de respuesta y complejidad de salida", + "waf": "Rendimiento" + }, { - "checklist": "SAP Checklist", - "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e9951904-8384-45c9-a6cb-2912156a1147", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Para SSO para SAP GUI y acceso al navegador web, implemente SNC / Kerberos / SPNEGO (mecanismo de negociación GSSAPI simple y protegido) debido a su facilidad de configuración y mantenimiento. Para SSO con certificados de cliente X.509, considere el servidor de inicio de sesión seguro de SAP, que es un componente de la solución SSO de SAP.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/9-exercise-integrate-active-directory-sap-single-sign-on", - "waf": "Seguridad" + "text": "Tener una línea de base para el rendimiento sin ajuste fino para saber si el ajuste fino ha mejorado o no el rendimiento del modelo", + "waf": "Rendimiento" }, { - "checklist": "SAP 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", - "severity": "Medio", - "text": "Para SSO para SAP GUI y acceso al navegador web, implemente SNC / Kerberos / SPNEGO (mecanismo de negociación GSSAPI simple y protegido) debido a su facilidad de configuración y mantenimiento. Para SSO con certificados de cliente X.509, considere el servidor de inicio de sesión seguro de SAP, que es un componente de la solución SSO de SAP.", - "waf": "Seguridad" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "Bajo", + "text": "Implementación de varias instancias de OAI en todas las regiones", + "waf": "Fiabilidad" }, { - "checklist": "SAP 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", - "severity": "Medio", - "text": "Implemente el inicio de sesión único mediante OAuth para SAP NetWeaver a fin de permitir que aplicaciones personalizadas o de terceros accedan a los servicios OData de SAP NetWeaver.", - "waf": "Seguridad" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "Alto", + "text": "Implemente reintentos y comprobaciones de estado con el patrón de puerta de enlace como APIM", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "a747c350-8d4c-449c-93af-393dbca77c48", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Medio", - "text": "Implementación de SSO en SAP HANA", - "waf": "Seguridad" + "text": "Asegúrese de tener cuotas adecuadas de TPM y RPM para la carga de trabajo", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", + "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Considere Azure AD como un proveedor de identidades para sistemas SAP hospedados en RISE. Para obtener más información, consulte Integración del servicio con Azure AD.", - "waf": "Seguridad" + "text": "Revise las consideraciones de la guía del kit de herramientas de HAI y aplique esas prácticas de interacción para el slution", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", - "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7f154e3a-a369-4282-ae7e-316183687a04", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", + "service": "Azure OpenAI", "severity": "Medio", - "text": "En el caso de las aplicaciones que acceden a SAP, es posible que desee utilizar la propagación de entidades de seguridad para establecer el inicio de sesión único.", - "waf": "Seguridad" + "text": "Implemente modelos de ajuste de precisión independientes en todas las regiones si se emplea el ajuste de precisión", + "waf": "Fiabilidad" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "77a1f893-5bda-4433-84f2-4811633182ba", + "link": "https://learn.microsoft.com/azure/backup/backup-overview", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Si usa servicios BTP de SAP o soluciones SaaS que requieren SAP Identity Authentication Service (IAS), considere la posibilidad de implementar SSO entre SAP Cloud Identity Authentication Services y Azure AD para acceder a esos servicios de SAP. Esta integración permite a SAP IAS actuar como proveedor de identidades de proxy y reenvía las solicitudes de autenticación a Azure AD como almacén de usuarios central y proveedor de identidades.", - "waf": "Seguridad" + "text": "Realice copias de seguridad y replique regularmente los datos críticos para garantizar la disponibilidad y la capacidad de recuperación de los datos en caso de pérdida de datos o fallos del sistema. Aproveche los servicios de copia de seguridad y recuperación ante desastres de Azure para proteger sus datos.", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", - "service": "SAP", - "severity": "Medio", - "text": "Implementación de SSO en SAP BTP", - "waf": "Seguridad" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "Alto", + "text": "Los niveles de servicio de búsqueda de Azure AI deben elegirse para tener un Acuerdo de Nivel de Servicio ", + "waf": "Fiabilidad" }, { - "checklist": "SAP 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", - "severity": "Medio", - "text": "Si usa SAP SuccessFactors, considere la posibilidad de usar el aprovisionamiento automatizado de usuarios de Azure AD. Con esta integración, a medida que agrega nuevos empleados a SAP SuccessFactors, puede crear automáticamente sus cuentas de usuario en Azure AD. Opcionalmente, puede crear cuentas de usuario en Microsoft 365 u otras aplicaciones SaaS compatibles con Azure AD. Utilice la escritura diferida de la dirección de correo electrónico en SAP SuccessFactors.", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", + "link": "https://learn.microsoft.com/purview/purview", + "service": "Azure OpenAI", + "severity": "Bajo", + "text": "Clasifique los datos y la confidencialidad, etiquetando con Microsoft Purview antes de generar las incrustaciones y asegúrese de tratar las incrustaciones generadas con la misma confidencialidad y clasificación", "waf": "Seguridad" }, { - "checklist": "SAP 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", - "severity": "Medio", - "text": "aplicar las directivas de grupo de administración existentes a las suscripciones de SAP", - "training": "https://learn.microsoft.com/training/modules/enterprise-scale-organization/4-management-group-subscription-organization", - "waf": "Operaciones" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "4fda1dbf-3dd9-45d4-ac7c-891dca1f6d56", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/use-your-data-securely", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Cifre los datos utilizados para RAG con cifrado SSE/Disk con BYOK opcional", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", + "link": "https://learn.microsoft.com/azure/search/search-security-overview", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Integre aplicaciones estrechamente acopladas en la misma suscripción de SAP para evitar una complejidad adicional de enrutamiento y administración", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-subscriptions", - "waf": "Operaciones" + "text": "Asegúrese de que TLS se aplica a los datos en tránsito a través de fuentes de datos, la búsqueda de IA utilizada para la generación aumentada de recuperación (RAG) y la comunicación de LLM", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7b94ef6e-047d-42ea-8992-b1cd6e2054b2", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Aprovechar la suscripción como unidad de escalado y escalar nuestros recursos, considere implementar la suscripción por entorno, por ejemplo. Sandbox, no-prod, prod ", - "training": "https://learn.microsoft.com/training/modules/configure-subscriptions/?source=recommendations", - "waf": "Operaciones" + "text": "Use RBAC para administrar el acceso a los servicios de Azure OpenAI. Asigne los permisos adecuados a los usuarios y restrinja el acceso en función de sus funciones y responsabilidades", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", - "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", + "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", + "service": "Azure OpenAI", + "severity": "Medio", + "text": "Implemente técnicas de cifrado, enmascaramiento o redacción de datos para ocultar datos confidenciales o reemplazarlos con valores ofuscados en entornos que no sean de producción o al compartir datos con fines de prueba o solución de problemas", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Garantizar el aumento de la cuota como parte del aprovisionamiento de suscripciones (por ejemplo, el total de núcleos de máquina virtual disponibles dentro de una suscripción)", - "training": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", - "waf": "Operaciones" + "text": "Use Azure Defender para detectar y responder a las amenazas de seguridad y configurar mecanismos de supervisión y alerta para identificar actividades sospechosas o infracciones. Aproveche Azure Sentinel para la detección y respuesta a amenazas avanzadas", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", - "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", - "service": "SAP", - "severity": "Bajo", - "text": "La API de cuota es una API de REST que se puede usar para ver y administrar las cuotas de los servicios de Azure. Considere usarlo si es necesario.", - "waf": "Operaciones" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "Medio", + "text": "Establezca políticas de retención y eliminación de datos para cumplir con las regulaciones de cumplimiento. Implemente métodos de eliminación seguros para los datos que ya no son necesarios y mantenga un registro de auditoría de las actividades de retención y eliminación de datos", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", - "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Si realiza la implementación en una zona de disponibilidad, asegúrese de que la implementación de la zona de la máquina virtual esté disponible una vez que se haya aprobado la cuota. Envíe una solicitud de soporte técnico con la suscripción, la serie de máquinas virtuales, el número de CPU y la zona de disponibilidad necesarias.", - "waf": "Operaciones" + "text": "Implemente los escudos de aviso y la detección de conexión a tierra mediante Content Safety ", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "e6e20617-3686-4af4-9791-f8935ada4332", - "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", + "link": "https://learn.microsoft.com/azure/compliance/", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Asegúrese de que los servicios y funciones requeridos estén disponibles dentro de las regiones de implementación elegidas, por ejemplo. ANF, Zona, etc.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/azure-best-practices/multiple-regions?source=recommendations", - "waf": "Operaciones" + "text": "Garantice el cumplimiento de las normativas de protección de datos pertinentes, como el RGPD o la HIPAA, mediante la implementación de controles de privacidad y la obtención de los consentimientos o permisos necesarios para las actividades de tratamiento de datos.", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Aproveche la etiqueta de recurso de Azure para la categorización de costos y la agrupación de recursos (facturación, departamento (o unidad de negocio), entorno (producción, fase, desarrollo), nivel (nivel web, nivel de aplicación), propietario de la aplicación, ProjectName)", - "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", - "waf": "Operaciones" + "text": "Eduque a sus empleados sobre las mejores prácticas de seguridad de datos, la importancia de manejar los datos de forma segura y los riesgos potenciales asociados con las violaciones de datos. Anímelos a seguir diligentemente los protocolos de seguridad de datos.", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Ayude a proteger la base de datos de HANA mediante el servicio Azure Backup.", - "training": "https://learn.microsoft.com/training/modules/implement-azure-backup-sap-workloads-azure-virtual-machines/?source=recommendations", - "waf": "Fiabilidad" + "text": "Mantenga los datos de producción separados de los datos de desarrollo y pruebas. Utilice únicamente datos confidenciales reales en producción y utilice datos anónimos o sintéticos en entornos de desarrollo y prueba.", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Si implementa Azure NetApp Files para la base de datos HANA, Oracle o DB2, use la herramienta Azure Application Consistent Snapshot (AzAcSnap) para tomar instantáneas coherentes con la aplicación. AzAcSnap también es compatible con las bases de datos de Oracle. Considere la posibilidad de usar AzAcSnap en una máquina virtual central en lugar de en máquinas virtuales individuales.", - "waf": "Fiabilidad" - }, - { - "checklist": "SAP Checklist", - "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", - "severity": "Alto", - "text": "Asegúrese de que la zona horaria coincida entre el sistema operativo y el sistema SAP.", - "waf": "Operaciones" + "text": "Si tiene distintos niveles de confidencialidad de datos, considere la posibilidad de crear índices independientes para cada nivel. Por ejemplo, podría tener un índice para los datos generales y otro para los datos confidenciales, cada uno gobernado por diferentes protocolos de acceso", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "c3c7abc0-716c-4486-893c-40e181d65539", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", + "service": "Azure OpenAI", "severity": "Medio", - "text": "No agrupe diferentes servicios de aplicaciones en el mismo clúster. Por ejemplo, no combine DRBD y clústeres de servicios centrales en el mismo clúster. Sin embargo, puede usar el mismo clúster de Pacemaker para administrar aproximadamente cinco servicios centrales diferentes (clúster de varios SID).", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Fiabilidad" - }, - { - "checklist": "SAP Checklist", - "guid": "a491dfc4-9353-4213-9217-eef0949f9467", - "link": "https://azure.microsoft.com/pricing/offers/dev-test/", - "service": "SAP", - "severity": "Bajo", - "text": "Considere la posibilidad de ejecutar sistemas de desarrollo y pruebas en un modelo de repetición para ahorrar y optimizar los costos de ejecución de Azure.", - "waf": "Costar" + "text": "Lleve la segregación un paso más allá colocando conjuntos de datos confidenciales en diferentes instancias del servicio. Cada instancia se puede controlar con su propio conjunto específico de políticas RBAC", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", - "link": "https://learn.microsoft.com/azure/lighthouse/overview", - "service": "SAP", - "severity": "Medio", - "text": "Si se asocia con los clientes mediante la administración de sus propiedades de SAP, considere la posibilidad de usar Azure Lighthouse. Azure Lighthouse permite a los proveedores de servicios administrados usar los servicios de identidad nativos de Azure para autenticarse en el entorno de los clientes. Pone el control en manos de los clientes, ya que pueden revocar el acceso en cualquier momento y auditar las acciones de los proveedores de servicios.", - "waf": "Operaciones" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Reconozca que las incrustaciones y los vectores generados a partir de información confidencial son en sí mismos confidenciales. Estos datos deben recibir las mismas medidas de protección que el material de origen", + "waf": "Seguridad" }, { - "checklist": "SAP 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", - "severity": "Medio", - "text": "Use Azure Update Manager para comprobar el estado de las actualizaciones disponibles para una sola máquina virtual o varias máquinas virtuales y considere la posibilidad de programar revisiones periódicas.", - "training": "https://learn.microsoft.com/training/modules/keep-your-virtual-machines-updated/?source=recommendations", - "waf": "Operaciones" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3571449a-b805-43d8-af89-dc7b33be2a1a", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Aplique RBAC a los almacenes de datos que tienen incrustaciones y vectores y alcance el acceso en función de los requisitos de acceso del rol", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", - "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", - "service": "SAP", - "severity": "Bajo", - "text": "Optimice y gestione las operaciones de SAP Basis mediante SAP Landscape Management (LaMa). Use el conector de SAP LaMa para Azure para reubicar, copiar, clonar y actualizar sistemas SAP.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-remote-management/?source=recommendations", - "waf": "Operaciones" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "Alto", + "text": "Configure un punto de conexión privado para que los servicios de IA restrinjan el acceso al servicio dentro de su red", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "14591147-5e39-4e53-89cc-cd979366bcda", - "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", - "service": "SAP", - "severity": "Medio", - "text": "Use Azure Monitor para soluciones SAP para supervisar las cargas de trabajo de SAP (SAP HANA, clústeres de SUSE de alta disponibilidad y sistemas SQL) en Azure. Considere la posibilidad de complementar las soluciones de Azure Monitor para SAP con SAP Solution Manager.", - "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", - "waf": "Operaciones" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Aplique un estricto control del tráfico entrante y saliente con Azure Firewall y UDR, y limite los puntos de integración externos", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", - "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Ejecute una comprobación de extensión de máquina virtual para SAP. VM Extension for SAP usa la identidad administrada asignada de una máquina virtual (VM) para acceder a los datos de configuración y supervisión de VM. La comprobación garantiza que todas las métricas de rendimiento de la aplicación SAP proceden de la extensión de Azure para SAP subyacente.", - "training": "https://learn.microsoft.com/training/modules/configure-azure-enhanced-monitoring-extension-for-sap/?source=recommendations", - "waf": "Operaciones" + "text": "Implemente la segmentación de la red y los controles de acceso para restringir el acceso a la aplicación LLM solo a los usuarios y sistemas autorizados y evitar el movimiento lateral", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", + "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Use Azure Policy para el control de acceso y los informes de cumplimiento. Azure Policy proporciona la capacidad de aplicar la configuración de toda la organización para garantizar el cumplimiento coherente de las directivas y la detección rápida de infracciones. ", - "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", - "waf": "Operaciones" + "text": "Utilice herramientas de compresión rápida como LLMLingua o gprtrim", + "waf": "Optimización de costes" }, { - "checklist": "SAP Checklist", - "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", - "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", - "service": "SAP", - "severity": "Medio", - "text": "Use el Monitor de conexión en Azure Network Watcher para supervisar las métricas de latencia de las bases de datos y los servidores de aplicaciones de SAP. O bien, recopile y muestre medidas de latencia de red mediante Azure Monitor.", - "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/collecting-and-displaying-niping-network-latency-measurements/ba-p/1833979", - "waf": "Operaciones" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Asegúrese de que las API y los puntos finales utilizados por la aplicación LLM estén correctamente protegidos con mecanismos de autenticación y autorización, como identidades administradas, claves de API u OAuth, para evitar el acceso no autorizado.", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "73686af4-6791-4f89-95ad-a43324e13811", - "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Medio", - "text": "Realice una comprobación de calidad de SAP HANA en la infraestructura de Azure aprovisionada para comprobar que las máquinas virtuales aprovisionadas cumplen con los procedimientos recomendados de SAP HANA en Azure.", - "waf": "Operaciones" - }, - { - "checklist": "SAP Checklist", - "guid": "616785d6-fa96-4c96-ad88-518f482734c8", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", - "severity": "Alto", - "text": "Para cada suscripción de Azure, ejecute una prueba de latencia en las zonas de disponibilidad de Azure antes de la implementación zonal para elegir zonas de baja latencia para la implementación de SAP en Azure.", - "training": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/AvZone-Latency-Test", - "waf": "Rendimiento" + "text": "Aplique mecanismos sólidos de autenticación de usuario final, como la autenticación multifactor, para evitar el acceso no autorizado a la aplicación LLM y a los recursos de red asociados", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", - "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "93555620-2bfe-4456-9b0d-834a348b263e", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Ejecute el informe de resistencia para asegurarse de que la configuración de toda la infraestructura de Azure aprovisionada (proceso, base de datos, redes, almacenamiento, Site Recovery) cumple con la configuración definida por Cloud Adaption Framework para Azure.", - "training": "https://learn.microsoft.com/training/paths/azure-well-architected-framework/", - "waf": "Fiabilidad" + "text": "Implemente herramientas de monitoreo de red para detectar y analizar el tráfico de red en busca de actividades sospechosas o maliciosas. Habilite el registro para capturar eventos de red y facilitar el análisis forense en caso de incidentes de seguridad", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", - "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Implemente la protección contra amenazas mediante la solución Microsoft Sentinel para SAP. Utilice esta solución para supervisar sus sistemas SAP y detectar amenazas sofisticadas en toda la lógica empresarial y las capas de aplicación.", - "training": "https://learn.microsoft.com/training/modules/plan-microsoft-sentinel-deployment-sap/?source=recommendations", + "text": "Realizar auditorías de seguridad y pruebas de penetración para identificar y abordar cualquier debilidad o vulnerabilidad de seguridad de red en la infraestructura de red de la aplicación LLM", "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", - "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", - "service": "SAP", - "severity": "Medio", - "text": "El etiquetado de Azure se puede aprovechar para agrupar y realizar un seguimiento lógico de los recursos, automatizar sus implementaciones y, lo que es más importante, proporcionar visibilidad de los costos incurridos.", - "training": "https://learn.microsoft.com/training/modules/analyze-costs-create-budgets-azure-cost-management/?source=recommendations", - "waf": "Operaciones" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", + "service": "Azure OpenAI", + "severity": "Bajo", + "text": "Los servicios de Azure AI están etiquetados correctamente para una mejor administración", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", + "service": "Azure OpenAI", "severity": "Bajo", - "text": "Use la supervisión de latencia entre máquinas virtuales para aplicaciones sensibles a la latencia.", - "waf": "Rendimiento" + "text": "Las cuentas de Azure AI Service siguen las convenciones de nomenclatura de la organización", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", - "severity": "Medio", - "text": "Use la supervisión de Azure Site Recovery para mantener el estado del servicio de recuperación ante desastres para los servidores de aplicaciones SAP.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", - "waf": "Fiabilidad" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Los registros de diagnóstico en los recursos de servicios de Azure AI deben estar habilitados", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", - "severity": "Medio", - "text": "Excluya todos los sistemas de archivos de bases de datos y programas ejecutables de los análisis antivirus. Incluirlos podría dar lugar a problemas de rendimiento. Consulte con los proveedores de bases de datos para obtener detalles prescriptivos sobre la lista de exclusión. Por ejemplo, Oracle recomienda excluir /oracle//sapdata de los análisis antivirus.", - "waf": "Rendimiento" - }, - { - "checklist": "SAP Checklist", - "guid": "c027f893-f404-41a9-b33d-39d625a14964", - "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", - "service": "SAP", - "severity": "Bajo", - "text": "Considere la posibilidad de recopilar estadísticas de base de datos completas para bases de datos que no son de HANA después de la migración. Por ejemplo, implemente la nota de SAP 1020260 - Entrega de estadísticas de Oracle.", - "waf": "Rendimiento" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "link": "https://learn.microsoft.com/azure/ai-services/authentication", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Se recomienda deshabilitar el acceso a claves (autenticación local) por seguridad. Después de deshabilitar el acceso basado en claves, el identificador de Microsoft Entra se convierte en el único método de acceso, lo que permite mantener el principio de privilegio mínimo y el control granular. ", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", - "service": "SAP", - "severity": "Medio", - "text": "Considere la posibilidad de usar Oracle Automatic Storage Management (ASM) para todas las implementaciones de Oracle que usan SAP en Azure.", - "training": "https://learn.microsoft.com/training/paths/administer-infrastructure-resources-in-azure/?source=recommendations", - "waf": "Rendimiento" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Almacene y administre claves de forma segura con Azure Key Vault. Evite codificar de forma rígida o incrustar claves confidenciales en el código de la aplicación de LLM y recupérelas de forma segura de Azure Key Vault mediante identidades administradas", + "waf": "Seguridad" }, { - "checklist": "SAP 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", - "severity": "Medio", - "text": "En el caso de SAP en Azure que ejecuta Oracle, una colección de scripts SQL puede ayudarle a diagnosticar problemas de rendimiento. Los informes de repositorio automático de cargas de trabajo (AWR) contienen información valiosa para diagnosticar problemas en el sistema Oracle. Le recomendamos que ejecute un informe de AWR durante varias sesiones y elija las horas punta para él, a fin de garantizar una amplia cobertura del análisis.", - "training": "https://learn.microsoft.com/ja-jp/azure/well-architected/oracle-iaas/performance-efficiency", - "waf": "Rendimiento" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Rotar y expirar periódicamente las claves almacenadas en Azure Key Vault para minimizar el riesgo de acceso no autorizado.", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "adfe27be-e297-401a-a352-baaab79b088d", + "link": "https://github.com/openai/tiktoken", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Use la supervisión de Azure Site Recovery para mantener el estado del servicio de recuperación ante desastres para los servidores de aplicaciones SAP.", - "training": "https://learn.microsoft.com/training/modules/protect-on-premises-infrastructure-with-azure-site-recovery/?source=recommendations", - "waf": "Operaciones" + "text": "Use tiktoken para comprender los tamaños de los tokens para las optimizaciones de tokens en el modo conversacional", + "waf": "Optimización de costes" }, { - "checklist": "SAP Checklist", - "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "SAP", - "severity": "Medio", - "text": "Para la entrega segura de aplicaciones HTTP/S, use Application Gateway v2 y asegúrese de que la protección y las directivas de WAF están habilitadas.", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", + "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Siga prácticas de codificación seguras para evitar vulnerabilidades comunes, como ataques de inyección, secuencias de comandos entre sitios (XSS) o errores de configuración de seguridad.", "waf": "Seguridad" }, { - "checklist": "SAP 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", - "severity": "Medio", - "text": "Si el DNS o el nombre virtual de la máquina virtual no se cambia durante la migración a Azure, el DNS en segundo plano y los nombres virtuales conectan muchas interfaces del sistema en el entorno de SAP, y los clientes solo conocen a veces las interfaces que los desarrolladores definen a lo largo del tiempo. Los desafíos de conexión surgen entre varios sistemas cuando los nombres virtuales o DNS cambian después de las migraciones, y se recomienda conservar los alias DNS para evitar este tipo de dificultades.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", - "waf": "Operaciones" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "Alto", + "text": "Configurar un proceso para actualizar y parchear regularmente las bibliotecas de LLM y otros componentes del sistema", + "waf": "Seguridad" }, { - "checklist": "SAP 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", - "severity": "Medio", - "text": "Utilice diferentes zonas DNS para distinguir cada entorno (espacio aislado, desarrollo, preproducción y producción) entre sí. La excepción es para las implementaciones de SAP con su propia red virtual; en este caso, es posible que las zonas DNS privadas no sean necesarias.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", - "waf": "Operaciones" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e29711b1-352b-4eee-879b-588defc4972c", + "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Cumplir con los términos de uso, las directivas y las directrices de Azure OpenAI u otros LLM, así como con los casos de uso permitidos.", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "a3592829-e6e2-4061-9368-6af46791f893", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Medio", - "text": "El emparejamiento de red virtual local y global proporciona conectividad y son los enfoques preferidos para garantizar la conectividad entre las zonas de aterrizaje para las implementaciones de SAP en varias regiones de Azure", - "training": "https://learn.microsoft.com/training/modules/configure-vnet-peering/?source=recommendations", - "waf": "Fiabilidad" + "text": "Comprenda la diferencia en el costo de los modelos base y los modelos ajustados y los tamaños de paso de token", + "waf": "Optimización de costes" }, { - "checklist": "SAP Checklist", - "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "service": "Azure OpenAI", "severity": "Alto", - "text": "No se admite la implementación de ninguna aplicación virtual de red entre la aplicación SAP y el servidor de base de datos SAP", - "training": "https://me.sap.com/notes/2731110", - "waf": "Rendimiento" + "text": "Solicitudes por lotes, siempre que sea posible, para minimizar la sobrecarga por llamada, lo que puede reducir los costos generales. Asegúrese de optimizar el tamaño del lote", + "waf": "Optimización de costes" }, { - "checklist": "SAP Checklist", - "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", - "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Use Virtual WAN para implementaciones de Azure en redes nuevas, grandes o globales en las que necesite conectividad de tránsito global entre regiones de Azure y ubicaciones locales. Con este enfoque, no tendrá que configurar manualmente el enrutamiento transitivo para las redes de Azure y puede seguir un estándar para las implementaciones de SAP en Azure.", - "training": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", - "waf": "Operaciones" + "text": "Configure un sistema de seguimiento de costos que supervise el uso del modelo y use esa información para ayudar a informar las opciones de modelos y los tamaños indicados", + "waf": "Optimización de costes" }, { - "checklist": "SAP Checklist", - "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", - "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Medio", - "text": "Considere la posibilidad de implementar aplicaciones virtuales de red (NVA) entre regiones solo si se usan aplicaciones virtuales de red de asociados. Las aplicaciones virtuales de red entre regiones o redes virtuales no son necesarias si hay aplicaciones virtuales de red nativas. Al implementar tecnologías de redes de asociados y aplicaciones virtuales de red, siga las instrucciones del proveedor para comprobar las configuraciones conflictivas con las redes de Azure.", - "training": "https://learn.microsoft.com/training/modules/control-network-traffic-flow-with-routes/?source=recommendations", - "waf": "Operaciones" + "text": "Establezca un límite máximo en el número de tokens por respuesta de modelo. Optimice el tamaño para asegurarse de que sea lo suficientemente grande para una respuesta válida", + "waf": "Optimización de costes" }, { - "checklist": "SAP Checklist", - "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", - "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", + "link": "https://learn.microsoft.com/azure/search/search-reliability", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Virtual WAN administra la conectividad entre redes virtuales de radio para topologías basadas en WAN virtuales (sin necesidad de configurar el enrutamiento definido por el usuario [UDR] o NVA), y el rendimiento máximo de red para el tráfico de red virtual a red virtual en el mismo centro virtual es de 50 gigabits por segundo. Si es necesario, las zonas de aterrizaje de SAP pueden usar el emparejamiento de red virtual para conectarse a otras zonas de aterrizaje y superar esta limitación de ancho de banda.", - "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/?source=recommendations", - "waf": "Operaciones" + "text": "Revise las instrucciones proporcionadas sobre la configuración de la búsqueda de IA para la confiabilidad", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP 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", - "severity": "Alto", - "text": "No se recomienda la asignación de direcciones IP públicas a la máquina virtual que ejecuta SAP Workload.", - "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", - "waf": "Seguridad" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3266b225-86f4-4a16-92bd-ddea8a487cde", + "link": "https://learn.microsoft.com/azure/search/vector-search-index-size?tabs=portal-vector-quota", + "service": "Azure OpenAI", + "severity": "Medio", + "text": "Planifique y administre el almacenamiento de vectores de búsqueda de IA", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP 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", - "severity": "Alto", - "text": "Considere la posibilidad de reservar la dirección IP en el lado de la recuperación ante desastres al configurar ASR", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "Operaciones" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "Medio", + "text": "Aplique prácticas de LLMOps para automatizar la gestión del ciclo de vida de sus aplicaciones GenAI", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Alto", - "text": "Evite el uso de intervalos de direcciones IP superpuestos para los sitios de producción y recuperación ante desastres.", - "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", - "waf": "Operaciones" + "text": "Evalúe el uso de los modelos de facturación: PAYG frente a PTU", + "waf": "Optimización de costes" }, { - "checklist": "SAP Checklist", - "guid": "6e154e3a-a359-4282-ae6e-206173686af4", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Medio", - "text": "Aunque Azure le ayuda a crear varias subredes delegadas en una red virtual, solo puede existir una subred delegada en una red virtual para Azure NetApp Files. Se producirá un error al intentar crear un nuevo volumen si se utiliza más de una subred delegada para Azure NetApp Files.", - "training": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-network-topologies?source=recommendations", - "waf": "Operaciones" + "text": "Evalúe la calidad de los mensajes y las aplicaciones al cambiar entre versiones de modelo", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Medio", - "text": "Use Azure Firewall para controlar el tráfico saliente de Azure a Internet, las conexiones entrantes que no son HTTP/S y el filtrado del tráfico Este/Oeste (si la organización lo requiere)", - "training": "https://learn.microsoft.com/training/paths/secure-networking-infrastructure/", - "waf": "Seguridad" + "text": "Evalúe, supervise y perfeccione sus aplicaciones GenAI para características como la fundamentación, la relevancia, la precisión, la coherencia, la fluidez,", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", - "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "294798b1-578b-4219-a46c-eb5443513592", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Application Gateway y Web Application Firewall tienen limitaciones cuando Application Gateway actúa como proxy inverso para aplicaciones web de SAP, como se muestra en la comparación entre Application Gateway, SAP Web Dispatcher y otros servicios de terceros.", - "training": "https://help.sap.com/docs/SUPPORT_CONTENT/si/3362959506.html", - "waf": "Seguridad" + "text": "Evalúe los resultados de búsqueda de Azure AI en función de diferentes parámetros de búsqueda", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "2744293b-b628-4537-a551-19b08e8f5854", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Use directivas de Azure Front Door y WAF para proporcionar protección global en todas las regiones de Azure para las conexiones HTTP/S entrantes a una zona de aterrizaje.", - "training": "https://learn.microsoft.com/training/paths/secure-application-delivery/", - "waf": "Seguridad" + "text": "Considere los modelos de ajuste fino como una forma de aumentar la precisión solo cuando haya probado otros enfoques básicos como la ingeniería de avisos y RAG con sus datos", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Medio", - "text": "Aproveche las directivas de Web Application Firewall en Azure Front Door cuando use Azure Front Door y Application Gateway para proteger las aplicaciones HTTP/S. Bloquee Application Gateway para recibir tráfico solo de Azure Front Door.", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", - "waf": "Seguridad" + "text": "Utilice técnicas de ingeniería rápida para mejorar la precisión de las respuestas de LLM", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "5ada4332-4e13-4811-9231-81aa41742694", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e737897e-71ca-47da-acfa-962a1594946d", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Utilice un firewall de aplicaciones web para analizar su tráfico cuando esté expuesto a Internet. Otra opción es usarlo con el equilibrador de carga o con recursos que tengan funcionalidades de firewall integradas, como Application Gateway o soluciones de terceros.", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", + "text": "Equipo rojo con sus aplicaciones GenAI", "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "SAP", - "severity": "Medio", - "text": "Use Virtual WAN para implementaciones de Azure en redes nuevas, grandes o globales en las que necesite conectividad de tránsito global entre regiones de Azure y ubicaciones locales. Con este enfoque, no tendrá que configurar manualmente el enrutamiento transitivo para las redes de Azure y puede seguir un estándar para las implementaciones de SAP en Azure.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/10-explore-azure-front-door", - "waf": "Rendimiento" - }, - { - "checklist": "SAP Checklist", - "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", - "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", + "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Para evitar la pérdida de datos, use Azure Private Link para acceder de forma segura a los recursos de plataforma como servicio, como Azure Blob Storage, Azure Files, Azure Data Lake Storage Gen2, Azure Data Factory, etc. El punto de conexión privado de Azure también puede ayudar a proteger el tráfico entre redes virtuales y servicios como Azure Storage, Azure Backup, etc. El tráfico entre la red virtual y el servicio habilitado para punto de conexión privado viaja a través de la red global de Microsoft, lo que impide su exposición a la red pública de Internet.", - "training": "https://learn.microsoft.com/training/modules/design-implement-private-access-to-azure-services/?source=recommendations", - "waf": "Seguridad" + "text": "Proporcione a los usuarios finales opciones de puntuación para las respuestas de LLM y realice un seguimiento de estas puntuaciones. ", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Alto", - "text": "Asegúrese de que las redes aceleradas de Azure están habilitadas en las máquinas virtuales que se usan en las capas de aplicación SAP y DBMS.", - "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", - "waf": "Rendimiento" + "text": "Considere las prácticas de administración de cuotas", + "waf": "Optimización de costes" }, { - "checklist": "SAP Checklist", - "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", - "service": "SAP", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", + "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", + "service": "Azure OpenAI", "severity": "Medio", - "text": "Asegúrese de que las implementaciones internas de Azure Load Balancer están configuradas para usar Direct Server Return (DSR). Esta configuración (Habilitación de IP flotante) reducirá la latencia cuando se utilicen configuraciones internas del equilibrador de carga para configuraciones de alta disponibilidad en la capa DBMS.", - "training": "https://learn.microsoft.com/ja-jp/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", - "waf": "Seguridad" + "text": "Utilice soluciones de equilibrador de carga, como la puerta de enlace basada en APIM, para equilibrar la carga y la capacidad entre servicios y regiones", + "waf": "Excelencia Operacional" }, { - "checklist": "SAP Checklist", - "guid": "6791f893-5ada-4433-84e1-3811523181aa", - "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", - "service": "SAP", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", + "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", + "service": "Spring Apps", "severity": "Medio", - "text": "Puede usar reglas de grupo de seguridad de aplicaciones (ASG) y NSG para definir listas de control de acceso de seguridad de red entre la aplicación SAP y las capas DBMS. Los ASG agrupan las máquinas virtuales para ayudar a administrar su seguridad.", - "training": "https://learn.microsoft.com/training/modules/configure-network-security-groups/?source=recommendations", - "waf": "Seguridad" - }, - { - "checklist": "SAP Checklist", - "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", - "severity": "Alto", - "text": "No se admite la colocación de la capa de aplicación de SAP y DBMS de SAP en diferentes redes virtuales de Azure que no están emparejadas.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "Rendimiento" + "text": "Azure Spring Apps permite dos implementaciones para cada aplicación, de las cuales solo una recibe tráfico de producción. Puede lograr cero tiempo de inactividad con estrategias de implementación azul verde. La implementación azul verde solo está disponible en los niveles Estándar y Enterprise. Puede automatizar la implementación mediante CI/CD con acciones de ADO/GitHub", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "fa96c96a-d885-418f-9827-34c886ba2802", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "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", "severity": "Medio", - "text": "Para obtener una latencia de red óptima con aplicaciones SAP, considere la posibilidad de usar grupos de selección de ubicación por proximidad de Azure.", - "training": "https://learn.microsoft.com/azure/virtual-machines/co-location#planned-maintenance-and-proximity-placement-groups", - "waf": "Rendimiento" + "text": "Las instancias de Azure Spring Apps se pueden crear en varias regiones para las aplicaciones y el tráfico se puede enrutar mediante Traffic Manager o Front Door.", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", - "severity": "Alto", - "text": "NO se admite en absoluto la ejecución de una capa de servidor de aplicaciones de SAP y una capa de DBMS divididas entre el entorno local y Azure. Ambas capas deben residir completamente en el entorno local o en Azure.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "Rendimiento" + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", + "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", + "service": "Spring Apps", + "severity": "Medio", + "text": "En la región admitida, Azure Spring Apps se puede implementar como zona redundante, lo que significa que las instancias se distribuyen automáticamente entre las zonas de disponibilidad. Esta función solo está disponible en los niveles Standard y Enterprise.", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", - "severity": "Alto", - "text": "No se recomienda hospedar el sistema de administración de bases de datos (DBMS) y las capas de aplicación de los sistemas SAP en diferentes redes virtuales y conectarlas con el emparejamiento de redes virtuales debido a los costos sustanciales que puede producir un tráfico de red excesivo entre las capas. Se recomienda el uso de subredes dentro de la red virtual de Azure para separar la capa de aplicación de SAP y la capa de DBMS.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "Costar" + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", + "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", + "service": "Spring Apps", + "severity": "Medio", + "text": "Usar más de 1 instancia de aplicación para las aplicaciones", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "402a9846-d515-4061-aff8-cd30088693fa", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", - "service": "SAP", - "severity": "Alto", - "text": "Si utiliza Load Balancer con sistemas operativos invitados Linux, compruebe que el parámetro de red de Linux net.ipv4.tcp_timestamps esté establecido en 0.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Rendimiento" + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "7504c230-6035-4183-95a5-85762acc6075", + "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", + "service": "Spring Apps", + "severity": "Medio", + "text": "Supervise Azure Spring Apps con registros, métricas y seguimiento. Integre ASA con la información de las aplicaciones, realice un seguimiento de los errores y cree libros de trabajo.", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "87585797-5551-4d53-bb7d-a94ee415734d", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", - "service": "SAP", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", + "service": "Spring Apps", "severity": "Medio", - "text": "En el caso de las implementaciones de SAP RISE/ECS, el emparejamiento virtual es la forma preferida de establecer la conectividad con el entorno de Azure existente del cliente. Tanto la red virtual de SAP como las redes virtuales del cliente están protegidas con grupos de seguridad de red (NSG), lo que permite la comunicación en los puertos de SAP y de base de datos a través del emparejamiento de redes virtuales", - "waf": "Seguridad" + "text": "Configuración del escalado automático en Spring Cloud Gateway", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", - "severity": "Alto", - "text": "Revise las copias de seguridad de bases de datos de SAP HANA para máquinas virtuales de Azure.", - "waf": "Costar" + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "97411607-b6fd-4335-99d1-9885faf4e392", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", + "service": "Spring Apps", + "severity": "Bajo", + "text": "Habilite el escalado automático para las aplicaciones con el consumo estándar y el plan dedicado.", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", + "link": "https://learn.microsoft.com/azure/spring-apps/overview", + "service": "Spring Apps", "severity": "Medio", - "text": "Revise la supervisión integrada de Site Recovery, si se usa para SAP.", - "waf": "Costar" + "text": "Use el plan Enterprise para obtener soporte comercial de Spring Boot para aplicaciones de misión crítica. Con otros niveles, obtienes soporte OSS.", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", - "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", - "service": "SAP", - "severity": "Alto", - "text": "Revise la guía Supervisión del entorno del sistema SAP HANA.", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", + "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", + "service": "APIM", + "severity": "Medio", + "text": "Implementar una política de control de errores a nivel global", "waf": "Operaciones" }, { - "checklist": "SAP Checklist", - "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", - "service": "SAP", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Medio", - "text": "Revise las estrategias de copia de seguridad de Oracle Database en máquinas virtuales Linux de Azure.", + "text": "Asegúrese de que todas las políticas de API incluyan un elemento.", "waf": "Operaciones" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", + "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", + "service": "APIM", "severity": "Medio", - "text": "Revise el uso de Azure Blob Storage con SQL Server 2016.", + "text": "Uso de fragmentos de políticas para evitar repetir las mismas definiciones de políticas en varias API", "waf": "Operaciones" }, { - "checklist": "SAP Checklist", - "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", - "service": "SAP", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", + "link": "https://learn.microsoft.com/azure/api-management/monetization-support", + "service": "APIM", "severity": "Medio", - "text": "Revise el uso de Copia de seguridad automatizada v2 para máquinas virtuales de Azure.", + "text": "Si planeas monetizar tus API, revisa el artículo \"Soporte de monetización\" para conocer las prácticas recomendadas", "waf": "Operaciones" }, { - "checklist": "SAP Checklist", - "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", - "service": "SAP", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "a7d0840a-c8c4-4e83-adec-5ca578eb4049", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", + "service": "APIM", "severity": "Alto", - "text": "Habilitación del acelerador de escritura para la serie M cuando se utilizan discos premium (V1)", + "text": "Habilitación de la configuración de diagnóstico para exportar registros a Azure Monitor", "waf": "Operaciones" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", + "service": "APIM", "severity": "Medio", - "text": "Pruebe la latencia de la zona de disponibilidad.", - "waf": "Rendimiento" + "text": "Habilitación de Application Insights para obtener telemetría más detallada", + "waf": "Operaciones" }, { - "checklist": "SAP Checklist", - "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", - "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", - "service": "SAP", - "severity": "Medio", - "text": "Active SAP EarlyWatch Alert para todos los componentes de SAP.", - "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", - "waf": "Rendimiento" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", + "service": "APIM", + "severity": "Alto", + "text": "Configurar alertas sobre las métricas más críticas", + "waf": "Operaciones" }, { - "checklist": "SAP 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", - "severity": "Medio", - "text": "Revise la latencia del servidor de aplicaciones SAP al servidor de bases de datos mediante el informe ABAPMeter de SAP /SSA/CAT.", - "training": "https://me.sap.com/notes/0002879613", - "waf": "Rendimiento" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "Alto", + "text": "Asegúrese de que los certificados SSL personalizados se almacenan en Azure Key Vault para que se pueda acceder a ellos y actualizarlos de forma segura", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", - "service": "SAP", - "severity": "Medio", - "text": "Revise la supervisión del rendimiento de SQL Server mediante CCMS.", - "waf": "Rendimiento" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "Alto", + "text": "Protección de las solicitudes entrantes a las API (plano de datos) con Azure AD", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", - "link": "https://me.sap.com/notes/500235", - "service": "SAP", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", + "service": "APIM", "severity": "Medio", - "text": "Pruebe la latencia de red entre las máquinas virtuales de la capa de aplicación de SAP y las máquinas virtuales de DBMS (NIPING).", - "training": "https://me.sap.com/notes/1100926/E", - "waf": "Rendimiento" + "text": "Usar el identificador de Microsoft Entra para autenticar a los usuarios en el Portal para desarrolladores", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", - "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", - "service": "SAP", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", + "service": "APIM", "severity": "Medio", - "text": "Revise las alertas de SAP HANA Studio.", - "waf": "Rendimiento" + "text": "Crear grupos adecuados para controlar la visibilidad de los productos", + "waf": "Seguridad" }, { - "checklist": "SAP Checklist", - "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", - "link": "https://me.sap.com/notes/1969700", - "service": "SAP", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "06862505-2d9a-4874-9491-2837b00a3475", + "link": "https://learn.microsoft.com/azure/api-management/backends", + "service": "APIM", "severity": "Medio", - "text": "Realice comprobaciones de estado de SAP HANA mediante HANA_Configuration_Minichecks.", - "waf": "Rendimiento" + "text": "Utilice la función Backends para eliminar las configuraciones redundantes de back-end de la API", + "waf": "Operaciones" }, { - "checklist": "SAP Checklist", - "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", + "service": "APIM", "severity": "Medio", - "text": "Si ejecuta máquinas virtuales Windows y Linux en Azure, en el entorno local o en otros entornos en la nube, puede usar el Centro de administración de actualizaciones de Automatización de Azure para administrar las actualizaciones del sistema operativo, incluidas las revisiones de seguridad.", - "training": "https://learn.microsoft.com/azure/automation/update-management/overview", - "waf": "Seguridad" + "text": "Usar valores con nombre para almacenar valores comunes que se pueden usar en directivas", + "waf": "Operaciones" }, { - "checklist": "SAP Checklist", - "guid": "08951710-79a2-492a-adbc-06d7a401545b", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", + "service": "APIM", "severity": "Medio", - "text": "Revise de forma rutinaria las notas de seguridad de SAP OSS, ya que SAP publica parches de seguridad muy críticos, o revisiones, que requieren una acción inmediata para proteger sus sistemas SAP.", - "training": "https://support.sap.com/en/my-support/knowledge-base/security-notes-news.html", - "waf": "Seguridad" - }, - { - "checklist": "SAP Checklist", - "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", - "severity": "Bajo", - "text": "En el caso de SAP en SQL Server, puede deshabilitar la cuenta de administrador del sistema de SQL Server porque los sistemas SAP en SQL Server no usan la cuenta. Asegúrese de que otro usuario con derechos de administrador del sistema pueda acceder al servidor antes de deshabilitar la cuenta de administrador del sistema original.", - "waf": "Seguridad" + "text": "En el caso de la recuperación ante desastres, aproveche el nivel premium con implementaciones escaladas en dos o más regiones para un acuerdo de nivel de servicio del 99,99 %", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", - "severity": "Alto", - "text": "Deshabilite xp_cmdshell. La característica de SQL Server xp_cmdshell habilita un shell de comandos del sistema operativo interno de SQL Server. Es un riesgo potencial en las auditorías de seguridad.", - "training": "https://me.sap.com/notes/3019299/E", - "waf": "Seguridad" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", + "link": "https://learn.microsoft.com/azure/api-management/high-availability", + "service": "APIM", + "severity": "Medio", + "text": "Implemente al menos una unidad en dos o más zonas de disponibilidad para obtener un SLA aumentado del 99,99 %", + "waf": "Fiabilidad" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Alto", - "text": "El cifrado de servidores de bases de datos de SAP HANA en Azure usa la tecnología de cifrado nativa de SAP HANA. Además, si usa SQL Server en Azure, use el cifrado de datos transparente (TDE) para proteger los datos y los archivos de registro y asegurarse de que las copias de seguridad también están cifradas.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "waf": "Seguridad" + "text": "Asegúrese de que haya una rutina de copia de seguridad automatizada", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", - "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", - "service": "SAP", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", + "link": "https://learn.microsoft.com/azure/api-management/retry-policy", + "service": "APIM", "severity": "Medio", - "text": "El cifrado de Azure Storage está habilitado para todas las cuentas de Azure Resource Manager y de almacenamiento clásico, y no se puede deshabilitar. Dado que los datos están cifrados de forma predeterminada, no es necesario modificar el código o las aplicaciones para usar el cifrado de Azure Storage.", - "training": "https://learn.microsoft.com/training/modules/encrypt-sector-data/?source=recommendations", - "waf": "Seguridad" + "text": "Use directivas para agregar una dirección URL de back-end de conmutación por error y el almacenamiento en caché para reducir las llamadas con errores.", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", - "link": "https://learn.microsoft.com/azure/key-vault/general/overview", - "service": "SAP", - "severity": "Alto", - "text": "Uso de Azure Key Vault para almacenar los secretos y las credenciales", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "Seguridad" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", + "service": "APIM", + "severity": "Bajo", + "text": "Si necesita iniciar sesión en niveles de alto rendimiento, tenga en cuenta la directiva de Event Hubs", + "waf": "Operaciones" }, { - "checklist": "SAP Checklist", - "guid": "829e2edb-2173-4676-aff6-691b4935ada4", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "SAP", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", + "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", + "service": "APIM", "severity": "Medio", - "text": "Se recomienda bloquear los recursos de Azure después de la implementación correcta para protegerse contra cambios no autorizados. También puede aplicar restricciones y reglas de LOCK por suscripción mediante directivas de Azure personalizadas (rol personalizado).", - "training": "https://learn.microsoft.com/training/modules/use-azure-resource-manager/?source=recommendations", - "waf": "Seguridad" + "text": "Aplicación de directivas de limitación para controlar el número de solicitudes por segundo", + "training": "https://learn.microsoft.com/training/modules/protect-apis-on-api-management/", + "waf": "Rendimiento" }, { - "checklist": "SAP Checklist", - "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "SAP", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", + "service": "APIM", "severity": "Medio", - "text": "Aprovisione Azure Key Vault con las directivas de eliminación temporal y purga habilitadas para permitir la protección de retención de los objetos eliminados.", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "Seguridad" + "text": "Configurar el escalado automático para escalar horizontalmente el número de instancias cuando aumenta la carga", + "waf": "Rendimiento" }, { - "checklist": "SAP Checklist", - "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", - "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", - "service": "SAP", - "severity": "Alto", - "text": "En función de los requisitos existentes, controles normativos y de cumplimiento (internos y externos): determine qué directivas de Azure y el rol de RBAC de Azure son necesarios", - "training": "https://learn.microsoft.com/training/paths/describe-azure-management-governance/?source=recommendations", - "waf": "Seguridad" - }, - { - "checklist": "SAP 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", - "severity": "Alto", - "text": "Al habilitar Microsoft Defender para punto de conexión en el entorno de SAP, se recomienda excluir los archivos de datos y registro en los servidores DBMS en lugar de dirigirse a todos los servidores. Siga las recomendaciones de su proveedor de DBMS al excluir archivos de destino.", - "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/microsoft-defender-endpoint-mde-for-sap-applications-on-windows/ba-p/3912268", - "waf": "Seguridad" - }, - { - "checklist": "SAP 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", - "severity": "Alto", - "text": "Delegue un rol personalizado de administrador de SAP con acceso Just-In-Time de Microsoft Defender for Cloud.", - "training": "https://learn.microsoft.com/training/modules/secure-vms-with-azure-security-center/?source=recommendations", - "waf": "Seguridad" - }, - { - "checklist": "SAP 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", - "severity": "Bajo", - "text": "cifre los datos en tránsito integrando el producto de seguridad de terceros con comunicaciones de red seguras (SNC) para DIAG (SAP GUI), RFC y SPNEGO para HTTPS", - "training": "https://learn.microsoft.com/azure/security/fundamentals/encryption-overview#encryption-of-data-in-transit", - "waf": "Seguridad" - }, - { - "checklist": "SAP Checklist", - "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", - "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", - "service": "SAP", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", + "service": "APIM", "severity": "Medio", - "text": "De forma predeterminada, utilice claves administradas por Microsoft para la funcionalidad de cifrado de entidad de seguridad y use claves administradas por el cliente cuando sea necesario.", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "Seguridad" - }, - { - "checklist": "SAP Checklist", - "guid": "4935ada4-2223-4ece-a1b1-23181a541741", - "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", - "service": "SAP", - "severity": "Alto", - "text": "Use una instancia de Azure Key Vault por aplicación, por entorno, por región.", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "Seguridad" + "text": "Implemente puertas de enlace autohospedadas en las que Azure no tenga una región cercana a las API de back-end.", + "waf": "Rendimiento" }, { - "checklist": "SAP Checklist", - "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", - "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", - "service": "SAP", - "severity": "Alto", - "text": "Para controlar y administrar claves y secretos de cifrado de disco para sistemas operativos Windows y Windows que no son de HANA, use Azure Key Vault. SAP HANA no es compatible con Azure Key Vault, por lo que debe usar métodos alternativos como SAP ABAP o claves SSH.", - "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/?source=recommendations", - "waf": "Seguridad" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", + "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", + "service": "APIM", + "severity": "Medio", + "text": "Use el nivel premium para las cargas de trabajo de producción.", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "209d490d-a477-4784-84d1-16785d2fa56c", - "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", - "service": "SAP", - "severity": "Alto", - "text": "Personalización de los roles de control de acceso basado en rol (RBAC) para SAP en suscripciones de Azure spoke para evitar cambios accidentales relacionados con la red", - "training": "https://learn.microsoft.com/training/modules/secure-azure-resources-with-rbac/?source=recommendations", - "waf": "Seguridad" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "Medio", + "text": "En el modelo de varias regiones, use directivas para enrutar las solicitudes a los back-ends regionales en función de la disponibilidad o la latencia.", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", - "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", - "service": "SAP", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Alto", - "text": "Aísle las redes perimetrales y las aplicaciones virtuales de red del resto del patrimonio de SAP, configure Azure Private Link y administre y controle de forma segura los recursos de SAP en Azure", - "training": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/secure-vnet-dmz?tabs=portal", - "waf": "Seguridad" - }, - { - "checklist": "SAP 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", - "severity": "Bajo", - "text": "Considere la posibilidad de usar el software antimalware de Microsoft en Azure para proteger las máquinas virtuales de archivos malintencionados, adware y otras amenazas.", - "training": "https://azure.microsoft.com/blog/deploying-antimalware-solutions-on-azure-virtual-machines/", - "waf": "Seguridad" - }, - { - "checklist": "SAP 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", - "severity": "Bajo", - "text": "Para una protección aún más eficaz, considere la posibilidad de usar Microsoft Defender para punto de conexión.", - "training": "https://learn.microsoft.com/training/modules/implement-endpoint-protection-use-microsoft-defender/?source=recommendations", - "waf": "Seguridad" + "text": "Tenga en cuenta los límites de APIM", + "waf": "Fiabilidad" }, { - "checklist": "SAP Checklist", - "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", + "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", + "service": "APIM", "severity": "Alto", - "text": "Aísle los servidores de aplicaciones y bases de datos de SAP de Internet o de la red local pasando todo el tráfico a través de la red virtual del centro de conectividad, que está conectada a la red radial mediante el emparejamiento de red virtual. Las redes virtuales emparejadas garantizan que la solución de SAP en Azure esté aislada de la red pública de Internet.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/?source=recommendations", - "waf": "Seguridad" + "text": "Asegúrese de que las implementaciones de puerta de enlace autohospedadas sean resistentes.", + "waf": "Fiabilidad" }, { - "checklist": "SAP 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", - "severity": "Bajo", - "text": "En el caso de las aplicaciones orientadas a Internet, como SAP Fiori, asegúrese de distribuir la carga según los requisitos de la aplicación mientras se mantienen los niveles de seguridad. Para la seguridad de nivel 7, puede usar un firewall de aplicaciones web (WAF) de terceros disponible en Azure Marketplace.", - "training": "https://learn.microsoft.com/training/modules/simplify-cloud-procurement-governance-azure-marketplace/?source=recommendations", - "waf": "Seguridad" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "7519e385-a88b-4d34-966b-6269d686e890", + "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", + "service": "APIM", + "severity": "Medio", + "text": "Uso de Azure Front Door delante de APIM para la implementación en varias regiones", + "waf": "Rendimiento" }, { - "checklist": "SAP Checklist", - "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", - "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", - "service": "SAP", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Medio", - "text": "Para habilitar la comunicación segura en las soluciones de Azure Monitor para SAP, puede optar por usar un certificado raíz o un certificado de servidor. Le recomendamos encarecidamente que utilice certificados raíz.", - "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", + "text": "Implementación del servicio dentro de una red virtual (VNet)", "waf": "Seguridad" }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", - "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", - "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", + "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", "severity": "Medio", - "text": "Implementar una política de control de errores a nivel global", - "waf": "Operaciones" + "text": "Implemente grupos de seguridad de red (NSG) en las subredes para restringir o supervisar el tráfico hacia/desde APIM.", + "waf": "Seguridad" }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", - "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", + "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", "severity": "Medio", - "text": "Asegúrese de que todas las políticas de API incluyan un elemento.", - "waf": "Operaciones" + "text": "Implemente puntos de conexión privados para filtrar el tráfico entrante cuando APIM no se implemente en una red virtual.", + "waf": "Seguridad" }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", - "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", - "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", + "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", - "severity": "Medio", - "text": "Uso de fragmentos de políticas para evitar repetir las mismas definiciones de políticas en varias API", - "waf": "Operaciones" + "severity": "Alto", + "text": "Deshabilitar el acceso a la red pública", + "waf": "Seguridad" }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", - "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", - "link": "https://learn.microsoft.com/azure/api-management/monetization-support", + "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", + "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", "service": "APIM", "severity": "Medio", - "text": "Si planeas monetizar tus API, revisa el artículo \"Soporte de monetización\" para conocer las prácticas recomendadas", + "text": "Simplifique la administración con scripts de automatización de PowerShell", "waf": "Operaciones" }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", - "guid": "a7d0840a-c8c4-4e83-adec-5ca578eb4049", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", + "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", - "severity": "Alto", - "text": "Habilitación de la configuración de diagnóstico para exportar registros a Azure Monitor", + "severity": "Medio", + "text": "Configure APIM a través de la infraestructura como código. Revise las prácticas recomendadas de DevOps desde el acelerador de zonas de aterrizaje de API de Cloud Adaption Framework", "waf": "Operaciones" }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", - "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", + "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", + "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", "service": "APIM", "severity": "Medio", - "text": "Habilitación de Application Insights para obtener telemetría más detallada", + "text": "Promover el uso de la extensión APIM de Visual Studio Code para un desarrollo de API más rápido", "waf": "Operaciones" }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", - "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", + "guid": "354f1c03-8112-4965-85ad-c0074bddf231", + "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", "service": "APIM", - "severity": "Alto", - "text": "Configurar alertas sobre las métricas más críticas", + "severity": "Medio", + "text": "Implemente DevOps y CI/CD en su flujo de trabajo", "waf": "Operaciones" }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", - "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", + "guid": "b6439493-426a-45f3-9697-cf65baee208d", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", "service": "APIM", - "severity": "Alto", - "text": "Asegúrese de que los certificados SSL personalizados se almacenan en Azure Key Vault para que se pueda acceder a ellos y actualizarlos de forma segura", + "severity": "Medio", + "text": "API seguras mediante la autenticación de certificados de cliente", "waf": "Seguridad" }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", - "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", + "guid": "2a67d143-1033-4c0a-8732-680896478f08", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", "service": "APIM", - "severity": "Alto", - "text": "Protección de las solicitudes entrantes a las API (plano de datos) con Azure AD", + "severity": "Medio", + "text": "Servicios de back-end seguros mediante la autenticación de certificados de cliente", "waf": "Seguridad" }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", - "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", + "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", + "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", "service": "APIM", "severity": "Medio", - "text": "Usar el identificador de Microsoft Entra para autenticar a los usuarios en el Portal para desarrolladores", + "text": "Revise el artículo \"Recomendaciones para mitigar las 10 principales amenazas de seguridad de la API de OWASP\" y compruebe qué se aplica a sus API", "waf": "Seguridad" }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", - "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", + "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", + "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", "service": "APIM", "severity": "Medio", - "text": "Crear grupos adecuados para controlar la visibilidad de los productos", + "text": "Utilice la función Autorizaciones para simplificar la administración del token de OAuth 2.0 para las API de back-end", "waf": "Seguridad" }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", - "guid": "06862505-2d9a-4874-9491-2837b00a3475", - "link": "https://learn.microsoft.com/azure/api-management/backends", + "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", "service": "APIM", - "severity": "Medio", - "text": "Utilice la función Backends para eliminar las configuraciones redundantes de back-end de la API", - "waf": "Operaciones" + "severity": "Alto", + "text": "Utilice la versión más reciente de TLS al cifrar la información en tránsito. Deshabilite los protocolos y cifrados obsoletos e innecesarios cuando sea posible.", + "waf": "Seguridad" }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", - "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", + "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", - "severity": "Medio", - "text": "Usar valores con nombre para almacenar valores comunes que se pueden usar en directivas", - "waf": "Operaciones" + "severity": "Alto", + "text": "Asegúrese de que los secretos (valores con nombre) se almacenan en Azure Key Vault para que se pueda acceder a ellos y actualizarlos de forma segura", + "waf": "Seguridad" }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", - "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", + "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", "severity": "Medio", - "text": "En el caso de la recuperación ante desastres, aproveche el nivel premium con implementaciones escaladas en dos o más regiones para un acuerdo de nivel de servicio del 99,99 %", - "waf": "Fiabilidad" + "text": "Uso de identidades administradas para autenticarse en otros recursos de Azure siempre que sea posible", + "waf": "Seguridad" }, { "arm-service": "Microsoft.ApiManagement/service", "checklist": "Azure API Management Review", - "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", - "link": "https://learn.microsoft.com/azure/api-management/high-availability", + "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", + "severity": "Alto", + "text": "Uso del firewall de aplicaciones web (WAF) mediante la implementación de Application Gateway delante de APIM", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review Checklist", + "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", + "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", + "service": "Azure MySQL", "severity": "Medio", - "text": "Implemente al menos una unidad en dos o más zonas de disponibilidad para obtener un SLA aumentado del 99,99 %", + "text": "Aproveche el servidor flexible", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review 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", "severity": "Alto", - "text": "Asegúrese de que haya una rutina de copia de seguridad automatizada", + "text": "Aproveche las zonas de disponibilidad cuando corresponda regionalmente", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", - "link": "https://learn.microsoft.com/azure/api-management/retry-policy", - "service": "APIM", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review 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", "severity": "Medio", - "text": "Use directivas para agregar una dirección URL de back-end de conmutación por error y el almacenamiento en caché para reducir las llamadas con errores.", + "text": "Aproveche la replicación de entrada de datos para escenarios de recuperación ante desastres entre regiones", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", - "service": "APIM", - "severity": "Bajo", - "text": "Si necesita iniciar sesión en niveles de alto rendimiento, tenga en cuenta la directiva de Event Hubs", - "waf": "Operaciones" + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", + "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", + "service": "IoT Hub DPS", + "severity": "Alto", + "text": "Seleccione el plan de hospedaje de aplicaciones lógicas adecuado en función de los requisitos empresariales y de SLO", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", - "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", - "service": "APIM", - "severity": "Medio", - "text": "Aplicación de directivas de limitación para controlar el número de solicitudes por segundo", - "training": "https://learn.microsoft.com/training/modules/protect-apis-on-api-management/", - "waf": "Rendimiento" + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "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", + "severity": "Alto", + "text": "Proteja las aplicaciones lógicas de errores de región con redundancia de zona y zonas de disponibilidad", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", - "service": "APIM", + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "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", + "severity": "Alto", + "text": "Considere la posibilidad de una estrategia de recuperación ante desastres entre regiones para cargas de trabajo críticas", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "IoT Hub DPS", + "severity": "Alto", + "text": "Si se implementa en un entorno aislado, use o migre a App Service Environment (ASE) v3", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "IoT Hub DPS", "severity": "Medio", - "text": "Configurar el escalado automático para escalar horizontalmente el número de instancias cuando aumenta la carga", - "waf": "Rendimiento" + "text": "Aproveche Azure DevOps o GitHub para simplificar la CI/CD y proteger el código de la aplicación lógica", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", - "service": "APIM", + "checklist": "SAP Checklist", + "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", + "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", + "service": "SAP", "severity": "Medio", - "text": "Implemente puertas de enlace autohospedadas en las que Azure no tenga una región cercana a las API de back-end.", - "waf": "Rendimiento" + "text": "Azure Center for SAP Solutions (ACSS) es una oferta de Azure que convierte a SAP en una carga de trabajo de nivel superior en Azure. ACSS es una solución integral que permite crear y ejecutar sistemas SAP como una carga de trabajo unificada en Azure y proporciona una base más fluida para la innovación. Puede aprovechar las funcionalidades de administración de los sistemas SAP nuevos y existentes basados en Azure.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-center-sap-solutions/?source=recommendations", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", - "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", - "service": "APIM", + "checklist": "SAP 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", "severity": "Medio", - "text": "Use el nivel premium para las cargas de trabajo de producción.", - "waf": "Fiabilidad" + "text": "Azure admite la automatización de implementaciones de SAP en Linux y Windows. SAP Deployment Automation Framework es una herramienta de orquestación de código abierto que puede implementar, instalar y mantener entornos SAP.", + "training": "https://github.com/Azure/sap-automation", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "checklist": "SAP Checklist", + "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", + "service": "SAP", "severity": "Medio", - "text": "En el modelo de varias regiones, use directivas para enrutar las solicitudes a los back-ends regionales en función de la disponibilidad o la latencia.", + "text": "Realice una recuperación a un momento dado de sus bases de datos de producción en cualquier momento y en un período de tiempo que cumpla con su RTO; La recuperación a un momento dado suele incluir errores del operador al eliminar datos en la capa DBMS o a través de SAP, por cierto", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Alto", - "text": "Tenga en cuenta los límites de APIM", + "checklist": "SAP Checklist", + "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", + "service": "SAP", + "severity": "Medio", + "text": "Pruebe los tiempos de copia de seguridad y recuperación para verificar que cumplen con los requisitos de RTO para restaurar todos los sistemas simultáneamente después de un desastre.", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", - "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", - "service": "APIM", + "checklist": "SAP Checklist", + "guid": "b651423c-8552-42db-a545-5cb50c05527a", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "service": "SAP", "severity": "Alto", - "text": "Asegúrese de que las implementaciones de puerta de enlace autohospedadas sean resistentes.", + "text": "Puede replicar el almacenamiento estándar entre regiones emparejadas, pero no puede usar el almacenamiento estándar para almacenar las bases de datos o los discos duros virtuales. Las copias de seguridad solo se pueden replicar entre las regiones emparejadas que utilice. Para todos los demás datos, ejecute la replicación mediante características nativas de DBMS, como SQL Server Always On o SAP HANA System Replication. Use una combinación de Site Recovery, rsync o robocopy y otro software de terceros para la capa de aplicación de SAP.", + "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "7519e385-a88b-4d34-966b-6269d686e890", - "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", - "service": "APIM", + "checklist": "SAP Checklist", + "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", "severity": "Medio", - "text": "Uso de Azure Front Door delante de APIM para la implementación en varias regiones", - "waf": "Rendimiento" + "text": "Al usar Azure Availability Zones para lograr una alta disponibilidad, debe tener en cuenta la latencia entre los servidores de aplicaciones SAP y los servidores de bases de datos. En el caso de las zonas con latencias altas, es necesario implementar procedimientos operativos para garantizar que los servidores de aplicaciones SAP y los servidores de bases de datos se ejecuten en la misma zona en todo momento.", + "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Medio", - "text": "Implementación del servicio dentro de una red virtual (VNet)", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", + "service": "SAP", + "severity": "Alto", + "text": "Configure conexiones de ExpressRoute desde el entorno local a las regiones de recuperación ante desastres de Azure principal y secundaria. Además, como alternativa al uso de ExpressRoute, considere la posibilidad de configurar conexiones VPN desde el entorno local a las regiones de recuperación ante desastres de Azure principal y secundaria.", + "training": "https://learn.microsoft.com/azure/expressroute/use-s2s-vpn-as-backup-for-expressroute-privatepeering", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Medio", - "text": "Implemente grupos de seguridad de red (NSG) en las subredes para restringir o supervisar el tráfico hacia/desde APIM.", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "SAP", + "severity": "Bajo", + "text": "Replique el contenido del almacén de claves, como certificados, secretos o claves, en todas las regiones para poder descifrar los datos de la región de recuperación ante desastres.", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "checklist": "SAP Checklist", + "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", + "service": "SAP", "severity": "Medio", - "text": "Implemente puntos de conexión privados para filtrar el tráfico entrante cuando APIM no se implemente en una red virtual.", - "waf": "Seguridad" + "text": "Empareje las redes virtuales principal y de recuperación ante desastres. Por ejemplo, para la replicación del sistema HANA, una red virtual de base de datos de SAP HANA debe estar emparejada con la red virtual de base de datos de SAP HANA del sitio de recuperación ante desastres.", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Alto", - "text": "Deshabilitar el acceso a la red pública", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", + "service": "SAP", + "severity": "Bajo", + "text": "Si usa el almacenamiento de Azure NetApp Files para las implementaciones de SAP, como mínimo, cree dos cuentas de Azure NetApp Files en el nivel Premium, en dos regiones.", + "training": "https://learn.microsoft.com/training/modules/choose-service-level-azure-netapp-files-hpc-applications/2-identify-decision-criteria", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", - "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", - "service": "APIM", - "severity": "Medio", - "text": "Simplifique la administración con scripts de automatización de PowerShell", - "waf": "Operaciones" + "checklist": "SAP Checklist", + "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", + "severity": "Alto", + "text": "Se debe usar la tecnología de replicación de bases de datos nativas para sincronizar la base de datos en un par de alta disponibilidad.", + "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Medio", - "text": "Configure APIM a través de la infraestructura como código. Revise las prácticas recomendadas de DevOps desde el acelerador de zonas de aterrizaje de API de Cloud Adaption Framework", - "waf": "Operaciones" + "checklist": "SAP Checklist", + "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", + "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", + "service": "SAP", + "severity": "Alto", + "text": "El CIDR de la red virtual (VNet) principal no debe entrar en conflicto ni superponerse con el CIDR de la red virtual del sitio de recuperación ante desastres", + "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", - "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", - "service": "APIM", - "severity": "Medio", - "text": "Promover el uso de la extensión APIM de Visual Studio Code para un desarrollo de API más rápido", - "waf": "Operaciones" + "checklist": "SAP Checklist", + "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", + "service": "SAP", + "severity": "Alto", + "text": "Use Site Recovery para replicar un servidor de aplicaciones en un sitio de recuperación ante desastres. Site Recovery también puede ayudar a replicar máquinas virtuales de clúster de servicios centrales en el sitio de recuperación ante desastres. Al invocar la recuperación ante desastres, deberá volver a configurar el clúster de Linux Pacemaker en el sitio de recuperación ante desastres (por ejemplo, reemplazar el VIP o SBD, ejecutar corosync.conf, etc.).", + "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "354f1c03-8112-4965-85ad-c0074bddf231", - "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", - "service": "APIM", - "severity": "Medio", - "text": "Implemente DevOps y CI/CD en su flujo de trabajo", - "waf": "Operaciones" + "checklist": "SAP 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", + "severity": "Alto", + "text": "Considere la disponibilidad del software de SAP frente a puntos únicos de fallo. Esto incluye puntos únicos de falla dentro de aplicaciones como DBMS utilizados en las arquitecturas SAP NetWeaver y SAP S/4HANA, SAP ABAP y ASCS + SCS. También, otras herramientas como 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": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "b6439493-426a-45f3-9697-cf65baee208d", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", - "service": "APIM", - "severity": "Medio", - "text": "API seguras mediante la autenticación de certificados de cliente", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", + "service": "SAP", + "severity": "Alto", + "text": "En el caso de SAP y bases de datos de SAP, considere la posibilidad de implementar clústeres de conmutación por error automática. En Windows, los clústeres de conmutación por error de Windows Server admiten la conmutación por error. En Linux, Linux Pacemaker o herramientas de terceros como SIOS Protection Suite y Veritas InfoScale admiten la conmutación por error.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "2a67d143-1033-4c0a-8732-680896478f08", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", - "service": "APIM", - "severity": "Medio", - "text": "Servicios de back-end seguros mediante la autenticación de certificados de cliente", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", + "severity": "Alto", + "text": "Azure no admite arquitecturas en las que las máquinas virtuales principal y secundaria compartan el almacenamiento de los datos de DBMS. Para la capa DBMS, el patrón de arquitectura común es replicar bases de datos al mismo tiempo y con pilas de almacenamiento diferentes a las que usan las máquinas virtuales principal y secundaria.", + "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": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", - "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", - "service": "APIM", - "severity": "Medio", - "text": "Revise el artículo \"Recomendaciones para mitigar las 10 principales amenazas de seguridad de la API de OWASP\" y compruebe qué se aplica a sus API", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", + "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", + "service": "SAP", + "severity": "Alto", + "text": "Los datos de DBMS y los archivos de registro de transacciones y puesta al día se almacenan en el almacenamiento en bloque compatible con Azure o en Azure NetApp Files. Azure Files o Azure Premium Files no se admiten como almacenamiento para datos de DBMS o archivos de registro de puesta al día con la carga de trabajo de SAP.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-databases/2-explore-database-support-azure-for-sap-workloads", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", - "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", - "service": "APIM", - "severity": "Medio", - "text": "Utilice la función Autorizaciones para simplificar la administración del token de OAuth 2.0 para las API de back-end", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", + "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", + "service": "SAP", + "severity": "Alto", + "text": "Puede usar discos compartidos de Azure en Windows para componentes ASCS + SCS y escenarios específicos de alta disponibilidad. Configure los clústeres de conmutación por error por separado para los componentes de la capa de aplicación de SAP y la capa de DBMS. Actualmente, Azure no admite arquitecturas de alta disponibilidad que combinen componentes de la capa de aplicación de SAP y la capa de DBMS en un clúster de conmutación por error.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", - "service": "APIM", + "checklist": "SAP 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", "severity": "Alto", - "text": "Utilice la versión más reciente de TLS al cifrar la información en tránsito. Deshabilite los protocolos y cifrados obsoletos e innecesarios cuando sea posible.", - "waf": "Seguridad" + "text": "La mayoría de los clústeres de conmutación por error para los componentes de la capa de aplicación (ASCS) de SAP y la capa de DBMS requieren una dirección IP virtual para un clúster de conmutación por error. Azure Load Balancer debe controlar la dirección IP virtual para todos los demás casos. Un principio de diseño es usar un equilibrador de carga por configuración de clúster. Te recomendamos que utilices la versión estándar del equilibrador de carga (SKU de equilibrador de carga estándar).", + "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "checklist": "SAP Checklist", + "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", + "service": "SAP", "severity": "Alto", - "text": "Asegúrese de que los secretos (valores con nombre) se almacenan en Azure Key Vault para que se pueda acceder a ellos y actualizarlos de forma segura", - "waf": "Seguridad" + "text": "Asegúrese de que la IP flotante esté habilitada en el equilibrador de carga", + "training": "https://learn.microsoft.com/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Medio", - "text": "Uso de identidades administradas para autenticarse en otros recursos de Azure siempre que sea posible", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "SAP", + "severity": "Alto", + "text": "Antes de implementar la infraestructura de alta disponibilidad, y en función de la región que elija, determine si desea realizar la implementación con un conjunto de disponibilidad de Azure o una zona de disponibilidad.", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "checklist": "SAP 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", "severity": "Alto", - "text": "Uso del firewall de aplicaciones web (WAF) mediante la implementación de Application Gateway delante de APIM", - "waf": "Seguridad" + "text": "Si desea cumplir los acuerdos de nivel de servicio de infraestructura para las aplicaciones de los componentes de SAP (servicios centrales, servidores de aplicaciones y bases de datos), debe elegir las mismas opciones de alta disponibilidad (máquinas virtuales, conjuntos de disponibilidad, zonas de disponibilidad) para todos los componentes.", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "SAP Checklist", + "guid": "cbe05bbe-209d-4490-ba47-778424d11678", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", "severity": "Alto", - "text": "Siga las barreras de seguridad de Metaprompting para una IA responsable", - "waf": "Excelencia Operacional" + "text": "No mezcle servidores de diferentes roles en el mismo conjunto de disponibilidad. Mantenga las máquinas virtuales de servicios centrales, las máquinas virtuales de base de datos y las máquinas virtuales de aplicaciones en sus propios conjuntos de disponibilidad", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", - "link": "https://github.com/Azure-Samples/AI-Gateway", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Considere la posibilidad de crear patrones de puerta de enlace con APIM o soluciones como AI Central para mejorar la limitación de velocidad, el equilibrio de carga, la autenticación y el registro", - "waf": "Excelencia Operacional" + "checklist": "SAP Checklist", + "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", + "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", + "service": "SAP", + "severity": "Medio", + "text": "No se pueden implementar conjuntos de disponibilidad de Azure dentro de una zona de disponibilidad de Azure a menos que se usen grupos de selección de ubicación de proximidad.", + "training": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "SAP Checklist", + "guid": "9674e7c7-7796-4181-8920-09f4429543ba", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", "severity": "Alto", - "text": "Habilitación de la supervisión para las instancias de AOAI", - "waf": "Excelencia Operacional" + "text": "Al crear conjuntos de disponibilidad, use el número máximo de dominios de error y dominios de actualización disponibles. Por ejemplo, si implementa más de dos máquinas virtuales en un conjunto de disponibilidad, use el número máximo de dominios de error (tres) y suficientes dominios de actualización para limitar el efecto de posibles errores de hardware físico, interrupciones de red o interrupciones de energía, además del mantenimiento planeado de Azure. El número predeterminado de dominios de error es dos y no puede cambiarlo en línea más adelante.", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "697cb391-ed16-4b2d-886f-0a0241addde6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "severity": "Alto", - "text": "Cree alertas para notificar a los equipos de eventos, como una entrada en el registro de actividad creada por una acción realizada en el recurso, como la regeneración de sus claves de suscripción, o un umbral de métrica, como el número de errores que superan los 10 en una hora", - "waf": "Excelencia Operacional" + "text": "Cuando se usan grupos de selección con selección de ubicación de proximidad de Azure en una implementación de conjunto de disponibilidad, los tres componentes de SAP (servicios centrales, servidor de aplicaciones y base de datos) deben estar en el mismo grupo con selección de ubicación de proximidad.", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "severity": "Alto", - "text": "Supervise el uso de tokens para evitar interrupciones del servicio debido a la capacidad", - "waf": "Excelencia Operacional" + "text": "Use un grupo de selección de ubicación de proximidad por SID de SAP. Los grupos no abarcan zonas de disponibilidad ni regiones de Azure", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", - "severity": "Medio", - "text": "Observe métricas como tokens de inferencia procesados, tokens de finalización generados, monitoree el límite de velocidad", - "waf": "Excelencia Operacional" + "checklist": "SAP 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", + "severity": "Alto", + "text": "Utilice uno de los siguientes servicios para ejecutar clústeres de servicios centrales de SAP, en función del sistema operativo.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Bajo", - "text": "Si los diagnósticos no son suficientes para usted, considere la posibilidad de usar una puerta de enlace como Azure API Managements frente a Azure OpenAI para registrar tanto los mensajes entrantes como las respuestas salientes, cuando esté permitido", - "waf": "Excelencia Operacional" + "checklist": "SAP Checklist", + "guid": "ed46b937-913e-4018-9c62-8393ab037e53", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", + "service": "SAP", + "severity": "Medio", + "text": "Actualmente, Azure no admite la combinación de ASCS y alta disponibilidad de base de datos en el mismo clúster de Linux Pacemaker; sepáralos en grupos individuales. Sin embargo, puede combinar hasta cinco clústeres de servicios centrales en un par de máquinas virtuales.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", - "link": "https://github.com/Azure-Samples/openai-enterprise-iac", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Use la infraestructura como código para implementar el servicio Azure OpenAI, las implementaciones de modelos y todos los recursos relacionados", - "waf": "Excelencia Operacional" + "checklist": "SAP 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", + "severity": "Medio", + "text": "Implemente ambas máquinas virtuales en el par de alta disponibilidad en un conjunto de disponibilidad o en zonas de disponibilidad. Estas máquinas virtuales deben tener el mismo tamaño y la misma configuración de almacenamiento.", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "4350d092-d234-4292-a752-8537a551c5bf", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Uso de la autenticación de Microsoft Entra con identidad administrada en lugar de clave de API", - "waf": "Seguridad" + "checklist": "SAP 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", + "severity": "Medio", + "text": "Azure admite la instalación y configuración de SAP HANA y las instancias de ASCS/SCS y ERS en el mismo clúster de alta disponibilidad que se ejecuta en Red Hat Enterprise Linux (RHEL).", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "SAP Checklist", + "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", "severity": "Alto", - "text": "Evalúe el rendimiento/precisión del sistema con un conjunto de datos dorado conocido que tenga las entradas y las respuestas correctas. Aproveche las capacidades de PromptFlow para la evaluación.", - "waf": "Excelencia Operacional" + "text": "Ejecute todos los sistemas de producción en SSD administradas Premium y use Azure NetApp Files o Ultra Disk Storage. Al menos el disco del sistema operativo debe estar en el nivel Premium para que pueda lograr un mejor rendimiento y el mejor Acuerdo de Nivel de Servicio.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "SAP Checklist", + "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", + "service": "SAP", "severity": "Alto", - "text": "Evaluación del uso del modelo de rendimiento aprovisionado ", - "waf": "Rendimiento" + "text": "Debe ejecutar SAP HANA en Azure solo en los tipos de almacenamiento certificados por SAP. Tenga en cuenta que ciertos volúmenes deben ejecutarse en determinadas configuraciones de disco, cuando corresponda. Estas configuraciones incluyen la habilitación del acelerador de escritura y el uso del almacenamiento premium. También debe asegurarse de que el sistema de archivos que se ejecuta en el almacenamiento es compatible con el DBMS que se ejecuta en la máquina.", + "training": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", + "service": "SAP", "severity": "Alto", - "text": "Revisión e implementación de la seguridad del contenido de Azure AI", - "waf": "Excelencia Operacional" + "text": "Considere la posibilidad de configurar la alta disponibilidad en función del tipo de almacenamiento que utilice para las cargas de trabajo de SAP. Algunos servicios de almacenamiento disponibles en Azure no son compatibles con Azure Site Recovery, por lo que la configuración de alta disponibilidad puede diferir.", + "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/2-explore-disaster-recovery-sap-workloads", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1193846d-697c-4b39-8ed1-6b2d186f0a02", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#system-level-throughput", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", + "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", + "service": "SAP", "severity": "Alto", - "text": "Defina y evalúe el rendimiento del sistema en función de los tokens y la respuesta por minuto y alinee con los requisitos", - "waf": "Rendimiento" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", - "service": "Azure OpenAI", - "severity": "Medio", - "text": "Mejore la latencia del sistema limitando el tamaño de los tokens, las opciones de transmisión", - "waf": "Rendimiento" + "text": "Es posible que los diferentes servicios de almacenamiento nativos de Azure (como Azure Files, Azure NetApp Files, Azure Shared Disk) no estén disponibles en todas las regiones. Por lo tanto, para tener una configuración de SAP similar en la región de recuperación ante desastres después de la conmutación por error, asegúrese de que el servicio de almacenamiento correspondiente se ofrece en el sitio de recuperación ante desastres.", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", - "service": "Azure OpenAI", + "checklist": "SAP 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", "severity": "Medio", - "text": "Calcule las demandas de elasticidad para determinar la segregación de solicitudes sincrónicas y por lotes en función de la prioridad. Para la prioridad alta, utilice el enfoque sincrónico y para la prioridad baja, se prefiere el procesamiento por lotes asincrónico con cola", - "waf": "Rendimiento" + "text": "Automatice SAP System Start-Stop para gestionar los costes.", + "waf": "Costar" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "5bda4332-4f24-4811-9331-82ba51752694", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Compare los requisitos de consumo de tokens en función de las demandas estimadas de los consumidores. Considere la posibilidad de usar la herramienta de pruebas comparativas de Azure OpenAI para ayudarle a validar el rendimiento si usa implementaciones de unidades de rendimiento aprovisionadas", - "waf": "Rendimiento" + "checklist": "SAP Checklist", + "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", + "severity": "Bajo", + "text": "En el caso de usar Azure Premium Storage con SAP HANA, se puede usar el almacenamiento SSD estándar de Azure para seleccionar una solución de almacenamiento rentable. Sin embargo, tenga en cuenta que la elección de SSD estándar o almacenamiento de Azure HDD estándar afectará al Acuerdo de Nivel de Servicio de las máquinas virtuales individuales. Además, para sistemas con menor rendimiento de E/S y baja latencia, como entornos que no son de producción, se pueden usar máquinas virtuales de series inferiores.", + "waf": "Costar" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Medio", - "text": "Si usa unidades de rendimiento aprovisionadas (PTU), considere la posibilidad de implementar una implementación de token por minuto (TPM) para las solicitudes de desbordamiento. Use una puerta de enlace para enrutar las solicitudes a la implementación de TPM cuando se alcancen los límites de PTU.", - "waf": "Rendimiento" + "checklist": "SAP Checklist", + "guid": "9877f353-2591-4e8b-8381-e9043fed1010", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", + "severity": "Bajo", + "text": "Como configuración alternativa de menor costo (multipropósito), puede elegir una SKU de bajo rendimiento para las máquinas virtuales del servidor de base de datos de HANA que no son de producción. Sin embargo, es importante tener en cuenta que algunos tipos de máquinas virtuales, como la serie E, no están certificadas para HANA (directorio de hardware de SAP HANA) o no pueden alcanzar una latencia de almacenamiento inferior a 1 ms.", + "waf": "Costar" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", + "service": "SAP", "severity": "Alto", - "text": "Elija el modelo adecuado para la tarea correcta. Elija modelos con el equilibrio adecuado entre velocidad, calidad de respuesta y complejidad de salida", - "waf": "Rendimiento" + "text": "Aplicación de un modelo RBAC para grupos de administración, suscripciones, grupos de recursos y recursos", + "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e9951904-8384-45c9-a6cb-2912156a1147", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "45911475-e39e-4530-accc-d979366bcda2", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", "severity": "Medio", - "text": "Tener una línea de base para el rendimiento sin ajuste fino para saber si el ajuste fino ha mejorado o no el rendimiento del modelo", - "waf": "Rendimiento" + "text": "Aplicación de la propagación de la entidad de seguridad para reenviar la identidad de la aplicación en la nube de SAP a SAP local (incluida IaaS) a través del conector en la nube", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/2-explore-azure-virtual-machine-auth-access-control", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Bajo", - "text": "Implementación de varias instancias de OAI en todas las regiones", - "waf": "Fiabilidad" + "checklist": "SAP Checklist", + "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", + "severity": "Medio", + "text": "Implemente SSO en aplicaciones SAP SaaS como SAP Analytics Cloud, SAP Cloud Platform, Business by design, SAP Qualtrics y SAP C4C con Azure AD mediante SAML.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Alto", - "text": "Implemente reintentos y comprobaciones de estado con el patrón de puerta de enlace como APIM", - "waf": "Fiabilidad" + "checklist": "SAP Checklist", + "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", + "severity": "Medio", + "text": "Implemente SSO en aplicaciones web basadas en SAP NetWeaver, como SAP Fiori y SAP Web GUI mediante SAML.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "SAP Checklist", + "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", + "service": "SAP", "severity": "Medio", - "text": "Asegúrese de tener cuotas adecuadas de TPM y RPM para la carga de trabajo", - "waf": "Fiabilidad" + "text": "Implemente SSO en aplicaciones web basadas en SAP NetWeaver, como SAP Fiori y SAP Web GUI mediante SAML.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/6-exercise-integrate-azure-active-directory-sap-fiori", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", - "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", "severity": "Medio", - "text": "Revise las consideraciones de la guía del kit de herramientas de HAI y aplique esas prácticas de interacción para el slution", - "waf": "Excelencia Operacional" + "text": "Puede implementar SSO en la GUI de SAP mediante SAP NetWeaver SSO o una solución de partner.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7f154e3a-a369-4282-ae7e-316183687a04", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", + "service": "SAP", "severity": "Medio", - "text": "Implemente modelos de ajuste de precisión independientes en todas las regiones si se emplea el ajuste de precisión", - "waf": "Fiabilidad" + "text": "Para SSO para SAP GUI y acceso al navegador web, implemente SNC / Kerberos / SPNEGO (mecanismo de negociación GSSAPI simple y protegido) debido a su facilidad de configuración y mantenimiento. Para SSO con certificados de cliente X.509, considere el servidor de inicio de sesión seguro de SAP, que es un componente de la solución SSO de SAP.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/9-exercise-integrate-active-directory-sap-single-sign-on", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "77a1f893-5bda-4433-84f2-4811633182ba", - "link": "https://learn.microsoft.com/azure/backup/backup-overview", - "service": "Azure OpenAI", + "checklist": "SAP 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", "severity": "Medio", - "text": "Realice copias de seguridad y replique regularmente los datos críticos para garantizar la disponibilidad y la capacidad de recuperación de los datos en caso de pérdida de datos o fallos del sistema. Aproveche los servicios de copia de seguridad y recuperación ante desastres de Azure para proteger sus datos.", - "waf": "Fiabilidad" + "text": "Para SSO para SAP GUI y acceso al navegador web, implemente SNC / Kerberos / SPNEGO (mecanismo de negociación GSSAPI simple y protegido) debido a su facilidad de configuración y mantenimiento. Para SSO con certificados de cliente X.509, considere el servidor de inicio de sesión seguro de SAP, que es un componente de la solución SSO de SAP.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Alto", - "text": "Los niveles de servicio de búsqueda de Azure AI deben elegirse para tener un Acuerdo de Nivel de Servicio ", - "waf": "Fiabilidad" + "checklist": "SAP 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", + "severity": "Medio", + "text": "Implemente el inicio de sesión único mediante OAuth para SAP NetWeaver a fin de permitir que aplicaciones personalizadas o de terceros accedan a los servicios OData de SAP NetWeaver.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", - "link": "https://learn.microsoft.com/purview/purview", - "service": "Azure OpenAI", - "severity": "Bajo", - "text": "Clasifique los datos y la confidencialidad, etiquetando con Microsoft Purview antes de generar las incrustaciones y asegúrese de tratar las incrustaciones generadas con la misma confidencialidad y clasificación", + "checklist": "SAP Checklist", + "guid": "a747c350-8d4c-449c-93af-393dbca77c48", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", + "service": "SAP", + "severity": "Medio", + "text": "Implementación de SSO en SAP HANA", "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "4fda1dbf-3dd9-45d4-ac7c-891dca1f6d56", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/use-your-data-securely", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Cifre los datos utilizados para RAG con cifrado SSE/Disk con BYOK opcional", + "checklist": "SAP Checklist", + "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", + "service": "SAP", + "severity": "Medio", + "text": "Considere Azure AD como un proveedor de identidades para sistemas SAP hospedados en RISE. Para obtener más información, consulte Integración del servicio con Azure AD.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", - "link": "https://learn.microsoft.com/azure/search/search-security-overview", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Asegúrese de que TLS se aplica a los datos en tránsito a través de fuentes de datos, la búsqueda de IA utilizada para la generación aumentada de recuperación (RAG) y la comunicación de LLM", + "checklist": "SAP Checklist", + "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", + "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", + "service": "SAP", + "severity": "Medio", + "text": "En el caso de las aplicaciones que acceden a SAP, es posible que desee utilizar la propagación de entidades de seguridad para establecer el inicio de sesión único.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7b94ef6e-047d-42ea-8992-b1cd6e2054b2", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Use RBAC para administrar el acceso a los servicios de Azure OpenAI. Asigne los permisos adecuados a los usuarios y restrinja el acceso en función de sus funciones y responsabilidades", + "checklist": "SAP 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", + "severity": "Medio", + "text": "Si usa servicios BTP de SAP o soluciones SaaS que requieren SAP Identity Authentication Service (IAS), considere la posibilidad de implementar SSO entre SAP Cloud Identity Authentication Services y Azure AD para acceder a esos servicios de SAP. Esta integración permite a SAP IAS actuar como proveedor de identidades de proxy y reenvía las solicitudes de autenticación a Azure AD como almacén de usuarios central y proveedor de identidades.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", - "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", + "service": "SAP", "severity": "Medio", - "text": "Implemente técnicas de cifrado, enmascaramiento o redacción de datos para ocultar datos confidenciales o reemplazarlos con valores ofuscados en entornos que no sean de producción o al compartir datos con fines de prueba o solución de problemas", + "text": "Implementación de SSO en SAP BTP", "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Use Azure Defender para detectar y responder a las amenazas de seguridad y configurar mecanismos de supervisión y alerta para identificar actividades sospechosas o infracciones. Aproveche Azure Sentinel para la detección y respuesta a amenazas avanzadas", + "checklist": "SAP 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", + "severity": "Medio", + "text": "Si usa SAP SuccessFactors, considere la posibilidad de usar el aprovisionamiento automatizado de usuarios de Azure AD. Con esta integración, a medida que agrega nuevos empleados a SAP SuccessFactors, puede crear automáticamente sus cuentas de usuario en Azure AD. Opcionalmente, puede crear cuentas de usuario en Microsoft 365 u otras aplicaciones SaaS compatibles con Azure AD. Utilice la escritura diferida de la dirección de correo electrónico en SAP SuccessFactors.", "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "SAP 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", "severity": "Medio", - "text": "Establezca políticas de retención y eliminación de datos para cumplir con las regulaciones de cumplimiento. Implemente métodos de eliminación seguros para los datos que ya no son necesarios y mantenga un registro de auditoría de las actividades de retención y eliminación de datos", - "waf": "Seguridad" + "text": "aplicar las directivas de grupo de administración existentes a las suscripciones de SAP", + "training": "https://learn.microsoft.com/training/modules/enterprise-scale-organization/4-management-group-subscription-organization", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "severity": "Alto", - "text": "Implemente los escudos de aviso y la detección de conexión a tierra mediante Content Safety ", - "waf": "Excelencia Operacional" + "text": "Integre aplicaciones estrechamente acopladas en la misma suscripción de SAP para evitar una complejidad adicional de enrutamiento y administración", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-subscriptions", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", - "link": "https://learn.microsoft.com/azure/compliance/", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "severity": "Alto", - "text": "Garantice el cumplimiento de las normativas de protección de datos pertinentes, como el RGPD o la HIPAA, mediante la implementación de controles de privacidad y la obtención de los consentimientos o permisos necesarios para las actividades de tratamiento de datos.", - "waf": "Seguridad" + "text": "Aprovechar la suscripción como unidad de escalado y escalar nuestros recursos, considere implementar la suscripción por entorno, por ejemplo. Sandbox, no-prod, prod ", + "training": "https://learn.microsoft.com/training/modules/configure-subscriptions/?source=recommendations", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", - "service": "Azure OpenAI", - "severity": "Medio", - "text": "Eduque a sus empleados sobre las mejores prácticas de seguridad de datos, la importancia de manejar los datos de forma segura y los riesgos potenciales asociados con las violaciones de datos. Anímelos a seguir diligentemente los protocolos de seguridad de datos.", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", + "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", + "service": "SAP", + "severity": "Alto", + "text": "Garantizar el aumento de la cuota como parte del aprovisionamiento de suscripciones (por ejemplo, el total de núcleos de máquina virtual disponibles dentro de una suscripción)", + "training": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", + "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", + "service": "SAP", + "severity": "Bajo", + "text": "La API de cuota es una API de REST que se puede usar para ver y administrar las cuotas de los servicios de Azure. Considere usarlo si es necesario.", + "waf": "Operaciones" + }, + { + "checklist": "SAP Checklist", + "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", + "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", + "service": "SAP", "severity": "Alto", - "text": "Mantenga los datos de producción separados de los datos de desarrollo y pruebas. Utilice únicamente datos confidenciales reales en producción y utilice datos anónimos o sintéticos en entornos de desarrollo y prueba.", - "waf": "Seguridad" + "text": "Si realiza la implementación en una zona de disponibilidad, asegúrese de que la implementación de la zona de la máquina virtual esté disponible una vez que se haya aprobado la cuota. Envíe una solicitud de soporte técnico con la suscripción, la serie de máquinas virtuales, el número de CPU y la zona de disponibilidad necesarias.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", - "service": "Azure OpenAI", - "severity": "Medio", - "text": "Si tiene distintos niveles de confidencialidad de datos, considere la posibilidad de crear índices independientes para cada nivel. Por ejemplo, podría tener un índice para los datos generales y otro para los datos confidenciales, cada uno gobernado por diferentes protocolos de acceso", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "e6e20617-3686-4af4-9791-f8935ada4332", + "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", + "service": "SAP", + "severity": "Alto", + "text": "Asegúrese de que los servicios y funciones requeridos estén disponibles dentro de las regiones de implementación elegidas, por ejemplo. ANF, Zona, etc.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/azure-best-practices/multiple-regions?source=recommendations", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", + "service": "SAP", "severity": "Medio", - "text": "Lleve la segregación un paso más allá colocando conjuntos de datos confidenciales en diferentes instancias del servicio. Cada instancia se puede controlar con su propio conjunto específico de políticas RBAC", - "waf": "Seguridad" + "text": "Aproveche la etiqueta de recurso de Azure para la categorización de costos y la agrupación de recursos (facturación, departamento (o unidad de negocio), entorno (producción, fase, desarrollo), nivel (nivel web, nivel de aplicación), propietario de la aplicación, ProjectName)", + "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", "severity": "Alto", - "text": "Reconozca que las incrustaciones y los vectores generados a partir de información confidencial son en sí mismos confidenciales. Estos datos deben recibir las mismas medidas de protección que el material de origen", - "waf": "Seguridad" + "text": "Ayude a proteger la base de datos de HANA mediante el servicio Azure Backup.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-backup-sap-workloads-azure-virtual-machines/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3571449a-b805-43d8-af89-dc7b33be2a1a", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Aplique RBAC a los almacenes de datos que tienen incrustaciones y vectores y alcance el acceso en función de los requisitos de acceso del rol", - "waf": "Seguridad" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Alto", - "text": "Configure un punto de conexión privado para que los servicios de IA restrinjan el acceso al servicio dentro de su red", - "waf": "Seguridad" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Aplique un estricto control del tráfico entrante y saliente con Azure Firewall y UDR, y limite los puntos de integración externos", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", + "service": "SAP", + "severity": "Medio", + "text": "Si implementa Azure NetApp Files para la base de datos HANA, Oracle o DB2, use la herramienta Azure Application Consistent Snapshot (AzAcSnap) para tomar instantáneas coherentes con la aplicación. AzAcSnap también es compatible con las bases de datos de Oracle. Considere la posibilidad de usar AzAcSnap en una máquina virtual central en lugar de en máquinas virtuales individuales.", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", "severity": "Alto", - "text": "Implemente la segmentación de la red y los controles de acceso para restringir el acceso a la aplicación LLM solo a los usuarios y sistemas autorizados y evitar el movimiento lateral", - "waf": "Seguridad" + "text": "Asegúrese de que la zona horaria coincida entre el sistema operativo y el sistema SAP.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", - "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "c3c7abc0-716c-4486-893c-40e181d65539", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", + "service": "SAP", "severity": "Medio", - "text": "Utilice herramientas de compresión rápida como LLMLingua o gprtrim", - "waf": "Optimización de costes" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Asegúrese de que las API y los puntos finales utilizados por la aplicación LLM estén correctamente protegidos con mecanismos de autenticación y autorización, como identidades administradas, claves de API u OAuth, para evitar el acceso no autorizado.", - "waf": "Seguridad" + "text": "No agrupe diferentes servicios de aplicaciones en el mismo clúster. Por ejemplo, no combine DRBD y clústeres de servicios centrales en el mismo clúster. Sin embargo, puede usar el mismo clúster de Pacemaker para administrar aproximadamente cinco servicios centrales diferentes (clúster de varios SID).", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Medio", - "text": "Aplique mecanismos sólidos de autenticación de usuario final, como la autenticación multifactor, para evitar el acceso no autorizado a la aplicación LLM y a los recursos de red asociados", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "a491dfc4-9353-4213-9217-eef0949f9467", + "link": "https://azure.microsoft.com/pricing/offers/dev-test/", + "service": "SAP", + "severity": "Bajo", + "text": "Considere la posibilidad de ejecutar sistemas de desarrollo y pruebas en un modelo de repetición para ahorrar y optimizar los costos de ejecución de Azure.", + "waf": "Costar" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "93555620-2bfe-4456-9b0d-834a348b263e", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", + "link": "https://learn.microsoft.com/azure/lighthouse/overview", + "service": "SAP", "severity": "Medio", - "text": "Implemente herramientas de monitoreo de red para detectar y analizar el tráfico de red en busca de actividades sospechosas o maliciosas. Habilite el registro para capturar eventos de red y facilitar el análisis forense en caso de incidentes de seguridad", - "waf": "Seguridad" + "text": "Si se asocia con los clientes mediante la administración de sus propiedades de SAP, considere la posibilidad de usar Azure Lighthouse. Azure Lighthouse permite a los proveedores de servicios administrados usar los servicios de identidad nativos de Azure para autenticarse en el entorno de los clientes. Pone el control en manos de los clientes, ya que pueden revocar el acceso en cualquier momento y auditar las acciones de los proveedores de servicios.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", - "service": "Azure OpenAI", + "checklist": "SAP 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", "severity": "Medio", - "text": "Realizar auditorías de seguridad y pruebas de penetración para identificar y abordar cualquier debilidad o vulnerabilidad de seguridad de red en la infraestructura de red de la aplicación LLM", - "waf": "Seguridad" + "text": "Use Azure Update Manager para comprobar el estado de las actualizaciones disponibles para una sola máquina virtual o varias máquinas virtuales y considere la posibilidad de programar revisiones periódicas.", + "training": "https://learn.microsoft.com/training/modules/keep-your-virtual-machines-updated/?source=recommendations", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", + "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", + "service": "SAP", "severity": "Bajo", - "text": "Los servicios de Azure AI están etiquetados correctamente para una mejor administración", - "waf": "Excelencia Operacional" + "text": "Optimice y gestione las operaciones de SAP Basis mediante SAP Landscape Management (LaMa). Use el conector de SAP LaMa para Azure para reubicar, copiar, clonar y actualizar sistemas SAP.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-remote-management/?source=recommendations", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", - "service": "Azure OpenAI", - "severity": "Bajo", - "text": "Las cuentas de Azure AI Service siguen las convenciones de nomenclatura de la organización", - "waf": "Excelencia Operacional" + "checklist": "SAP Checklist", + "guid": "14591147-5e39-4e53-89cc-cd979366bcda", + "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", + "service": "SAP", + "severity": "Medio", + "text": "Use Azure Monitor para soluciones SAP para supervisar las cargas de trabajo de SAP (SAP HANA, clústeres de SUSE de alta disponibilidad y sistemas SQL) en Azure. Considere la posibilidad de complementar las soluciones de Azure Monitor para SAP con SAP Solution Manager.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", - "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", + "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", + "service": "SAP", "severity": "Alto", - "text": "Los registros de diagnóstico en los recursos de servicios de Azure AI deben estar habilitados", - "waf": "Excelencia Operacional" + "text": "Ejecute una comprobación de extensión de máquina virtual para SAP. VM Extension for SAP usa la identidad administrada asignada de una máquina virtual (VM) para acceder a los datos de configuración y supervisión de VM. La comprobación garantiza que todas las métricas de rendimiento de la aplicación SAP proceden de la extensión de Azure para SAP subyacente.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-enhanced-monitoring-extension-for-sap/?source=recommendations", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", - "link": "https://learn.microsoft.com/azure/ai-services/authentication", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Se recomienda deshabilitar el acceso a claves (autenticación local) por seguridad. Después de deshabilitar el acceso basado en claves, el identificador de Microsoft Entra se convierte en el único método de acceso, lo que permite mantener el principio de privilegio mínimo y el control granular. ", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "SAP", + "severity": "Medio", + "text": "Use Azure Policy para el control de acceso y los informes de cumplimiento. Azure Policy proporciona la capacidad de aplicar la configuración de toda la organización para garantizar el cumplimiento coherente de las directivas y la detección rápida de infracciones. ", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Almacene y administre claves de forma segura con Azure Key Vault. Evite codificar de forma rígida o incrustar claves confidenciales en el código de la aplicación de LLM y recupérelas de forma segura de Azure Key Vault mediante identidades administradas", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", + "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", + "service": "SAP", + "severity": "Medio", + "text": "Use el Monitor de conexión en Azure Network Watcher para supervisar las métricas de latencia de las bases de datos y los servidores de aplicaciones de SAP. O bien, recopile y muestre medidas de latencia de red mediante Azure Monitor.", + "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/collecting-and-displaying-niping-network-latency-measurements/ba-p/1833979", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Rotar y expirar periódicamente las claves almacenadas en Azure Key Vault para minimizar el riesgo de acceso no autorizado.", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "73686af4-6791-4f89-95ad-a43324e13811", + "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", + "service": "SAP", + "severity": "Medio", + "text": "Realice una comprobación de calidad de SAP HANA en la infraestructura de Azure aprovisionada para comprobar que las máquinas virtuales aprovisionadas cumplen con los procedimientos recomendados de SAP HANA en Azure.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "adfe27be-e297-401a-a352-baaab79b088d", - "link": "https://github.com/openai/tiktoken", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "616785d6-fa96-4c96-ad88-518f482734c8", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", "severity": "Alto", - "text": "Use tiktoken para comprender los tamaños de los tokens para las optimizaciones de tokens en el modo conversacional", - "waf": "Optimización de costes" + "text": "Para cada suscripción de Azure, ejecute una prueba de latencia en las zonas de disponibilidad de Azure antes de la implementación zonal para elegir zonas de baja latencia para la implementación de SAP en Azure.", + "training": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/AvZone-Latency-Test", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", - "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Siga prácticas de codificación seguras para evitar vulnerabilidades comunes, como ataques de inyección, secuencias de comandos entre sitios (XSS) o errores de configuración de seguridad.", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", + "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", + "service": "SAP", + "severity": "Medio", + "text": "Ejecute el informe de resistencia para asegurarse de que la configuración de toda la infraestructura de Azure aprovisionada (proceso, base de datos, redes, almacenamiento, Site Recovery) cumple con la configuración definida por Cloud Adaption Framework para Azure.", + "training": "https://learn.microsoft.com/training/paths/azure-well-architected-framework/", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Alto", - "text": "Configurar un proceso para actualizar y parchear regularmente las bibliotecas de LLM y otros componentes del sistema", + "checklist": "SAP Checklist", + "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", + "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", + "service": "SAP", + "severity": "Medio", + "text": "Implemente la protección contra amenazas mediante la solución Microsoft Sentinel para SAP. Utilice esta solución para supervisar sus sistemas SAP y detectar amenazas sofisticadas en toda la lógica empresarial y las capas de aplicación.", + "training": "https://learn.microsoft.com/training/modules/plan-microsoft-sentinel-deployment-sap/?source=recommendations", "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e29711b1-352b-4eee-879b-588defc4972c", - "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Cumplir con los términos de uso, las directivas y las directrices de Azure OpenAI u otros LLM, así como con los casos de uso permitidos.", - "waf": "Excelencia Operacional" + "checklist": "SAP Checklist", + "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", + "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", + "service": "SAP", + "severity": "Medio", + "text": "El etiquetado de Azure se puede aprovechar para agrupar y realizar un seguimiento lógico de los recursos, automatizar sus implementaciones y, lo que es más importante, proporcionar visibilidad de los costos incurridos.", + "training": "https://learn.microsoft.com/training/modules/analyze-costs-create-budgets-azure-cost-management/?source=recommendations", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Medio", - "text": "Comprenda la diferencia en el costo de los modelos base y los modelos ajustados y los tamaños de paso de token", - "waf": "Optimización de costes" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Solicitudes por lotes, siempre que sea posible, para minimizar la sobrecarga por llamada, lo que puede reducir los costos generales. Asegúrese de optimizar el tamaño del lote", - "waf": "Optimización de costes" + "checklist": "SAP Checklist", + "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", + "service": "SAP", + "severity": "Bajo", + "text": "Use la supervisión de latencia entre máquinas virtuales para aplicaciones sensibles a la latencia.", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", "severity": "Medio", - "text": "Configure un sistema de seguimiento de costos que supervise el uso del modelo y use esa información para ayudar a informar las opciones de modelos y los tamaños indicados", - "waf": "Optimización de costes" + "text": "Use la supervisión de Azure Site Recovery para mantener el estado del servicio de recuperación ante desastres para los servidores de aplicaciones SAP.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "SAP Checklist", + "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", "severity": "Medio", - "text": "Establezca un límite máximo en el número de tokens por respuesta de modelo. Optimice el tamaño para asegurarse de que sea lo suficientemente grande para una respuesta válida", - "waf": "Optimización de costes" + "text": "Excluya todos los sistemas de archivos de bases de datos y programas ejecutables de los análisis antivirus. Incluirlos podría dar lugar a problemas de rendimiento. Consulte con los proveedores de bases de datos para obtener detalles prescriptivos sobre la lista de exclusión. Por ejemplo, Oracle recomienda excluir /oracle//sapdata de los análisis antivirus.", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", - "link": "https://learn.microsoft.com/azure/search/search-reliability", - "service": "Azure OpenAI", - "severity": "Medio", - "text": "Revise las instrucciones proporcionadas sobre la configuración de la búsqueda de IA para la confiabilidad", - "waf": "Excelencia Operacional" + "checklist": "SAP Checklist", + "guid": "c027f893-f404-41a9-b33d-39d625a14964", + "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", + "service": "SAP", + "severity": "Bajo", + "text": "Considere la posibilidad de recopilar estadísticas de base de datos completas para bases de datos que no son de HANA después de la migración. Por ejemplo, implemente la nota de SAP 1020260 - Entrega de estadísticas de Oracle.", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3266b225-86f4-4a16-92bd-ddea8a487cde", - "link": "https://learn.microsoft.com/azure/search/vector-search-index-size?tabs=portal-vector-quota", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", + "service": "SAP", "severity": "Medio", - "text": "Planifique y administre el almacenamiento de vectores de búsqueda de IA", - "waf": "Excelencia Operacional" + "text": "Considere la posibilidad de usar Oracle Automatic Storage Management (ASM) para todas las implementaciones de Oracle que usan SAP en Azure.", + "training": "https://learn.microsoft.com/training/paths/administer-infrastructure-resources-in-azure/?source=recommendations", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "SAP 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", "severity": "Medio", - "text": "Aplique prácticas de LLMOps para automatizar la gestión del ciclo de vida de sus aplicaciones GenAI", - "waf": "Excelencia Operacional" + "text": "En el caso de SAP en Azure que ejecuta Oracle, una colección de scripts SQL puede ayudarle a diagnosticar problemas de rendimiento. Los informes de repositorio automático de cargas de trabajo (AWR) contienen información valiosa para diagnosticar problemas en el sistema Oracle. Le recomendamos que ejecute un informe de AWR durante varias sesiones y elija las horas punta para él, a fin de garantizar una amplia cobertura del análisis.", + "training": "https://learn.microsoft.com/ja-jp/azure/well-architected/oracle-iaas/performance-efficiency", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "SAP Checklist", + "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", "severity": "Alto", - "text": "Evalúe el uso de los modelos de facturación: PAYG frente a PTU", - "waf": "Optimización de costes" + "text": "Use la supervisión de Azure Site Recovery para mantener el estado del servicio de recuperación ante desastres para los servidores de aplicaciones SAP.", + "training": "https://learn.microsoft.com/training/modules/protect-on-premises-infrastructure-with-azure-site-recovery/?source=recommendations", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "SAP Checklist", + "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "SAP", "severity": "Medio", - "text": "Evalúe la calidad de los mensajes y las aplicaciones al cambiar entre versiones de modelo", - "waf": "Excelencia Operacional" + "text": "Para la entrega segura de aplicaciones HTTP/S, use Application Gateway v2 y asegúrese de que la protección y las directivas de WAF están habilitadas.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "SAP 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", "severity": "Medio", - "text": "Evalúe, supervise y perfeccione sus aplicaciones GenAI para características como la fundamentación, la relevancia, la precisión, la coherencia, la fluidez,", - "waf": "Excelencia Operacional" + "text": "Si el DNS o el nombre virtual de la máquina virtual no se cambia durante la migración a Azure, el DNS en segundo plano y los nombres virtuales conectan muchas interfaces del sistema en el entorno de SAP, y los clientes solo conocen a veces las interfaces que los desarrolladores definen a lo largo del tiempo. Los desafíos de conexión surgen entre varios sistemas cuando los nombres virtuales o DNS cambian después de las migraciones, y se recomienda conservar los alias DNS para evitar este tipo de dificultades.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "294798b1-578b-4219-a46c-eb5443513592", - "service": "Azure OpenAI", + "checklist": "SAP 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", "severity": "Medio", - "text": "Evalúe los resultados de búsqueda de Azure AI en función de diferentes parámetros de búsqueda", - "waf": "Excelencia Operacional" + "text": "Utilice diferentes zonas DNS para distinguir cada entorno (espacio aislado, desarrollo, preproducción y producción) entre sí. La excepción es para las implementaciones de SAP con su propia red virtual; en este caso, es posible que las zonas DNS privadas no sean necesarias.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "2744293b-b628-4537-a551-19b08e8f5854", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "a3592829-e6e2-4061-9368-6af46791f893", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", + "service": "SAP", "severity": "Medio", - "text": "Considere los modelos de ajuste fino como una forma de aumentar la precisión solo cuando haya probado otros enfoques básicos como la ingeniería de avisos y RAG con sus datos", - "waf": "Excelencia Operacional" + "text": "El emparejamiento de red virtual local y global proporciona conectividad y son los enfoques preferidos para garantizar la conectividad entre las zonas de aterrizaje para las implementaciones de SAP en varias regiones de Azure", + "training": "https://learn.microsoft.com/training/modules/configure-vnet-peering/?source=recommendations", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Medio", - "text": "Utilice técnicas de ingeniería rápida para mejorar la precisión de las respuestas de LLM", - "waf": "Excelencia Operacional" + "checklist": "SAP Checklist", + "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", + "service": "SAP", + "severity": "Alto", + "text": "No se admite la implementación de ninguna aplicación virtual de red entre la aplicación SAP y el servidor de base de datos SAP", + "training": "https://me.sap.com/notes/2731110", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e737897e-71ca-47da-acfa-962a1594946d", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", + "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", + "service": "SAP", "severity": "Medio", - "text": "Equipo rojo con sus aplicaciones GenAI", - "waf": "Seguridad" + "text": "Use Virtual WAN para implementaciones de Azure en redes nuevas, grandes o globales en las que necesite conectividad de tránsito global entre regiones de Azure y ubicaciones locales. Con este enfoque, no tendrá que configurar manualmente el enrutamiento transitivo para las redes de Azure y puede seguir un estándar para las implementaciones de SAP en Azure.", + "training": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", - "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", + "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", + "service": "SAP", "severity": "Medio", - "text": "Proporcione a los usuarios finales opciones de puntuación para las respuestas de LLM y realice un seguimiento de estas puntuaciones. ", - "waf": "Excelencia Operacional" + "text": "Considere la posibilidad de implementar aplicaciones virtuales de red (NVA) entre regiones solo si se usan aplicaciones virtuales de red de asociados. Las aplicaciones virtuales de red entre regiones o redes virtuales no son necesarias si hay aplicaciones virtuales de red nativas. Al implementar tecnologías de redes de asociados y aplicaciones virtuales de red, siga las instrucciones del proveedor para comprobar las configuraciones conflictivas con las redes de Azure.", + "training": "https://learn.microsoft.com/training/modules/control-network-traffic-flow-with-routes/?source=recommendations", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Alto", - "text": "Considere las prácticas de administración de cuotas", - "waf": "Optimización de costes" + "checklist": "SAP Checklist", + "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", + "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", + "service": "SAP", + "severity": "Medio", + "text": "Virtual WAN administra la conectividad entre redes virtuales de radio para topologías basadas en WAN virtuales (sin necesidad de configurar el enrutamiento definido por el usuario [UDR] o NVA), y el rendimiento máximo de red para el tráfico de red virtual a red virtual en el mismo centro virtual es de 50 gigabits por segundo. Si es necesario, las zonas de aterrizaje de SAP pueden usar el emparejamiento de red virtual para conectarse a otras zonas de aterrizaje y superar esta limitación de ancho de banda.", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/?source=recommendations", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", - "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", - "service": "Azure OpenAI", - "severity": "Medio", - "text": "Utilice soluciones de equilibrador de carga, como la puerta de enlace basada en APIM, para equilibrar la carga y la capacidad entre servicios y regiones", - "waf": "Excelencia Operacional" + "checklist": "SAP 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", + "severity": "Alto", + "text": "No se recomienda la asignación de direcciones IP públicas a la máquina virtual que ejecuta SAP Workload.", + "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", - "service": "Bot service", - "severity": "Medio", - "text": "Siga las recomendaciones de soporte técnico de confiabilidad en Azure Bot Service", - "waf": "Fiabilidad" + "checklist": "SAP 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", + "severity": "Alto", + "text": "Considere la posibilidad de reservar la dirección IP en el lado de la recuperación ante desastres al configurar ASR", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", - "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", - "service": "Bot service", - "severity": "Medio", - "text": "Implementación de bots con residencia de datos local y cumplimiento regional", - "waf": "Fiabilidad" - }, - { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "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", - "severity": "Medio", - "text": "Azure Bot Service se ejecuta en modo activo-activo para los servicios globales y regionales. Cuando se produce una interrupción, no es necesario detectar errores ni administrar el servicio. Azure Bot Service realiza automáticamente la conmutación por error y la recuperación automáticas en una arquitectura geográfica de varias regiones. En el caso del servicio regional de bots de la UE, Azure Bot Service proporciona dos regiones completas dentro de Europa con replicación activa/activa para garantizar la redundancia. En el caso del servicio de bot global, todas las regiones o zonas geográficas disponibles se pueden servir como superficie global.", - "waf": "Fiabilidad" + "checklist": "SAP 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", + "severity": "Alto", + "text": "Evite el uso de intervalos de direcciones IP superpuestos para los sitios de producción y recuperación ante desastres.", + "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", + "waf": "Operaciones" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "6e154e3a-a359-4282-ae6e-206173686af4", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", + "service": "SAP", "severity": "Medio", - "text": "Si usa certificados TLS administrados por el cliente con Azure Front Door, use la versión de certificado \"más reciente\". Reduzca el riesgo de interrupciones causadas por la renovación manual de certificados", + "text": "Aunque Azure le ayuda a crear varias subredes delegadas en una red virtual, solo puede existir una subred delegada en una red virtual para Azure NetApp Files. Se producirá un error al intentar crear un nuevo volumen si se utiliza más de una subred delegada para Azure NetApp Files.", + "training": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-network-topologies?source=recommendations", "waf": "Operaciones" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP 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", "severity": "Medio", - "text": "Asegúrese de que usa la SKU de Application Gateway v2", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "text": "Use Azure Firewall para controlar el tráfico saliente de Azure a Internet, las conexiones entrantes que no son HTTP/S y el filtrado del tráfico Este/Oeste (si la organización lo requiere)", + "training": "https://learn.microsoft.com/training/paths/secure-networking-infrastructure/", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", + "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", + "service": "SAP", "severity": "Medio", - "text": "Asegúrese de que usa la SKU estándar para Azure Load Balancers", + "text": "Application Gateway y Web Application Firewall tienen limitaciones cuando Application Gateway actúa como proxy inverso para aplicaciones web de SAP, como se muestra en la comparación entre Application Gateway, SAP Web Dispatcher y otros servicios de terceros.", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/si/3362959506.html", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "guid": "9432621a-8397-4654-a882-5bc856b7ef83", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", - "service": "Load Balancer", + "checklist": "SAP Checklist", + "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "SAP", "severity": "Medio", - "text": "Asegúrese de que las direcciones IP de front-end de Load Balancers tengan redundancia de zona (a menos que necesite front-end zonal).", + "text": "Use directivas de Azure Front Door y WAF para proporcionar protección global en todas las regiones de Azure para las conexiones HTTP/S entrantes a una zona de aterrizaje.", + "training": "https://learn.microsoft.com/training/paths/secure-application-delivery/", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", + "service": "SAP", "severity": "Medio", - "text": "Application Gateways v2 debe implementarse en subredes con prefijos IP iguales o mayores que /24", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "text": "Aproveche las directivas de Web Application Firewall en Azure Front Door cuando use Azure Front Door y Application Gateway para proteger las aplicaciones HTTP/S. Bloquee Application Gateway para recibir tráfico solo de Azure Front Door.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "description": "La administración de proxies inversos en general y de WAF en particular está más cerca de la aplicación que de la red, por lo que pertenecen a la misma suscripción que la aplicación. La centralización de Application Gateway y WAF en la suscripción de conectividad puede ser correcta si la administra un solo equipo.", - "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", + "checklist": "SAP Checklist", + "guid": "5ada4332-4e13-4811-9231-81aa41742694", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "App Gateway", + "service": "SAP", "severity": "Medio", - "text": "Implemente Azure Application Gateway v2 o aplicaciones virtuales de red de asociados que se usan para proxy de conexiones HTTP(S) entrantes dentro de la red virtual de la zona de aterrizaje y con las aplicaciones que están protegiendo.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "text": "Utilice un firewall de aplicaciones web para analizar su tráfico cuando esté expuesto a Internet. Otra opción es usarlo con el equilibrador de carga o con recursos que tengan funcionalidades de firewall integradas, como Application Gateway o soluciones de terceros.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "App Gateway", + "checklist": "SAP Checklist", + "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "SAP", "severity": "Medio", - "text": "Use una red DDoS o planes de protección IP para todas las direcciones IP públicas en las zonas de aterrizaje de la aplicación.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Seguridad" + "text": "Use Virtual WAN para implementaciones de Azure en redes nuevas, grandes o globales en las que necesite conectividad de tránsito global entre regiones de Azure y ubicaciones locales. Con este enfoque, no tendrá que configurar manualmente el enrutamiento transitivo para las redes de Azure y puede seguir un estándar para las implementaciones de SAP en Azure.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/10-explore-azure-front-door", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", + "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", + "service": "SAP", "severity": "Medio", - "text": "Configure el escalado automático con una cantidad mínima de instancias de dos.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Fiabilidad" + "text": "Para evitar la pérdida de datos, use Azure Private Link para acceder de forma segura a los recursos de plataforma como servicio, como Azure Blob Storage, Azure Files, Azure Data Lake Storage Gen2, Azure Data Factory, etc. El punto de conexión privado de Azure también puede ayudar a proteger el tráfico entre redes virtuales y servicios como Azure Storage, Azure Backup, etc. El tráfico entre la red virtual y el servicio habilitado para punto de conexión privado viaja a través de la red global de Microsoft, lo que impide su exposición a la red pública de Internet.", + "training": "https://learn.microsoft.com/training/modules/design-implement-private-access-to-azure-services/?source=recommendations", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Medio", - "text": "Implementación de Application Gateway en zonas de disponibilidad", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Fiabilidad" + "checklist": "SAP Checklist", + "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", + "service": "SAP", + "severity": "Alto", + "text": "Asegúrese de que las redes aceleradas de Azure están habilitadas en las máquinas virtuales que se usan en las capas de aplicación SAP y DBMS.", + "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "Front Door", + "checklist": "SAP Checklist", + "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", + "service": "SAP", "severity": "Medio", - "text": "Use Azure Front Door con directivas de WAF para entregar y ayudar a proteger aplicaciones HTTP/S globales que abarcan varias regiones de Azure.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "Asegúrese de que las implementaciones internas de Azure Load Balancer están configuradas para usar Direct Server Return (DSR). Esta configuración (Habilitación de IP flotante) reducirá la latencia cuando se utilicen configuraciones internas del equilibrador de carga para configuraciones de alta disponibilidad en la capa DBMS.", + "training": "https://learn.microsoft.com/ja-jp/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "3f29812b-2363-4cef-b179-b599de0d5973", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "Front Door", + "checklist": "SAP Checklist", + "guid": "6791f893-5ada-4433-84e1-3811523181aa", + "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "service": "SAP", "severity": "Medio", - "text": "Al usar Front Door y Application Gateway para ayudar a proteger las aplicaciones HTTP/S, use directivas de WAF en Front Door. Bloquee Application Gateway para recibir tráfico solo de Front Door.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "Puede usar reglas de grupo de seguridad de aplicaciones (ASG) y NSG para definir listas de control de acceso de seguridad de red entre la aplicación SAP y las capas DBMS. Los ASG agrupan las máquinas virtuales para ayudar a administrar su seguridad.", + "training": "https://learn.microsoft.com/training/modules/configure-network-security-groups/?source=recommendations", "waf": "Seguridad" }, { - "ammp": true, - "arm-service": "microsoft.network/trafficManagerProfiles", - "checklist": "Azure Application Delivery Networking", - "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "Traffic Manager", + "checklist": "SAP Checklist", + "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "severity": "Alto", - "text": "Use el Administrador de tráfico para entregar aplicaciones globales que abarquen protocolos distintos de HTTP/S.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Fiabilidad" - }, - { - "checklist": "Azure Application Delivery Networking", - "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "Entra", - "severity": "Bajo", - "text": "Si los usuarios solo necesitan acceso a aplicaciones internas, ¿se ha considerado Microsoft Entra ID Application Proxy como una alternativa a Azure Virtual Desktop (AVD)?", - "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", - "waf": "Seguridad" + "text": "No se admite la colocación de la capa de aplicación de SAP y DBMS de SAP en diferentes redes virtuales de Azure que no están emparejadas.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "Rendimiento" }, { - "checklist": "Azure Application Delivery Networking", - "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "Entra", + "checklist": "SAP Checklist", + "guid": "fa96c96a-d885-418f-9827-34c886ba2802", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "severity": "Medio", - "text": "Para reducir el número de puertos de firewall abiertos para las conexiones entrantes en la red, considere la posibilidad de usar Microsoft Entra ID Application Proxy para proporcionar a los usuarios remotos acceso seguro y autenticado a las aplicaciones internas.", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", - "waf": "Seguridad" + "text": "Para obtener una latencia de red óptima con aplicaciones SAP, considere la posibilidad de usar grupos de selección de ubicación por proximidad de Azure.", + "training": "https://learn.microsoft.com/azure/virtual-machines/co-location#planned-maintenance-and-proximity-placement-groups", + "waf": "Rendimiento" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "severity": "Alto", - "text": "Implemente la directiva de WAF para Front Door en modo de \"prevención\".", - "waf": "Seguridad" + "text": "NO se admite en absoluto la ejecución de una capa de servidor de aplicaciones de SAP y una capa de DBMS divididas entre el entorno local y Azure. Ambas capas deben residir completamente en el entorno local o en Azure.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "Rendimiento" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "severity": "Alto", - "text": "Evite combinar Azure Traffic Manager y Azure Front Door.", - "waf": "Seguridad" + "text": "No se recomienda hospedar el sistema de administración de bases de datos (DBMS) y las capas de aplicación de los sistemas SAP en diferentes redes virtuales y conectarlas con el emparejamiento de redes virtuales debido a los costos sustanciales que puede producir un tráfico de red excesivo entre las capas. Se recomienda el uso de subredes dentro de la red virtual de Azure para separar la capa de aplicación de SAP y la capa de DBMS.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "Costar" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "402a9846-d515-4061-aff8-cd30088693fa", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", + "service": "SAP", "severity": "Alto", - "text": "Use el mismo nombre de dominio en Azure Front Door y su origen. Los nombres de host no coincidentes pueden causar errores sutiles.", - "waf": "Seguridad" + "text": "Si utiliza Load Balancer con sistemas operativos invitados Linux, compruebe que el parámetro de red de Linux net.ipv4.tcp_timestamps esté establecido en 0.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Bajo", - "text": "Deshabilite los sondeos de estado cuando solo haya un origen en un grupo de orígenes de Azure Front Door.", - "waf": "Rendimiento" - }, - { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "Front Door", + "checklist": "SAP Checklist", + "guid": "87585797-5551-4d53-bb7d-a94ee415734d", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", + "service": "SAP", "severity": "Medio", - "text": "Seleccione puntos de conexión de sondeo de estado correctos para Azure Front Door. Considere la posibilidad de crear puntos de conexión de estado que comprueben todas las dependencias de la aplicación.", - "waf": "Fiabilidad" + "text": "En el caso de las implementaciones de SAP RISE/ECS, el emparejamiento virtual es la forma preferida de establecer la conectividad con el entorno de Azure existente del cliente. Tanto la red virtual de SAP como las redes virtuales del cliente están protegidas con grupos de seguridad de red (NSG), lo que permite la comunicación en los puertos de SAP y de base de datos a través del emparejamiento de redes virtuales", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Bajo", - "text": "Use sondeos de estado de HEAD con Azure Front Door para reducir el tráfico que Front Door envía a la aplicación.", - "waf": "Rendimiento" + "checklist": "SAP Checklist", + "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", + "severity": "Alto", + "text": "Revise las copias de seguridad de bases de datos de SAP HANA para máquinas virtuales de Azure.", + "waf": "Costar" }, { - "ammp": true, - "arm-service": "Microsoft.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Alto", - "text": "Use Azure NAT Gateway en lugar de reglas de salida de Load Balancer para mejorar la escalabilidad de SNAT", - "waf": "Fiabilidad" + "checklist": "SAP Checklist", + "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", + "severity": "Medio", + "text": "Revise la supervisión integrada de Site Recovery, si se usa para SAP.", + "waf": "Costar" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", + "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", + "service": "SAP", "severity": "Alto", - "text": "Use certificados TLS administrados con Azure Front Door. Reduzca los costos operativos y el riesgo de interrupciones debido a las renovaciones de certificados.", + "text": "Revise la guía Supervisión del entorno del sistema SAP HANA.", "waf": "Operaciones" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", + "service": "SAP", "severity": "Medio", - "text": "Defina la configuración de WAF de Azure Front Door como código. Mediante el uso de código, puede adoptar más fácilmente una nueva versión del conjunto de reglas y obtener protección adicional.", + "text": "Revise las estrategias de copia de seguridad de Oracle Database en máquinas virtuales Linux de Azure.", "waf": "Operaciones" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", - "service": "Front Door", - "severity": "Alto", - "text": "Use TLS de un extremo a otro con Azure Front Door. Use TLS para las conexiones de los clientes a Front Door y de Front Door al origen.", - "waf": "Seguridad" - }, - { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", - "service": "Front Door", + "checklist": "SAP 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", "severity": "Medio", - "text": "Use el redireccionamiento de HTTP a HTTPS con Azure Front Door. Apoye a los clientes más antiguos redirigiéndolos automáticamente a una solicitud HTTPS.", - "waf": "Seguridad" + "text": "Revise el uso de Azure Blob Storage con SQL Server 2016.", + "waf": "Operaciones" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", - "service": "Front Door", - "severity": "Alto", - "text": "Habilite el WAF de Azure Front Door. Proteja su aplicación de una variedad de ataques.", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", + "service": "SAP", + "severity": "Medio", + "text": "Revise el uso de Copia de seguridad automatizada v2 para máquinas virtuales de Azure.", + "waf": "Operaciones" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", + "service": "SAP", "severity": "Alto", - "text": "Ajuste el WAF de Azure Front Door para su carga de trabajo. Reduzca las detecciones de falsos positivos.", - "waf": "Seguridad" + "text": "Habilitación del acelerador de escritura para la serie M cuando se utilizan discos premium (V1)", + "waf": "Operaciones" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Alto", - "text": "Habilite la característica de inspección del cuerpo de la solicitud habilitada en la directiva WAF de Azure Front Door.", - "waf": "Seguridad" + "checklist": "SAP 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", + "severity": "Medio", + "text": "Pruebe la latencia de la zona de disponibilidad.", + "waf": "Rendimiento" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Alto", - "text": "Habilite los conjuntos de reglas predeterminados de WAF de Azure Front Door. Los conjuntos de reglas predeterminados detectan y bloquean los ataques comunes.", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", + "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", + "service": "SAP", + "severity": "Medio", + "text": "Active SAP EarlyWatch Alert para todos los componentes de SAP.", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", + "waf": "Rendimiento" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Alto", - "text": "Habilite el conjunto de reglas de protección contra bots de Azure Front Door WAF. Las reglas de bots detectan bots buenos y malos.", - "waf": "Seguridad" + "checklist": "SAP 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", + "severity": "Medio", + "text": "Revise la latencia del servidor de aplicaciones SAP al servidor de bases de datos mediante el informe ABAPMeter de SAP /SSA/CAT.", + "training": "https://me.sap.com/notes/0002879613", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", + "service": "SAP", "severity": "Medio", - "text": "Use la versión más reciente del conjunto de reglas de WAF de Azure Front Door. Las actualizaciones del conjunto de reglas se actualizan periódicamente para tener en cuenta el panorama actual de amenazas.", - "waf": "Seguridad" + "text": "Revise la supervisión del rendimiento de SQL Server mediante CCMS.", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", + "link": "https://me.sap.com/notes/500235", + "service": "SAP", "severity": "Medio", - "text": "Agregue limitación de velocidad al WAF de Azure Front Door. La limitación de velocidad bloquea a los clientes que envían accidental o intencionadamente grandes cantidades de tráfico en un corto período de tiempo.", - "waf": "Seguridad" + "text": "Pruebe la latencia de red entre las máquinas virtuales de la capa de aplicación de SAP y las máquinas virtuales de DBMS (NIPING).", + "training": "https://me.sap.com/notes/1100926/E", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", + "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", + "service": "SAP", "severity": "Medio", - "text": "Use un umbral alto para los límites de frecuencia de WAF de Azure Front Door. Los umbrales de límite de velocidad altos evitan el bloqueo del tráfico legítimo, a la vez que proporcionan protección contra un número extremadamente alto de solicitudes que podrían sobrecargar su infraestructura. ", - "waf": "Seguridad" + "text": "Revise las alertas de SAP HANA Studio.", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Bajo", - "text": "Si no espera tráfico de todas las regiones geográficas, utilice filtros geográficos para bloquear el tráfico de países no esperados.", - "waf": "Seguridad" + "checklist": "SAP Checklist", + "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", + "link": "https://me.sap.com/notes/1969700", + "service": "SAP", + "severity": "Medio", + "text": "Realice comprobaciones de estado de SAP HANA mediante HANA_Configuration_Minichecks.", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "service": "SAP", "severity": "Medio", - "text": "Especifique la ubicación desconocida (ZZ) al filtrar geográficamente el tráfico con el WAF de Azure Front Door. Evite bloquear accidentalmente solicitudes legítimas cuando las direcciones IP no puedan coincidir geográficamente.", + "text": "Si ejecuta máquinas virtuales Windows y Linux en Azure, en el entorno local o en otros entornos en la nube, puede usar el Centro de administración de actualizaciones de Automatización de Azure para administrar las actualizaciones del sistema operativo, incluidas las revisiones de seguridad.", + "training": "https://learn.microsoft.com/azure/automation/update-management/overview", "waf": "Seguridad" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Alto", - "text": "Habilitación del conjunto de reglas de protección contra bots de WAF de Azure Application Gateway Las reglas de bots detectan bots buenos y malos.", + "checklist": "SAP Checklist", + "guid": "08951710-79a2-492a-adbc-06d7a401545b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "service": "SAP", + "severity": "Medio", + "text": "Revise de forma rutinaria las notas de seguridad de SAP OSS, ya que SAP publica parches de seguridad muy críticos, o revisiones, que requieren una acción inmediata para proteger sus sistemas SAP.", + "training": "https://support.sap.com/en/my-support/knowledge-base/security-notes-news.html", "waf": "Seguridad" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Alto", - "text": "Habilite la característica de inspección del cuerpo de la solicitud habilitada en la directiva WAF de Azure Application Gateway.", + "checklist": "SAP Checklist", + "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", + "severity": "Bajo", + "text": "En el caso de SAP en SQL Server, puede deshabilitar la cuenta de administrador del sistema de SQL Server porque los sistemas SAP en SQL Server no usan la cuenta. Asegúrese de que otro usuario con derechos de administrador del sistema pueda acceder al servidor antes de deshabilitar la cuenta de administrador del sistema original.", "waf": "Seguridad" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", - "service": "App Gateway", + "checklist": "SAP Checklist", + "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", "severity": "Alto", - "text": "Ajuste el WAF de Azure Application Gateway para la carga de trabajo. Reduzca las detecciones de falsos positivos.", + "text": "Deshabilite xp_cmdshell. La característica de SQL Server xp_cmdshell habilita un shell de comandos del sistema operativo interno de SQL Server. Es un riesgo potencial en las auditorías de seguridad.", + "training": "https://me.sap.com/notes/3019299/E", "waf": "Seguridad" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP 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", "severity": "Alto", - "text": "Implemente la directiva de WAF para Application Gateway en modo de \"prevención\".", - "waf": "Seguridad" - }, - { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", - "service": "App Gateway", - "severity": "Medio", - "text": "Agregue limitación de velocidad al WAF de Azure Application Gateway. La limitación de velocidad bloquea a los clientes que envían accidental o intencionadamente grandes cantidades de tráfico en un corto período de tiempo.", + "text": "El cifrado de servidores de bases de datos de SAP HANA en Azure usa la tecnología de cifrado nativa de SAP HANA. Además, si usa SQL Server en Azure, use el cifrado de datos transparente (TDE) para proteger los datos y los archivos de registro y asegurarse de que las copias de seguridad también están cifradas.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "SAP", "severity": "Medio", - "text": "Use un umbral alto para los límites de frecuencia de WAF de Azure Application Gateway. Los umbrales de límite de velocidad altos evitan el bloqueo del tráfico legítimo, a la vez que proporcionan protección contra un número extremadamente alto de solicitudes que podrían sobrecargar su infraestructura. ", + "text": "El cifrado de Azure Storage está habilitado para todas las cuentas de Azure Resource Manager y de almacenamiento clásico, y no se puede deshabilitar. Dado que los datos están cifrados de forma predeterminada, no es necesario modificar el código o las aplicaciones para usar el cifrado de Azure Storage.", + "training": "https://learn.microsoft.com/training/modules/encrypt-sector-data/?source=recommendations", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Bajo", - "text": "Si no espera tráfico de todas las regiones geográficas, utilice filtros geográficos para bloquear el tráfico de países no esperados.", + "checklist": "SAP Checklist", + "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview", + "service": "SAP", + "severity": "Alto", + "text": "Uso de Azure Key Vault para almacenar los secretos y las credenciales", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", - "service": "App Gateway", + "checklist": "SAP Checklist", + "guid": "829e2edb-2173-4676-aff6-691b4935ada4", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "SAP", "severity": "Medio", - "text": "Especifique la ubicación desconocida (ZZ) al filtrar geográficamente el tráfico con el WAF de Azure Application Gateway. Evite bloquear accidentalmente solicitudes legítimas cuando las direcciones IP no puedan coincidir geográficamente.", + "text": "Se recomienda bloquear los recursos de Azure después de la implementación correcta para protegerse contra cambios no autorizados. También puede aplicar restricciones y reglas de LOCK por suscripción mediante directivas de Azure personalizadas (rol personalizado).", + "training": "https://learn.microsoft.com/training/modules/use-azure-resource-manager/?source=recommendations", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "SAP", "severity": "Medio", - "text": "Use la versión más reciente del conjunto de reglas de WAF de Azure Application Gateway. Las actualizaciones del conjunto de reglas se actualizan periódicamente para tener en cuenta el panorama actual de amenazas.", + "text": "Aprovisione Azure Key Vault con las directivas de eliminación temporal y purga habilitadas para permitir la protección de retención de los objetos eliminados.", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Medio", - "text": "Agregue la configuración de diagnóstico para guardar los registros de WAF de Azure Application Gateway.", - "waf": "Operaciones" + "checklist": "SAP Checklist", + "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", + "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", + "service": "SAP", + "severity": "Alto", + "text": "En función de los requisitos existentes, controles normativos y de cumplimiento (internos y externos): determine qué directivas de Azure y el rol de RBAC de Azure son necesarios", + "training": "https://learn.microsoft.com/training/paths/describe-azure-management-governance/?source=recommendations", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Medio", - "text": "Agregue la configuración de diagnóstico para guardar los registros de WAF de Azure Front Door.", - "waf": "Operaciones" + "checklist": "SAP 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", + "severity": "Alto", + "text": "Al habilitar Microsoft Defender para punto de conexión en el entorno de SAP, se recomienda excluir los archivos de datos y registro en los servidores DBMS en lugar de dirigirse a todos los servidores. Siga las recomendaciones de su proveedor de DBMS al excluir archivos de destino.", + "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/microsoft-defender-endpoint-mde-for-sap-applications-on-windows/ba-p/3912268", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Medio", - "text": "Envíe registros de WAF de Azure Application Gateway a Microsoft Sentinel.", - "waf": "Operaciones" + "checklist": "SAP 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", + "severity": "Alto", + "text": "Delegue un rol personalizado de administrador de SAP con acceso Just-In-Time de Microsoft Defender for Cloud.", + "training": "https://learn.microsoft.com/training/modules/secure-vms-with-azure-security-center/?source=recommendations", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Medio", - "text": "Envíe registros de WAF de Azure Front Door a Microsoft Sentinel.", - "waf": "Operaciones" + "checklist": "SAP 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", + "severity": "Bajo", + "text": "cifre los datos en tránsito integrando el producto de seguridad de terceros con comunicaciones de red seguras (SNC) para DIAG (SAP GUI), RFC y SPNEGO para HTTPS", + "training": "https://learn.microsoft.com/azure/security/fundamentals/encryption-overview#encryption-of-data-in-transit", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", + "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", + "service": "SAP", "severity": "Medio", - "text": "Defina la configuración de WAF de Azure Application Gateway como código. Mediante el uso de código, puede adoptar más fácilmente una nueva versión del conjunto de reglas y obtener protección adicional.", - "waf": "Operaciones" + "text": "De forma predeterminada, utilice claves administradas por Microsoft para la funcionalidad de cifrado de entidad de seguridad y use claves administradas por el cliente cuando sea necesario.", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", - "service": "App Gateway", - "severity": "Medio", - "text": "Utilice directivas de WAF en lugar de la configuración de WAF heredada.", - "waf": "Operaciones" + "checklist": "SAP Checklist", + "guid": "4935ada4-2223-4ece-a1b1-23181a541741", + "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", + "service": "SAP", + "severity": "Alto", + "text": "Use una instancia de Azure Key Vault por aplicación, por entorno, por región.", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", - "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", - "service": "App Gateway", - "severity": "Medio", - "text": "Filtre el tráfico entrante en los back-end para que solo acepten conexiones de la subred de Application Gateway, por ejemplo, con grupos de seguridad de red.", + "checklist": "SAP Checklist", + "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", + "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", + "service": "SAP", + "severity": "Alto", + "text": "Para controlar y administrar claves y secretos de cifrado de disco para sistemas operativos Windows y Windows que no son de HANA, use Azure Key Vault. SAP HANA no es compatible con Azure Key Vault, por lo que debe usar métodos alternativos como SAP ABAP o claves SSH.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/?source=recommendations", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", - "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", - "service": "Front Door", - "severity": "Medio", - "text": "Asegúrese de que los orígenes solo toman tráfico de la instancia de Azure Front Door.", + "checklist": "SAP Checklist", + "guid": "209d490d-a477-4784-84d1-16785d2fa56c", + "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", + "service": "SAP", + "severity": "Alto", + "text": "Personalización de los roles de control de acceso basado en rol (RBAC) para SAP en suscripciones de Azure spoke para evitar cambios accidentales relacionados con la red", + "training": "https://learn.microsoft.com/training/modules/secure-azure-resources-with-rbac/?source=recommendations", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", - "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", - "service": "App Gateway", + "checklist": "SAP Checklist", + "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", + "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", + "service": "SAP", "severity": "Alto", - "text": "Debe cifrar el tráfico a los servidores backend.", + "text": "Aísle las redes perimetrales y las aplicaciones virtuales de red del resto del patrimonio de SAP, configure Azure Private Link y administre y controle de forma segura los recursos de SAP en Azure", + "training": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/secure-vnet-dmz?tabs=portal", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", - "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", - "service": "App Gateway", - "severity": "Alto", - "text": "Debe utilizar un firewall de aplicaciones web.", + "checklist": "SAP 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", + "severity": "Bajo", + "text": "Considere la posibilidad de usar el software antimalware de Microsoft en Azure para proteger las máquinas virtuales de archivos malintencionados, adware y otras amenazas.", + "training": "https://azure.microsoft.com/blog/deploying-antimalware-solutions-on-azure-virtual-machines/", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", - "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", - "service": "App Gateway", - "severity": "Medio", - "text": "Redirigir HTTP a HTTPS", + "checklist": "SAP 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", + "severity": "Bajo", + "text": "Para una protección aún más eficaz, considere la posibilidad de usar Microsoft Defender para punto de conexión.", + "training": "https://learn.microsoft.com/training/modules/implement-endpoint-protection-use-microsoft-defender/?source=recommendations", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Medio", - "text": "Utilice cookies administradas por puerta de enlace para dirigir el tráfico de una sesión de usuario al mismo servidor para su procesamiento", - "waf": "Operaciones" - }, - { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", - "service": "App Gateway", + "checklist": "SAP Checklist", + "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "severity": "Alto", - "text": "Habilite el drenaje de conexiones durante las actualizaciones de servicio planificadas para evitar la pérdida de conexión a los miembros existentes del grupo de back-end", + "text": "Aísle los servidores de aplicaciones y bases de datos de SAP de Internet o de la red local pasando todo el tráfico a través de la red virtual del centro de conectividad, que está conectada a la red radial mediante el emparejamiento de red virtual. Las redes virtuales emparejadas garantizan que la solución de SAP en Azure esté aislada de la red pública de Internet.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/?source=recommendations", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", - "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", - "service": "App Gateway", + "checklist": "SAP 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", "severity": "Bajo", - "text": "Crear páginas de error personalizadas para mostrar una experiencia de usuario personalizada", - "waf": "Operaciones" - }, - { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", - "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", - "service": "App Gateway", - "severity": "Medio", - "text": "Edite las solicitudes HTTP y los encabezados de respuesta para facilitar el enrutamiento y el intercambio de información entre el cliente y el servidor", - "waf": "Seguridad" - }, - { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "App Gateway", - "severity": "Medio", - "text": "Configure Front Door para optimizar el enrutamiento del tráfico web global y el rendimiento del usuario final de primer nivel, así como la confiabilidad a través de una rápida conmutación por error global", - "waf": "Rendimiento" - }, - { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "29dcc19f-a8fa-4c35-8281-290577538793", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "App Gateway", - "severity": "Medio", - "text": "Usar el equilibrio de carga de la capa de transporte", - "waf": "Rendimiento" - }, - { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", - "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", - "service": "App Gateway", - "severity": "Medio", - "text": "Configure el enrutamiento basado en el host o el nombre de dominio para varias aplicaciones web en una sola puerta de enlace", + "text": "En el caso de las aplicaciones orientadas a Internet, como SAP Fiori, asegúrese de distribuir la carga según los requisitos de la aplicación mientras se mantienen los niveles de seguridad. Para la seguridad de nivel 7, puede usar un firewall de aplicaciones web (WAF) de terceros disponible en Azure Marketplace.", + "training": "https://learn.microsoft.com/training/modules/simplify-cloud-procurement-governance-azure-marketplace/?source=recommendations", "waf": "Seguridad" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", - "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", - "service": "App Gateway", + "checklist": "SAP Checklist", + "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", + "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", + "service": "SAP", "severity": "Medio", - "text": "Centralice la administración de certificados SSL para reducir la sobrecarga de cifrado y descifrado de una granja de servidores back-end", - "waf": "Seguridad" - }, - { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", - "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", - "service": "App Gateway", - "severity": "Bajo", - "text": "Uso de Application Gateway para obtener compatibilidad nativa con los protocolos WebSocket y HTTP/2", + "text": "Para habilitar la comunicación segura en las soluciones de Azure Monitor para SAP, puede optar por usar un certificado raíz o un certificado de servidor. Le recomendamos encarecidamente que utilice certificados raíz.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", "waf": "Seguridad" }, { @@ -5777,2660 +5406,2593 @@ "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", - "service": "AVS", - "severity": "Alto", - "text": "Asegúrese de que los controladores de dominio ADDS se implementan en la suscripción de identidad en Azure nativo", - "waf": "Seguridad" + "checklist": "Identity Review Checklist", + "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", + "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", + "service": "Entra", + "severity": "Medio", + "text": "Use el token revocable de larga duración, almacene en caché el token y adquiera el token de forma silenciosa mediante la biblioteca de identidades de Microsoft", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "75089c20-990d-4927-b105-885576f76fc2", - "service": "AVS", + "checklist": "Identity Review Checklist", + "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", + "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", + "service": "AAD B2C", "severity": "Medio", - "text": "Asegúrese de que los sitios y servicios de ADDS están configurados para mantener las solicitudes de autenticación de los recursos basados en Azure (incluida Azure VMware Solution) locales en Azure", - "waf": "Seguridad" + "text": "Asegúrese de que los flujos de usuario de inicio de sesión estén respaldados y sean resistentes. Asegúrese de que se ha realizado una copia de seguridad del código que usa para iniciar sesión en los usuarios y se puede recuperar. Interfaces resilientes con procesos externos", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", - "service": "AVS", - "severity": "Alto", - "text": "Asegúrese de que vCenter esté conectado a ADDS para habilitar la autenticación basada en \"cuentas de usuario designadas\"", - "waf": "Seguridad" + "checklist": "Identity Review 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", + "severity": "Medio", + "text": "Los activos de marca personalizados deben estar alojados en una CDN", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", - "service": "AVS", - "severity": "Medio", - "text": "Asegúrese de que la conexión de vCenter a ADDS utilice un protocolo seguro (LDAPS)", - "waf": "Seguridad" + "checklist": "Identity Review Checklist", + "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", + "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", + "service": "AAD B2C", + "severity": "Bajo", + "text": "Tener varios proveedores de identidad (es decir, iniciar sesión con sus cuentas de Microsoft, Google, Facebook)", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", - "service": "AVS", + "checklist": "Identity Review 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", "severity": "Medio", - "text": "La cuenta de CloudAdmin en vCenter IdP solo se utiliza como una cuenta de emergencia (break-glass)", - "waf": "Seguridad" + "text": "Siga las reglas de la máquina virtual para la alta disponibilidad en el nivel de máquina virtual (discos premium, dos o más en una región, en diferentes zonas de disponibilidad)", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", - "service": "AVS", - "severity": "Alto", - "text": "Asegúrese de que NSX-Manager esté integrado con un proveedor de identidades externo (LDAPS)", - "waf": "Seguridad" + "checklist": "Identity Review 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", + "severity": "Medio", + "text": "¡No repliques! La replicación puede crear problemas con la sincronización de directorios", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", - "service": "AVS", + "checklist": "Identity Review 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", "severity": "Medio", - "text": "¿Se ha creado un modelo RBAC para su uso en VMware vSphere?", - "waf": "Seguridad" + "text": "Tener activo-activo para varias regiones", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", - "service": "AVS", + "checklist": "Identity Review Checklist", + "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", "severity": "Medio", - "text": "Los permisos RBAC deben concederse a grupos ADDS y no a usuarios específicos", - "waf": "Seguridad" + "text": "Adición de stamps de servicio de dominio de Azure AD a regiones y ubicaciones adicionales", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", - "service": "AVS", - "severity": "Alto", - "text": "Los permisos de RBAC en el recurso de Azure VMware Solution en Azure están \"bloqueados\" solo para un conjunto limitado de propietarios", - "waf": "Seguridad" + "checklist": "Identity Review Checklist", + "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", + "severity": "Medio", + "text": "Uso de conjuntos de réplicas para recuperación ante desastres", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", - "service": "AVS", - "severity": "Alto", - "text": "Asegúrese de que todos los roles personalizados tengan el ámbito de las autorizaciones permitidas de CloudAdmin", - "waf": "Seguridad" + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "ab91932c-9fc9-4d1b-a881-37f5e6c0cb9e", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ADF_v1.docx", + "service": "Azure Data Factory", + "severity": "Medio", + "text": "Aproveche el cuaderno de estrategias de resistencia de FTA para Azure Data Factory", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", - "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", - "service": "AVS", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "e503547c-d447-4e82-9138-a7200f1cac6d", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", "severity": "Alto", - "text": "¿Se ha seleccionado el modelo de conectividad de Azure VMware Solution correcto para el caso de uso del cliente en cuestión?", - "waf": "Rendimiento" + "text": "Uso de canalizaciones con redundancia de zona en regiones que admiten zonas de disponibilidad", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", - "service": "AVS", - "severity": "Alto", - "text": "Asegúrese de que las conexiones de ExpressRoute o VPN desde el entorno local a Azure se supervisan mediante el \"monitor de conexiones\"", - "waf": "Operaciones" + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "9ef1d6e8-32e5-42e3-911c-818b1a0bc511", + "link": "https://learn.microsoft.com/azure/data-factory/source-control", + "service": "Azure Data Factory", + "severity": "Medio", + "text": "Uso de DevOps para realizar copias de seguridad de las plantillas de ARM con la integración de Github/Azure DevOps ", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", - "service": "AVS", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "e43a18a9-cd29-49cf-b7b1-7db8255562f2", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", "severity": "Medio", - "text": "Asegúrese de que se crea un monitor de conexión desde un recurso nativo de Azure a una máquina virtual de Azure VMware Solution para supervisar la conexión de ExpressRoute back-end de Azure VMware Solution", - "waf": "Operaciones" + "text": "Asegúrese de replicar las máquinas virtuales de Integration Runtime autohospedadas en otra región ", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", - "service": "AVS", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "aee4563a-fd83-4393-98b2-62d6dc5f512a", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", "severity": "Medio", - "text": "Asegúrese de que se crea un monitor de conexión desde un recurso local a una máquina virtual de Azure VMware Solution para supervisar la conectividad de extremo a extremo", - "waf": "Operaciones" + "text": "Asegúrese de replicar o duplicar la red en la región hermana. Tiene que hacer una copia de la red virtual en otra región", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", - "service": "AVS", - "severity": "Alto", - "text": "Cuando se utiliza el servidor de rutas, asegúrese de que no se propaguen más de 1000 rutas desde el servidor de rutas a la puerta de enlace de ExR al entorno local (límite de ARS).", - "waf": "Operaciones" + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "description": "Si las canalizaciones de ADF usan Key Vault, no tiene que hacer nada para replicar Key Vault. Key Vault es un servicio administrado y Microsoft se encarga de ello por ti", + "guid": "25498f6d-bad3-47da-a43b-c6ce1d7aa9b2", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "Azure Data Factory", + "severity": "Bajo", + "text": "Si utiliza la integración de Keyvault, utilice el Acuerdo de Nivel de Servicio de Keyvault para comprender su disponibilidad", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", - "service": "AVS", - "severity": "Alto", - "text": "¿Se ha implementado Privileged Identity Management para los roles que administran el recurso de Azure VMware Solution en Azure Portal (no se permiten permisos permanentes)?", - "waf": "Seguridad" + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization Checklist", + "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", + "service": "Azure Monitor", + "text": "Reglas de recopilación de datos en Azure Monitor -https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview", + "training": "https://azure.microsoft.com/pricing/reservations/", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", - "service": "AVS", - "severity": "Alto", - "text": "Los informes de auditoría de Privileged Identity Management deben implementarse para los roles PIM de Azure VMware Solution", - "waf": "Seguridad" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "text": "Comprobar las instancias de copia de seguridad con la fuente de datos subyacente no encontrada", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", - "service": "AVS", - "severity": "Medio", - "text": "Si se usa Privileged Identity Management, asegúrese de que se crea una cuenta válida habilitada para Entra ID con un registro SMTP válido para las notificaciones de reemplazo automático de host de Azure VMware Solution. (se requieren permisos permanentes)", - "waf": "Seguridad" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "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", + "text": "Eliminar o archivar servicios no asociados (discos, NIC, direcciones IP, etc.)", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", - "service": "AVS", - "severity": "Alto", - "text": "Limite el uso de la cuenta de CloudAdmin solo al acceso de emergencia", - "waf": "Seguridad" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "text": "Considere un buen equilibrio entre el almacenamiento de recuperación del sitio y la copia de seguridad para aplicaciones que no son críticas", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", - "service": "AVS", - "severity": "Medio", - "text": "Cree funciones RBAC personalizadas en vCenter para implementar un modelo de privilegios mínimos dentro de vCenter", - "waf": "Seguridad" + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization 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", + "text": "Compruebe las oportunidades de gasto y ahorro entre las 40 áreas de trabajo de Log Analytics diferentes: use diferentes retenciones y recopilación de datos para áreas de trabajo que no sean de producción: cree un límite diario para el reconocimiento y el tamaño de los niveles: si establece un límite diario, además de crear una alerta cuando se alcance el límite, asegúrese de crear también una regla de alerta para que se le notifique cuando se alcance algún porcentaje (90 %, por ejemplo). - Considere la posibilidad de transformar el espacio de trabajo si es posible - 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": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", - "service": "AVS", - "severity": "Medio", - "text": "Es un proceso definido para rotar periódicamente las credenciales de administrador de la nube (vCenter) y administrador (NSX)", - "waf": "Seguridad" + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization 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", + "text": "Aplique una política de purga de registros y automatización (si es necesario, los registros se pueden mover al almacenamiento en frío)", + "training": "https://www.youtube.com/watch?v=nHQYcYGKuyw", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", - "service": "AVS", - "severity": "Alto", - "text": "Uso de un proveedor de identidades centralizado que se usará para las cargas de trabajo (VM) que se ejecutan en Azure VMware Solution", - "waf": "Seguridad" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "text": "Compruebe que los discos son realmente necesarios, si no: eliminar. Si son necesarios, busque niveles de almacenamiento más bajos o use una copia de seguridad:", + "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/manage-automation", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", - "service": "AVS", - "severity": "Medio", - "text": "¿Se implementa el filtrado de tráfico este-oeste en NSX-T?", - "waf": "Seguridad" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization 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", + "text": "Considere la posibilidad de mover el almacenamiento no utilizado al nivel inferior, con reglas personalizadas: 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": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", - "service": "AVS", - "severity": "Alto", - "text": "Las cargas de trabajo de Azure VMware Solution no se exponen directamente a Internet. El tráfico se filtra e inspecciona mediante Azure Application Gateway, Azure Firewall o soluciones de terceros", - "waf": "Seguridad" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "VM", + "text": "Asegúrese de que el asesor está configurado para el tamaño correcto de la máquina virtual ", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", - "service": "AVS", - "severity": "Alto", - "text": "La auditoría y el registro se implementan para las solicitudes entrantes de Internet a Azure VMware Solution y a las cargas de trabajo basadas en Azure VMware Solution", - "waf": "Seguridad" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "description": "comprobando la búsqueda de las licencias de categoría de contador en el análisis de costes", + "guid": "59ae568b-a38d-4498-9e22-13dbd7bb012f", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/manage/centralize-operations", + "service": "VM", + "text": "ejecutar el script en todas las máquinas virtuales de Windows 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: considere la posibilidad de implementar una directiva si las máquinas virtuales de Windows se crean con frecuencia", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", - "service": "AVS", - "severity": "Medio", - "text": "La supervisión de sesiones se implementa para las conexiones salientes a Internet desde Azure VMware Solution o cargas de trabajo basadas en Azure VMware Solution para identificar actividades sospechosas o malintencionadas", - "waf": "Seguridad" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "service": "VM", + "text": " esto también se puede poner bajo AHUB si ya tiene licencias https://learn.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux?tabs=rhelpayg%2Crhelbyos%2CrhelEnablebyos%2Crhelcompliance", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "334fdf91-c234-4182-a652-75269440b4be", - "service": "AVS", - "severity": "Medio", - "text": "¿Está habilitada la protección estándar de DDoS en la subred de puerta de enlace de ExR/VPN en Azure?", - "waf": "Seguridad" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", + "service": "VM", + "text": "Consolide familias de máquinas virtuales reservadas con la opción de flexibilidad (no más de 4-5 familias)", + "training": "https://learn.microsoft.com/azure/automation/automation-solution-vm-management", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", - "service": "AVS", - "severity": "Medio", - "text": "Use una estación de trabajo de acceso con privilegios (PAW) dedicada para administrar Azure VMware Solution, vCenter, NSX Manager y HCX Manager", - "waf": "Seguridad" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "text": "Uso de Azure Reserved Instances: esta característica le permite reservar máquinas virtuales durante un período de 1 o 3 años, lo que proporciona un importante ahorro de costos en comparación con los precios de pago por uso.", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", - "service": "AVS", - "severity": "Medio", - "text": "Habilitación de la detección avanzada de amenazas (Microsoft Defender for Cloud, también conocida como ASC) para cargas de trabajo que se ejecutan en Azure VMware Solution", - "waf": "Seguridad" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", + "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", + "service": "VM", + "text": "Solo se pueden reservar discos más grandes => 1 TiB -", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", - "service": "AVS", - "severity": "Medio", - "text": "Use Azure ARC for Servers para controlar correctamente las cargas de trabajo que se ejecutan en Azure VMware Solution mediante tecnologías nativas de Azure (Azure ARC for Azure VMware Solution aún no está disponible)", - "waf": "Seguridad" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", + "service": "VM", + "text": "Después de la optimización del tamaño correcto", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", - "service": "AVS", - "severity": "Bajo", - "text": "Asegúrese de que las cargas de trabajo de Azure VMware Solution usen suficiente cifrado de datos durante el tiempo de ejecución (como el cifrado de disco invitado y SQL TDE). (El cifrado de vSAN en reposo es el predeterminado)", - "waf": "Seguridad" + "arm-service": "Microsoft.Sql/servers", + "checklist": "Cost Optimization Checklist", + "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", + "service": "Azure SQL", + "text": "Compruebe si corresponde y aplique la política/cambio 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": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "a3592718-e6e2-4051-9267-6ae46691e883", - "service": "AVS", - "severity": "Bajo", - "text": "Cuando se usa el cifrado en invitado, almacene las claves de cifrado en Azure Key Vault siempre que sea posible", - "waf": "Seguridad" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", + "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", + "service": "VM", + "text": "El descuento de la parte de la licencia VM + (ahub + 3YRI) es de alrededor del 70% de descuento", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "5ac94222-3e13-4810-9230-81a941741583", - "service": "AVS", - "severity": "Medio", - "text": "Considere la posibilidad de usar la compatibilidad con actualizaciones de seguridad extendidas para las cargas de trabajo que se ejecutan en Azure VMware Solution (Azure VMware Solution es apta para ESU)", - "waf": "Seguridad" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "text": "Considere la posibilidad de utilizar un VMSS para satisfacer la demanda en lugar de un tamaño fijo", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", - "service": "AVS", - "severity": "Alto", - "text": "Asegúrese de que se utiliza el método de redundancia de datos de vSAN adecuado (especificación RAID)", - "waf": "Fiabilidad" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Cost Optimization Checklist", + "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "service": "AKS", + "text": "Use el escalador automático de AKS para que coincida con el uso de los clústeres (asegúrese de que los requisitos de los pods coincidan con el escalador)", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d88408f3-7273-44c8-96ba-280214590146", - "service": "AVS", - "severity": "Alto", - "text": "Asegúrese de que la directiva de error de tolerancia esté implementada para satisfacer sus necesidades de almacenamiento de vSAN", - "waf": "Fiabilidad" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "text": "Mover los puntos de recuperación al archivo de almacén cuando corresponda (Validar)", + "training": "https://azure.microsoft.com/pricing/reservations/", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", - "service": "AVS", - "severity": "Alto", - "text": "Asegúrese de que ha solicitado una cuota suficiente, asegurándose de que ha tenido en cuenta el crecimiento y el requisito de recuperación ante desastres", - "waf": "Fiabilidad" + "arm-service": "Microsoft.Databricks/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", + "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", + "service": "Databricks", + "text": "Considere la posibilidad de usar máquinas virtuales de acceso puntual con reserva siempre que sea posible. Considere la posibilidad de la terminación automática de clústeres.", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", - "service": "AVS", - "severity": "Medio", - "text": "Asegúrese de que se comprenden las restricciones de acceso a ESXi, ya que existen límites de acceso que pueden afectar a las soluciones de terceros.", - "waf": "Operaciones" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", + "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", + "service": "Azure Functions", + "text": "Funciones - Reutilizar conexiones", + "training": "https://learn.microsoft.com/azure/cost-management-billing/reservations/reservation-apis?toc=%2Fazure%2Fcost-management-billing%2Ftoc.json", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", - "service": "AVS", - "severity": "Medio", - "text": "Asegúrese de tener una política en torno a la densidad y la eficiencia del host ESXi, teniendo en cuenta el tiempo de espera para solicitar nuevos nodos", - "waf": "Operaciones" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", + "link": "https://learn.microsoft.com/azure/automation/update-management/overview", + "service": "Azure Functions", + "text": "Funciones: almacenar datos en caché localmente", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", - "service": "AVS", - "severity": "Medio", - "text": "Asegúrese de que existe un buen proceso de administración de costos para Azure VMware Solution: se puede usar Azure Cost Management", + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", + "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", + "service": "Azure Functions", + "text": "Funciones - Arranques en frío: utilice la funcionalidad 'Ejecutar desde el paquete'. De esta manera, el código se descarga como un único archivo zip. Esto puede, por ejemplo, resultar en mejoras significativas con las funciones de Javascript, que tienen muchos módulos de nodos. Utilice herramientas específicas del lenguaje para reducir el tamaño del paquete, por ejemplo, aplicaciones Javascript que sacuden el árbol.", + "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", - "service": "AVS", - "severity": "Bajo", - "text": "¿Se usan instancias reservadas de Azure para optimizar el costo de uso de Azure VMware Solution?", + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "Azure Functions", + "text": "Funciones - Mantén tus funciones calientes", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6691e883-5ac9-4422-83e1-3810523081a9", - "service": "AVS", - "severity": "Medio", - "text": "Tenga en cuenta el uso de Azure Private-Link cuando use otros servicios nativos de Azure", - "waf": "Seguridad" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Azure Functions", + "text": "Al usar el escalado automático con diferentes funciones, es posible que haya uno que controle todo el escalado automático para todos los recursos: considere la posibilidad de moverlo a un plan de consumo independiente (y considere un plan superior para la CPU)", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", - "service": "AVS", - "severity": "Alto", - "text": "Asegúrese de que todos los recursos necesarios residen en las mismas zonas de disponibilidad de Azure", - "waf": "Rendimiento" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", + "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", + "service": "Azure Functions", + "text": "Las aplicaciones de funciones de un plan determinado se escalan juntas, por lo que cualquier problema con el escalado puede afectar a todas las aplicaciones del plan.", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", - "service": "AVS", - "severity": "Medio", - "text": "Habilitación de cargas de trabajo de máquina virtual invitada de Microsoft Defender for Cloud for Azure VMware Solution", - "waf": "Seguridad" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", + "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", + "service": "Azure Functions", + "text": "¿Se me factura por el \"tiempo de espera\"? Esta pregunta se suele formular en el contexto de una función de C# que realiza una operación asincrónica y espera el resultado, por ejemplo, await Task.Delay(1000) o await client. GetAsync('http://google.com'). La respuesta es sí: el segundo cálculo de GB se basa en la hora de inicio y finalización de la función y el uso de memoria durante ese período. Lo que realmente sucede durante ese tiempo en términos de actividad de la CPU no se tiene en cuenta en el cálculo. Una excepción a esta regla es si está utilizando funciones duraderas. No se le facturará por el tiempo empleado en las esperas en las funciones de orquestador.aplique técnicas de modelado de la demanda siempre que sea posible (¿entornos de desarrollo?) https://github.com/Azure-Samples/functions-csharp-premium-scaler", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", - "service": "AVS", - "severity": "Medio", - "text": "Uso de servidores habilitados para Azure Arc para administrar las cargas de trabajo de máquinas virtuales invitadas de Azure VMware Solution", - "waf": "Seguridad" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Cost Optimization Checklist", + "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Front Door", + "text": "Frontdoor: desactivar la página principal predeterminadaEn la configuración de la aplicación de la aplicación, establezca AzureWebJobsDisableHomepage en true. Esto devolverá un 204 (sin contenido) al PoP para que solo se devuelvan los datos del encabezado.", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", - "service": "AVS", - "severity": "Alto", - "text": "Habilitación del registro de diagnósticos y métricas en Azure VMware Solution", - "waf": "Operaciones" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Cost Optimization 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", + "text": "Frontdoor: ruta a algo que no devuelve nada. Configure una función, un proxy de función o agregue una ruta en la aplicación web que devuelva 200 (correctamente) y envíe contenido mínimo o nulo. La ventaja de esto es que podrá cerrar la sesión cuando se llame.", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", - "service": "AVS", - "severity": "Medio", - "text": "Implementación de los agentes de Log Analytics en cargas de trabajo de máquinas virtuales invitadas de Azure VMware Solution", - "waf": "Operaciones" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", + "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", + "service": "Storage", + "text": "Considere la posibilidad de archivar niveles para los datos menos utilizados", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "589d457a-927c-4397-9d11-02cad6aae11e", - "service": "AVS", - "severity": "Medio", - "text": "Asegúrese de que dispone de una directiva y una solución de copia de seguridad documentadas e implementadas para las cargas de trabajo de máquina virtual de Azure VMware Solution", - "waf": "Operaciones" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", + "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", + "service": "VM", + "text": "Compruebe los tamaños de disco en los que el tamaño no coincida con el nivel (es decir, un disco de 513 GiB pagará un P30 (1 TiB) y considere la posibilidad de cambiar el tamaño", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ee29711b-d352-4caa-ab79-b198dab81932", - "service": "AVS", - "severity": "Medio", - "text": "Uso de Microsoft Defender for Cloud para la supervisión del cumplimiento de las cargas de trabajo que se ejecutan en Azure VMware Solution", - "waf": "Seguridad" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", + "service": "Storage", + "text": "Considere la posibilidad de utilizar un SSD estándar en lugar de Premium o Ultra siempre que sea posible", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", - "service": "AVS", - "severity": "Medio", - "text": "¿Se agregan las líneas base de cumplimiento aplicables a Microsoft Defender for Cloud?", - "waf": "Seguridad" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization 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", + "text": "En el caso de las cuentas de almacenamiento, asegúrese de que el nivel elegido no suma cargos por transacción (puede ser más barato pasar al siguiente nivel)", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", - "service": "AVS", - "severity": "Alto", - "text": "¿Se evaluó la residencia de datos al seleccionar las regiones de Azure que se usarán para la implementación de Azure VMware Solution?", - "waf": "Seguridad" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization Checklist", + "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", + "service": "Site Recovery", + "text": "Para ASR, considere la posibilidad de usar discos SSD estándar si el RPO/RTO y el rendimiento de replicación lo permiten", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", - "service": "AVS", - "severity": "Alto", - "text": "¿Son claras y documentadas las implicaciones del procesamiento de datos (proveedor de servicios / modelo de consumidor de servicios)?", - "waf": "Seguridad" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", + "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", + "service": "Storage", + "text": "Cuentas de almacenamiento: compruebe el nivel de acceso frecuente o GRS necesario", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "547c1747-dc56-4068-a714-435cd19dd244", - "service": "AVS", - "severity": "Medio", - "text": "Considere la posibilidad de usar CMK (clave administrada por el cliente) para vSAN solo si es necesario por motivos de cumplimiento.", - "waf": "Seguridad" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", + "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", + "service": "VM", + "text": "Discos: valide el uso de discos SSD Premium en todas partes: por ejemplo, los que no son de producción podrían cambiar a SSD estándar o SSD Premium bajo demanda ", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", - "service": "AVS", - "severity": "Alto", - "text": "Creación de paneles para habilitar la información principal de supervisión de Azure VMware Solution", - "waf": "Operaciones" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", + "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", + "service": "Synapse", + "text": "Cree presupuestos para administrar los costos y cree alertas que notifiquen automáticamente a las partes interesadas sobre anomalías en el gasto y riesgos de gasto excesivo.", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", - "service": "AVS", - "severity": "Alto", - "text": "Creación de alertas de advertencia para umbrales críticos para alertas automáticas sobre el rendimiento de Azure VMware Solution (CPU >80 %, memoria media >80 %, vSAN >70 %)", - "waf": "Operaciones" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "Synapse", + "text": "Exporte los datos de costos a una cuenta de almacenamiento para realizar análisis de datos adicionales.", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9659e396-80e7-4828-ac93-5657d02bff45", - "service": "AVS", - "severity": "Alto", - "text": "Asegúrese de que se crea una alerta crítica para supervisar si el consumo de vSAN es inferior al 75 %, ya que se trata de un umbral de soporte de VMware", - "waf": "Operaciones" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "Synapse", + "text": "Controle los costos de un grupo de SQL dedicado pausando el recurso cuando no esté en uso.", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", - "service": "AVS", - "severity": "Alto", - "text": "Asegúrese de que las alertas están configuradas para las alertas y notificaciones de Azure Service Health", - "waf": "Operaciones" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", + "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", + "service": "Synapse", + "text": "Habilite la función de pausa automática de Apache Spark sin servidor y establezca el valor de tiempo de espera en consecuencia.", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", - "service": "AVS", - "severity": "Medio", - "text": "Configure el registro de Azure VMware Solution para que se envíe a una cuenta de Azure Storage o Azure EventHub para su procesamiento", - "waf": "Operaciones" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization 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", + "text": "Cree varias definiciones de grupo de Apache Spark de varios tamaños.", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", - "service": "AVS", - "severity": "Bajo", - "text": "Si se requiere una visión profunda de VMware vSphere: ¿Se utiliza vRealize Operations o vRealize Network Insights en la solución?", - "waf": "Operaciones" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization 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", + "text": "Compre unidades de confirmación (SCU) de Azure Synapse durante un año con un plan de compra anticipada para ahorrar en los costos de Azure Synapse Analytics.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", - "service": "AVS", - "severity": "Alto", - "text": "Asegúrese de que la directiva de almacenamiento de vSAN para las máquinas virtuales NO sea la directiva de almacenamiento predeterminada, ya que esta directiva aplica el aprovisionamiento grueso", - "waf": "Operaciones" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", + "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", + "service": "VM", + "text": "Uso de máquinas virtuales de acceso puntual para trabajos interrumpibles: se trata de máquinas virtuales por las que se puede pujar y comprar a un precio reducido, lo que proporciona una solución rentable para cargas de trabajo no críticas.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", - "service": "AVS", - "severity": "Medio", - "text": "Asegúrese de que las bibliotecas de contenido de vSphere no se coloquen en vSAN, ya que vSAN es un recurso finito", - "waf": "Operaciones" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "544451e1-92d3-4442-a3c7-628637a551c5", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "VM", + "text": "Ajustar el tamaño de todas las máquinas virtuales", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", - "service": "AVS", - "severity": "Medio", - "text": "Asegúrese de que los repositorios de datos de la solución de copia de seguridad se almacenen fuera del almacenamiento de vSAN. Ya sea en Azure nativo o en un almacén de datos respaldado por un grupo de discos", - "waf": "Operaciones" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", + "service": "VM", + "text": "Intercambiar el tamaño de la máquina virtual con los tamaños normalizados y más recientes", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", - "service": "AVS", - "severity": "Medio", - "text": "Asegúrese de que las cargas de trabajo que se ejecutan en Azure VMware Solution se administran de forma híbrida mediante Azure Arc para servidores (Arc para Azure VMware Solution está en versión preliminar)", - "waf": "Operaciones" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", + "text": "Ajustar el tamaño de las máquinas virtuales: comience con la supervisión del uso por debajo del 5 % y, a continuación, trabaje hasta el 40 %", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", - "service": "AVS", - "severity": "Medio", - "text": "Asegúrese de que las cargas de trabajo que se ejecutan en Azure VMware Solution se supervisan mediante Azure Log Analytics y Azure Monitor", - "waf": "Operaciones" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", + "text": "La inclusión de una aplicación en contenedores puede mejorar la densidad de la máquina virtual y ahorrar dinero en su escalado", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", - "service": "AVS", - "severity": "Medio", - "text": "Inclusión de cargas de trabajo que se ejecutan en Azure VMware Solution en las herramientas de administración de actualizaciones existentes o en Azure Update Management", - "waf": "Operaciones" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", + "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", + "service": "AKS", + "severity": "Bajo", + "text": "Si es necesario para las cargas de trabajo de Windows de AKS, se pueden usar contenedores HostProcess", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", - "service": "AVS", - "severity": "Medio", - "text": "Uso de Azure Policy para incorporar cargas de trabajo de Azure VMware Solution en las soluciones de administración, supervisión y seguridad de Azure", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", + "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", + "service": "AKS", + "severity": "Bajo", + "text": "Utilice KEDA si ejecuta cargas de trabajo controladas por eventos", + "waf": "Rendimiento" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", + "link": "https://dapr.io/", + "service": "AKS", + "severity": "Bajo", + "text": "Uso de Dapr para facilitar el desarrollo de microservicios", "waf": "Operaciones" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", - "service": "AVS", - "severity": "Medio", - "text": "Asegúrese de que las cargas de trabajo que se ejecutan en Azure VMware Solution se incorporan a Microsoft Defender for Cloud", - "waf": "Seguridad" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", - "service": "AVS", - "severity": "Medio", - "text": "Asegúrese de que las copias de seguridad no se almacenen en vSAN, ya que vSAN es un recurso finito", - "waf": "Fiabilidad" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", - "service": "AVS", - "severity": "Medio", - "text": "¿Se han considerado todas las soluciones de recuperación ante desastres y se ha decidido por la mejor solución para su negocio? [SRM/JetStream/Zerto/Veeam/...]", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Alto", + "text": "Uso de la oferta de AKS respaldada por SLA", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", - "service": "AVS", - "severity": "Medio", - "text": "Uso de Azure Site Recovery cuando la tecnología de recuperación ante desastres sea IaaS nativa de Azure", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", + "severity": "Bajo", + "text": "Uso de presupuestos de interrupción en el pod y las definiciones de implementación", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", - "service": "AVS", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure AKS Review", + "guid": "3c763963-7a55-42d5-a15e-401955387e5c", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", + "service": "ACR", "severity": "Alto", - "text": "Utilice planes de recuperación automatizados con cualquiera de las soluciones ante desastres, evite las tareas manuales tanto como sea posible", + "text": "Si usa un registro privado, configure la replicación de regiones para almacenar imágenes en varias regiones", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "8255461e-2aee-4345-9aec-8339248b262d", - "service": "AVS", - "severity": "Medio", - "text": "Usar el par de regiones geopolíticas como entorno secundario de recuperación ante desastres", - "waf": "Fiabilidad" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", + "service": "AKS", + "severity": "Bajo", + "text": "Usar una aplicación externa como kubecost para asignar costos a diferentes usuarios", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", - "service": "AVS", - "severity": "Alto", - "text": "Utilice 2 espacios de direcciones diferentes entre las regiones, por ejemplo: 10.0.0.0/16 y 192.168.0.0/16 para las diferentes regiones", - "waf": "Fiabilidad" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", + "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", + "service": "AKS", + "severity": "Bajo", + "text": "Usar el modo de reducción vertical para eliminar/desasignar nodos", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", + "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", + "service": "AKS", "severity": "Medio", - "text": "¿Se usará Global Reach de ExpressRoute para la conectividad entre las nubes privadas de Azure VMware Solution principal y secundaria, o el enrutamiento se realiza a través de aplicaciones virtuales de red?", - "waf": "Fiabilidad" + "text": "Cuando sea necesario, use la GPU de partición de varias instancias en clústeres de AKS", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", - "service": "AVS", - "severity": "Medio", - "text": "¿Se han considerado todas las soluciones de copia de seguridad y se ha decidido por la mejor solución para su negocio? [ MABS/CommVault/Metallic.io/Veeam/ . ]", - "waf": "Fiabilidad" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", + "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", + "service": "AKS", + "severity": "Bajo", + "text": "Si se ejecuta un clúster de desarrollo y pruebas, use NodePool Start/Stop", + "waf": "Costar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Medio", - "text": "Implemente la solución de copia de seguridad en la misma región que la nube privada de Azure VMware Solution", - "waf": "Fiabilidad" + "text": "Uso de Azure Policy para Kubernetes para garantizar el cumplimiento de clústeres", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Medio", - "text": "Implementación de la solución de copia de seguridad fuera de vSan, en componentes nativos de Azure", - "waf": "Fiabilidad" + "text": "Separe las aplicaciones del plano de control con grupos de nodos de usuario/sistema", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", + "link": "https://learn.microsoft.com/azure/aks/use-system-pools", + "service": "AKS", "severity": "Bajo", - "text": "¿Existe un proceso para solicitar una restauración de los componentes de VMware administrados por la plataforma Azure?", - "waf": "Fiabilidad" + "text": "Agregue taint a su grupo de nodos del sistema para que sea dedicado", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", - "service": "AVS", - "severity": "Bajo", - "text": "En el caso de las implementaciones manuales, se deben documentar todas las configuraciones e implementaciones", - "waf": "Operaciones" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", + "link": "https://learn.microsoft.com/azure/container-registry/", + "service": "AKS", + "severity": "Medio", + "text": "Utilice un registro privado para sus imágenes, como ACR", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", - "service": "AVS", - "severity": "Bajo", - "text": "En el caso de las implementaciones manuales, considere la posibilidad de implementar bloqueos de recursos para evitar acciones accidentales en la nube privada de Azure VMware Solution", - "waf": "Operaciones" + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure AKS Review", + "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", + "link": "https://learn.microsoft.com/azure/security-center/container-security", + "service": "ACR", + "severity": "Medio", + "text": "Escanea tus imágenes en busca de vulnerabilidades", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", - "service": "AVS", - "severity": "Bajo", - "text": "Para implementaciones automatizadas, implemente una nube privada mínima y escale según sea necesario", - "waf": "Operaciones" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", + "service": "AKS", + "severity": "Alto", + "text": "Definición de los requisitos de separación de aplicaciones (espacio de nombres/grupo de nodos/clúster)", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", - "service": "AVS", - "severity": "Bajo", - "text": "En el caso de las implementaciones automatizadas, solicite o reserve una cuota antes de iniciar la implementación", - "waf": "Operaciones" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", + "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", + "service": "AKS", + "severity": "Medio", + "text": "Almacenamiento de los secretos en Azure Key Vault con el controlador del almacén de secretos de CSI", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", - "service": "AVS", - "severity": "Bajo", - "text": "En el caso de la implementación automatizada, asegúrese de que se crean bloqueos de recursos relevantes a través de la automatización o a través de Azure Policy para una gobernanza adecuada", - "waf": "Operaciones" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", + "link": "https://learn.microsoft.com/azure/aks/update-credentials", + "service": "AKS", + "severity": "Alto", + "text": "Si usa entidades de servicio para el clúster, actualice las credenciales periódicamente (por ejemplo, trimestralmente)", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", - "service": "AVS", - "severity": "Bajo", - "text": "Implemente nombres comprensibles para las claves de autorización ExR para permitir una fácil identificación del propósito y uso de las claves.", - "waf": "Operaciones" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", + "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", + "service": "AKS", + "severity": "Medio", + "text": "Si es necesario, agregue el servicio de administración de claves, etcd, cifrado", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "255461e2-aee3-4553-afc8-339248b262d6", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", + "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", + "service": "AKS", "severity": "Bajo", - "text": "Uso de Key Vault para almacenar secretos y claves de autorización cuando se usan principios de servicio independientes para implementar Azure VMware Solution y ExpressRoute", - "waf": "Operaciones" + "text": "Si es necesario, considere la posibilidad de usar Proceso confidencial para AKS", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", - "service": "AVS", - "severity": "Bajo", - "text": "Defina dependencias de recursos para serializar acciones en IaC cuando sea necesario implementar muchos recursos en Azure VMware Solution, ya que Azure VMware Solution solo admite un número limitado de operaciones paralelas.", - "waf": "Operaciones" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", + "service": "AKS", + "severity": "Medio", + "text": "Considere la posibilidad de usar Defender para contenedores", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", - "service": "AVS", - "severity": "Bajo", - "text": "Al realizar la configuración automatizada de segmentos de NSX-T con una única puerta de enlace de nivel 1, use las API de Azure Portal en lugar de las API de NSX-Manager", - "waf": "Operaciones" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Alto", + "text": "Uso de identidades administradas en lugar de entidades de servicio", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Medio", - "text": "Si tiene la intención de usar el escalado horizontal automatizado, asegúrese de solicitar una cuota suficiente de Azure VMware Solution para las suscripciones que ejecutan Azure VMware Solution", - "waf": "Rendimiento" + "text": "Integración de la autenticación con AAD (mediante la integración administrada)", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", + "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", + "service": "AKS", "severity": "Medio", - "text": "Cuando tenga la intención de usar la reducción horizontal automatizada, asegúrese de tener en cuenta los requisitos de la directiva de almacenamiento antes de realizar dicha acción", - "waf": "Rendimiento" + "text": "Limitar el acceso a admin kubeconfig (get-credentials --admin)", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", + "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", + "service": "AKS", "severity": "Medio", - "text": "Las operaciones de escalado siempre deben serializarse dentro de un único SDDC, ya que solo se puede realizar una operación de escalado a la vez (incluso cuando se utilizan varios clústeres)", - "waf": "Rendimiento" + "text": "Integración de la autorización con RBAC de AAD", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", - "service": "AVS", - "severity": "Medio", - "text": "Considerar y validar las operaciones de escalado en soluciones de terceros utilizadas en la arquitectura (compatibles o no)", - "waf": "Rendimiento" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", + "service": "AKS", + "severity": "Alto", + "text": "Uso de espacios de nombres para restringir el privilegio RBAC en Kubernetes", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", + "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", + "service": "AKS", "severity": "Medio", - "text": "Defina y aplique límites máximos de escalado vertical y horizontal para su entorno en las automatizaciones", - "waf": "Rendimiento" + "text": "Para la administración de acceso a identidades de pods, use Azure AD Workload Identity (versión preliminar)", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", + "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", + "service": "AKS", "severity": "Medio", - "text": "Implemente reglas de supervisión para supervisar las operaciones de escalado automatizadas y supervisar el éxito y el fracaso para permitir respuestas adecuadas (automatizadas)", - "waf": "Operaciones" + "text": "En el caso de los inicios de sesión no interactivos de AKS, use kubelogin (versión preliminar)", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c5972cd4-cd21-4b07-9036-f5e6b4bfd3d5", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", - "severity": "Alto", - "text": "Al usar MON, tenga en cuenta los límites de las máquinas virtuales configuradas simultáneamente (límite de MON para HCX [400 - estándar, 1000 - dispositivo más grande])", - "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", - "waf": "Fiabilidad" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Medio", + "text": "Deshabilitación de cuentas locales de AKS", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "be1f38cf-03a8-422b-b463-cbbbc8ac299e", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", - "severity": "Alto", - "text": "Al usar MON, no puede habilitar MON en más de 100 extensiones de red", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", - "waf": "Fiabilidad" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Bajo", + "text": "Configure, si es necesario, el acceso al clúster Just-In-Time", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", - "service": "AVS", - "severity": "Medio", - "text": "Si utiliza una conexión VPN para migraciones, ajuste el tamaño de su MTU en consecuencia.", - "waf": "Rendimiento" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Bajo", + "text": "Configure si es necesario el acceso condicional de AAD para AKS", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e614658d-d457-4e92-9139-b821102cad6e", - "service": "AVS", - "severity": "Medio", - "text": "En el caso de las regiones de baja conectividad que se conectan a Azure (500 Mbps o menos), considere la posibilidad de implementar el dispositivo de optimización de WAN de HCX", - "waf": "Rendimiento" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", + "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", + "service": "AKS", + "severity": "Bajo", + "text": "Si es necesario para las cargas de trabajo de Windows AKS, configure gMSA ", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Medio", - "text": "Asegúrese de que las migraciones se inicien desde el dispositivo local y NO desde el dispositivo en la nube (NO realice una migración inversa)", - "waf": "Fiabilidad" + "text": "Para un control más preciso, considere la posibilidad de utilizar una identidad de Kubelet administrada", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", + "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", + "service": "AKS", "severity": "Medio", - "text": "Cuando se usa Azure NetApp Files para ampliar el almacenamiento de Azure VMware Solution, considere la posibilidad de usarlo como almacén de datos de VMware en lugar de adjuntarlo directamente a una máquina virtual.", + "text": "Si utiliza AGIC, no comparta un AppGW entre clústeres", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bff4564b-0d93-44a3-98b2-63e7dd60513a", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", - "service": "AVS", - "severity": "Medio", - "text": "Asegúrese de que se usa una puerta de enlace de ExpressRoute dedicada para soluciones de almacenamiento de datos externos", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Alto", + "text": "No use el complemento de enrutamiento HTTP de AKS, use en su lugar la entrada NGINX administrada con el complemento de enrutamiento de aplicaciones.", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", + "service": "AKS", "severity": "Medio", - "text": "Asegúrese de que FastPath está habilitado en la puerta de enlace de ExpressRoute que se usa para las soluciones de almacenamiento de datos externos", - "waf": "Fiabilidad" + "text": "En el caso de las cargas de trabajo de Windows, use las redes aceleradas", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Alto", - "text": "Si utiliza un clúster ampliado, asegúrese de que la solución de recuperación ante desastres seleccionada sea compatible con el proveedor", + "text": "Utilice el ALB estándar (en lugar del básico)", "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "AVS", - "severity": "Alto", - "text": "Si utiliza un clúster ampliado, asegúrese de que el Acuerdo de Nivel de Servicio proporcionado cumpla sus requisitos", - "waf": "Fiabilidad" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", - "service": "AVS", - "severity": "Alto", - "text": "Si usa un clúster extendido, asegúrese de que ambos circuitos ExpressRoute están conectados al centro de conectividad.", - "waf": "Fiabilidad" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", - "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", - "service": "AVS", - "severity": "Alto", - "text": "Si usa un clúster extendido, asegúrese de que ambos circuitos ExpressRoute tengan habilitado GlobalReach.", - "waf": "Fiabilidad" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", - "service": "AVS", - "severity": "Alto", - "text": "Haga que la configuración de tolerancia ante desastres del sitio se considere y cambie correctamente para su negocio si es necesario.", - "waf": "Fiabilidad" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Medio", + "text": "Si usa Azure CNI, considere la posibilidad de usar diferentes subredes para NodePools", + "waf": "Seguridad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", - "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", + "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", + "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", "service": "AKS", - "severity": "Bajo", - "text": "Si es necesario para las cargas de trabajo de Windows de AKS, se pueden usar contenedores HostProcess", - "waf": "Fiabilidad" + "severity": "Medio", + "text": "Use puntos de conexión privados (preferidos) o puntos de conexión de servicio de red virtual para acceder a los servicios PaaS desde el clúster", + "waf": "Seguridad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", - "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", + "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", - "severity": "Bajo", - "text": "Utilice KEDA si ejecuta cargas de trabajo controladas por eventos", - "waf": "Rendimiento" + "severity": "Alto", + "text": "Elija el mejor complemento de red de CNI para sus necesidades (se recomienda Azure CNI)", + "waf": "Fiabilidad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", - "link": "https://dapr.io/", + "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", "service": "AKS", - "severity": "Bajo", - "text": "Uso de Dapr para facilitar el desarrollo de microservicios", - "waf": "Operaciones" + "severity": "Alto", + "text": "Si usa CNI de Azure, ajuste el tamaño de la subred en consecuencia teniendo en cuenta el número máximo de pods por nodo", + "waf": "Rendimiento" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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": "22f54b29-bade-43aa-b1e8-c38ec9366673", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", "service": "AKS", "severity": "Alto", - "text": "Uso de la oferta de AKS respaldada por SLA", - "waf": "Fiabilidad" + "text": "Si usa Azure CNI, compruebe el número máximo de pods o nodo (valor predeterminado 30)", + "waf": "Rendimiento" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "description": "En el caso de las aplicaciones internas, las organizaciones suelen abrir toda la subred de AKS en sus firewalls. Esto también abre el acceso de red a los nodos y, potencialmente, también a los pods (si se usa Azure CNI). Si las direcciones IP de LoadBalancer están en una subred diferente, solo esta debe estar disponible para los clientes de la aplicación. Otra razón es que si las direcciones IP de la subred de AKS son un recurso escaso, el consumo de sus direcciones IP para los servicios reducirá la escalabilidad máxima del clúster.", + "guid": "13c00567-4b1e-4945-a459-c373e7ed6162", + "link": "https://learn.microsoft.com/azure/aks/internal-lb", "service": "AKS", "severity": "Bajo", - "text": "Uso de presupuestos de interrupción en el pod y las definiciones de implementación", - "waf": "Fiabilidad" + "text": "Si usa servicios de LoadBalancer de dirección IP privada, use una subred dedicada (no la subred de AKS)", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "3c763963-7a55-42d5-a15e-401955387e5c", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", - "service": "ACR", + "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "severity": "Alto", - "text": "Si usa un registro privado, configure la replicación de regiones para almacenar imágenes en varias regiones", + "text": "Dimensione el rango de direcciones IP del servicio en consecuencia (limitará la escalabilidad del clúster)", "waf": "Fiabilidad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", + "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", + "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", "service": "AKS", "severity": "Bajo", - "text": "Usar una aplicación externa como kubecost para asignar costos a diferentes usuarios", - "waf": "Costar" + "text": "Si es necesario, agregue su propio complemento CNI", + "waf": "Seguridad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", - "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", + "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", "severity": "Bajo", - "text": "Usar el modo de reducción vertical para eliminar/desasignar nodos", - "waf": "Costar" + "text": "Si es necesario, configure la dirección IP pública por nodo en AKS", + "waf": "Rendimiento" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", - "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", + "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", + "link": "https://learn.microsoft.com/azure/aks/concepts-network", "service": "AKS", "severity": "Medio", - "text": "Cuando sea necesario, use la GPU de partición de varias instancias en clústeres de AKS", - "waf": "Costar" + "text": "Use un controlador de entrada para exponer aplicaciones basadas en web en lugar de exponerlas con servicios de tipo LoadBalancer", + "waf": "Fiabilidad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", - "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", + "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", + "link": "https://learn.microsoft.com/azure/aks/nat-gateway", "service": "AKS", "severity": "Bajo", - "text": "Si se ejecuta un clúster de desarrollo y pruebas, use NodePool Start/Stop", - "waf": "Costar" + "text": "Uso de Azure NAT Gateway como outboundType para escalar el tráfico de salida", + "waf": "Fiabilidad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "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", "severity": "Medio", - "text": "Uso de Azure Policy para Kubernetes para garantizar el cumplimiento de clústeres", - "waf": "Seguridad" + "text": "Uso de asignaciones dinámicas de direcciones IP para evitar el agotamiento de direcciones IP de Azure CNI", + "waf": "Fiabilidad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "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", - "severity": "Medio", - "text": "Separe las aplicaciones del plano de control con grupos de nodos de usuario/sistema", + "severity": "Alto", + "text": "Filtre el tráfico de salida con AzFW/NVA si sus requisitos de seguridad lo exigen", "waf": "Seguridad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", - "link": "https://learn.microsoft.com/azure/aks/use-system-pools", + "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", - "severity": "Bajo", - "text": "Agregue taint a su grupo de nodos del sistema para que sea dedicado", + "severity": "Medio", + "text": "Si utiliza un punto de conexión de API público, restrinja las direcciones IP que pueden acceder a él", "waf": "Seguridad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", - "link": "https://learn.microsoft.com/azure/container-registry/", + "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", - "severity": "Medio", - "text": "Utilice un registro privado para sus imágenes, como ACR", + "severity": "Alto", + "text": "Utilice clústeres privados si sus requisitos lo exigen", "waf": "Seguridad" }, { - "arm-service": "microsoft.containerregistry/registries", + "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", - "link": "https://learn.microsoft.com/azure/security-center/container-security", - "service": "ACR", + "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", "severity": "Medio", - "text": "Escanea tus imágenes en busca de vulnerabilidades", + "text": "Para los nodos de AKS de Windows 2019 y 2022, se pueden usar directivas de red de Calico ", "waf": "Seguridad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", + "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", "severity": "Alto", - "text": "Definición de los requisitos de separación de aplicaciones (espacio de nombres/grupo de nodos/clúster)", + "text": "Habilitación de una opción de directiva de red de Kubernetes (Calico/Azure)", "waf": "Seguridad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", - "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", + "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", "service": "AKS", - "severity": "Medio", - "text": "Almacenamiento de los secretos en Azure Key Vault con el controlador del almacén de secretos de CSI", + "severity": "Alto", + "text": "Uso de directivas de red de Kubernetes para aumentar la seguridad dentro del clúster", "waf": "Seguridad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", - "link": "https://learn.microsoft.com/azure/aks/update-credentials", + "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", "service": "AKS", "severity": "Alto", - "text": "Si usa entidades de servicio para el clúster, actualice las credenciales periódicamente (por ejemplo, trimestralmente)", + "text": "Uso de un WAF para cargas de trabajo web (interfaces de usuario o API)", "waf": "Seguridad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", - "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", + "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", "severity": "Medio", - "text": "Si es necesario, agregue el servicio de administración de claves, etcd, cifrado", + "text": "Uso de DDoS Standard en la red virtual de AKS", "waf": "Seguridad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", - "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", + "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", "severity": "Bajo", - "text": "Si es necesario, considere la posibilidad de usar Proceso confidencial para AKS", + "text": "Si es necesario, agregue el proxy HTTP de la empresa", "waf": "Seguridad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", + "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", + "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", "service": "AKS", "severity": "Medio", - "text": "Considere la posibilidad de usar Defender para contenedores", + "text": "Considere la posibilidad de usar una malla de servicios para la administración avanzada de comunicaciones de microservicios", "waf": "Seguridad" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", "service": "AKS", "severity": "Alto", - "text": "Uso de identidades administradas en lugar de entidades de servicio", - "waf": "Seguridad" + "text": "Configurar alertas sobre las métricas más críticas (consulte Container Insights para obtener recomendaciones)", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "guid": "337453a3-cc63-4963-9a65-22ac19e80696", + "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", "service": "AKS", - "severity": "Medio", - "text": "Integración de la autenticación con AAD (mediante la integración administrada)", - "waf": "Seguridad" + "severity": "Bajo", + "text": "Consulte periódicamente Azure Advisor para obtener recomendaciones sobre el clúster", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", - "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", + "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", + "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", "service": "AKS", - "severity": "Medio", - "text": "Limitar el acceso a admin kubeconfig (get-credentials --admin)", - "waf": "Seguridad" + "severity": "Bajo", + "text": "Habilitación de la rotación automática de certificados de AKS", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", - "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", + "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", + "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", "service": "AKS", - "severity": "Medio", - "text": "Integración de la autorización con RBAC de AAD", - "waf": "Seguridad" + "severity": "Alto", + "text": "Tenga un proceso regular para actualizar la versión de Kubernetes periódicamente (trimestralmente, por ejemplo) o use la característica de actualización automática de AKS", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", + "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", + "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", "service": "AKS", "severity": "Alto", - "text": "Uso de espacios de nombres para restringir el privilegio RBAC en Kubernetes", - "waf": "Seguridad" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", - "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", - "service": "AKS", - "severity": "Medio", - "text": "Para la administración de acceso a identidades de pods, use Azure AD Workload Identity (versión preliminar)", - "waf": "Seguridad" + "text": "Utilice kured para las actualizaciones de nodos de Linux en caso de que no esté utilizando la actualización de imagen de nodo", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", - "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", + "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", + "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", "service": "AKS", - "severity": "Medio", - "text": "En el caso de los inicios de sesión no interactivos de AKS, use kubelogin (versión preliminar)", - "waf": "Seguridad" + "severity": "Alto", + "text": "Disponer de un proceso regular para actualizar las imágenes de los nodos del clúster periódicamente (semanalmente, por ejemplo)", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", "service": "AKS", - "severity": "Medio", - "text": "Deshabilitación de cuentas locales de AKS", - "waf": "Seguridad" + "severity": "Bajo", + "text": "Considere la posibilidad de implementar aplicaciones o configuraciones de clústeres en varios clústeres", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "guid": "d7672c26-7602-4482-85a4-14527fbe855c", + "link": "https://learn.microsoft.com/azure/aks/command-invoke", "service": "AKS", "severity": "Bajo", - "text": "Configure, si es necesario, el acceso al clúster Just-In-Time", - "waf": "Seguridad" + "text": "Considere la posibilidad de usar la invocación de comandos de AKS en clústeres privados", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "c4d7f4c6-79bf-45d0-aa05-ce8fc717e150", - "link": "https://learn.microsoft.com/azure/aks/managed-aad#use-conditional-access-with-azure-ad-and-aks", + "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", + "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", "service": "AKS", "severity": "Bajo", - "text": "Configure si es necesario el acceso condicional de AAD para AKS", - "waf": "Seguridad" + "text": "En el caso de los eventos planeados, considere la posibilidad de utilizar el drenaje automático de nodos", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", - "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", + "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", + "link": "https://learn.microsoft.com/azure/aks/faq", "service": "AKS", - "severity": "Bajo", - "text": "Si es necesario para las cargas de trabajo de Windows AKS, configure gMSA ", - "waf": "Seguridad" + "severity": "Alto", + "text": "Desarrollar sus propias prácticas de gobernanza para asegurarse de que los operadores no realicen cambios en el nodo RG (también conocido como 'infra RG')", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "1f711a74-3672-470b-b8b8-a2148d640d79", - "link": "https://learn.microsoft.com/azure/aks/use-managed-identity#use-a-pre-created-kubelet-managed-identity", + "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", - "severity": "Medio", - "text": "Para un control más preciso, considere la posibilidad de utilizar una identidad de Kubelet administrada", - "waf": "Seguridad" + "severity": "Bajo", + "text": "Usar el nombre personalizado de Node RG (también conocido como 'Infra RG')", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", - "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", + "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", + "link": "https://kubernetes.io/docs/setup/release/notes/", "service": "AKS", "severity": "Medio", - "text": "Si utiliza AGIC, no comparta un AppGW entre clústeres", - "waf": "Fiabilidad" + "text": "No use API de Kubernetes obsoletas en los manifiestos de YAML", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", + "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", "service": "AKS", - "severity": "Alto", - "text": "No use el complemento de enrutamiento HTTP de AKS, use en su lugar la entrada NGINX administrada con el complemento de enrutamiento de aplicaciones.", - "waf": "Fiabilidad" + "severity": "Bajo", + "text": "Nodos de Windows de Taint", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", + "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", - "severity": "Medio", - "text": "En el caso de las cargas de trabajo de Windows, use las redes aceleradas", - "waf": "Rendimiento" + "severity": "Bajo", + "text": "Mantener el nivel de revisión de los contenedores de Windows sincronizado con el nivel de revisión del host", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "description": "A través de la configuración de diagnóstico en el nivel de clúster", + "guid": "5b56ad48-408f-4e72-934c-476ba280dcf5", + "link": "https://learn.microsoft.com/azure/aks/monitor-aks", "service": "AKS", - "severity": "Alto", - "text": "Utilice el ALB estándar (en lugar del básico)", - "waf": "Fiabilidad" + "severity": "Bajo", + "text": "Envío de registros maestros (también conocidos como registros de API) a Azure Monitor o a la solución de administración de registros que prefiera", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", + "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", "service": "AKS", - "severity": "Medio", - "text": "Si usa Azure CNI, considere la posibilidad de usar diferentes subredes para NodePools", - "waf": "Seguridad" + "severity": "Bajo", + "text": "Si es necesario, utilice instantáneas de nodePool", + "waf": "Costar" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", - "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", + "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", + "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", "service": "AKS", - "severity": "Medio", - "text": "Use puntos de conexión privados (preferidos) o puntos de conexión de servicio de red virtual para acceder a los servicios PaaS desde el clúster", - "waf": "Seguridad" + "severity": "Bajo", + "text": "Considere la posibilidad de crear grupos de nodos de acceso puntual para cargas de trabajo no urgentes", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "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", - "severity": "Alto", - "text": "Elija el mejor complemento de red de CNI para sus necesidades (se recomienda Azure CNI)", - "waf": "Fiabilidad" + "severity": "Bajo", + "text": "Considere la posibilidad de utilizar el nodo virtual de AKS para una ráfaga rápida", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", "service": "AKS", "severity": "Alto", - "text": "Si usa CNI de Azure, ajuste el tamaño de la subred en consecuencia teniendo en cuenta el número máximo de pods por nodo", - "waf": "Rendimiento" + "text": "Supervise las métricas de clúster con Container Insights (u otras herramientas como Prometheus)", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "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", "severity": "Alto", - "text": "Si usa Azure CNI, compruebe el número máximo de pods o nodo (valor predeterminado 30)", - "waf": "Rendimiento" + "text": "Almacene y analice los registros del clúster con Container Insights (u otras herramientas como Telegraf/ElasticSearch)", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "description": "En el caso de las aplicaciones internas, las organizaciones suelen abrir toda la subred de AKS en sus firewalls. Esto también abre el acceso de red a los nodos y, potencialmente, también a los pods (si se usa Azure CNI). Si las direcciones IP de LoadBalancer están en una subred diferente, solo esta debe estar disponible para los clientes de la aplicación. Otra razón es que si las direcciones IP de la subred de AKS son un recurso escaso, el consumo de sus direcciones IP para los servicios reducirá la escalabilidad máxima del clúster.", - "guid": "13c00567-4b1e-4945-a459-c373e7ed6162", - "link": "https://learn.microsoft.com/azure/aks/internal-lb", + "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", + "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", "service": "AKS", - "severity": "Bajo", - "text": "Si usa servicios de LoadBalancer de dirección IP privada, use una subred dedicada (no la subred de AKS)", - "waf": "Seguridad" + "severity": "Medio", + "text": "Supervisar el uso de la CPU y la memoria de los nodos", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", + "guid": "1a4835ac-9422-423e-ae80-b123081a5417", "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", "service": "AKS", - "severity": "Alto", - "text": "Dimensione el rango de direcciones IP del servicio en consecuencia (limitará la escalabilidad del clúster)", - "waf": "Fiabilidad" + "severity": "Medio", + "text": "Si usa Azure CNI, supervise el porcentaje de direcciones IP de pod consumidas por nodo", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", - "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", + "description": "La E/S en el disco del sistema operativo es un recurso crítico. Si el sistema operativo de los nodos se limita en la E/S, esto podría dar lugar a un comportamiento impredecible, que normalmente terminaría en que el nodo se declarara NotReady", + "guid": "415833ea-3ad3-4c2d-b733-165c3acbe04b", + "link": "https://learn.microsoft.com/azure/virtual-machines/premium-storage-performance", "service": "AKS", - "severity": "Bajo", - "text": "Si es necesario, agregue su propio complemento CNI", - "waf": "Seguridad" + "severity": "Medio", + "text": "Supervisión de la profundidad de la cola de disco del sistema operativo en los nodos", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "guid": "be209d39-fda4-4777-a424-d116785c2fa5", + "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", "service": "AKS", - "severity": "Bajo", - "text": "Si es necesario, configure la dirección IP pública por nodo en AKS", - "waf": "Rendimiento" + "severity": "Medio", + "text": "Si no usa el filtrado de salida con AzFW/NVA, supervise los puertos SNAT asignados por ALB estándar", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", - "link": "https://learn.microsoft.com/azure/aks/concepts-network", + "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", + "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", "service": "AKS", "severity": "Medio", - "text": "Use un controlador de entrada para exponer aplicaciones basadas en web en lugar de exponerlas con servicios de tipo LoadBalancer", - "waf": "Fiabilidad" + "text": "Suscríbase a las notificaciones de estado de los recursos para el clúster de AKS", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", - "link": "https://learn.microsoft.com/azure/aks/nat-gateway", + "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", "service": "AKS", - "severity": "Bajo", - "text": "Uso de Azure NAT Gateway como outboundType para escalar el tráfico de salida", - "waf": "Fiabilidad" + "severity": "Alto", + "text": "Configurar solicitudes y límites en las especificaciones del pod", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "8ee9a69a-1b58-4b1e-9c61-476e110a160b", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni#dynamic-allocation-of-ips-and-enhanced-subnet-support", + "guid": "769ef669-1a48-435a-a942-223ece80b123", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", "service": "AKS", "severity": "Medio", - "text": "Uso de asignaciones dinámicas de direcciones IP para evitar el agotamiento de direcciones IP de Azure CNI", - "waf": "Fiabilidad" + "text": "Aplicación de cuotas de recursos para espacios de nombres", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "guid": "081a5417-4158-433e-a3ad-3c2de733165c", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", "service": "AKS", "severity": "Alto", - "text": "Filtre el tráfico de salida con AzFW/NVA si sus requisitos de seguridad lo exigen", - "waf": "Seguridad" + "text": "Asegúrese de que la suscripción tiene suficiente cuota para escalar horizontalmente los grupos de nodos", + "waf": "Operaciones" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "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", "severity": "Medio", - "text": "Si utiliza un punto de conexión de API público, restrinja las direcciones IP que pueden acceder a él", - "waf": "Seguridad" + "text": "Uso del escalador automático de clústeres", + "waf": "Rendimiento" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "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", - "severity": "Alto", - "text": "Utilice clústeres privados si sus requisitos lo exigen", - "waf": "Seguridad" - }, - { + "severity": "Bajo", + "text": "Personalización de la configuración de nodos para grupos de nodos de AKS", + "waf": "Rendimiento" + }, + { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", + "link": "https://learn.microsoft.com/azure/aks/concepts-scale", "service": "AKS", "severity": "Medio", - "text": "Para los nodos de AKS de Windows 2019 y 2022, se pueden usar directivas de red de Calico ", - "waf": "Seguridad" + "text": "Usar el escalador automático horizontal de pods cuando sea necesario", + "waf": "Rendimiento" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "description": "Los nodos más grandes aportarán un mayor rendimiento y características como discos efímeros y redes aceleradas, pero aumentarán el radio de explosión y disminuirán la granularidad de escalado", + "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", "severity": "Alto", - "text": "Habilitación de una opción de directiva de red de Kubernetes (Calico/Azure)", - "waf": "Seguridad" + "text": "Considere un tamaño de nodo adecuado, ni demasiado grande ni demasiado pequeño", + "waf": "Rendimiento" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", + "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", "service": "AKS", - "severity": "Alto", - "text": "Uso de directivas de red de Kubernetes para aumentar la seguridad dentro del clúster", - "waf": "Seguridad" + "severity": "Bajo", + "text": "Si se requieren más de 5000 nodos para la escalabilidad, considere la posibilidad de usar un clúster de AKS adicional", + "waf": "Rendimiento" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", + "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", "service": "AKS", - "severity": "Alto", - "text": "Uso de un WAF para cargas de trabajo web (interfaces de usuario o API)", - "waf": "Seguridad" + "severity": "Bajo", + "text": "Considere la posibilidad de suscribirse a eventos de EventGrid para la automatización de AKS", + "waf": "Rendimiento" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", + "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", "service": "AKS", - "severity": "Medio", - "text": "Uso de DDoS Standard en la red virtual de AKS", - "waf": "Seguridad" + "severity": "Bajo", + "text": "Para una operación de ejecución prolongada en un clúster de AKS, considere la finalización de eventos", + "waf": "Rendimiento" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "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", + "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", + "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", "service": "AKS", "severity": "Bajo", - "text": "Si es necesario, agregue el proxy HTTP de la empresa", - "waf": "Seguridad" + "text": "Si es necesario, considere la posibilidad de usar Azure Dedicated Hosts para nodos de AKS", + "waf": "Rendimiento" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", - "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", + "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", - "severity": "Medio", - "text": "Considere la posibilidad de usar una malla de servicios para la administración avanzada de comunicaciones de microservicios", - "waf": "Seguridad" + "severity": "Alto", + "text": "Usar discos de sistema operativo efímeros", + "waf": "Rendimiento" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", + "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", + "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", "service": "AKS", "severity": "Alto", - "text": "Configurar alertas sobre las métricas más críticas (consulte Container Insights para obtener recomendaciones)", - "waf": "Operaciones" + "text": "En el caso de los discos no efímeros, use IOPS altas y discos de sistema operativo más grandes para los nodos cuando ejecute muchos pods o nodos, ya que requiere un alto rendimiento para ejecutar varios pods y generará registros enormes con umbrales de rotación de registros de AKS predeterminados", + "waf": "Rendimiento" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "337453a3-cc63-4963-9a65-22ac19e80696", - "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", + "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", + "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", "service": "AKS", "severity": "Bajo", - "text": "Consulte periódicamente Azure Advisor para obtener recomendaciones sobre el clúster", - "waf": "Operaciones" + "text": "Para la opción de almacenamiento de hiperrendimiento, use discos Ultra en AKS", + "waf": "Rendimiento" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", - "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", + "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", "service": "AKS", - "severity": "Bajo", - "text": "Habilitación de la rotación automática de certificados de AKS", - "waf": "Operaciones" + "severity": "Medio", + "text": "Evite mantener el estado en el clúster y almacene los datos fuera (AzStorage, AzSQL, Cosmos, etc.)", + "waf": "Rendimiento" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", - "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", + "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", "service": "AKS", - "severity": "Alto", - "text": "Tenga un proceso regular para actualizar la versión de Kubernetes periódicamente (trimestralmente, por ejemplo) o use la característica de actualización automática de AKS", - "waf": "Operaciones" + "severity": "Medio", + "text": "Si usa AzFiles Standard, considere AzFiles Premium o ANF por motivos de rendimiento", + "waf": "Rendimiento" }, { "arm-service": "microsoft.containerservice/managedClusters", "checklist": "Azure AKS Review", - "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", - "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", + "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", + "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", "service": "AKS", - "severity": "Alto", - "text": "Utilice kured para las actualizaciones de nodos de Linux en caso de que no esté utilizando la actualización de imagen de nodo", - "waf": "Operaciones" + "severity": "Medio", + "text": "Si usa Azure Disks y AZ, considere la posibilidad de tener grupos de nodos dentro de una zona para el disco LRS con VolumeBindingMode:WaitForFirstConsumer para aprovisionar el almacenamiento en la zona correcta o use el disco ZRS para los grupos de nodos que abarquen varias zonas", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", - "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", + "service": "AVS", "severity": "Alto", - "text": "Disponer de un proceso regular para actualizar las imágenes de los nodos del clúster periódicamente (semanalmente, por ejemplo)", - "waf": "Operaciones" + "text": "Asegúrese de que los controladores de dominio ADDS se implementan en la suscripción de identidad en Azure nativo", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", - "service": "AKS", - "severity": "Bajo", - "text": "Considere la posibilidad de implementar aplicaciones o configuraciones de clústeres en varios clústeres", - "waf": "Operaciones" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "75089c20-990d-4927-b105-885576f76fc2", + "service": "AVS", + "severity": "Medio", + "text": "Asegúrese de que los sitios y servicios de ADDS están configurados para mantener las solicitudes de autenticación de los recursos basados en Azure (incluida Azure VMware Solution) locales en Azure", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d7672c26-7602-4482-85a4-14527fbe855c", - "link": "https://learn.microsoft.com/azure/aks/command-invoke", - "service": "AKS", - "severity": "Bajo", - "text": "Considere la posibilidad de usar la invocación de comandos de AKS en clústeres privados", - "waf": "Operaciones" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", + "service": "AVS", + "severity": "Alto", + "text": "Asegúrese de que vCenter esté conectado a ADDS para habilitar la autenticación basada en \"cuentas de usuario designadas\"", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", - "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", - "service": "AKS", - "severity": "Bajo", - "text": "En el caso de los eventos planeados, considere la posibilidad de utilizar el drenaje automático de nodos", - "waf": "Operaciones" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", + "service": "AVS", + "severity": "Medio", + "text": "Asegúrese de que la conexión de vCenter a ADDS utilice un protocolo seguro (LDAPS)", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", - "link": "https://learn.microsoft.com/azure/aks/faq", - "service": "AKS", - "severity": "Alto", - "text": "Desarrollar sus propias prácticas de gobernanza para asegurarse de que los operadores no realicen cambios en el nodo RG (también conocido como 'infra RG')", - "waf": "Operaciones" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", + "service": "AVS", + "severity": "Medio", + "text": "La cuenta de CloudAdmin en vCenter IdP solo se utiliza como una cuenta de emergencia (break-glass)", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Bajo", - "text": "Usar el nombre personalizado de Node RG (también conocido como 'Infra RG')", - "waf": "Operaciones" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", + "service": "AVS", + "severity": "Alto", + "text": "Asegúrese de que NSX-Manager esté integrado con un proveedor de identidades externo (LDAPS)", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", - "link": "https://kubernetes.io/docs/setup/release/notes/", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", + "service": "AVS", "severity": "Medio", - "text": "No use API de Kubernetes obsoletas en los manifiestos de YAML", - "waf": "Operaciones" + "text": "¿Se ha creado un modelo RBAC para su uso en VMware vSphere?", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", - "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", - "service": "AKS", - "severity": "Bajo", - "text": "Nodos de Windows de Taint", - "waf": "Operaciones" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", + "service": "AVS", + "severity": "Medio", + "text": "Los permisos RBAC deben concederse a grupos ADDS y no a usuarios específicos", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Bajo", - "text": "Mantener el nivel de revisión de los contenedores de Windows sincronizado con el nivel de revisión del host", - "waf": "Operaciones" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", + "service": "AVS", + "severity": "Alto", + "text": "Los permisos de RBAC en el recurso de Azure VMware Solution en Azure están \"bloqueados\" solo para un conjunto limitado de propietarios", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "A través de la configuración de diagnóstico en el nivel de clúster", - "guid": "5b56ad48-408f-4e72-934c-476ba280dcf5", - "link": "https://learn.microsoft.com/azure/aks/monitor-aks", - "service": "AKS", - "severity": "Bajo", - "text": "Envío de registros maestros (también conocidos como registros de API) a Azure Monitor o a la solución de administración de registros que prefiera", - "waf": "Operaciones" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", + "service": "AVS", + "severity": "Alto", + "text": "Asegúrese de que todos los roles personalizados tengan el ámbito de las autorizaciones permitidas de CloudAdmin", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", - "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", - "service": "AKS", - "severity": "Bajo", - "text": "Si es necesario, utilice instantáneas de nodePool", - "waf": "Costar" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", + "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", + "service": "AVS", + "severity": "Alto", + "text": "¿Se ha seleccionado el modelo de conectividad de Azure VMware Solution correcto para el caso de uso del cliente en cuestión?", + "waf": "Rendimiento" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", - "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", - "service": "AKS", - "severity": "Bajo", - "text": "Considere la posibilidad de crear grupos de nodos de acceso puntual para cargas de trabajo no urgentes", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", + "service": "AVS", + "severity": "Alto", + "text": "Asegúrese de que las conexiones de ExpressRoute o VPN desde el entorno local a Azure se supervisan mediante el \"monitor de conexiones\"", "waf": "Operaciones" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Bajo", - "text": "Considere la posibilidad de utilizar el nodo virtual de AKS para una ráfaga rápida", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", + "service": "AVS", + "severity": "Medio", + "text": "Asegúrese de que se crea un monitor de conexión desde un recurso nativo de Azure a una máquina virtual de Azure VMware Solution para supervisar la conexión de ExpressRoute back-end de Azure VMware Solution", "waf": "Operaciones" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", - "service": "AKS", - "severity": "Alto", - "text": "Supervise las métricas de clúster con Container Insights (u otras herramientas como Prometheus)", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", + "service": "AVS", + "severity": "Medio", + "text": "Asegúrese de que se crea un monitor de conexión desde un recurso local a una máquina virtual de Azure VMware Solution para supervisar la conectividad de extremo a extremo", "waf": "Operaciones" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", + "service": "AVS", "severity": "Alto", - "text": "Almacene y analice los registros del clúster con Container Insights (u otras herramientas como Telegraf/ElasticSearch)", + "text": "Cuando se utiliza el servidor de rutas, asegúrese de que no se propaguen más de 1000 rutas desde el servidor de rutas a la puerta de enlace de ExR al entorno local (límite de ARS).", "waf": "Operaciones" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", - "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", - "service": "AKS", - "severity": "Medio", - "text": "Supervisar el uso de la CPU y la memoria de los nodos", - "waf": "Operaciones" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", + "service": "AVS", + "severity": "Alto", + "text": "¿Se ha implementado Privileged Identity Management para los roles que administran el recurso de Azure VMware Solution en Azure Portal (no se permiten permisos permanentes)?", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "1a4835ac-9422-423e-ae80-b123081a5417", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", - "severity": "Medio", - "text": "Si usa Azure CNI, supervise el porcentaje de direcciones IP de pod consumidas por nodo", - "waf": "Operaciones" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", + "service": "AVS", + "severity": "Alto", + "text": "Los informes de auditoría de Privileged Identity Management deben implementarse para los roles PIM de Azure VMware Solution", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "La E/S en el disco del sistema operativo es un recurso crítico. Si el sistema operativo de los nodos se limita en la E/S, esto podría dar lugar a un comportamiento impredecible, que normalmente terminaría en que el nodo se declarara NotReady", - "guid": "415833ea-3ad3-4c2d-b733-165c3acbe04b", - "link": "https://learn.microsoft.com/azure/virtual-machines/premium-storage-performance", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", + "service": "AVS", "severity": "Medio", - "text": "Supervisión de la profundidad de la cola de disco del sistema operativo en los nodos", - "waf": "Operaciones" + "text": "Si se usa Privileged Identity Management, asegúrese de que se crea una cuenta válida habilitada para Entra ID con un registro SMTP válido para las notificaciones de reemplazo automático de host de Azure VMware Solution. (se requieren permisos permanentes)", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "be209d39-fda4-4777-a424-d116785c2fa5", - "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", + "service": "AVS", + "severity": "Alto", + "text": "Limite el uso de la cuenta de CloudAdmin solo al acceso de emergencia", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", + "service": "AVS", "severity": "Medio", - "text": "Si no usa el filtrado de salida con AzFW/NVA, supervise los puertos SNAT asignados por ALB estándar", - "waf": "Operaciones" + "text": "Cree funciones RBAC personalizadas en vCenter para implementar un modelo de privilegios mínimos dentro de vCenter", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", - "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", + "service": "AVS", "severity": "Medio", - "text": "Suscríbase a las notificaciones de estado de los recursos para el clúster de AKS", - "waf": "Operaciones" + "text": "Es un proceso definido para rotar periódicamente las credenciales de administrador de la nube (vCenter) y administrador (NSX)", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", + "service": "AVS", "severity": "Alto", - "text": "Configurar solicitudes y límites en las especificaciones del pod", - "waf": "Operaciones" + "text": "Uso de un proveedor de identidades centralizado que se usará para las cargas de trabajo (VM) que se ejecutan en Azure VMware Solution", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "769ef669-1a48-435a-a942-223ece80b123", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", + "service": "AVS", "severity": "Medio", - "text": "Aplicación de cuotas de recursos para espacios de nombres", - "waf": "Operaciones" + "text": "¿Se implementa el filtrado de tráfico este-oeste en NSX-T?", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "081a5417-4158-433e-a3ad-3c2de733165c", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", + "service": "AVS", "severity": "Alto", - "text": "Asegúrese de que la suscripción tiene suficiente cuota para escalar horizontalmente los grupos de nodos", - "waf": "Operaciones" + "text": "Las cargas de trabajo de Azure VMware Solution no se exponen directamente a Internet. El tráfico se filtra e inspecciona mediante Azure Application Gateway, Azure Firewall o soluciones de terceros", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", + "service": "AVS", + "severity": "Alto", + "text": "La auditoría y el registro se implementan para las solicitudes entrantes de Internet a Azure VMware Solution y a las cargas de trabajo basadas en Azure VMware Solution", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", + "service": "AVS", "severity": "Medio", - "text": "Uso del escalador automático de clústeres", - "waf": "Rendimiento" + "text": "La supervisión de sesiones se implementa para las conexiones salientes a Internet desde Azure VMware Solution o cargas de trabajo basadas en Azure VMware Solution para identificar actividades sospechosas o malintencionadas", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Bajo", - "text": "Personalización de la configuración de nodos para grupos de nodos de AKS", - "waf": "Rendimiento" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "334fdf91-c234-4182-a652-75269440b4be", + "service": "AVS", + "severity": "Medio", + "text": "¿Está habilitada la protección estándar de DDoS en la subred de puerta de enlace de ExR/VPN en Azure?", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", - "link": "https://learn.microsoft.com/azure/aks/concepts-scale", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", + "service": "AVS", "severity": "Medio", - "text": "Usar el escalador automático horizontal de pods cuando sea necesario", - "waf": "Rendimiento" + "text": "Use una estación de trabajo de acceso con privilegios (PAW) dedicada para administrar Azure VMware Solution, vCenter, NSX Manager y HCX Manager", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "Los nodos más grandes aportarán un mayor rendimiento y características como discos efímeros y redes aceleradas, pero aumentarán el radio de explosión y disminuirán la granularidad de escalado", - "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", - "severity": "Alto", - "text": "Considere un tamaño de nodo adecuado, ni demasiado grande ni demasiado pequeño", - "waf": "Rendimiento" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", + "service": "AVS", + "severity": "Medio", + "text": "Habilitación de la detección avanzada de amenazas (Microsoft Defender for Cloud, también conocida como ASC) para cargas de trabajo que se ejecutan en Azure VMware Solution", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", - "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", - "service": "AKS", - "severity": "Bajo", - "text": "Si se requieren más de 5000 nodos para la escalabilidad, considere la posibilidad de usar un clúster de AKS adicional", - "waf": "Rendimiento" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", + "service": "AVS", + "severity": "Medio", + "text": "Use Azure ARC for Servers para controlar correctamente las cargas de trabajo que se ejecutan en Azure VMware Solution mediante tecnologías nativas de Azure (Azure ARC for Azure VMware Solution aún no está disponible)", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", - "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", + "service": "AVS", "severity": "Bajo", - "text": "Considere la posibilidad de suscribirse a eventos de EventGrid para la automatización de AKS", - "waf": "Rendimiento" + "text": "Asegúrese de que las cargas de trabajo de Azure VMware Solution usen suficiente cifrado de datos durante el tiempo de ejecución (como el cifrado de disco invitado y SQL TDE). (El cifrado de vSAN en reposo es el predeterminado)", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", - "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a3592718-e6e2-4051-9267-6ae46691e883", + "service": "AVS", "severity": "Bajo", - "text": "Para una operación de ejecución prolongada en un clúster de AKS, considere la finalización de eventos", - "waf": "Rendimiento" + "text": "Cuando se usa el cifrado en invitado, almacene las claves de cifrado en Azure Key Vault siempre que sea posible", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", - "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", - "service": "AKS", - "severity": "Bajo", - "text": "Si es necesario, considere la posibilidad de usar Azure Dedicated Hosts para nodos de AKS", - "waf": "Rendimiento" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5ac94222-3e13-4810-9230-81a941741583", + "service": "AVS", + "severity": "Medio", + "text": "Considere la posibilidad de usar la compatibilidad con actualizaciones de seguridad extendidas para las cargas de trabajo que se ejecutan en Azure VMware Solution (Azure VMware Solution es apta para ESU)", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", + "service": "AVS", "severity": "Alto", - "text": "Usar discos de sistema operativo efímeros", - "waf": "Rendimiento" + "text": "Asegúrese de que se utiliza el método de redundancia de datos de vSAN adecuado (especificación RAID)", + "waf": "Fiabilidad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", - "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d88408f3-7273-44c8-96ba-280214590146", + "service": "AVS", "severity": "Alto", - "text": "En el caso de los discos no efímeros, use IOPS altas y discos de sistema operativo más grandes para los nodos cuando ejecute muchos pods o nodos, ya que requiere un alto rendimiento para ejecutar varios pods y generará registros enormes con umbrales de rotación de registros de AKS predeterminados", - "waf": "Rendimiento" + "text": "Asegúrese de que la directiva de error de tolerancia esté implementada para satisfacer sus necesidades de almacenamiento de vSAN", + "waf": "Fiabilidad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", - "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", - "service": "AKS", - "severity": "Bajo", - "text": "Para la opción de almacenamiento de hiperrendimiento, use discos Ultra en AKS", - "waf": "Rendimiento" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", + "service": "AVS", + "severity": "Alto", + "text": "Asegúrese de que ha solicitado una cuota suficiente, asegurándose de que ha tenido en cuenta el crecimiento y el requisito de recuperación ante desastres", + "waf": "Fiabilidad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", + "service": "AVS", "severity": "Medio", - "text": "Evite mantener el estado en el clúster y almacene los datos fuera (AzStorage, AzSQL, Cosmos, etc.)", - "waf": "Rendimiento" + "text": "Asegúrese de que se comprenden las restricciones de acceso a ESXi, ya que existen límites de acceso que pueden afectar a las soluciones de terceros.", + "waf": "Operaciones" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", + "service": "AVS", "severity": "Medio", - "text": "Si usa AzFiles Standard, considere AzFiles Premium o ANF por motivos de rendimiento", - "waf": "Rendimiento" + "text": "Asegúrese de tener una política en torno a la densidad y la eficiencia del host ESXi, teniendo en cuenta el tiempo de espera para solicitar nuevos nodos", + "waf": "Operaciones" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", - "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", + "service": "AVS", "severity": "Medio", - "text": "Si usa Azure Disks y AZ, considere la posibilidad de tener grupos de nodos dentro de una zona para el disco LRS con VolumeBindingMode:WaitForFirstConsumer para aprovisionar el almacenamiento en la zona correcta o use el disco ZRS para los grupos de nodos que abarquen varias zonas", - "waf": "Rendimiento" - }, - { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", - "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", - "service": "Logic Apps", - "severity": "Alto", - "text": "Seleccione el plan de hospedaje de aplicaciones lógicas adecuado en función de los requisitos empresariales y de SLO", - "waf": "Fiabilidad" + "text": "Asegúrese de que existe un buen proceso de administración de costos para Azure VMware Solution: se puede usar Azure Cost Management", + "waf": "Costar" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps 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", - "severity": "Alto", - "text": "Proteja las aplicaciones lógicas de errores de región con redundancia de zona y zonas de disponibilidad", - "waf": "Fiabilidad" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", + "service": "AVS", + "severity": "Bajo", + "text": "¿Se usan instancias reservadas de Azure para optimizar el costo de uso de Azure VMware Solution?", + "waf": "Costar" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps 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", - "severity": "Alto", - "text": "Considere la posibilidad de una estrategia de recuperación ante desastres entre regiones para cargas de trabajo críticas", - "waf": "Fiabilidad" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6691e883-5ac9-4422-83e1-3810523081a9", + "service": "AVS", + "severity": "Medio", + "text": "Tenga en cuenta el uso de Azure Private-Link cuando use otros servicios nativos de Azure", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", - "link": "https://learn.microsoft.com/azure/app-service/environment/intro", - "service": "Logic Apps", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", + "service": "AVS", "severity": "Alto", - "text": "Si se implementa en un entorno aislado, use o migre a App Service Environment (ASE) v3", - "waf": "Fiabilidad" + "text": "Asegúrese de que todos los recursos necesarios residen en las mismas zonas de disponibilidad de Azure", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", - "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", - "service": "Logic Apps", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", + "service": "AVS", "severity": "Medio", - "text": "Aproveche Azure DevOps o GitHub para simplificar la CI/CD y proteger el código de la aplicación lógica", - "waf": "Operaciones" - }, - { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Azure Event Hub proporciona cifrado de datos en reposo. Si usa su propia clave, los datos se siguen cifrando con la clave administrada por Microsoft, pero además la clave administrada por Microsoft se cifrará con la clave administrada por el cliente. ", - "guid": "7aaf12e7-b94e-4f6e-847d-2d92981b1cd6", - "link": "https://learn.microsoft.com/azure/event-hubs/configure-customer-managed-key", - "service": "Event Hubs", - "severity": "Bajo", - "text": "Usar la opción de clave administrada por el cliente en el cifrado de datos en reposo cuando sea necesario", - "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "text": "Habilitación de cargas de trabajo de máquina virtual invitada de Microsoft Defender for Cloud for Azure VMware Solution", "waf": "Seguridad" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Los espacios de nombres de Azure Event Hubs permiten a los clientes enviar y recibir datos con TLS 1.0 y versiones posteriores. Para aplicar medidas de seguridad más estrictas, puede configurar el espacio de nombres de Event Hubs para requerir que los clientes envíen y reciban datos con una versión más reciente de TLS. Si un espacio de nombres de Event Hubs requiere una versión mínima de TLS, se producirá un error en las solicitudes realizadas con una versión anterior. ", - "guid": "d2f54b29-769e-43a6-a0e7-828ac936657e", - "link": "https://learn.microsoft.com/azure/event-hubs/transport-layer-security-configure-minimum-version", - "service": "Event Hubs", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", + "service": "AVS", "severity": "Medio", - "text": "Aplicar una versión mínima requerida de Seguridad de la capa de transporte (TLS) para las solicitudes ", - "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "text": "Uso de servidores habilitados para Azure Arc para administrar las cargas de trabajo de máquinas virtuales invitadas de Azure VMware Solution", "waf": "Seguridad" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Al crear un espacio de nombres de Event Hubs, se crea automáticamente una regla de directiva denominada RootManageSharedAccessKey para el espacio de nombres. Esta directiva tiene permisos de administración para todo el espacio de nombres. Se recomienda tratar esta regla como una cuenta raíz administrativa y no usarla en la aplicación. Se recomienda usar AAD como proveedor de autenticación con RBAC. ", - "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", - "severity": "Medio", - "text": "Evite usar la cuenta raíz cuando no sea necesario", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", - "waf": "Seguridad" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", + "service": "AVS", + "severity": "Alto", + "text": "Habilitación del registro de diagnósticos y métricas en Azure VMware Solution", + "waf": "Operaciones" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Las identidades administradas para los recursos de Azure pueden autorizar el acceso a los recursos de Event Hubs mediante credenciales de Azure AD desde aplicaciones que se ejecutan en Azure Virtual Machines (VM), aplicaciones de funciones, conjuntos de escalado de máquinas virtuales y otros servicios. Mediante el uso de identidades administradas para los recursos de Azure junto con la autenticación de Azure AD, puede evitar el almacenamiento de credenciales con las aplicaciones que se ejecutan en la nube. ", - "guid": "3a365a5c-7acb-4e48-abd5-4cd79f2e8776", - "link": "https://learn.microsoft.com/azure/event-hubs/authenticate-managed-identity?tabs=latest", - "service": "Event Hubs", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", + "service": "AVS", "severity": "Medio", - "text": "Siempre que sea posible, la aplicación debe usar una identidad administrada para autenticarse en Azure Event Hub. Si no es así, considere la posibilidad de tener la credencial de almacenamiento (SAS, credencial de entidad de servicio) en Azure Key Vault o en un servicio equivalente", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", - "waf": "Seguridad" + "text": "Implementación de los agentes de Log Analytics en cargas de trabajo de máquinas virtuales invitadas de Azure VMware Solution", + "waf": "Operaciones" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Al crear permisos, proporcione un control específico sobre el acceso de un cliente al Centro de eventos de Azure. Los permisos del Centro de eventos de Azure pueden y deben limitarse al nivel de recurso individual, por ejemplo, grupo de consumidores, entidad del centro de eventos, espacios de nombres del centro de eventos, 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", - "severity": "Alto", - "text": "Uso de RBAC de plano de datos con privilegios mínimos", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", - "waf": "Seguridad" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "589d457a-927c-4397-9d11-02cad6aae11e", + "service": "AVS", + "severity": "Medio", + "text": "Asegúrese de que dispone de una directiva y una solución de copia de seguridad documentadas e implementadas para las cargas de trabajo de máquina virtual de Azure VMware Solution", + "waf": "Operaciones" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Los registros de recursos del Centro de eventos de Azure incluyen registros operativos, registros de red virtual y registros de Kafka. Los registros de auditoría en tiempo de ejecución capturan información de diagnóstico agregada para todas las operaciones de acceso al plano de datos (como eventos de envío o recepción) en Event Hubs.", - "guid": "b38b875b-a1cf-4104-a900-3a4d3ce474db", - "link": "https://learn.microsoft.com/azure/event-hubs/monitor-event-hubs-reference", - "service": "Event Hubs", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ee29711b-d352-4caa-ab79-b198dab81932", + "service": "AVS", "severity": "Medio", - "text": "Habilite el registro para la investigación de seguridad. Use Azure Monitor para capturar métricas y registros, como registros de recursos, registros de auditoría en tiempo de ejecución y registros de Kafka", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "text": "Uso de Microsoft Defender for Cloud para la supervisión del cumplimiento de las cargas de trabajo que se ejecutan en Azure VMware Solution", "waf": "Seguridad" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "De forma predeterminada, Azure Event Hub tiene una dirección IP pública y es accesible a través de Internet. Los puntos de conexión privados permiten el tráfico entre la red virtual y Azure Event Hubs a través de la red troncal de Microsoft. Además de eso, debe deshabilitar los puntos de conexión públicos si no se usan. ", - "guid": "5abca2a4-eda1-4dae-8cc9-5d48c6b791dc", - "link": "https://learn.microsoft.com/azure/event-hubs/private-link-service", - "service": "Event Hubs", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", + "service": "AVS", "severity": "Medio", - "text": "Considere la posibilidad de usar puntos de conexión privados para acceder al Centro de eventos de Azure y deshabilitar el acceso a la red pública cuando corresponda.", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "text": "¿Se agregan las líneas base de cumplimiento aplicables a Microsoft Defender for Cloud?", "waf": "Seguridad" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Con el firewall IP, puede restringir aún más el punto de conexión público a solo un conjunto de direcciones IPv4 o rangos de direcciones IPv4 en notación CIDR (Classless Inter-Domain Routing). ", - "guid": "a0e6c465-89e5-458b-a37d-3974d1112dbd", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-ip-filtering", - "service": "Event Hubs", - "severity": "Medio", - "text": "Considere la posibilidad de permitir solo el acceso al espacio de nombres del Centro de eventos de Azure desde direcciones IP o intervalos específicos", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", + "service": "AVS", + "severity": "Alto", + "text": "¿Se evaluó la residencia de datos al seleccionar las regiones de Azure que se usarán para la implementación de Azure VMware Solution?", "waf": "Seguridad" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "31d41e36-11c8-417b-8afb-c410d4391898", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-AEH_v1.docx", - "service": "Event Hubs", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", + "service": "AVS", + "severity": "Alto", + "text": "¿Son claras y documentadas las implicaciones del procesamiento de datos (proveedor de servicios / modelo de consumidor de servicios)?", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "547c1747-dc56-4068-a714-435cd19dd244", + "service": "AVS", "severity": "Medio", - "text": "Aproveche el Manual de Resiliencia de los TLC", - "waf": "Fiabilidad" + "text": "Considere la posibilidad de usar CMK (clave administrada por el cliente) para vSAN solo si es necesario por motivos de cumplimiento.", + "waf": "Seguridad" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": " Esto se activará automáticamente para un nuevo espacio de nombres EH creado desde el portal con SKU Premium, Dedicado o Estándar en una región habilitada para zonas. Tanto los metadatos de EH como los propios datos de eventos se replican en todas las zonas", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", + "service": "AVS", "severity": "Alto", - "text": "Aproveche las zonas de disponibilidad si corresponde regionalmente", - "waf": "Fiabilidad" + "text": "Creación de paneles para habilitar la información principal de supervisión de Azure VMware Solution", + "waf": "Operaciones" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "20b56c56-ad58-4519-8f82-735c586bb281", - "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", - "service": "Event Hubs", - "severity": "Medio", - "text": "Usa las SKU Premium o Dedicadas para obtener un rendimiento predecible", - "waf": "Fiabilidad" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", + "service": "AVS", + "severity": "Alto", + "text": "Creación de alertas de advertencia para umbrales críticos para alertas automáticas sobre el rendimiento de Azure VMware Solution (CPU >80 %, memoria media >80 %, vSAN >70 %)", + "waf": "Operaciones" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "La característica integrada de recuperación ante desastres geográfica, cuando está habilitada, garantiza que toda la configuración de un espacio de nombres (Event Hubs, grupos de consumidores y configuración) se replique continuamente desde un espacio de nombres principal a un espacio de nombres secundario, y permite un movimiento de conmutación por error de una sola vez del principal al secundario en cualquier momento. La característica Activo/Pasivo está diseñada para facilitar la recuperación y el abandono de una región de Azure con errores sin tener que cambiar las configuraciones de la aplicación", - "guid": "dc15a1c0-75ee-49f1-90ac-ccd579376bcd", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-geo-dr?tabs=portal", - "service": "Event Hubs", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9659e396-80e7-4828-ac93-5657d02bff45", + "service": "AVS", "severity": "Alto", - "text": "Planeación de la recuperación ante desastres geográfica mediante la configuración pasiva activa", - "waf": "Fiabilidad" + "text": "Asegúrese de que se crea una alerta crítica para supervisar si el consumo de vSAN es inferior al 75 %, ya que se trata de un umbral de soporte de VMware", + "waf": "Operaciones" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Debe utilizarse para configuraciones de recuperación ante desastres en las que no se puede tolerar una interrupción o pérdida de datos de eventos en la región inactiva. En estos casos, siga las instrucciones de replicación y no use la capacidad de recuperación ante desastres geográfica integrada (activa/pasiva). Con Activo/Activo, mantenga varios centros de eventos en diferentes regiones y espacios de nombres, y los eventos se replicarán entre los centros", - "guid": "6e31b67d-67ba-4591-89c0-9e805d597c7e", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-federation-overview", - "service": "Event Hubs", - "severity": "Medio", - "text": "En el caso de las aplicaciones críticas para la empresa, use la configuración Active Active", - "waf": "Fiabilidad" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", + "service": "AVS", + "severity": "Alto", + "text": "Asegúrese de que las alertas están configuradas para las alertas y notificaciones de Azure Service Health", + "waf": "Operaciones" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", - "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", - "service": "Event Hubs", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", + "service": "AVS", "severity": "Medio", - "text": "Diseño de centros de eventos resilientes", - "waf": "Fiabilidad" + "text": "Configure el registro de Azure VMware Solution para que se envíe a una cuenta de Azure Storage o Azure EventHub para su procesamiento", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Aplicación de las instrucciones de la prueba comparativa 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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", + "service": "AVS", + "severity": "Bajo", + "text": "Si se requiere una visión profunda de VMware vSphere: ¿Se utiliza vRealize Operations o vRealize Network Insights en la solución?", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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 proceso de Azure 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", + "service": "AVS", "severity": "Alto", - "text": "Considere la posibilidad de usar puntos de conexión privados para Azure Storage", - "waf": "Seguridad" + "text": "Asegúrese de que la directiva de almacenamiento de vSAN para las máquinas virtuales NO sea la directiva de almacenamiento predeterminada, ya que esta directiva aplica el aprovisionamiento grueso", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Las cuentas de almacenamiento recién creadas se crean mediante el modelo de implementación de ARM, de modo que RBAC, auditoría, etc. están habilitados. Asegúrese de que no hay cuentas de almacenamiento antiguas con el modelo de implementación clásica 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", + "service": "AVS", "severity": "Medio", - "text": "Asegúrese de que las cuentas de almacenamiento más antiguas no usan el \"modelo de implementación clásica\"", - "waf": "Seguridad" + "text": "Asegúrese de que las bibliotecas de contenido de vSphere no se coloquen en vSAN, ya que vSAN es un recurso finito", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Aproveche Microsoft Defender para obtener información sobre la actividad sospechosa y los errores de configuración.", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", + "service": "AVS", + "severity": "Medio", + "text": "Asegúrese de que los repositorios de datos de la solución de copia de seguridad se almacenen fuera del almacenamiento de vSAN. Ya sea en Azure nativo o en un almacén de datos respaldado por un grupo de discos", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", + "service": "AVS", "severity": "Medio", - "text": "Habilitación de la \"eliminación temporal\" para blobs", - "waf": "Seguridad" + "text": "Asegúrese de que las cargas de trabajo que se ejecutan en Azure VMware Solution se administran de forma híbrida mediante Azure Arc para servidores (Arc para Azure VMware Solution está en versión preliminar)", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Considere la posibilidad de deshabilitar de forma selectiva la \"eliminación temporal\" para determinados contenedores de blobs, por ejemplo, si la aplicación debe asegurarse de que la información eliminada se elimina 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", + "service": "AVS", "severity": "Medio", - "text": "Deshabilitación de la \"eliminación temporal\" de blobs", - "waf": "Seguridad" + "text": "Asegúrese de que las cargas de trabajo que se ejecutan en Azure VMware Solution se supervisan mediante Azure Log Analytics y Azure Monitor", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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 los contenedores", - "waf": "Seguridad" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Considere la posibilidad de deshabilitar de forma selectiva la \"eliminación temporal\" para determinados contenedores de blobs, por ejemplo, si la aplicación debe asegurarse de que la información eliminada se elimina 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", + "service": "AVS", "severity": "Medio", - "text": "Deshabilitación de la \"eliminación temporal\" para contenedores", - "waf": "Seguridad" + "text": "Inclusión de cargas de trabajo que se ejecutan en Azure VMware Solution en las herramientas de administración de actualizaciones existentes o en Azure Update Management", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", + "service": "AVS", + "severity": "Medio", + "text": "Uso de Azure Policy para incorporar cargas de trabajo de Azure VMware Solution en las soluciones de administración, supervisión y seguridad de Azure", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Considere la posibilidad de aplicar directivas de \"retención legal\" o \"retención basada en el 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", + "service": "AVS", + "severity": "Medio", + "text": "Asegúrese de que las cargas de trabajo que se ejecutan en Azure VMware Solution se incorporan a Microsoft Defender for Cloud", "waf": "Seguridad" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Considere la posibilidad de deshabilitar el acceso HTTP/80 sin protección a la cuenta de almacenamiento, de modo que todas las transferencias de datos estén cifradas, protegidas por 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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", + "service": "AVS", + "severity": "Medio", + "text": "Asegúrese de que las copias de seguridad no se almacenen en vSAN, ya que vSAN es un recurso finito", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", + "service": "AVS", + "severity": "Medio", + "text": "¿Se han considerado todas las soluciones de recuperación ante desastres y se ha decidido por la mejor solución para su negocio? [SRM/JetStream/Zerto/Veeam/...]", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Requerir HTTPS cuando un cliente usa un token de SAS para acceder a los datos de blobs 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", + "service": "AVS", "severity": "Medio", - "text": "Limitar los tokens de firma de acceso compartido (SAS) solo a las conexiones HTTPS", - "waf": "Seguridad" + "text": "Uso de Azure Site Recovery cuando la tecnología de recuperación ante desastres sea IaaS nativa de Azure", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Los tokens de AAD 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", + "service": "AVS", "severity": "Alto", - "text": "Uso de tokens de Azure Active Directory (Azure AD) para el acceso a blobs", - "waf": "Seguridad" + "text": "Utilice planes de recuperación automatizados con cualquiera de las soluciones ante desastres, evite las tareas manuales tanto como sea posible", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "8255461e-2aee-4345-9aec-8339248b262d", + "service": "AVS", "severity": "Medio", - "text": "Privilegios mínimos en los permisos de IaM", - "waf": "Seguridad" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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 sobre 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 claves de cuenta de almacenamiento.", - "waf": "Seguridad" + "text": "Usar el par de regiones geopolíticas como entorno secundario de recuperación ante desastres", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Las claves de la cuenta de almacenamiento (\"claves compartidas\") tienen muy pocas funcionalidades 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 AAD facilita la vinculación del acceso al almacenamiento a un usuario. ", - "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", - "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", - "service": "Azure Storage", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", + "service": "AVS", "severity": "Alto", - "text": "Considere la posibilidad de deshabilitar las claves de la cuenta de almacenamiento, de modo que solo se admita el acceso a AAD (y la SAS de delegación de usuarios).", - "waf": "Seguridad" + "text": "Utilice 2 espacios de direcciones diferentes entre las regiones, por ejemplo: 10.0.0.0/16 y 192.168.0.0/16 para las diferentes regiones", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Use 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.).", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", + "service": "AVS", + "severity": "Medio", + "text": "¿Se usará Global Reach de ExpressRoute para la conectividad entre las nubes privadas de Azure VMware Solution principal y secundaria, o el enrutamiento se realiza a través de aplicaciones virtuales de red?", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Una directiva de expiración de claves le permite establecer un recordatorio para la rotación de las claves de acceso a 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", + "service": "AVS", "severity": "Medio", - "text": "Al usar claves de cuenta de almacenamiento, considere la posibilidad de habilitar una \"directiva de expiración de claves\"", - "waf": "Seguridad" + "text": "¿Se han considerado todas las soluciones de copia de seguridad y se ha decidido por la mejor solución para su negocio? [ MABS/CommVault/Metallic.io/Veeam/ . ]", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Una directiva de expiración de SAS especifica un intervalo recomendado durante el cual la SAS es válida. Las directivas de expiración 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", + "service": "AVS", "severity": "Medio", - "text": "Considere la posibilidad de configurar una directiva de expiración de SAS", - "waf": "Seguridad" + "text": "Implemente la solución de copia de seguridad en la misma región que la nube privada de Azure VMware Solution", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", + "service": "AVS", "severity": "Medio", - "text": "Considere la posibilidad de vincular SAS a una directiva de acceso almacenada", - "waf": "Seguridad" + "text": "Implementación de la solución de copia de seguridad fuera de vSan, en componentes nativos de Azure", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", + "service": "AVS", + "severity": "Bajo", + "text": "¿Existe un proceso para solicitar una restauración de los componentes de VMware administrados por la plataforma Azure?", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Lo ideal es que la aplicación use una identidad administrada para autenticarse en Azure Storage. Si esto 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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", + "service": "AVS", + "severity": "Bajo", + "text": "En el caso de las implementaciones manuales, se deben documentar todas las configuraciones e implementaciones", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Use los tiempos de expiración 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, es válida solo por un corto tiempo. Esta práctica es especialmente importante si no puede hacer referencia a una directiva 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 cargarlo.", - "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 obtener períodos de validez cortos para SAS ad-hoc", - "waf": "Seguridad" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", + "service": "AVS", + "severity": "Bajo", + "text": "En el caso de las implementaciones manuales, considere la posibilidad de implementar bloqueos de recursos para evitar acciones accidentales en la nube privada de Azure VMware Solution", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", + "service": "AVS", + "severity": "Bajo", + "text": "Para implementaciones automatizadas, implemente una nube privada mínima y escale según sea necesario", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Una SAS puede incluir parámetros en los que las direcciones IP de cliente o los intervalos de direcciones 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 en una dirección IP de cliente específica, siempre que sea posible", - "waf": "Seguridad" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", + "service": "AVS", + "severity": "Bajo", + "text": "En el caso de las implementaciones automatizadas, solicite o reserve una cuota antes de iniciar la implementación", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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 contenido de gran tamaño malintencionado.", - "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", - "service": "Azure Storage", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", + "service": "AVS", "severity": "Bajo", - "text": "Considere la posibilidad de comprobar los datos cargados, después de que los clientes hayan usado una SAS para cargar un archivo. ", - "waf": "Seguridad" + "text": "En el caso de la implementación automatizada, asegúrese de que se crean bloqueos de recursos relevantes a través de la automatización o a través de Azure Policy para una gobernanza adecuada", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Al acceder a Blob Storage 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 se admite para 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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", + "service": "AVS", + "severity": "Bajo", + "text": "Implemente nombres comprensibles para las claves de autorización ExR para permitir una fácil identificación del propósito y uso de las claves.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "255461e2-aee3-4553-afc8-339248b262d6", + "service": "AVS", + "severity": "Bajo", + "text": "Uso de Key Vault para almacenar secretos y claves de autorización cuando se usan principios de servicio independientes para implementar Azure VMware Solution y ExpressRoute", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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 relajar 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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", + "service": "AVS", + "severity": "Bajo", + "text": "Defina dependencias de recursos para serializar acciones en IaC cuando sea necesario implementar muchos recursos en Azure VMware Solution, ya que Azure VMware Solution solo admite un número limitado de operaciones paralelas.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Los datos en reposo siempre están cifrados 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 realizarse mediante una clave administrada por la plataforma (predeterminada) 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 a Azure Storage 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.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", + "service": "AVS", + "severity": "Bajo", + "text": "Al realizar la configuración automatizada de segmentos de NSX-T con una única puerta de enlace de nivel 1, use las API de Azure Portal en lugar de las API de NSX-Manager", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", + "service": "AVS", "severity": "Medio", - "text": "Determine qué cifrado de plataforma se debe usar o si se debe usar.", - "waf": "Seguridad" + "text": "Si tiene la intención de usar el escalado horizontal automatizado, asegúrese de solicitar una cuota suficiente de Azure VMware Solution para las suscripciones que ejecutan Azure VMware Solution", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", - "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", - "service": "Azure Storage", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", + "service": "AVS", "severity": "Medio", - "text": "Determine qué cifrado del lado del cliente se debe usar o si.", - "waf": "Seguridad" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.", - "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 se necesita acceso público a blobs o si se puede deshabilitar para determinadas cuentas de almacenamiento. ", - "waf": "Seguridad" + "text": "Cuando tenga la intención de usar la reducción horizontal automatizada, asegúrese de tener en cuenta los requisitos de la directiva de almacenamiento antes de realizar dicha acción", + "waf": "Rendimiento" }, { - "checklist": "Identity Review Checklist", - "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", - "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", - "service": "Entra", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", + "service": "AVS", "severity": "Medio", - "text": "Use el token revocable de larga duración, almacene en caché el token y adquiera el token de forma silenciosa mediante la biblioteca de identidades de Microsoft", - "waf": "Fiabilidad" + "text": "Las operaciones de escalado siempre deben serializarse dentro de un único SDDC, ya que solo se puede realizar una operación de escalado a la vez (incluso cuando se utilizan varios clústeres)", + "waf": "Rendimiento" }, { - "checklist": "Identity Review Checklist", - "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", - "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", - "service": "AAD B2C", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", + "service": "AVS", "severity": "Medio", - "text": "Asegúrese de que los flujos de usuario de inicio de sesión estén respaldados y sean resistentes. Asegúrese de que se ha realizado una copia de seguridad del código que usa para iniciar sesión en los usuarios y se puede recuperar. Interfaces resilientes con procesos externos", - "waf": "Fiabilidad" + "text": "Considerar y validar las operaciones de escalado en soluciones de terceros utilizadas en la arquitectura (compatibles o no)", + "waf": "Rendimiento" }, { - "checklist": "Identity Review 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", + "service": "AVS", "severity": "Medio", - "text": "Los activos de marca personalizados deben estar alojados en una CDN", + "text": "Defina y aplique límites máximos de escalado vertical y horizontal para su entorno en las automatizaciones", "waf": "Rendimiento" }, { - "checklist": "Identity Review Checklist", - "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", - "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", - "service": "AAD B2C", - "severity": "Bajo", - "text": "Tener varios proveedores de identidad (es decir, iniciar sesión con sus cuentas de Microsoft, Google, Facebook)", - "waf": "Fiabilidad" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", + "service": "AVS", + "severity": "Medio", + "text": "Implemente reglas de supervisión para supervisar las operaciones de escalado automatizadas y supervisar el éxito y el fracaso para permitir respuestas adecuadas (automatizadas)", + "waf": "Operaciones" }, { - "checklist": "Identity Review 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", - "severity": "Medio", - "text": "Siga las reglas de la máquina virtual para la alta disponibilidad en el nivel de máquina virtual (discos premium, dos o más en una región, en diferentes zonas de disponibilidad)", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c5972cd4-cd21-4b07-9036-f5e6b4bfd3d5", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "AVS", + "severity": "Alto", + "text": "Al usar MON, tenga en cuenta los límites de las máquinas virtuales configuradas simultáneamente (límite de MON para HCX [400 - estándar, 1000 - dispositivo más grande])", + "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", "waf": "Fiabilidad" }, { - "checklist": "Identity Review 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", - "severity": "Medio", - "text": "¡No repliques! La replicación puede crear problemas con la sincronización de directorios", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "be1f38cf-03a8-422b-b463-cbbbc8ac299e", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "AVS", + "severity": "Alto", + "text": "Al usar MON, no puede habilitar MON en más de 100 extensiones de red", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", "waf": "Fiabilidad" }, { - "checklist": "Identity Review 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", + "service": "AVS", "severity": "Medio", - "text": "Tener activo-activo para varias regiones", - "waf": "Fiabilidad" + "text": "Si utiliza una conexión VPN para migraciones, ajuste el tamaño de su MTU en consecuencia.", + "waf": "Rendimiento" }, { - "checklist": "Identity Review Checklist", - "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e614658d-d457-4e92-9139-b821102cad6e", + "service": "AVS", "severity": "Medio", - "text": "Adición de stamps de servicio de dominio de Azure AD a regiones y ubicaciones adicionales", - "waf": "Fiabilidad" + "text": "En el caso de las regiones de baja conectividad que se conectan a Azure (500 Mbps o menos), considere la posibilidad de implementar el dispositivo de optimización de WAN de HCX", + "waf": "Rendimiento" }, { - "checklist": "Identity Review Checklist", - "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", + "service": "AVS", "severity": "Medio", - "text": "Uso de conjuntos de réplicas para recuperación ante desastres", + "text": "Asegúrese de que las migraciones se inicien desde el dispositivo local y NO desde el dispositivo en la nube (NO realice una migración inversa)", "waf": "Fiabilidad" }, { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency checklist", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", + "service": "AVS", + "severity": "Medio", + "text": "Cuando se usa Azure NetApp Files para ampliar el almacenamiento de Azure VMware Solution, considere la posibilidad de usarlo como almacén de datos de VMware en lugar de adjuntarlo directamente a una máquina virtual.", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bff4564b-0d93-44a3-98b2-63e7dd60513a", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", + "service": "AVS", + "severity": "Medio", + "text": "Asegúrese de que se usa una puerta de enlace de ExpressRoute dedicada para soluciones de almacenamiento de datos externos", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "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", + "severity": "Medio", + "text": "Asegúrese de que FastPath está habilitado en la puerta de enlace de ExpressRoute que se usa para las soluciones de almacenamiento de datos externos", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "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", + "severity": "Alto", + "text": "Si utiliza un clúster ampliado, asegúrese de que la solución de recuperación ante desastres seleccionada sea compatible con el proveedor", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", + "service": "AVS", + "severity": "Alto", + "text": "Si utiliza un clúster ampliado, asegúrese de que el Acuerdo de Nivel de Servicio proporcionado cumpla sus requisitos", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", + "service": "AVS", + "severity": "Alto", + "text": "Si usa un clúster extendido, asegúrese de que ambos circuitos ExpressRoute están conectados al centro de conectividad.", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", + "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", + "service": "AVS", + "severity": "Alto", + "text": "Si usa un clúster extendido, asegúrese de que ambos circuitos ExpressRoute tengan habilitado GlobalReach.", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", + "service": "AVS", + "severity": "Alto", + "text": "Haga que la configuración de tolerancia ante desastres del sitio se considere y cambie correctamente para su negocio si es necesario.", + "waf": "Fiabilidad" + }, + { + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency checklist", "guid": "65285269-440b-44be-9d3e-0844276d4bdc", "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-zone-redundancy", "service": "Redis", @@ -8469,528 +8031,966 @@ "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Azure Functions", - "severity": "Alto", - "text": "Seleccione el plan de hospedaje de funciones adecuado en función de los requisitos de su empresa y SLO", - "waf": "Fiabilidad" + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Azure Event Hub proporciona cifrado de datos en reposo. Si usa su propia clave, los datos se siguen cifrando con la clave administrada por Microsoft, pero además la clave administrada por Microsoft se cifrará con la clave administrada por el cliente. ", + "guid": "7aaf12e7-b94e-4f6e-847d-2d92981b1cd6", + "link": "https://learn.microsoft.com/azure/event-hubs/configure-customer-managed-key", + "service": "Event Hubs", + "severity": "Bajo", + "text": "Usar la opción de clave administrada por el cliente en el cifrado de datos en reposo cuando sea necesario", + "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Azure Functions", - "severity": "Alto", - "text": "Aproveche las zonas de disponibilidad cuando corresponda regionalmente (no disponible para el nivel de consumo)", - "waf": "Fiabilidad" + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Los espacios de nombres de Azure Event Hubs permiten a los clientes enviar y recibir datos con TLS 1.0 y versiones posteriores. Para aplicar medidas de seguridad más estrictas, puede configurar el espacio de nombres de Event Hubs para requerir que los clientes envíen y reciban datos con una versión más reciente de TLS. Si un espacio de nombres de Event Hubs requiere una versión mínima de TLS, se producirá un error en las solicitudes realizadas con una versión anterior. ", + "guid": "d2f54b29-769e-43a6-a0e7-828ac936657e", + "link": "https://learn.microsoft.com/azure/event-hubs/transport-layer-security-configure-minimum-version", + "service": "Event Hubs", + "severity": "Medio", + "text": "Aplicar una versión mínima requerida de Seguridad de la capa de transporte (TLS) para las solicitudes ", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Al crear un espacio de nombres de Event Hubs, se crea automáticamente una regla de directiva denominada RootManageSharedAccessKey para el espacio de nombres. Esta directiva tiene permisos de administración para todo el espacio de nombres. Se recomienda tratar esta regla como una cuenta raíz administrativa y no usarla en la aplicación. Se recomienda usar AAD como proveedor de autenticación con RBAC. ", + "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", "severity": "Medio", - "text": "Considere la posibilidad de una estrategia de recuperación ante desastres entre regiones para cargas de trabajo críticas", - "waf": "Fiabilidad" + "text": "Evite usar la cuenta raíz cuando no sea necesario", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "Azure Functions", - "severity": "Alto", - "text": "Si se implementa en un entorno aislado, use o migre a App Service Environment (ASE) v3", - "waf": "Fiabilidad" + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Las identidades administradas para los recursos de Azure pueden autorizar el acceso a los recursos de Event Hubs mediante credenciales de Azure AD desde aplicaciones que se ejecutan en Azure Virtual Machines (VM), aplicaciones de funciones, conjuntos de escalado de máquinas virtuales y otros servicios. Mediante el uso de identidades administradas para los recursos de Azure junto con la autenticación de Azure AD, puede evitar el almacenamiento de credenciales con las aplicaciones que se ejecutan en la nube. ", + "guid": "3a365a5c-7acb-4e48-abd5-4cd79f2e8776", + "link": "https://learn.microsoft.com/azure/event-hubs/authenticate-managed-identity?tabs=latest", + "service": "Event Hubs", + "severity": "Medio", + "text": "Siempre que sea posible, la aplicación debe usar una identidad administrada para autenticarse en Azure Event Hub. Si no es así, considere la posibilidad de tener la credencial de almacenamiento (SAS, credencial de entidad de servicio) en Azure Key Vault o en un servicio equivalente", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "Azure Functions", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Al crear permisos, proporcione un control específico sobre el acceso de un cliente al Centro de eventos de Azure. Los permisos del Centro de eventos de Azure pueden y deben limitarse al nivel de recurso individual, por ejemplo, grupo de consumidores, entidad del centro de eventos, espacios de nombres del centro de eventos, 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", "severity": "Alto", - "text": "Asegúrese de que \"Siempre activado\" esté habilitado para todas las aplicaciones de funciones que se ejecutan en el plan de App Service", - "waf": "Fiabilidad" + "text": "Uso de RBAC de plano de datos con privilegios mínimos", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Los registros de recursos del Centro de eventos de Azure incluyen registros operativos, registros de red virtual y registros de Kafka. Los registros de auditoría en tiempo de ejecución capturan información de diagnóstico agregada para todas las operaciones de acceso al plano de datos (como eventos de envío o recepción) en Event Hubs.", + "guid": "b38b875b-a1cf-4104-a900-3a4d3ce474db", + "link": "https://learn.microsoft.com/azure/event-hubs/monitor-event-hubs-reference", + "service": "Event Hubs", "severity": "Medio", - "text": "Empareje una aplicación de funciones con su propia cuenta de almacenamiento. Intente no volver a usar las cuentas de almacenamiento para las aplicaciones de funciones a menos que estén estrechamente acopladas", - "waf": "Fiabilidad" + "text": "Habilite el registro para la investigación de seguridad. Use Azure Monitor para capturar métricas y registros, como registros de recursos, registros de auditoría en tiempo de ejecución y registros de Kafka", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "Azure Functions", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "De forma predeterminada, Azure Event Hub tiene una dirección IP pública y es accesible a través de Internet. Los puntos de conexión privados permiten el tráfico entre la red virtual y Azure Event Hubs a través de la red troncal de Microsoft. Además de eso, debe deshabilitar los puntos de conexión públicos si no se usan. ", + "guid": "5abca2a4-eda1-4dae-8cc9-5d48c6b791dc", + "link": "https://learn.microsoft.com/azure/event-hubs/private-link-service", + "service": "Event Hubs", "severity": "Medio", - "text": "Aproveche Azure DevOps o GitHub para optimizar la CI/CD y proteger el código de la aplicación de funciones", - "waf": "Operaciones" + "text": "Considere la posibilidad de usar puntos de conexión privados para acceder al Centro de eventos de Azure y deshabilitar el acceso a la red pública cuando corresponda.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization Checklist", - "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", - "service": "Azure Monitor", - "text": "Reglas de recopilación de datos en Azure Monitor -https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview", - "training": "https://azure.microsoft.com/pricing/reservations/", - "waf": "Costar" + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Con el firewall IP, puede restringir aún más el punto de conexión público a solo un conjunto de direcciones IPv4 o rangos de direcciones IPv4 en notación CIDR (Classless Inter-Domain Routing). ", + "guid": "a0e6c465-89e5-458b-a37d-3974d1112dbd", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-ip-filtering", + "service": "Event Hubs", + "severity": "Medio", + "text": "Considere la posibilidad de permitir solo el acceso al espacio de nombres del Centro de eventos de Azure desde direcciones IP o intervalos específicos", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "text": "Comprobar las instancias de copia de seguridad con la fuente de datos subyacente no encontrada", - "waf": "Costar" + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "31d41e36-11c8-417b-8afb-c410d4391898", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-AEH_v1.docx", + "service": "Event Hubs", + "severity": "Medio", + "text": "Aproveche el Manual de Resiliencia de los TLC", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "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", - "text": "Eliminar o archivar servicios no asociados (discos, NIC, direcciones IP, etc.)", - "waf": "Costar" + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": " Esto se activará automáticamente para un nuevo espacio de nombres EH creado desde el portal con SKU Premium, Dedicado o Estándar en una región habilitada para zonas. Tanto los metadatos de EH como los propios datos de eventos se replican en todas las zonas", + "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", + "severity": "Alto", + "text": "Aproveche las zonas de disponibilidad si corresponde regionalmente", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "text": "Considere un buen equilibrio entre el almacenamiento de recuperación del sitio y la copia de seguridad para aplicaciones que no son críticas", - "waf": "Costar" + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "20b56c56-ad58-4519-8f82-735c586bb281", + "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", + "service": "Event Hubs", + "severity": "Medio", + "text": "Usa las SKU Premium o Dedicadas para obtener un rendimiento predecible", + "waf": "Fiabilidad" + }, + { + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "La característica integrada de recuperación ante desastres geográfica, cuando está habilitada, garantiza que toda la configuración de un espacio de nombres (Event Hubs, grupos de consumidores y configuración) se replique continuamente desde un espacio de nombres principal a un espacio de nombres secundario, y permite un movimiento de conmutación por error de una sola vez del principal al secundario en cualquier momento. La característica Activo/Pasivo está diseñada para facilitar la recuperación y el abandono de una región de Azure con errores sin tener que cambiar las configuraciones de la aplicación", + "guid": "dc15a1c0-75ee-49f1-90ac-ccd579376bcd", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-geo-dr?tabs=portal", + "service": "Event Hubs", + "severity": "Alto", + "text": "Planeación de la recuperación ante desastres geográfica mediante la configuración pasiva activa", + "waf": "Fiabilidad" + }, + { + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Debe utilizarse para configuraciones de recuperación ante desastres en las que no se puede tolerar una interrupción o pérdida de datos de eventos en la región inactiva. En estos casos, siga las instrucciones de replicación y no use la capacidad de recuperación ante desastres geográfica integrada (activa/pasiva). Con Activo/Activo, mantenga varios centros de eventos en diferentes regiones y espacios de nombres, y los eventos se replicarán entre los centros", + "guid": "6e31b67d-67ba-4591-89c0-9e805d597c7e", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-federation-overview", + "service": "Event Hubs", + "severity": "Medio", + "text": "En el caso de las aplicaciones críticas para la empresa, use la configuración Active Active", + "waf": "Fiabilidad" + }, + { + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", + "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", + "service": "Event Hubs", + "severity": "Medio", + "text": "Diseño de centros de eventos resilientes", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", + "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", + "service": "Logic Apps", + "severity": "Alto", + "text": "Seleccione el plan de hospedaje de aplicaciones lógicas adecuado en función de los requisitos empresariales y de SLO", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps 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", + "severity": "Alto", + "text": "Proteja las aplicaciones lógicas de errores de región con redundancia de zona y zonas de disponibilidad", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps 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", + "severity": "Alto", + "text": "Considere la posibilidad de una estrategia de recuperación ante desastres entre regiones para cargas de trabajo críticas", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", + "link": "https://learn.microsoft.com/azure/app-service/environment/intro", + "service": "Logic Apps", + "severity": "Alto", + "text": "Si se implementa en un entorno aislado, use o migre a App Service Environment (ASE) v3", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", + "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", + "service": "Logic Apps", + "severity": "Medio", + "text": "Aproveche Azure DevOps o GitHub para simplificar la CI/CD y proteger el código de la aplicación lógica", + "waf": "Operaciones" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Azure Functions", + "severity": "Alto", + "text": "Seleccione el plan de hospedaje de funciones adecuado en función de los requisitos de su empresa y SLO", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Azure Functions", + "severity": "Alto", + "text": "Aproveche las zonas de disponibilidad cuando corresponda regionalmente (no disponible para el nivel de consumo)", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "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", + "severity": "Medio", + "text": "Considere la posibilidad de una estrategia de recuperación ante desastres entre regiones para cargas de trabajo críticas", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "Azure Functions", + "severity": "Alto", + "text": "Si se implementa en un entorno aislado, use o migre a App Service Environment (ASE) v3", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "Azure Functions", + "severity": "Alto", + "text": "Asegúrese de que \"Siempre activado\" esté habilitado para todas las aplicaciones de funciones que se ejecutan en el plan de App Service", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "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", + "severity": "Medio", + "text": "Empareje una aplicación de funciones con su propia cuenta de almacenamiento. Intente no volver a usar las cuentas de almacenamiento para las aplicaciones de funciones a menos que estén estrechamente acopladas", + "waf": "Fiabilidad" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "Azure Functions", + "severity": "Medio", + "text": "Aproveche Azure DevOps o GitHub para optimizar la CI/CD y proteger el código de la aplicación de funciones", + "waf": "Operaciones" + }, + { + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Si usa certificados TLS administrados por el cliente con Azure Front Door, use la versión de certificado \"más reciente\". Reduzca el riesgo de interrupciones causadas por la renovación manual de certificados", + "waf": "Operaciones" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Asegúrese de que usa la SKU de Application Gateway v2", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Asegúrese de que usa la SKU estándar para los equilibradores de carga de Azure", + "waf": "Seguridad" + }, + { + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "guid": "9432621a-8397-4654-a882-5bc856b7ef83", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", + "service": "Load Balancer", + "severity": "Medio", + "text": "Asegúrese de que las direcciones IP de front-end de los equilibradores de carga sean con redundancia de zona (a menos que necesite front-end zonal).", + "waf": "Seguridad" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Application Gateways v2 debe implementarse en subredes con prefijos IP iguales o mayores que /24", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Seguridad" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "description": "La administración de proxies inversos en general y WAF en particular está más cerca de la aplicación que de la red, por lo que pertenecen a la misma suscripción que la aplicación. La centralización de Application Gateway y WAF en la suscripción de conectividad puede ser correcta si la administra un solo equipo.", + "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "App Gateway", + "severity": "Medio", + "text": "Implemente Azure Application Gateway v2 o NVA de asociados que se usan para proxy de conexiones HTTP(S) entrantes dentro de la red virtual de la zona de aterrizaje y con las aplicaciones que protegen.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Seguridad" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "App Gateway", + "severity": "Medio", + "text": "Utilice una red DDoS o planes de protección IP para todas las direcciones IP públicas en las zonas de aterrizaje de aplicaciones.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Seguridad" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Configure el escalado automático con una cantidad mínima de instancias de dos.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Fiabilidad" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Implementación de Application Gateway en zonas de disponibilidad", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Fiabilidad" + }, + { + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Front Door", + "severity": "Medio", + "text": "Use Azure Front Door con directivas de WAF para entregar y ayudar a proteger aplicaciones HTTP/S globales que abarcan varias regiones de Azure.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Seguridad" + }, + { + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "3f29812b-2363-4cef-b179-b599de0d5973", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "Front Door", + "severity": "Medio", + "text": "Al usar Front Door y Application Gateway para ayudar a proteger las aplicaciones HTTP/S, use directivas de WAF en Front Door. Bloquee Application Gateway para recibir tráfico solo de Front Door.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization 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", - "text": "Compruebe las oportunidades de gasto y ahorro entre las 40 áreas de trabajo de Log Analytics diferentes: use diferentes retenciones y recopilación de datos para áreas de trabajo que no sean de producción: cree un límite diario para el reconocimiento y el tamaño de los niveles: si establece un límite diario, además de crear una alerta cuando se alcance el límite, asegúrese de crear también una regla de alerta para que se le notifique cuando se alcance algún porcentaje (90 %, por ejemplo). - Considere la posibilidad de transformar el espacio de trabajo si es posible - 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": "Costar" + "ammp": true, + "arm-service": "microsoft.network/trafficManagerProfiles", + "checklist": "Azure Application Delivery Networking", + "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Traffic Manager", + "severity": "Alto", + "text": "Use el Administrador de tráfico para entregar aplicaciones globales que abarquen protocolos distintos de HTTP/S.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization 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", - "text": "Aplique una política de purga de registros y automatización (si es necesario, los registros se pueden mover al almacenamiento en frío)", - "training": "https://www.youtube.com/watch?v=nHQYcYGKuyw", - "waf": "Costar" + "checklist": "Azure Application Delivery Networking", + "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "Entra", + "severity": "Bajo", + "text": "Si los usuarios solo necesitan acceso a aplicaciones internas, ¿se ha considerado Microsoft Entra ID Application Proxy como una alternativa a Azure Virtual Desktop (AVD)?", + "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "text": "Compruebe que los discos son realmente necesarios, si no: eliminar. Si son necesarios, busque niveles de almacenamiento más bajos o use una copia de seguridad:", - "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/manage-automation", - "waf": "Costar" + "checklist": "Azure Application Delivery Networking", + "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "Entra", + "severity": "Medio", + "text": "Para reducir el número de puertos de firewall abiertos para las conexiones entrantes en la red, considere la posibilidad de usar el proxy de aplicación de identificador de Microsoft Entra para proporcionar a los usuarios remotos acceso seguro y autenticado a las aplicaciones internas.", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization 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", - "text": "Considere la posibilidad de mover el almacenamiento no utilizado al nivel inferior, con reglas personalizadas: 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": "Costar" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Implemente la directiva de WAF para Front Door en modo de \"Prevención\" para que el firewall de aplicaciones web tome las medidas adecuadas para permitir o denegar el tráfico.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "VM", - "text": "Asegúrese de que el asesor está configurado para el tamaño correcto de la máquina virtual ", - "waf": "Costar" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Evite combinar Azure Traffic Manager y Azure Front Door.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "description": "comprobando la búsqueda de las licencias de categoría de contador en el análisis de costes", - "guid": "59ae568b-a38d-4498-9e22-13dbd7bb012f", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/manage/centralize-operations", - "service": "VM", - "text": "ejecutar el script en todas las máquinas virtuales de Windows 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: considere la posibilidad de implementar una directiva si las máquinas virtuales de Windows se crean con frecuencia", - "waf": "Costar" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Use el mismo nombre de dominio en Azure Front Door y en su origen. Los nombres de host no coincidentes pueden causar errores sutiles.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", - "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", - "service": "VM", - "text": " esto también se puede poner bajo AHUB si ya tiene licencias https://learn.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux?tabs=rhelpayg%2Crhelbyos%2CrhelEnablebyos%2Crhelcompliance", - "waf": "Costar" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Bajo", + "text": "Deshabilite los sondeos de estado cuando solo haya un origen en un grupo de origen de Azure Front Door.", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", - "service": "VM", - "text": "Consolide familias de máquinas virtuales reservadas con la opción de flexibilidad (no más de 4-5 familias)", - "training": "https://learn.microsoft.com/azure/automation/automation-solution-vm-management", - "waf": "Costar" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", + "service": "Front Door", + "severity": "Medio", + "text": "Seleccione puntos de conexión de sondeo de estado correctos para Azure Front Door. Considere la posibilidad de crear puntos de conexión de estado que comprueben todas las dependencias de la aplicación.", + "waf": "Fiabilidad" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "text": "Uso de Azure Reserved Instances: esta característica le permite reservar máquinas virtuales durante un período de 1 o 3 años, lo que proporciona un importante ahorro de costos en comparación con los precios de pago por uso.", - "waf": "Costar" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Bajo", + "text": "Use sondeos de estado de HEAD con Azure Front Door para reducir el tráfico que Front Door envía a la aplicación.", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", - "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", - "service": "VM", - "text": "Solo se pueden reservar discos más grandes => 1 TiB -", - "waf": "Costar" + "ammp": true, + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Use Azure NAT Gateway en lugar de las reglas de salida de Load Balancer para mejorar la escalabilidad de SNAT", + "waf": "Fiabilidad" + }, + { + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Use certificados TLS administrados con Azure Front Door. Reduzca los costos operativos y el riesgo de interrupciones debido a las renovaciones de certificados.", + "waf": "Operaciones" + }, + { + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Defina la configuración de WAF de Azure Front Door como código. Mediante el uso de código, puede adoptar más fácilmente una nueva versión del conjunto de reglas y obtener protección adicional.", + "waf": "Operaciones" + }, + { + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", + "service": "Front Door", + "severity": "Alto", + "text": "Use TLS de un extremo a otro con Azure Front Door. Use TLS para las conexiones de los clientes a Front Door y de Front Door al origen.", + "waf": "Seguridad" + }, + { + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", + "service": "Front Door", + "severity": "Medio", + "text": "Use el redireccionamiento de HTTP a HTTPS con Azure Front Door. Apoye a los clientes más antiguos redirigiéndolos a una solicitud HTTPS automáticamente.", + "waf": "Seguridad" + }, + { + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", + "service": "Front Door", + "severity": "Alto", + "text": "Habilite el WAF de Azure Front Door. Proteja su aplicación de una variedad de ataques.", + "waf": "Seguridad" + }, + { + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Ajuste el WAF de Azure Front Door para su carga de trabajo configurando el WAF en modo de detección para reducir y corregir las detecciones de falsos positivos.", + "waf": "Seguridad" + }, + { + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Habilite la característica de inspección del cuerpo de la solicitud habilitada en la directiva WAF de Azure Front Door.", + "waf": "Seguridad" + }, + { + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Habilite los conjuntos de reglas predeterminadas de WAF de Azure Front Door. Los conjuntos de reglas predeterminados detectan y bloquean ataques comunes.", + "waf": "Seguridad" + }, + { + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Habilite el conjunto de reglas de protección contra bots de WAF de Azure Front Door. Las reglas de bots detectan bots buenos y malos.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", - "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", - "service": "VM", - "text": "Después de la optimización del tamaño correcto", - "waf": "Costar" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Use la versión más reciente del conjunto de reglas de Azure Front Door WAF. Las actualizaciones del conjunto de reglas se actualizan periódicamente para tener en cuenta el panorama actual de amenazas.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Sql/servers", - "checklist": "Cost Optimization Checklist", - "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", - "service": "Azure SQL", - "text": "Compruebe si corresponde y aplique la política/cambio 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": "Costar" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Agregue la limitación de velocidad al WAF de Azure Front Door. La limitación de velocidad bloquea a los clientes que envían accidental o intencionalmente grandes cantidades de tráfico en un corto período de tiempo.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", - "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", - "service": "VM", - "text": "El descuento de la parte de la licencia VM + (ahub + 3YRI) es de alrededor del 70% de descuento", - "waf": "Costar" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Use un umbral alto para los límites de frecuencia de WAF de Azure Front Door. Los umbrales de límite de velocidad altos evitan el bloqueo del tráfico legítimo, a la vez que proporcionan protección contra un número extremadamente alto de solicitudes que podrían sobrecargar su infraestructura. ", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "text": "Considere la posibilidad de utilizar un VMSS para satisfacer la demanda en lugar de un tamaño fijo", - "waf": "Costar" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Bajo", + "text": "Si no espera tráfico de todas las regiones geográficas, utilice filtros geográficos para bloquear el tráfico de países no esperados.", + "waf": "Seguridad" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Cost Optimization Checklist", - "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "AKS", - "text": "Use el escalador automático de AKS para que coincida con el uso de los clústeres (asegúrese de que los requisitos de los pods coincidan con el escalador)", - "waf": "Costar" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Especifique la ubicación desconocida (ZZ) al filtrar geográficamente el tráfico con el WAF de Azure Front Door. Evite bloquear accidentalmente solicitudes legítimas cuando las direcciones IP no puedan coincidir geográficamente.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "text": "Mover los puntos de recuperación al archivo de almacén cuando corresponda (Validar)", - "training": "https://azure.microsoft.com/pricing/reservations/", - "waf": "Costar" + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Habilite el conjunto de reglas de protección contra bots de WAF de Azure Application Gateway. Las reglas de bots detectan bots buenos y malos.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Databricks/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", - "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", - "service": "Databricks", - "text": "Considere la posibilidad de usar máquinas virtuales de acceso puntual con reserva siempre que sea posible. Considere la posibilidad de la terminación automática de clústeres.", - "waf": "Costar" + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Habilite la característica de inspección del cuerpo de la solicitud habilitada en la directiva WAF de Azure Application Gateway.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", - "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", - "service": "Azure Functions", - "text": "Funciones - Reutilizar conexiones", - "training": "https://learn.microsoft.com/azure/cost-management-billing/reservations/reservation-apis?toc=%2Fazure%2Fcost-management-billing%2Ftoc.json", - "waf": "Costar" + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", + "service": "App Gateway", + "severity": "Alto", + "text": "Ajuste el WAF de Azure Application Gateway en modo de detección para la carga de trabajo. Reduzca las detecciones de falsos positivos.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", - "link": "https://learn.microsoft.com/azure/automation/update-management/overview", - "service": "Azure Functions", - "text": "Funciones: almacenar datos en caché localmente", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", - "waf": "Costar" + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Implemente la directiva de WAF para Application Gateway en modo \"Prevención\".", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", - "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", - "service": "Azure Functions", - "text": "Funciones - Arranques en frío: utilice la funcionalidad 'Ejecutar desde el paquete'. De esta manera, el código se descarga como un único archivo zip. Esto puede, por ejemplo, resultar en mejoras significativas con las funciones de Javascript, que tienen muchos módulos de nodos. Utilice herramientas específicas del lenguaje para reducir el tamaño del paquete, por ejemplo, aplicaciones Javascript que sacuden el árbol.", - "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", + "service": "App Gateway", + "severity": "Medio", + "text": "Agregue la limitación de velocidad al WAF de Azure Application Gateway. La limitación de velocidad bloquea a los clientes que envían accidental o intencionalmente grandes cantidades de tráfico en un corto período de tiempo.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "Azure Functions", - "text": "Funciones - Mantén tus funciones calientes", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Use un umbral alto para los límites de velocidad de WAF de Azure Application Gateway. Los umbrales de límite de velocidad altos evitan el bloqueo del tráfico legítimo, a la vez que proporcionan protección contra un número extremadamente alto de solicitudes que podrían sobrecargar su infraestructura. ", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "Azure Functions", - "text": "Al usar el escalado automático con diferentes funciones, es posible que haya uno que controle todo el escalado automático para todos los recursos: considere la posibilidad de moverlo a un plan de consumo independiente (y considere un plan superior para la CPU)", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Bajo", + "text": "Si no espera tráfico de todas las regiones geográficas, utilice filtros geográficos para bloquear el tráfico de países no esperados.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", - "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", - "service": "Azure Functions", - "text": "Las aplicaciones de funciones de un plan determinado se escalan juntas, por lo que cualquier problema con el escalado puede afectar a todas las aplicaciones del plan.", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", + "service": "App Gateway", + "severity": "Medio", + "text": "Especifique la ubicación desconocida (ZZ) al filtrar geográficamente el tráfico con el WAF de Azure Application Gateway. Evite bloquear accidentalmente solicitudes legítimas cuando las direcciones IP no puedan coincidir geográficamente.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", - "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", - "service": "Azure Functions", - "text": "¿Se me factura por el \"tiempo de espera\"? Esta pregunta se suele formular en el contexto de una función de C# que realiza una operación asincrónica y espera el resultado, por ejemplo, await Task.Delay(1000) o await client. GetAsync('http://google.com'). La respuesta es sí: el segundo cálculo de GB se basa en la hora de inicio y finalización de la función y el uso de memoria durante ese período. Lo que realmente sucede durante ese tiempo en términos de actividad de la CPU no se tiene en cuenta en el cálculo. Una excepción a esta regla es si está utilizando funciones duraderas. No se le facturará por el tiempo empleado en las esperas en las funciones de orquestador.aplique técnicas de modelado de la demanda siempre que sea posible (¿entornos de desarrollo?) https://github.com/Azure-Samples/functions-csharp-premium-scaler", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Use la versión más reciente del conjunto de reglas de WAF de Azure Application Gateway. Las actualizaciones del conjunto de reglas se actualizan periódicamente para tener en cuenta el panorama actual de amenazas.", + "waf": "Seguridad" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Cost Optimization Checklist", - "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "Front Door", - "text": "Frontdoor: desactivar la página principal predeterminadaEn la configuración de la aplicación de la aplicación, establezca AzureWebJobsDisableHomepage en true. Esto devolverá un 204 (sin contenido) al PoP para que solo se devuelvan los datos del encabezado.", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Agregue la configuración de diagnóstico para guardar los registros de WAF de Azure Application Gateway.", + "waf": "Operaciones" }, { "arm-service": "microsoft.network/frontdoors", - "checklist": "Cost Optimization Checklist", - "guid": "8dd458e9-2713-49b8-8110-2dbd6eaf11e6", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-setup-guide/monitoring-reporting?tabs=AzureMonitor", + "checklist": "Azure Application Delivery Networking", + "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", - "text": "Frontdoor: ruta a algo que no devuelve nada. Configure una función, un proxy de función o agregue una ruta en la aplicación web que devuelva 200 (correctamente) y envíe contenido mínimo o nulo. La ventaja de esto es que podrá cerrar la sesión cuando se llame.", - "waf": "Costar" + "severity": "Medio", + "text": "Agregue la configuración de diagnóstico para guardar los registros de WAF de Azure Front Door.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", - "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", - "service": "Storage", - "text": "Considere la posibilidad de archivar niveles para los datos menos utilizados", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Envíe registros de WAF de Azure Application Gateway a Microsoft Sentinel.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", - "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", - "service": "VM", - "text": "Compruebe los tamaños de disco en los que el tamaño no coincida con el nivel (es decir, un disco de 513 GiB pagará un P30 (1 TiB) y considere la posibilidad de cambiar el tamaño", - "waf": "Costar" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Envíe registros de WAF de Azure Front Door a Microsoft Sentinel.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", - "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", - "service": "Storage", - "text": "Considere la posibilidad de utilizar un SSD estándar en lugar de Premium o Ultra siempre que sea posible", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Defina la configuración de WAF de Azure Application Gateway como código. Mediante el uso de código, puede adoptar más fácilmente una nueva versión del conjunto de reglas y obtener protección adicional.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization 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", - "text": "En el caso de las cuentas de almacenamiento, asegúrese de que el nivel elegido no suma cargos por transacción (puede ser más barato pasar al siguiente nivel)", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", + "service": "App Gateway", + "severity": "Medio", + "text": "Utilice las políticas de WAF en lugar de la configuración de WAF heredada.", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization Checklist", - "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", - "service": "Site Recovery", - "text": "Para ASR, considere la posibilidad de usar discos SSD estándar si el RPO/RTO y el rendimiento de replicación lo permiten", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", + "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", + "service": "App Gateway", + "severity": "Medio", + "text": "Filtre el tráfico entrante en los back-end para que solo acepten conexiones de la subred de Application Gateway, por ejemplo, con grupos de seguridad de red.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", - "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", - "service": "Storage", - "text": "Cuentas de almacenamiento: compruebe el nivel de acceso frecuente o GRS necesario", - "waf": "Costar" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", + "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", + "service": "Front Door", + "severity": "Medio", + "text": "Asegúrese de que los orígenes solo reciben tráfico de la instancia de Azure Front Door.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", - "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", - "service": "VM", - "text": "Discos: valide el uso de discos SSD Premium en todas partes: por ejemplo, los que no son de producción podrían cambiar a SSD estándar o SSD Premium bajo demanda ", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", + "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", + "service": "App Gateway", + "severity": "Alto", + "text": "Debe cifrar el tráfico a los servidores backend.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", - "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", - "service": "Synapse", - "text": "Cree presupuestos para administrar los costos y cree alertas que notifiquen automáticamente a las partes interesadas sobre anomalías en el gasto y riesgos de gasto excesivo.", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", + "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", + "service": "App Gateway", + "severity": "Alto", + "text": "Debe utilizar un firewall de aplicaciones web.", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "Synapse", - "text": "Exporte los datos de costos a una cuenta de almacenamiento para realizar análisis de datos adicionales.", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", + "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", + "service": "App Gateway", + "severity": "Medio", + "text": "Redirigir HTTP a HTTPS", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "Synapse", - "text": "Controle los costos de un grupo de SQL dedicado pausando el recurso cuando no esté en uso.", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Medio", + "text": "Utilice cookies administradas por puerta de enlace para dirigir el tráfico de una sesión de usuario al mismo servidor para su procesamiento", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", - "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", - "service": "Synapse", - "text": "Habilite la función de pausa automática de Apache Spark sin servidor y establezca el valor de tiempo de espera en consecuencia.", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", + "service": "App Gateway", + "severity": "Alto", + "text": "Habilite el drenaje de conexiones durante las actualizaciones de servicio planeadas para evitar la pérdida de conexión con los miembros existentes del grupo de back-end", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization 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", - "text": "Cree varias definiciones de grupo de Apache Spark de varios tamaños.", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", + "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", + "service": "App Gateway", + "severity": "Bajo", + "text": "Cree páginas de error personalizadas para mostrar una experiencia de usuario personalizada", + "waf": "Operaciones" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization 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", - "text": "Compre unidades de confirmación (SCU) de Azure Synapse durante un año con un plan de compra anticipada para ahorrar en los costos de Azure Synapse Analytics.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", + "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", + "service": "App Gateway", + "severity": "Medio", + "text": "Edite las solicitudes HTTP y los encabezados de respuesta para facilitar el enrutamiento y el intercambio de información entre el cliente y el servidor", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", - "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", - "service": "VM", - "text": "Uso de máquinas virtuales de acceso puntual para trabajos interrumpibles: se trata de máquinas virtuales por las que se puede pujar y comprar a un precio reducido, lo que proporciona una solución rentable para cargas de trabajo no críticas.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "App Gateway", + "severity": "Medio", + "text": "Configure Front Door para optimizar el enrutamiento del tráfico web global y el rendimiento y la confiabilidad del usuario final de primer nivel a través de una rápida conmutación por error global", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "544451e1-92d3-4442-a3c7-628637a551c5", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "29dcc19f-a8fa-4c35-8281-290577538793", "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "VM", - "text": "Ajustar el tamaño de todas las máquinas virtuales", - "waf": "Costar" + "service": "App Gateway", + "severity": "Medio", + "text": "Uso del equilibrio de carga de la capa de transporte", + "waf": "Rendimiento" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", - "service": "VM", - "text": "Intercambiar el tamaño de la máquina virtual con los tamaños normalizados y más recientes", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", + "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", + "service": "App Gateway", + "severity": "Medio", + "text": "Configure el enrutamiento basado en el host o el nombre de dominio para varias aplicaciones web en una sola puerta de enlace", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", - "text": "Ajustar el tamaño de las máquinas virtuales: comience con la supervisión del uso por debajo del 5 % y, a continuación, trabaje hasta el 40 %", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", + "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", + "service": "App Gateway", + "severity": "Medio", + "text": "Centralice la administración de certificados SSL para reducir la sobrecarga de cifrado y descifrado de una granja de servidores backend", + "waf": "Seguridad" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", - "text": "La inclusión de una aplicación en contenedores puede mejorar la densidad de la máquina virtual y ahorrar dinero en su escalado", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Costar" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", + "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", + "service": "App Gateway", + "severity": "Bajo", + "text": "Uso de Application Gateway para obtener compatibilidad nativa con los protocolos WebSocket y HTTP/2", + "waf": "Seguridad" } ], "metadata": { "name": "WAF checklist", - "timestamp": "August 05, 2024" + "timestamp": "August 08, 2024" }, "severities": [ { @@ -9005,7 +9005,7 @@ ], "status": [ { - "description": "Esta comprobación aún no se ha examinado", + "description": "Este control aún no se ha examinado", "name": "No verificado" }, { diff --git a/checklists/waf_checklist.ja.json b/checklists/waf_checklist.ja.json index 98fa01c14..000155a97 100644 --- a/checklists/waf_checklist.ja.json +++ b/checklists/waf_checklist.ja.json @@ -1,113 +1,33 @@ { "items": [ { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", - "severity": "高い", - "text": "2 つのレプリカで読み取り操作の可用性を 99.9% にする", - "waf": "確実" - }, - { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", - "severity": "中程度", - "text": "3 つのレプリカで読み取り/書き込み操作の可用性を 99.9% に向上させる", - "waf": "確実" - }, - { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", - "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", - "service": "Cognitive Search", - "severity": "高い", - "text": "読み取りレプリカや書き込みレプリカを有効にすることでアベイラビリティーゾーンを活用する", - "waf": "確実" - }, - { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review 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", - "severity": "中程度", - "text": "リージョンの冗長性については、地理的リージョン間で検索インデックスをレプリケートする自動化された方法が提供されないため、検索用に 2 つ以上のリージョンにサービスを手動で作成します", - "waf": "確実" - }, - { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", - "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", - "service": "Cognitive Search", - "severity": "中程度", - "text": "複数のサービス間でデータを同期するには、複数のサービスでコンテンツを更新するためにインデクサーを使用するか、複数のサービスでコンテンツの更新をプッシュするために REST API を使用する", - "waf": "確実" - }, - { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review 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", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review Checklist", + "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", + "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", + "service": "Azure MySQL", "severity": "中程度", - "text": "Azure Traffic Manager を使用して要求を調整する", - "waf": "確実" - }, - { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", - "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", - "service": "Cognitive Search", - "severity": "高い", - "text": "Azure Cognitive Search インデックスをバックアップおよび復元します。このサンプル コードを使用して、インデックス定義とスナップショットを一連の Json ファイルにバックアップします", + "text": "フレキシブル サーバーの活用", "waf": "確実" }, { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency checklist", - "guid": "65285269-440b-44be-9d3e-0844276d4bdc", - "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-zone-redundancy", - "service": "Redis", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review 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", "severity": "高い", - "text": "Azure Cache for Redis のゾーン冗長を有効にします。Azure Cache for Redis では、Premium レベルと Enterprise レベルでゾーン冗長構成がサポートされています。ゾーン冗長キャッシュでは、同じリージョン内の異なる Azure Availability Zones にノードを配置できます。これにより、データセンターや AZ の停止が単一障害点として排除され、キャッシュの全体的な可用性が向上します。", - "waf": "確実" - }, - { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency 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", - "severity": "中程度", - "text": "Azure Cache for Redis インスタンスのデータ永続化を構成します。キャッシュ データはメモリに格納されるため、まれに複数のノードで計画外の障害が発生すると、すべてのデータがドロップされる可能性があります。データの完全な損失を回避するために、Redis 永続化では、メモリ内データのスナップショットを定期的に取得し、ストレージ アカウントに格納できます。", - "waf": "確実" - }, - { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency 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", - "severity": "中程度", - "text": "geo 冗長ストレージ アカウントを使用して Azure Cache for Redis データを保持するか、geo 冗長性を使用できない場合はゾーン冗長を使用します", + "text": "Availability Zones (地域的に適用可能な場合) を活用する", "waf": "確実" }, { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency checklist", - "guid": "a8c26c9b-32ab-45bd-bc69-98a135e33789", - "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-geo-replication", - "service": "Redis", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review 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", "severity": "中程度", - "text": "Premium Azure Cache for Redis インスタンスのパッシブ geo レプリケーションを構成します。geo レプリケーションは、2 つ以上の Azure Cache for Redis インスタンス (通常は 2 つの Azure リージョンにまたがる) をリンクするためのメカニズムです。geo レプリケーションは、主にリージョン間のディザスター リカバリー用に設計されています。2 つの Premium レベルのキャッシュ インスタンスは、プライマリ キャッシュへの読み取りと書き込みを提供する方法で geo レプリケーションを介して接続され、そのデータはセカンダリ キャッシュにレプリケートされます。", + "text": "リージョン間の DR シナリオでのデータイン レプリケーションの活用", "waf": "確実" }, { @@ -270,7401 +190,7843 @@ "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", - "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", - "service": "AKS", - "severity": "低い", - "text": "AKS Windows ワークロードで必要な場合は、HostProcess コンテナーを使用できます", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", + "severity": "高い", + "text": "2 つのレプリカで読み取り操作の可用性を 99.9% にする", "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", - "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", - "service": "AKS", - "severity": "低い", - "text": "イベント ドリブン ワークロードを実行する場合は KEDA を使用します", - "waf": "パフォーマンス" + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", + "severity": "中程度", + "text": "3 つのレプリカで読み取り/書き込み操作の可用性を 99.9% に向上させる", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", - "link": "https://dapr.io/", - "service": "AKS", - "severity": "低い", - "text": "Dapr を使用してマイクロサービス開発を容易にする", - "waf": "オペレーションズ" + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", + "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", + "service": "Cognitive Search", + "severity": "高い", + "text": "読み取りレプリカや書き込みレプリカを有効にすることでアベイラビリティーゾーンを活用する", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "高い", - "text": "SLA でサポートされる AKS オファリングを使用する", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review 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", + "severity": "中程度", + "text": "リージョンの冗長性については、地理的リージョン間で検索インデックスをレプリケートする自動化された方法が提供されないため、検索用に 2 つ以上のリージョンにサービスを手動で作成します", "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", - "severity": "低い", - "text": "ポッドとデプロイ定義でのディスラプション バジェットの使用", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", + "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", + "service": "Cognitive Search", + "severity": "中程度", + "text": "複数のサービス間でデータを同期するには、複数のサービスでコンテンツを更新するためにインデクサーを使用するか、複数のサービスでコンテンツの更新をプッシュするために REST API を使用する", "waf": "確実" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure AKS Review", - "guid": "3c763963-7a55-42d5-a15e-401955387e5c", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", - "service": "ACR", - "severity": "高い", - "text": "プライベート レジストリを使用する場合は、複数のリージョンにイメージを格納するようにリージョン レプリケーションを構成します", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review 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", + "severity": "中程度", + "text": "Azure Traffic Manager を使用して要求を調整する", "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", - "service": "AKS", - "severity": "低い", - "text": "kubecost などの外部アプリケーションを使用して、さまざまなユーザーにコストを割り当てます", - "waf": "費用" + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", + "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", + "service": "Cognitive Search", + "severity": "高い", + "text": "Azure Cognitive Search インデックスをバックアップおよび復元します。このサンプル コードを使用して、インデックス定義とスナップショットを一連の Json ファイルにバックアップします", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", - "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", - "service": "AKS", - "severity": "低い", - "text": "スケールダウンモードを使用してノードを削除/割り当て解除する", - "waf": "費用" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "高い", + "text": "共鳴可能なAIのためのメタプロンプトガードレールに従う", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", - "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", - "service": "AKS", - "severity": "中程度", - "text": "必要に応じて、AKS クラスターで複数インスタンスの分割 GPU を使用する", - "waf": "費用" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", + "link": "https://github.com/Azure-Samples/AI-Gateway", + "service": "Azure OpenAI", + "severity": "高い", + "text": "APIM や AI Central などのソリューションを使用したゲートウェイ パターンを検討して、レート制限、負荷分散、認証、ログ記録を改善します", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", - "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", - "service": "AKS", - "severity": "低い", - "text": "Dev/Test クラスターを実行している場合は、NodePool Start/Stop を使用します。", - "waf": "費用" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "高い", + "text": "AOAI インスタンスの監視を有効にする", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "中程度", - "text": "Azure Policy for Kubernetes を使用してクラスターのコンプライアンスを確保する", - "waf": "安全" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "697cb391-ed16-4b2d-886f-0a0241addde6", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", + "service": "Azure OpenAI", + "severity": "高い", + "text": "リソースに対して実行されたアクション (サブスクリプション キーの再生成など) によって作成されたアクティビティ ログのエントリや、1 時間に 10 を超えるエラー数などのメトリックしきい値によって作成されたアクティビティ ログのエントリなど、イベントを通知するアラートを作成します", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "Azure OpenAI", + "severity": "高い", + "text": "トークンの使用状況を監視して、容量によるサービスの中断を防ぎます", + "waf": "オペレーショナルエクセレンス" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "Azure OpenAI", "severity": "中程度", - "text": "ユーザー/システムノードプールを使用してコントロールプレーンからアプリケーションを分離する", - "waf": "安全" + "text": "処理された推論トークン、生成された完了トークンなどのメトリックを観察し、レート制限を監視します", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", - "link": "https://learn.microsoft.com/azure/aks/use-system-pools", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "低い", - "text": "システム ノードプールにテイントを追加して専用にする", - "waf": "安全" + "text": "診断が十分でない場合は、Azure OpenAI の前で Azure API Management などのゲートウェイを使用して、受信プロンプトと送信応答の両方をログに記録することを検討してください (許可されている場合)", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", - "link": "https://learn.microsoft.com/azure/container-registry/", - "service": "AKS", - "severity": "中程度", - "text": "イメージにはプライベート レジストリ (ACR など) を使用する", - "waf": "安全" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", + "link": "https://github.com/Azure-Samples/openai-enterprise-iac", + "service": "Azure OpenAI", + "severity": "高い", + "text": "コードとしてのインフラストラクチャを使用して、Azure OpenAI Service、モデル デプロイ、およびすべての関連リソースをデプロイします", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure AKS Review", - "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", - "link": "https://learn.microsoft.com/azure/security-center/container-security", - "service": "ACR", - "severity": "中程度", - "text": "イメージをスキャンして脆弱性を検出する", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "4350d092-d234-4292-a752-8537a551c5bf", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", + "service": "Azure OpenAI", + "severity": "高い", + "text": "API キーの代わりにマネージド ID で Microsoft Entra 認証を使用する", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "高い", - "text": "アプリの分離要件を定義する (名前空間/ノードプール/クラスター)", - "waf": "安全" + "text": "入力と正しい答えを持つ既知のゴールデンデータセットを使用して、システムのパフォーマンス/精度を評価します。PromptFlowの機能を評価に活用します。", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", - "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", - "service": "AKS", - "severity": "中程度", - "text": "CSI シークレット ストア ドライバーを使用して Azure Key Vault にシークレットを格納する", - "waf": "安全" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "高い", + "text": "プロビジョニング済みスループットモデルの使用状況の評価", + "waf": "パフォーマンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", - "link": "https://learn.microsoft.com/azure/aks/update-credentials", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", + "service": "Azure OpenAI", "severity": "高い", - "text": "クラスターにサービス プリンシパルを使用する場合は、資格情報を定期的に (四半期ごとなど) 更新します", - "waf": "安全" + "text": "Azure AI コンテンツの安全性を確認して実装する", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", - "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", - "service": "AKS", - "severity": "中程度", - "text": "必要に応じて、キー管理サービスの etcd 暗号化を追加します", - "waf": "安全" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1193846d-697c-4b39-8ed1-6b2d186f0a02", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#system-level-throughput", + "service": "Azure OpenAI", + "severity": "高い", + "text": "トークンと1分あたりのレスポンスに基づいてシステムのスループットを定義および評価し、要件に合わせます", + "waf": "パフォーマンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", - "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", - "service": "AKS", - "severity": "低い", - "text": "必要に応じて、Confidential Compute for AKS の使用を検討してください", - "waf": "安全" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", + "service": "Azure OpenAI", + "severity": "中程度", + "text": "トークンサイズ、ストリーミングオプションを制限することにより、システムのレイテンシーを改善します", + "waf": "パフォーマンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "service": "Azure OpenAI", "severity": "中程度", - "text": "Defender for Containers の使用を検討する", - "waf": "安全" + "text": "弾力性の要求を見積もり、優先順位に基づいて同期要求とバッチ要求の分離を決定します。優先度が高い場合は同期アプローチを使用し、優先度が低い場合はキューを使用した非同期バッチ処理が推奨されます", + "waf": "パフォーマンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "5bda4332-4f24-4811-9331-82ba51752694", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "Azure OpenAI", "severity": "高い", - "text": "サービス プリンシパルの代わりにマネージド ID を使用するUse managed identities instead of Service Principals", - "waf": "安全" + "text": "消費者からの推定需要に基づくトークン消費要件のベンチマーク。プロビジョニングされたスループット ユニットのデプロイを使用している場合は、Azure OpenAI ベンチマーク ツールを使用してスループットを検証することを検討してください", + "waf": "パフォーマンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "中程度", - "text": "認証と AAD の統合 (マネージド統合を使用)", - "waf": "安全" + "text": "プロビジョニングされたスループットユニット (PTU) を使用している場合は、オーバーフローリクエストに対して Token-Per Minute (TPM) デプロイメントをデプロイすることを検討してください。ゲートウェイを使用して、PTU の制限に達したときに要求を TPM デプロイにルーティングします。", + "waf": "パフォーマンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", - "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", - "service": "AKS", - "severity": "中程度", - "text": "管理者 kubeconfig へのアクセスを制限する (get-credentials --admin)", - "waf": "安全" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", + "service": "Azure OpenAI", + "severity": "高い", + "text": "適切なタスクに適したモデルを選択してください。速度、応答の品質、出力の複雑さの間で適切なトレードオフを持つモデルを選択する", + "waf": "パフォーマンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", - "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e9951904-8384-45c9-a6cb-2912156a1147", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "Azure OpenAI", "severity": "中程度", - "text": "承認と AAD RBAC の統合", - "waf": "安全" + "text": "微調整によってモデルのパフォーマンスが向上したかどうかを知るための微調整を行わずに、パフォーマンスのベースラインを設定する", + "waf": "パフォーマンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", - "service": "AKS", - "severity": "高い", - "text": "Kubernetes で RBAC 特権を制限するために名前空間を使用する", - "waf": "安全" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "低い", + "text": "複数のOAIインスタンスを複数のリージョンにデプロイする", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", - "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "高い", + "text": "APIM のようなゲートウェイ パターンを使用した再試行とヘルスチェックの実装", + "waf": "確実" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "中程度", - "text": "ポッド ID アクセス管理の場合は、Azure AD ワークロード ID (プレビュー) を使用します", - "waf": "安全" + "text": "ワークロードに対してTPMとRPMの適切なクォータがあることを確認します", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", - "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", + "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", + "service": "Azure OpenAI", "severity": "中程度", - "text": "AKS 非対話型ログインの場合は、kubelogin (プレビュー) を使用します", - "waf": "安全" + "text": "HAIツールキットガイダンスの考慮事項を確認し、それらの相互作用の実践をslutionに適用します", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7f154e3a-a369-4282-ae7e-316183687a04", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", + "service": "Azure OpenAI", "severity": "中程度", - "text": "AKS ローカル アカウントを無効にする", - "waf": "安全" + "text": "ファインチューニングが採用されている場合は、リージョン間で個別の微調整モデルをデプロイします", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "77a1f893-5bda-4433-84f2-4811633182ba", + "link": "https://learn.microsoft.com/azure/backup/backup-overview", + "service": "Azure OpenAI", + "severity": "中程度", + "text": "重要なデータを定期的にバックアップおよびレプリケートして、データの損失やシステム障害が発生した場合のデータの可用性と回復性を確保します。Azure のバックアップおよびディザスター リカバリー サービスを活用して、データを保護します。", + "waf": "確実" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "高い", + "text": "Azure AI Search サービス レベルは、SLA を持つために選択する必要があります", + "waf": "確実" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", + "link": "https://learn.microsoft.com/purview/purview", + "service": "Azure OpenAI", "severity": "低い", - "text": "必要に応じて Just-In-Time クラスター アクセスを構成する", + "text": "データと機密性を分類し、埋め込みを生成する前に Microsoft Purview でラベル付けし、生成された埋め込みを同じ感度と分類で処理するようにしてください", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "低い", - "text": "必要に応じて AKS の AAD 条件付きアクセスを構成する", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "4fda1dbf-3dd9-45d4-ac7c-891dca1f6d56", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/use-your-data-securely", + "service": "Azure OpenAI", + "severity": "高い", + "text": "SSE/ディスク暗号化(オプションのBYOKを使用)を使用してRAGに使用されるデータを暗号化", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", - "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", - "service": "AKS", - "severity": "低い", - "text": "Windows AKS ワークロードで必要な場合は、gMSA を構成します", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", + "link": "https://learn.microsoft.com/azure/search/search-security-overview", + "service": "Azure OpenAI", + "severity": "高い", + "text": "データソース間で転送されるデータ、Retrieval-Augmented Generation(RAG)およびLLM通信に使用されるAI検索にTLSが適用されていることを確認します", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "中程度", - "text": "より細かく制御するには、マネージドKubelet Identityの使用を検討してください", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7b94ef6e-047d-42ea-8992-b1cd6e2054b2", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", + "service": "Azure OpenAI", + "severity": "高い", + "text": "RBAC を使用して、Azure OpenAI サービスへのアクセスを管理します。ユーザーに適切な権限を割り当て、ユーザーの役割と責任に基づいてアクセスを制限します", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", - "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", + "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", + "service": "Azure OpenAI", "severity": "中程度", - "text": "AGIC を使用している場合は、クラスター間で AppGW を共有しないでください", - "waf": "確実" + "text": "データの暗号化、マスキング、または編集技術を実装して、機密データを非表示にしたり、非本番環境で難読化された値に置き換えたり、テストやトラブルシューティングの目的でデータを共有する場合", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", + "service": "Azure OpenAI", "severity": "高い", - "text": "AKS HTTP ルーティング アドオンを使用せず、代わりにアプリケーション ルーティング アドオンでマネージド NGINX イングレスを使用します。", - "waf": "確実" + "text": "Azure Defender を利用して、セキュリティの脅威を検出して対応し、監視とアラートのメカニズムを設定して、疑わしいアクティビティや侵害を特定します。Azure Sentinel を活用して高度な脅威の検出と対応を実現", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "中程度", - "text": "Windows ワークロードの場合は、高速ネットワークを使用します", - "waf": "パフォーマンス" + "text": "コンプライアンス規制を遵守するためのデータ保持および廃棄ポリシーを確立します。不要になったデータに対して安全な削除方法を実装し、データの保持と廃棄活動の監査証跡を維持します", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", + "service": "Azure OpenAI", "severity": "高い", - "text": "標準のALBを使用する(基本的なALBとは対照的)", - "waf": "確実" + "text": "Content Safety を使用した Prompt シールドと接地検出の実装", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "中程度", - "text": "Azure CNI を使用する場合は、NodePool に異なるサブネットを使用することを検討してください", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", + "link": "https://learn.microsoft.com/azure/compliance/", + "service": "Azure OpenAI", + "severity": "高い", + "text": "GDPRやHIPAAなどの関連するデータ保護規制への準拠を確保するには、プライバシー制御を実装し、データ処理活動に必要な同意または許可を取得します。", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", - "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", + "service": "Azure OpenAI", "severity": "中程度", - "text": "プライベート エンドポイント (推奨) または Virtual Network サービス エンドポイントを使用して、クラスターから PaaS サービスにアクセスする", + "text": "データセキュリティのベストプラクティス、データの安全な取り扱いの重要性、データ侵害に関連する潜在的なリスクについて、従業員を教育します。データセキュリティプロトコルに熱心に従うように促します。", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", + "service": "Azure OpenAI", "severity": "高い", - "text": "要件に最適な CNI ネットワーク プラグインを選択する (Azure CNI を推奨)", - "waf": "確実" + "text": "運用データを開発データやテストデータから分離します。本番環境では実際の機密データのみを使用し、開発環境やテスト環境では匿名化されたデータや合成データを利用します。", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", - "severity": "高い", - "text": "Azure CNI を使用する場合は、ノードあたりのポッドの最大数を考慮して、サブネットのサイズを適切に設定します", - "waf": "パフォーマンス" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", + "service": "Azure OpenAI", + "severity": "中程度", + "text": "データの機密性のレベルが異なる場合は、レベルごとに個別のインデックスを作成することを検討してください。たとえば、一般的なデータ用に 1 つのインデックスを作成し、機密データ用に別のインデックスを作成し、それぞれ異なるアクセス プロトコルで管理することができます", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", - "severity": "高い", - "text": "Azure CNI を使用している場合は、最大ポッド数/ノード (既定値は 30) を確認します", - "waf": "パフォーマンス" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "内部アプリの場合、組織は多くの場合、ファイアウォールで AKS サブネット全体を開きます。これにより、ノードへのネットワーク アクセスも開かれ、場合によってはポッドへのネットワーク アクセスも開かれます (Azure CNI を使用している場合)。LoadBalancer の IP が別のサブネットにある場合は、この IP のみをアプリ クライアントで使用できる必要があります。もう 1 つの理由は、AKS サブネット内の IP アドレスが希少なリソースである場合、その IP アドレスをサービスに使用すると、クラスターの最大スケーラビリティが低下することです。", - "guid": "13c00567-4b1e-4945-a459-c373e7ed6162", - "link": "https://learn.microsoft.com/azure/aks/internal-lb", - "service": "AKS", - "severity": "低い", - "text": "プライベート IP LoadBalancer サービスを使用する場合は、(AKS サブネットではなく) 専用サブネットを使用します", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", + "service": "Azure OpenAI", + "severity": "中程度", + "text": "分離をさらに一歩進めて、機密性の高いデータセットをサービスの異なるインスタンスに配置します。各インスタンスは、独自のRBACポリシーのセットで制御できます", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", + "service": "Azure OpenAI", "severity": "高い", - "text": "それに応じて、サービスの IP アドレス範囲のサイズを設定します (クラスターのスケーラビリティが制限されます)。", - "waf": "確実" + "text": "機密情報から生成された埋め込みとベクトルは、それ自体が機密性が高いことを認識します。このデータには、ソースマテリアルと同じ保護対策を提供する必要があります", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", - "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", - "service": "AKS", - "severity": "低い", - "text": "必要に応じて、独自のCNIプラグインを追加します", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3571449a-b805-43d8-af89-dc7b33be2a1a", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", + "service": "Azure OpenAI", + "severity": "高い", + "text": "埋め込みとベクトルを持つデータストアに RBAC を適用し、ロールのアクセス要件に基づいてアクセスのスコープを設定します", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "低い", - "text": "必要に応じて、AKS でノードごとにパブリック IP を構成する", - "waf": "パフォーマンス" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "高い", + "text": "AI サービスのプライベート エンドポイントを構成して、ネットワーク内のサービス アクセスを制限します", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", - "link": "https://learn.microsoft.com/azure/aks/concepts-network", - "service": "AKS", - "severity": "中程度", - "text": "イングレス コントローラーを使用して、LoadBalancer タイプのサービスで公開する代わりに、Web ベースのアプリを公開します", - "waf": "確実" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", + "service": "Azure OpenAI", + "severity": "高い", + "text": "Azure Firewall と UDR を使用して受信と送信のトラフィック制御を厳密に適用し、外部統合ポイントを制限します", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", - "link": "https://learn.microsoft.com/azure/aks/nat-gateway", - "service": "AKS", - "severity": "低い", - "text": "エグレス トラフィックをスケーリングするために Azure NAT Gateway を outboundType として使用する", - "waf": "確実" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", + "service": "Azure OpenAI", + "severity": "高い", + "text": "ネットワークのセグメンテーションとアクセス制御を実装して、LLMアプリケーションへのアクセスを許可されたユーザーとシステムのみに制限し、横方向の移動を防ぎます", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", + "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", + "service": "Azure OpenAI", "severity": "中程度", - "text": "Azure CNI IP の枯渇を回避するために IP の動的割り当てを使用する", - "waf": "確実" + "text": "LLMLingua や gprtrim などのプロンプト圧縮ツールを使用します", + "waf": "コストの最適化" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", + "service": "Azure OpenAI", "severity": "高い", - "text": "セキュリティ要件で義務付けられている場合は、AzFW/NVA を使用してエグレス トラフィックをフィルター処理します", + "text": "LLM アプリケーションで使用される API とエンドポイントが、マネージド ID、API キー、OAuth などの認証および承認メカニズムで適切に保護され、不正アクセスを防止します。", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "中程度", - "text": "パブリック API エンドポイントを使用している場合は、アクセスできる IP アドレスを制限します", + "text": "多要素認証などの強力なエンドユーザー認証メカニズムを適用して、LLMアプリケーションおよび関連するネットワークリソースへの不正アクセスを防止します", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "高い", - "text": "要件で必要な場合は、プライベート クラスターを使用します", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "93555620-2bfe-4456-9b0d-834a348b263e", + "service": "Azure OpenAI", + "severity": "中程度", + "text": "ネットワーク監視ツールを実装して、疑わしいアクティビティや悪意のあるアクティビティのネットワークトラフィックを検出および分析します。ロギングを有効にしてネットワークイベントをキャプチャし、セキュリティインシデントが発生した場合のフォレンジック分析を容易にします", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", + "service": "Azure OpenAI", "severity": "中程度", - "text": "Windows 2019 および 2022 AKS ノードでは、Calico ネットワーク ポリシーを使用できます", + "text": "セキュリティ監査と侵入テストを実施して、LLMアプリケーションのネットワークインフラストラクチャのネットワークセキュリティの弱点または脆弱性を特定して対処します", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "高い", - "text": "Kubernetes ネットワーク ポリシー オプションを有効にする (Calico/Azure)", - "waf": "安全" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", + "service": "Azure OpenAI", + "severity": "低い", + "text": "Azure AI Services は、管理を改善するために適切にタグ付けされています", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", - "severity": "高い", - "text": "Kubernetesネットワークポリシーを使用してクラスタ内のセキュリティを強化", - "waf": "安全" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", + "service": "Azure OpenAI", + "severity": "低い", + "text": "Azure AI Service アカウントは、組織の名前付け規則に従います", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", + "service": "Azure OpenAI", "severity": "高い", - "text": "Web ワークロード (UI または API) に WAF を使用するUse a WAF for a web workloads (UI or API)", - "waf": "安全" + "text": "Azure AI サービス リソースの診断ログを有効にする必要がある", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "中程度", - "text": "AKS Virtual Network で DDoS Standard を使用するUse DDoS Standard in the AKS Virtual Network", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "link": "https://learn.microsoft.com/azure/ai-services/authentication", + "service": "Azure OpenAI", + "severity": "高い", + "text": "セキュリティのため、キーアクセス(ローカル認証)を無効にすることをお勧めします。 キーベースのアクセスを無効にすると、Microsoft Entra IDが唯一のアクセス方法になり、最小限の特権原則ときめ細かな制御を維持できます。", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "低い", - "text": "必要に応じて、会社の HTTP プロキシを追加します", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", + "severity": "高い", + "text": "Azure Key Vault を使用して、キーを安全に保存および管理します。LLM アプリケーションのコード内で機密性の高いキーをハードコーディングしたり埋め込んだりすることを避け、マネージド ID を使用して Azure Key Vault から安全に取得します", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", - "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", - "service": "AKS", - "severity": "中程度", - "text": "高度なマイクロサービス通信管理にサービスメッシュの使用を検討する", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", + "severity": "高い", + "text": "Azure Key Vault に格納されているキーを定期的にローテーションして期限切れにすることで、不正アクセスのリスクを最小限に抑えます。", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "adfe27be-e297-401a-a352-baaab79b088d", + "link": "https://github.com/openai/tiktoken", + "service": "Azure OpenAI", "severity": "高い", - "text": "最も重要なメトリックに関するアラートを構成します (推奨事項については、「Container Insights」を参照してください)", - "waf": "オペレーションズ" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "337453a3-cc63-4963-9a65-22ac19e80696", - "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", - "service": "AKS", - "severity": "低い", - "text": "Azure Advisor でクラスターの推奨事項を定期的に確認する", - "waf": "オペレーションズ" + "text": "tiktokenを使用して、会話モードでのトークン最適化のためのトークンサイズを理解します", + "waf": "コストの最適化" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", - "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", - "service": "AKS", - "severity": "低い", - "text": "AKS 自動証明書のローテーションを有効にする", - "waf": "オペレーションズ" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", + "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", + "service": "Azure OpenAI", + "severity": "高い", + "text": "安全なコーディング手法に従って、インジェクション攻撃、クロスサイトスクリプティング(XSS)、セキュリティ設定の誤りなどの一般的な脆弱性を防止します", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", - "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "高い", - "text": "kubernetes のバージョンを定期的に (四半期ごとなど) アップグレードする定期的なプロセスを行うか、AKS 自動アップグレード機能を使用します", - "waf": "オペレーションズ" + "text": "LLM ライブラリとその他のシステム コンポーネントを定期的に更新し、パッチを適用するプロセスを設定します", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", - "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e29711b1-352b-4eee-879b-588defc4972c", + "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", + "service": "Azure OpenAI", "severity": "高い", - "text": "ノードイメージのアップグレードを使用していない場合は、Linuxノードのアップグレードにkuredを使用します", - "waf": "オペレーションズ" + "text": "Azure OpenAI またはその他の LLM の利用規約、ポリシー、ガイダンス、および許可されたユース ケースを順守する", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", - "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", - "service": "AKS", - "severity": "高い", - "text": "クラスタノードイメージを定期的に(毎週など)アップグレードする定期的なプロセスを用意します", - "waf": "オペレーションズ" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "中程度", + "text": "基本モデルと微調整されたモデルおよびトークンのステップサイズのコストの違いを理解する", + "waf": "コストの最適化" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", - "service": "AKS", - "severity": "低い", - "text": "アプリケーションまたはクラスター構成を複数のクラスターにデプロイするために gitop を検討してください", - "waf": "オペレーションズ" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "service": "Azure OpenAI", + "severity": "高い", + "text": "可能であれば、呼び出しごとのオーバーヘッドを最小限に抑え、全体的なコストを削減できるバッチ要求。バッチサイズを確実に最適化する", + "waf": "コストの最適化" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d7672c26-7602-4482-85a4-14527fbe855c", - "link": "https://learn.microsoft.com/azure/aks/command-invoke", - "service": "AKS", - "severity": "低い", - "text": "プライベート クラスターで AKS コマンド呼び出しを使用することを検討する", - "waf": "オペレーションズ" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", + "service": "Azure OpenAI", + "severity": "中程度", + "text": "モデルの使用状況を監視するコスト追跡システムを設定し、その情報を使用してモデルの選択とプロンプトのサイズを通知します", + "waf": "コストの最適化" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", - "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", - "service": "AKS", - "severity": "低い", - "text": "計画されたイベントの場合は、ノードの自動ドレインの使用を検討してください", - "waf": "オペレーションズ" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "中程度", + "text": "モデル応答あたりのトークン数に上限を設定します。サイズを最適化して、有効な応答に十分な大きさになるようにします", + "waf": "コストの最適化" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", - "link": "https://learn.microsoft.com/azure/aks/faq", - "service": "AKS", - "severity": "高い", - "text": "独自のガバナンスプラクティスを開発して、ノードRG(別名「インフラRG」)のオペレーターによって変更が実行されないようにします", - "waf": "オペレーションズ" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", + "link": "https://learn.microsoft.com/azure/search/search-reliability", + "service": "Azure OpenAI", + "severity": "中程度", + "text": "信頼性のための AI 検索の設定に関するガイダンスを確認します", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "低い", - "text": "カスタムノードRG(別名「インフラRG」)名を使用", - "waf": "オペレーションズ" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3266b225-86f4-4a16-92bd-ddea8a487cde", + "link": "https://learn.microsoft.com/azure/search/vector-search-index-size?tabs=portal-vector-quota", + "service": "Azure OpenAI", + "severity": "中程度", + "text": "AI Search Vector ストレージの計画と管理", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", - "link": "https://kubernetes.io/docs/setup/release/notes/", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "中程度", - "text": "非推奨の Kubernetes API を YAML マニフェストで使用しないでください", - "waf": "オペレーションズ" + "text": "LLMOpsプラクティスを適用して、GenAIアプリケーションのライフサイクル管理を自動化します", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", - "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", - "service": "AKS", - "severity": "低い", - "text": "Windows ノードのテイント", - "waf": "オペレーションズ" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "高い", + "text": "請求モデルの使用状況の評価 - PAYG と PTU の比較", + "waf": "コストの最適化" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "低い", - "text": "Windows コンテナーのパッチ レベルをホストのパッチ レベルと同期させる", - "waf": "オペレーションズ" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "中程度", + "text": "モデルバージョンを切り替える際のプロンプトとアプリケーションの品質を評価する", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "クラスタレベルでの診断設定経由", - "guid": "5b56ad48-408f-4e72-934c-476ba280dcf5", - "link": "https://learn.microsoft.com/azure/aks/monitor-aks", - "service": "AKS", - "severity": "低い", - "text": "マスター ログ (API ログ) を Azure Monitor または任意のログ管理ソリューションに送信する", - "waf": "オペレーションズ" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "中程度", + "text": "GenAIアプリを評価、監視、改良して、接地性、関連性、精度、一貫性、流暢さなどの機能を確認します。", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", - "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", - "service": "AKS", - "severity": "低い", - "text": "必要に応じて、nodePool スナップショットを使用します", - "waf": "費用" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "294798b1-578b-4219-a46c-eb5443513592", + "service": "Azure OpenAI", + "severity": "中程度", + "text": "さまざまな検索パラメーターに基づいて Azure AI Search の結果を評価する", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", - "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", - "service": "AKS", - "severity": "低い", - "text": "時間的制約のないワークロードのスポット ノード プールを検討する", - "waf": "オペレーションズ" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "2744293b-b628-4537-a551-19b08e8f5854", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", + "service": "Azure OpenAI", + "severity": "中程度", + "text": "精度を向上させる方法としてモデルの微調整を検討するのは、データを使用してプロンプトエンジニアリングやRAGなどの他の基本的なアプローチを試した場合のみです", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "低い", - "text": "クイック バーストのために AKS 仮想ノードを検討する", - "waf": "オペレーションズ" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "中程度", + "text": "プロンプトエンジニアリング手法を使用して、LLM応答の精度を向上させる", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", - "service": "AKS", - "severity": "高い", - "text": "Container Insights (または Prometheus などの他のツール) を使用してクラスター メトリックを監視する", - "waf": "オペレーションズ" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e737897e-71ca-47da-acfa-962a1594946d", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", + "service": "Azure OpenAI", + "severity": "中程度", + "text": "GenAIアプリケーションをレッドチーム化", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "高い", - "text": "Container Insights(またはTelegraf/ElasticSearchなどの他のツール)を使用してクラスターログを保存および分析します", - "waf": "オペレーションズ" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", + "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", + "service": "Azure OpenAI", + "severity": "中程度", + "text": "エンドユーザーにLLM応答のスコアリングオプションを提供し、これらのスコアを追跡します。", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", - "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", - "service": "AKS", - "severity": "中程度", - "text": "ノードの CPU とメモリの使用率を監視する", - "waf": "オペレーションズ" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "高い", + "text": "クォータ管理の実践を検討する", + "waf": "コストの最適化" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "1a4835ac-9422-423e-ae80-b123081a5417", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", + "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", + "service": "Azure OpenAI", "severity": "中程度", - "text": "Azure CNI を使用している場合は、ノードごとに消費されるポッド IP の割合を監視します", - "waf": "オペレーションズ" + "text": "APIM ベースのゲートウェイなどのロード バランサー ソリューションを使用して、サービスやリージョン間で負荷と容量を分散します", + "waf": "オペレーショナルエクセレンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "OS ディスクの I/O は重要なリソースです。ノード内の OS が I/O で調整されると、予期しない動作が発生し、通常はノードが NotReady と宣言される可能性があります", - "guid": "415833ea-3ad3-4c2d-b733-165c3acbe04b", - "link": "https://learn.microsoft.com/azure/virtual-machines/premium-storage-performance", - "service": "AKS", + "checklist": "Identity Review Checklist", + "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", + "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", + "service": "Entra", "severity": "中程度", - "text": "ノード内の OS ディスク キューの深さを監視する", - "waf": "オペレーションズ" + "text": "有効期間の長い取り消し可能なトークンを使用し、トークンをキャッシュし、Microsoft ID ライブラリを使用してサイレントに取得します", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "be209d39-fda4-4777-a424-d116785c2fa5", - "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", - "service": "AKS", + "checklist": "Identity Review Checklist", + "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", + "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", + "service": "AAD B2C", "severity": "中程度", - "text": "AzFW/NVA でエグレス フィルター処理を使用しない場合は、標準の ALB によって割り当てられた SNAT ポートを監視します", - "waf": "オペレーションズ" + "text": "サインイン ユーザー フローがバックアップされ、回復性があることを確認します。ユーザーのサインインに使用するコードがバックアップされ、回復可能であることを確認します。外部プロセスとの回復力のあるインターフェース", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", - "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", - "service": "AKS", + "checklist": "Identity Review 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", "severity": "中程度", - "text": "AKS クラスターのリソース正常性通知をサブスクライブするSubscribe to resource health notifications for your AKS cluster", - "waf": "オペレーションズ" + "text": "カスタムブランドアセットはCDNでホストする必要がある", + "waf": "パフォーマンス" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", - "severity": "高い", - "text": "ポッド仕様で要求と制限を構成する", - "waf": "オペレーションズ" + "checklist": "Identity Review Checklist", + "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", + "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", + "service": "AAD B2C", + "severity": "低い", + "text": "複数のIDプロバイダーを持っている(つまり、Microsoft、Google、Facebookアカウントでログインする)", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "769ef669-1a48-435a-a942-223ece80b123", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "checklist": "Identity Review 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", "severity": "中程度", - "text": "名前空間のリソースクォータを適用する", - "waf": "オペレーションズ" + "text": "VM レベルでの高可用性に関する VM ルールに従う (Premium ディスク、リージョン内の 2 つ以上、異なる可用性ゾーン内)", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "081a5417-4158-433e-a3ad-3c2de733165c", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", - "service": "AKS", - "severity": "高い", - "text": "サブスクリプションにノードプールをスケールアウトするのに十分なクォータがあることを確認する", - "waf": "オペレーションズ" + "checklist": "Identity Review 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", + "severity": "中程度", + "text": "複製しないでください!レプリケーションにより、ディレクトリ同期に関する問題が発生する可能性があります", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "Identity Review 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", "severity": "中程度", - "text": "Cluster Autoscaler を使用する", - "waf": "パフォーマンス" + "text": "マルチリージョンのアクティブ/アクティブを持つ", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "低い", - "text": "AKS ノード プールのノード構成をカスタマイズする", - "waf": "パフォーマンス" + "checklist": "Identity Review Checklist", + "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", + "severity": "中程度", + "text": "Azure AD Domain Service スタンプを追加のリージョンと場所に追加する", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", - "link": "https://learn.microsoft.com/azure/aks/concepts-scale", - "service": "AKS", + "checklist": "Identity Review Checklist", + "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", "severity": "中程度", - "text": "必要に応じてHorizontal Pod Autoscalerを使用します", - "waf": "パフォーマンス" + "text": "DR にレプリカ セットを使用する", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "ノードが大きくなると、パフォーマンスが向上し、エフェメラル ディスクや高速ネットワークなどの機能が提供されますが、爆発半径が大きくなり、スケーリングの粒度が低下します", - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Azure Functions", "severity": "高い", - "text": "大きすぎず小さすぎない適切なノードサイズを検討してください", - "waf": "パフォーマンス" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", - "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", - "service": "AKS", - "severity": "低い", - "text": "スケーラビリティのために 5,000 を超えるノードが必要な場合は、追加の AKS クラスターの使用を検討してください", - "waf": "パフォーマンス" + "text": "ビジネスとSLOの要件に基づいて適切な関数ホスティングプランを選択します", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", - "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", - "service": "AKS", - "severity": "低い", - "text": "AKS 自動化のために EventGrid イベントをサブスクライブすることを検討する", - "waf": "パフォーマンス" + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Azure Functions", + "severity": "高い", + "text": "リージョンで適用可能な場合は Availability Zones を活用します (従量課金レベルでは使用できません)", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", - "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", - "service": "AKS", - "severity": "低い", - "text": "AKS クラスターで実行時間の長い操作を行う場合は、イベントの終了を検討してください", - "waf": "パフォーマンス" + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "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", + "severity": "中程度", + "text": "重要なワークロードに対するリージョン間 DR 戦略を検討する", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", - "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", - "service": "AKS", - "severity": "低い", - "text": "必要に応じて、AKS ノードに Azure Dedicated Hosts を使用することを検討してください", - "waf": "パフォーマンス" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "Azure Functions", "severity": "高い", - "text": "エフェメラル OS ディスクを使用する", - "waf": "パフォーマンス" + "text": "分離環境にデプロイする場合は、App Service Environment (ASE) v3 を使用するか、それらに移行します", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", - "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", - "service": "AKS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "Azure Functions", "severity": "高い", - "text": "非エフェメラル ディスクの場合、複数のポッドを実行するには高いパフォーマンスが必要であり、既定の AKS ログ ローテーションしきい値で巨大なログが生成されるため、多くのポッド/ノードを実行する場合は、ノードに高い IOPS とより大きな OS ディスクを使用します", - "waf": "パフォーマンス" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", - "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", - "service": "AKS", - "severity": "低い", - "text": "ハイパー パフォーマンス ストレージ オプションの場合は、AKS 上の Ultra Disks を使用します", - "waf": "パフォーマンス" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", - "service": "AKS", - "severity": "中程度", - "text": "クラスター内に状態を保持することは避け、外部 (AzStorage、AzSQL、Cosmos など) にデータを格納します", - "waf": "パフォーマンス" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", - "service": "AKS", - "severity": "中程度", - "text": "AzFiles Standard を使用する場合は、パフォーマンス上の理由から AzFiles Premium や ANF を検討してください", - "waf": "パフォーマンス" + "text": "App Service プランで実行されているすべての関数アプリで \"Always On\" が有効になっていることを確認する", + "waf": "確実" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", - "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", - "service": "AKS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "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", "severity": "中程度", - "text": "Azure ディスクと AZ を使用する場合は、適切なゾーンにストレージをプロビジョニングするために VolumeBindingMode:WaitForFirstConsumer を使用して LRS ディスクのゾーン内にノードプールを配置するか、複数のゾーンにまたがるノードプールに ZRS ディスクを使用することを検討してください", - "waf": "パフォーマンス" + "text": "関数アプリを独自のストレージ アカウントにペアリングします。Function Apps のストレージ アカウントは、緊密に結合されていない限り、再利用しないようにしてください", + "waf": "確実" }, { - "checklist": "SAP Checklist", - "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", - "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", - "service": "SAP", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "Azure Functions", "severity": "中程度", - "text": "Azure Center for SAP solutions (ACSS) は、SAP を Azure 上のトップレベルのワークロードにする Azure オファリングです。ACSS は、SAP システムを Azure 上の統合ワークロードとして作成および実行し、イノベーションのためのよりシームレスな基盤を提供するエンドツーエンドのソリューションです。新規と既存の Azure ベースの SAP システムの両方の管理機能を利用できます。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-center-sap-solutions/?source=recommendations", + "text": "Azure DevOps または GitHub を活用して CI/CD を合理化し、関数アプリのコードを保護します", "waf": "オペレーションズ" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", + "service": "Bot service", "severity": "中程度", - "text": "Azure では、Linux と Windows での SAP デプロイの自動化がサポートされています。SAP Deployment Automation Framework は、SAP 環境をデプロイ、インストール、および保守できるオープンソースのオーケストレーション ツールです。", - "training": "https://github.com/Azure/sap-automation", - "waf": "オペレーションズ" + "text": "Azure Bot Service の信頼性サポートの推奨事項に従う", + "waf": "確実" }, { - "checklist": "SAP Checklist", - "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", - "service": "SAP", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", + "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", + "service": "Bot service", "severity": "中程度", - "text": "運用データベースのポイントインタイム リカバリを、RTOを満たす任意の時点および時間枠で実行します。ポイント・イン・タイム・リカバリには、通常、DBMSレイヤー上またはSAPを介してデータを削除するオペレーター・エラーが含まれます", + "text": "ローカル データ所在地とリージョン コンプライアンスを備えたボットのデプロイ", "waf": "確実" }, { - "checklist": "SAP Checklist", - "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", - "service": "SAP", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "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", "severity": "中程度", - "text": "バックアップと復旧の時間をテストして、災害発生後にすべてのシステムを同時に復元するための RTO 要件を満たしていることを確認します。", + "text": "Azure Bot Service は、グローバル サービスとリージョン サービスの両方に対してアクティブ/アクティブ モードで実行されます。停止が発生した場合、エラーを検出したり、サービスを管理したりする必要はありません。Azure Bot Service は、複数リージョンの地理的アーキテクチャで自動フェールオーバーと自動復旧を自動的に実行します。EU ボット リージョン サービスの場合、Azure Bot Service は、冗長性を確保するために、アクティブ/アクティブ レプリケーションを備えたヨーロッパ内の 2 つの完全なリージョンを提供します。グローバル ボット サービスの場合、使用可能なすべてのリージョン/地域をグローバル フットプリントとして提供できます。", "waf": "確実" }, { - "checklist": "SAP Checklist", - "guid": "b651423c-8552-42db-a545-5cb50c05527a", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "SAP", - "severity": "高い", - "text": "ペアのリージョン間で Standard Storage をレプリケートすることはできますが、Standard Storage を使用してデータベースや仮想ハード ディスクを格納することはできません。バックアップは、使用するペアのリージョン間でのみレプリケートできます。その他のすべてのデータについては、SQL Server Always On や SAP HANA システム レプリケーションなどのネイティブ DBMS 機能を使用してレプリケーションを実行します。SAP アプリケーション層には、Site Recovery、rsync または robocopy、およびその他のサードパーティ ソフトウェアを組み合わせて使用します。", - "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", - "waf": "確実" + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization Checklist", + "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", + "service": "Azure Monitor", + "text": "Azure Monitor のデータ収集ルール - https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview", + "training": "https://azure.microsoft.com/pricing/reservations/", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", - "severity": "中程度", - "text": "Azure Availability Zones を使用して高可用性を実現する場合は、SAP アプリケーション サーバーとデータベース サーバー間の待機時間を考慮する必要があります。待機時間が長いゾーンでは、SAP アプリケーション サーバーとデータベース サーバーが常に同じゾーンで実行されていることを確認するための運用手順を実施する必要があります。", - "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", - "waf": "確実" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "text": "基になるデータソースが見つからないバックアップインスタンスを確認する", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", - "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", - "service": "SAP", - "severity": "高い", - "text": "オンプレミスからプライマリおよびセカンダリの Azure ディザスター リカバリー リージョンへの ExpressRoute 接続を設定します。また、ExpressRoute を使用する代わりに、オンプレミスからプライマリおよびセカンダリの Azure ディザスター リカバリー リージョンへの VPN 接続を設定することも検討してください。", - "training": "https://learn.microsoft.com/azure/expressroute/use-s2s-vpn-as-backup-for-expressroute-privatepeering", - "waf": "確実" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "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", + "text": "関連づけられていないサービス(ディスク、NIC、IPアドレスなど)を削除またはアーカイブする", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "SAP", - "severity": "低い", - "text": "証明書、シークレット、キーなどのキー コンテナーの内容をリージョン間でレプリケートして、DR リージョン内のデータの暗号化を解除できるようにします。", - "waf": "確実" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "text": "ミッション クリティカルでないアプリケーションの Site Recovery ストレージとバックアップのバランスを考慮する", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", - "service": "SAP", - "severity": "中程度", - "text": "プライマリ仮想ネットワークとディザスター リカバリー仮想ネットワークをピアリングします。たとえば、HANA システム レプリケーションの場合、SAP HANA DB 仮想ネットワークは、ディザスター リカバリー サイトの SAP HANA DB 仮想ネットワークにピアリングする必要があります。", - "waf": "確実" + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization 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", + "text": "40 の異なるログ分析ワークスペース間で支出と節約の機会を確認する - 非運用ワークスペースに異なる保持とデータ収集を使用する - 認識と階層サイズ設定のための日次上限を作成する - 日次上限を設定する場合は、上限に達したときにアラートを作成するだけでなく、ある割合 (90% など) に達したときに通知されるアラート ルールも作成してください。- 可能であればワークスペースの変革を検討する - 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": "費用" }, { - "checklist": "SAP Checklist", - "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", - "service": "SAP", - "severity": "低い", - "text": "SAP デプロイに Azure NetApp Files ストレージを使用する場合は、少なくとも、Premium レベルの 2 つのリージョンに 2 つの Azure NetApp Files アカウントを作成します。", - "training": "https://learn.microsoft.com/training/modules/choose-service-level-azure-netapp-files-hpc-applications/2-identify-decision-criteria", - "waf": "確実" + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization 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", + "text": "ログのパージポリシーと自動化を適用する(必要に応じて、ログをコールドストレージに移動できます)", + "training": "https://www.youtube.com/watch?v=nHQYcYGKuyw", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", - "severity": "高い", - "text": "ネイティブのデータベースレプリケーションテクノロジーを使用して、HAペアでデータベースを同期する必要があります。", - "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/?source=recommendations", - "waf": "確実" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "text": "ディスクが本当に必要かどうかを確認し、必要でない場合は削除します。必要な場合は、下位のストレージ階層を見つけるか、バックアップを使用します。", + "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/manage-automation", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", - "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", - "service": "SAP", - "severity": "高い", - "text": "プライマリ仮想ネットワーク (VNet) の CIDR は、DR サイトの VNet の CIDR と競合したり重複したりしないようにする必要があります", - "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", - "waf": "確実" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization 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", + "text": "未使用のストレージを下位階層に移動し、カスタマイズされたルールを使用することを検討する - 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": "費用" }, { - "checklist": "SAP Checklist", - "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", - "service": "SAP", - "severity": "高い", - "text": "Site Recovery を使用して、アプリケーション サーバーを DR サイトにレプリケートします。Site Recovery は、セントラル サービス クラスター VM を DR サイトにレプリケートする場合にも役立ちます。DR を呼び出すときは、DR サイトで Linux Pacemaker クラスターを再構成する必要があります (たとえば、VIP または SBD の置き換え、corosync.conf の実行など)。", - "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", - "waf": "確実" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "VM", + "text": "advisor が VM の適切なサイズ設定用に構成されていることを確認する", + "waf": "費用" }, { - "checklist": "SAP 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", - "severity": "高い", - "text": "単一障害点に対する SAP ソフトウェアの可用性を検討します。これには、SAP NetWeaver や SAP S/4HANA アーキテクチャ、SAP ABAP、ASCS + SCS で使用される DBMS などのアプリケーション内の単一障害点が含まれます。また、SAP Web ディスパッチャなどの他のツールも必要です。", - "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": "確実" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "description": "コスト分析でメーターカテゴリライセンスを検索して確認してください", + "guid": "59ae568b-a38d-4498-9e22-13dbd7bb012f", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/manage/centralize-operations", + "service": "VM", + "text": "すべての Windows VM でスクリプトを実行する 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- Windows VM が頻繁に作成される場合は、ポリシーの実装を検討してください", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", - "service": "SAP", - "severity": "高い", - "text": "SAP および SAP データベースの場合は、自動フェールオーバー クラスターの実装を検討してください。Windows では、Windows Server フェールオーバー クラスタリングがフェールオーバーをサポートします。Linux では、Linux Pacemaker や、SIOS Protection Suite や Veritas InfoScale などのサードパーティツールがフェイルオーバーをサポートしています。", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "確実" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "service": "VM", + "text": "これは、すでにライセンスを持っている場合は、AHUBの下に置くこともできます https://learn.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux?tabs=rhelpayg%2Crhelbyos%2CrhelEnablebyos%2Crhelcompliance", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", - "severity": "高い", - "text": "Azure では、プライマリ VM とセカンダリ VM が DBMS データのストレージを共有するアーキテクチャはサポートされていません。DBMSレイヤーの場合、一般的なアーキテクチャパターンは、プライマリおよびセカンダリVMが使用するストレージスタックとは異なるストレージスタックを使用して、データベースを同時にレプリケートすることです。", - "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": "確実" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", + "service": "VM", + "text": "予約済み VM ファミリを柔軟性オプションで統合する (4 から 5 ファミリ以下)", + "training": "https://learn.microsoft.com/azure/automation/automation-solution-vm-management", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", - "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", - "service": "SAP", - "severity": "高い", - "text": "DBMS データとトランザクション/REDO ログ ファイルは、Azure でサポートされているブロック ストレージまたは Azure NetApp Files に格納されます。Azure Files または Azure Premium Files は、SAP ワークロードでの DBMS データや再実行ログ ファイルのストレージとしてはサポートされていません。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-databases/2-explore-database-support-azure-for-sap-workloads", - "waf": "確実" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "text": "Azure 予約インスタンスを利用する: この機能を使用すると、VM を 1 年または 3 年間予約できるため、PAYG 価格と比較して大幅なコスト削減が実現します。", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", - "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", - "service": "SAP", - "severity": "高い", - "text": "Windows の Azure 共有ディスクは、ASCS + SCS コンポーネントと特定の高可用性シナリオに使用できます。フェールオーバー クラスターは、SAP アプリケーション層コンポーネントと DBMS 層に対して個別に設定します。現在、Azure では、SAP アプリケーション レイヤー コンポーネントと DBMS レイヤーを 1 つのフェールオーバー クラスターに結合する高可用性アーキテクチャはサポートされていません。", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "確実" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", + "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", + "service": "VM", + "text": "より大きなディスクのみ予約できます => 1 TiB -", + "waf": "費用" }, { - "checklist": "SAP 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", - "severity": "高い", - "text": "SAP アプリケーション レイヤー コンポーネント (ASCS) と DBMS レイヤーのほとんどのフェールオーバー クラスターでは、フェールオーバー クラスターの仮想 IP アドレスが必要です。 Azure Load Balancer は、他のすべてのケースで仮想 IP アドレスを処理する必要があります。設計原則の 1 つは、クラスター構成ごとに 1 つのロード バランサーを使用することです。ロード バランサーの Standard バージョン (Standard Load Balancer SKU) を使用することをお勧めします。", - "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", - "waf": "確実" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", + "service": "VM", + "text": "適切なサイズ最適化の後", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", - "service": "SAP", - "severity": "高い", - "text": "ロードバランサーでフローティング IP が有効になっていることを確認します", - "training": "https://learn.microsoft.com/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", - "waf": "確実" + "arm-service": "Microsoft.Sql/servers", + "checklist": "Cost Optimization Checklist", + "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", + "service": "Azure SQL", + "text": "該当するかどうかを確認し、ポリシー/変更 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": "費用" }, { - "checklist": "SAP Checklist", - "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "SAP", - "severity": "高い", - "text": "高可用性インフラストラクチャをデプロイする前に、選択したリージョンに応じて、Azure 可用性セットと可用性ゾーンのどちらを使用してデプロイするかを決定します。", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "確実" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", + "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", + "service": "VM", + "text": "VM +ライセンス部分の割引(ahub + 3YRI)は約70%の割引です", + "waf": "費用" }, { - "checklist": "SAP 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", - "severity": "高い", - "text": "SAP コンポーネント (セントラル サービス、アプリケーション サーバー、データベース) のアプリケーションのインフラストラクチャ SLA を満たす場合は、すべてのコンポーネントに対して同じ高可用性オプション (VM、可用性セット、可用性ゾーン) を選択する必要があります。", - "waf": "確実" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "text": "需要に合わせて、フラットなサイジングではなく、VMSS の使用を検討してください", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "cbe05bbe-209d-4490-ba47-778424d11678", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", - "severity": "高い", - "text": "同じ可用性セット内に異なるロールのサーバーを混在させないでください。セントラル サービス VM、データベース VM、アプリケーション VM を独自の可用性セットに保持する", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "確実" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Cost Optimization Checklist", + "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "service": "AKS", + "text": "AKS オートスケーラーを使用してクラスターの使用量に一致させる (ポッドの要件がスケーラーと一致していることを確認する)", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", - "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", - "service": "SAP", - "severity": "中程度", - "text": "近接通信配置グループを使用しない限り、Azure 可用性ゾーン内に Azure 可用性セットをデプロイすることはできません。", - "training": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "waf": "確実" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "text": "該当する場合は、復旧ポイントを vault-archive に移動します (検証)", + "training": "https://azure.microsoft.com/pricing/reservations/", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "9674e7c7-7796-4181-8920-09f4429543ba", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", - "severity": "高い", - "text": "可用性セットを作成するときは、使用可能な障害ドメインと更新ドメインの最大数を使用します。たとえば、1 つの可用性セットに 2 つ以上の VM をデプロイする場合は、Azure の計画メンテナンスに加えて、潜在的な物理ハードウェア障害、ネットワークの停止、または停電の影響を制限するために、最大数の障害ドメイン (3 つ) と十分な更新ドメインを使用します。障害ドメインの既定の数は 2 であり、後でオンラインで変更することはできません。", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "確実" + "arm-service": "Microsoft.Databricks/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", + "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", + "service": "Databricks", + "text": "可能な場合は、フォールバックでスポット VM を使用することを検討してください。クラスターの自動終了を検討してください。", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", - "severity": "高い", - "text": "可用性セットのデプロイで Azure 近接通信配置グループを使用する場合は、3 つの SAP コンポーネント (セントラル サービス、アプリケーション サーバー、データベース) をすべて同じ近接通信配置グループに含める必要があります。", - "waf": "確実" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", + "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", + "service": "Azure Functions", + "text": "関数 - 接続の再利用", + "training": "https://learn.microsoft.com/azure/cost-management-billing/reservations/reservation-apis?toc=%2Fazure%2Fcost-management-billing%2Ftoc.json", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", - "severity": "高い", - "text": "SAP SID ごとに 1 つの近接配置グループを使用します。グループは、Availability Zones や Azure リージョンにまたがっていません", - "waf": "確実" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", + "link": "https://learn.microsoft.com/azure/automation/update-management/overview", + "service": "Azure Functions", + "text": "関数 - データをローカルにキャッシュする", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", + "waf": "費用" }, { - "checklist": "SAP 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", - "severity": "高い", - "text": "オペレーティング システムに応じて、次のいずれかのサービスを使用して SAP セントラル サービス クラスターを実行します。", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "確実" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", + "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", + "service": "Azure Functions", + "text": "関数 - コールド スタート - 「パッケージから実行」機能を使用します。このようにして、コードは単一のzipファイルとしてダウンロードされます。これにより、たとえば、多くのノードモジュールを持つJavascript関数が大幅に改善される可能性があります。言語固有のツールを使用してパッケージサイズを縮小します (ツリーを揺るがす Javascript アプリケーションなど)。", + "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "ed46b937-913e-4018-9c62-8393ab037e53", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", - "service": "SAP", - "severity": "中程度", - "text": "現在、Azure では、同じ Linux Pacemaker クラスターでの ASCS と DB HA の組み合わせはサポートされていません。それらを個々のクラスターに分離します。ただし、最大 5 つの複数のセントラル サービス クラスターを 1 つの VM のペアに結合できます。", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "確実" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "Azure Functions", + "text": "関数 - 関数を暖かく保つ", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "費用" }, { - "checklist": "SAP 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", - "severity": "中程度", - "text": "両方の VM を高可用性ペアの可用性セットまたは可用性ゾーンにデプロイします。これらの VM は、同じサイズで、同じストレージ構成を持つ必要があります。", - "waf": "確実" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Azure Functions", + "text": "さまざまな関数で自動スケーリングを使用する場合、すべてのリソースのすべての自動スケーリングを駆動する 1 つが存在する可能性があるため、別の従量課金プランに移行することを検討してください (また、CPU のより高いプランを検討してください)", + "waf": "費用" }, { - "checklist": "SAP 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", - "severity": "中程度", - "text": "Azure では、Red Hat Enterprise Linux (RHEL) で実行されている同じ高可用性クラスターへの SAP HANA インスタンスと ASCS/SCS インスタンスと ERS インスタンスのインストールと構成がサポートされています。", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "確実" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", + "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", + "service": "Azure Functions", + "text": "特定のプランの関数アプリはすべて一緒にスケーリングされるため、スケーリングに関する問題はプラン内のすべてのアプリに影響を与える可能性があります。", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", - "severity": "高い", - "text": "Premium マネージド SSD ですべての運用システムを実行し、Azure NetApp Files または Ultra Disk Storage を使用します。少なくとも、OS ディスクは Premium レベルにすることで、パフォーマンスの向上と最高の SLA を実現できます。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", - "waf": "確実" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", + "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", + "service": "Azure Functions", + "text": "「待機時間」に対して請求されますか?この質問は、通常、非同期操作を実行して結果を待機する C# 関数のコンテキストで尋ねられます (例: await Task.Delay(1000) や await client)。GetAsync('http://google.com') です。答えはイエスです-GB秒の計算は、関数の開始時刻と終了時刻、およびその期間のメモリ使用量に基づいています。その間に CPU アクティビティに関して実際に何が起こるかは、計算には考慮されません。この規則の 1 つの例外は、永続関数を使用している場合です。オーケストレーター関数で待機に費やされた時間に対しては課金されません。可能な場合は、デマンド シェーピング技術を適用します (開発環境?) https://github.com/Azure-Samples/functions-csharp-premium-scaler", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", - "service": "SAP", - "severity": "高い", - "text": "SAP HANA on Azure は、SAP によって認定された種類のストレージでのみ実行する必要があります。該当する場合は、特定のボリュームを特定のディスク構成で実行する必要があることに注意してください。これらの構成には、書き込みアクセラレータの有効化と Premium Storage の使用が含まれます。また、ストレージ上で稼働するファイル システムが、マシン上で稼働する DBMS と互換性があることを確認する必要もあります。", - "training": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1?source=recommendations", - "waf": "確実" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Cost Optimization Checklist", + "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Front Door", + "text": "Frontdoor - 既定のホームページをオフにするアプリのアプリケーション設定で、AzureWebJobsDisableHomepage を true に設定します。これにより、PoPに204(No Content)が返されるため、ヘッダーデータのみが返されます。", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", - "service": "SAP", - "severity": "高い", - "text": "SAP ワークロードに使用するストレージの種類に応じて、高可用性を構成することを検討してください。Azure で使用できる一部のストレージ サービスは Azure Site Recovery でサポートされていないため、高可用性の構成が異なる場合があります。", - "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/2-explore-disaster-recovery-sap-workloads", - "waf": "確実" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Cost Optimization 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", + "text": "Frontdoor - 何も返さないものへのルーティング。関数、関数プロキシを設定するか、200 (OK) を返し、コンテンツを送信しない、または最小限のコンテンツを送信 するルートを Web アプリに追加します。これの利点は、呼び出されたときにログアウトできることです。", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", - "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", - "service": "SAP", - "severity": "高い", - "text": "さまざまなネイティブ Azure ストレージ サービス (Azure Files、Azure NetApp Files、Azure Shared Disk など) は、リージョンによっては利用できない場合があります。そのため、フェールオーバー後に DR リージョンで同様の SAP 設定を行うには、それぞれのストレージ サービスが DR サイトで提供されていることを確認します。", - "waf": "確実" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", + "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", + "service": "Storage", + "text": "使用頻度の低いデータの階層のアーカイブを検討する", + "waf": "費用" }, { - "checklist": "SAP 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", - "severity": "中程度", - "text": "SAP システムのスタート/ストップを自動化してコストを管理します。", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", + "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", + "service": "VM", + "text": "サイズが階層と一致しない場合は、ディスク サイズを確認します (つまり、513 GiB のディスクは P30 (1TiB) を支払います) と、サイズ変更を検討してください", "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", - "severity": "低い", - "text": "SAP HANA で Azure Premium Storage を使用する場合は、Azure Standard SSD ストレージを使用して、コスト意識の高いストレージ ソリューションを選択できます。ただし、Standard SSD または Standard HDD Azure Storage を選択すると、個々の VM の SLA に影響することに注意してください。また、非運用環境など、I/O スループットが低く待機時間が短いシステムでは、下位のシリーズ VM を使用できます。", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", + "service": "Storage", + "text": "可能な場合は、Premium や Ultra ではなく Standard SSD の使用を検討してください", "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "9877f353-2591-4e8b-8381-e9043fed1010", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", - "severity": "低い", - "text": "低コストの代替構成 (多目的) として、非運用環境の HANA データベース サーバー VM に低パフォーマンスの SKU を選択できます。ただし、E シリーズなどの一部の VM の種類は、HANA 認定 (SAP HANA Hardware Directory) されていないか、ストレージ待機時間を 1 ミリ秒未満にできないことに注意することが重要です。", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization 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", + "text": "ストレージ アカウントの場合は、選択したレベルによってトランザクション料金が加算されていないことを確認します (次のレベルに移動する方が安くなる可能性があります)", "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", - "service": "SAP", - "severity": "高い", - "text": "管理グループ、サブスクリプション、リソース グループ、およびリソースに RBAC モデルを適用する", - "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", - "waf": "安全" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization Checklist", + "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", + "service": "Site Recovery", + "text": "ASR の場合、RPO/RTO とレプリケーション スループットで許可されている場合は、Standard SSD ディスクの使用を検討してください", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "45911475-e39e-4530-accc-d979366bcda2", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", - "severity": "中程度", - "text": "Cloud Connector を介して SAP クラウド アプリケーションからオンプレミス (IaaS を含む) に ID を転送するためのプリンシパル伝達を適用する", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/2-explore-azure-virtual-machine-auth-access-control", - "waf": "安全" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", + "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", + "service": "Storage", + "text": "ストレージ アカウント: 必要なホット層や GRS を確認する", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", - "severity": "中程度", - "text": "SAML を使用して Azure AD で SAP Analytics Cloud、SAP Cloud Platform、Business by Design、SAP Qualtrics、SAP C4C などの SAP SaaS アプリケーションに SSO を実装します。", - "waf": "安全" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", + "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", + "service": "VM", + "text": "ディスク - あらゆる場所で Premium SSD ディスクの使用を検証: たとえば、非運用環境を Standard SSD またはオンデマンド Premium SSD にスワップできます", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", - "severity": "中程度", - "text": "SAML を使用して、SAP Fiori や SAP Web GUI などの SAP NetWeaver ベースの Web アプリケーションに SSO を実装します。", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", - "waf": "安全" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", + "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", + "service": "Synapse", + "text": "予算を作成してコストを管理し、支出の異常や過剰支出のリスクを関係者に自動的に通知するアラートを作成します。", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", - "service": "SAP", - "severity": "中程度", - "text": "SAML を使用して、SAP Fiori や SAP Web GUI などの SAP NetWeaver ベースの Web アプリケーションに SSO を実装します。", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/6-exercise-integrate-azure-active-directory-sap-fiori", - "waf": "安全" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "Synapse", + "text": "追加のデータ分析のために、コスト データをストレージ アカウントにエクスポートします。", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", - "severity": "中程度", - "text": "SAP NetWeaver SSO またはパートナーソリューションを使用して、SAP GUI への SSO を実装できます。", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", - "waf": "安全" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "Synapse", + "text": "専用 SQL プールのコストを制御するには、リソースが使用されていないときに一時停止します。", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", - "service": "SAP", - "severity": "中程度", - "text": "SAP GUI および Web ブラウザアクセスの SSO には、設定とメンテナンスが容易なため、SNC/Kerberos/SPNEGO (シンプルで保護された GSSAPI ネゴシエーションメカニズム) を実装します。X.509 クライアント証明書を使用した SSO の場合は、SAP SSO ソリューションのコンポーネントである SAP セキュアログインサーバーを検討してください。", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/9-exercise-integrate-active-directory-sap-single-sign-on", - "waf": "安全" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", + "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", + "service": "Synapse", + "text": "サーバーレス Apache Spark の自動一時停止機能を有効にし、それに応じてタイムアウト値を設定します。", + "waf": "費用" }, { - "checklist": "SAP 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", - "severity": "中程度", - "text": "SAP GUI および Web ブラウザアクセスの SSO には、設定とメンテナンスが容易なため、SNC/Kerberos/SPNEGO (シンプルで保護された GSSAPI ネゴシエーションメカニズム) を実装します。X.509 クライアント証明書を使用した SSO の場合は、SAP SSO ソリューションのコンポーネントである SAP セキュアログインサーバーを検討してください。", - "waf": "安全" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization 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", + "text": "さまざまなサイズの複数の Apache Spark プール定義を作成します。", + "waf": "費用" }, { - "checklist": "SAP 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", - "severity": "中程度", - "text": "OAuth for SAP NetWeaver を使用して SSO を実装し、サードパーティまたはカスタムアプリケーションが SAP NetWeaver OData サービスにアクセスできるようにします。", - "waf": "安全" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization 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", + "text": "Azure Synapse Analytics のコストを節約するために、事前購入プランで Azure Synapse コミット ユニット (SCU) を 1 年間購入します。", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "a747c350-8d4c-449c-93af-393dbca77c48", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", - "service": "SAP", - "severity": "中程度", - "text": "SAP HANAへのSSOの実装", - "waf": "安全" - }, - { - "checklist": "SAP Checklist", - "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", - "service": "SAP", - "severity": "中程度", - "text": "Azure AD は、RISE でホストされている SAP システムの ID プロバイダーであると考えてください。詳細については、「サービスと Azure AD の統合」を参照してください。", - "waf": "安全" - }, - { - "checklist": "SAP Checklist", - "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", - "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", - "service": "SAP", - "severity": "中程度", - "text": "SAP にアクセスするアプリケーションでは、プリンシパル伝搬を使用して SSO を確立することができます。", - "waf": "安全" - }, - { - "checklist": "SAP 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", - "severity": "中程度", - "text": "SAP Identity Authentication Service (IAS) を必要とする SAP BTP サービスまたは SaaS ソリューションを使用している場合は、SAP Cloud Identity Authentication Services と Azure AD の間に SSO を実装して、それらの SAP サービスにアクセスすることを検討してください。この統合により、SAP IAS はプロキシ ID プロバイダーとして機能し、認証要求を中央ユーザー ストアおよび ID プロバイダーとして Azure AD に転送できます。", - "waf": "安全" - }, - { - "checklist": "SAP Checklist", - "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", - "service": "SAP", - "severity": "中程度", - "text": "SAP BTP への SSO の実装", - "waf": "安全" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", + "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", + "service": "VM", + "text": "中断可能なジョブにスポット VM を使用する: これらは、割引価格で入札および購入できる VM であり、重要でないワークロードにコスト効率の高いソリューションを提供します。", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "費用" }, { - "checklist": "SAP 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", - "severity": "中程度", - "text": "SAP SuccessFactors を使用している場合は、Azure AD の自動ユーザー プロビジョニングの使用を検討してください。この統合により、SAP SuccessFactors に新しい従業員を追加するときに、Azure AD でユーザー アカウントを自動的に作成できます。 必要に応じて、Microsoft 365 または Azure AD でサポートされているその他の SaaS アプリケーションでユーザー アカウントを作成できます。 SAP SuccessFactors へのメール アドレスの書き戻しを使用します。", - "waf": "安全" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "544451e1-92d3-4442-a3c7-628637a551c5", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "VM", + "text": "すべての VM の適切なサイズ設定", + "waf": "費用" }, { - "checklist": "SAP 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", - "severity": "中程度", - "text": "既存の管理グループ ポリシーを SAP サブスクリプションに適用する", - "training": "https://learn.microsoft.com/training/modules/enterprise-scale-organization/4-management-group-subscription-organization", - "waf": "オペレーションズ" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", + "service": "VM", + "text": "正規化されたサイズと最新のサイズでサイズをスワップする VM", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", - "severity": "高い", - "text": "緊密に結合されたアプリケーションを同じSAPサブスクリプションに統合し、ルーティングと管理の複雑さを回避", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-subscriptions", - "waf": "オペレーションズ" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", + "text": "VM の適切なサイズ設定 - 使用率を 5% 未満で監視することから始めて、その後 40% まで作業します", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", - "severity": "高い", - "text": "サブスクリプションをスケール ユニットとして活用し、リソースをスケーリングし、環境ごとにサブスクリプションをデプロイすることを検討してください。サンドボックス、非製品、製品", - "training": "https://learn.microsoft.com/training/modules/configure-subscriptions/?source=recommendations", - "waf": "オペレーションズ" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", + "text": "アプリケーションをコンテナー化すると、VM の密度が向上し、スケーリングにかかるコストを節約できます", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", - "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", - "service": "SAP", - "severity": "高い", - "text": "サブスクリプションのプロビジョニングの一環としてクォータを確実に増やす (例: サブスクリプション内で使用可能な VM コアの合計数)", - "training": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", - "waf": "オペレーションズ" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", + "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", + "service": "AKS", + "severity": "低い", + "text": "AKS Windows ワークロードで必要な場合は、HostProcess コンテナーを使用できます", + "waf": "確実" }, { - "checklist": "SAP Checklist", - "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", - "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", + "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", + "service": "AKS", "severity": "低い", - "text": "クォータ API は、Azure サービスのクォータを表示および管理するために使用できる REST API です。必要に応じて使用を検討してください。", - "waf": "オペレーションズ" + "text": "イベント ドリブン ワークロードを実行する場合は KEDA を使用します", + "waf": "パフォーマンス" }, { - "checklist": "SAP Checklist", - "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", - "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", - "service": "SAP", - "severity": "高い", - "text": "可用性ゾーンにデプロイする場合は、クォータが承認されたら、VM のゾーン デプロイが使用可能であることを確認します。必要なサブスクリプション、VM シリーズ、CPU の数、可用性ゾーンを含むサポート リクエストを送信します。", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", + "link": "https://dapr.io/", + "service": "AKS", + "severity": "低い", + "text": "Dapr を使用してマイクロサービス開発を容易にする", "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "e6e20617-3686-4af4-9791-f8935ada4332", - "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "高い", - "text": "必要なサービスと機能が、選択した展開リージョン内で利用可能であることを確認します。ANF、ゾーンなど", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/azure-best-practices/multiple-regions?source=recommendations", - "waf": "オペレーションズ" + "text": "SLA でサポートされる AKS オファリングを使用する", + "waf": "確実" }, { - "checklist": "SAP Checklist", - "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", - "service": "SAP", - "severity": "中程度", - "text": "コストの分類とリソースのグループ化 (BillTo、部門 (または部署)、環境 (運用、ステージ、開発)、層 (Web 層、アプリケーション層)、アプリケーション所有者、プロジェクト名) に Azure リソース タグを活用します", - "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", - "waf": "オペレーションズ" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", + "severity": "低い", + "text": "ポッドとデプロイ定義でのディスラプション バジェットの使用", + "waf": "確実" }, { - "checklist": "SAP Checklist", - "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure AKS Review", + "guid": "3c763963-7a55-42d5-a15e-401955387e5c", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", + "service": "ACR", "severity": "高い", - "text": "Azure Backup サービスを使用して HANA データベースを保護するのに役立ちます。", - "training": "https://learn.microsoft.com/training/modules/implement-azure-backup-sap-workloads-azure-virtual-machines/?source=recommendations", + "text": "プライベート レジストリを使用する場合は、複数のリージョンにイメージを格納するようにリージョン レプリケーションを構成します", "waf": "確実" }, { - "checklist": "SAP Checklist", - "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", - "service": "SAP", - "severity": "中程度", - "text": "HANA、Oracle、または DB2 データベースに Azure NetApp Files をデプロイする場合は、Azure アプリケーション整合性スナップショット ツール (AzAcSnap) を使用して、アプリケーション整合性スナップショットを作成します。AzAcSnap は Oracle データベースもサポートしています。個々の VM ではなく、中央の VM で AzAcSnap を使用することを検討してください。", - "waf": "確実" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", + "service": "AKS", + "severity": "低い", + "text": "kubecost などの外部アプリケーションを使用して、さまざまなユーザーにコストを割り当てます", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", - "severity": "高い", - "text": "オペレーティングシステムと SAP システムの間でタイムゾーンが一致していることを確認します。", - "waf": "オペレーションズ" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", + "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", + "service": "AKS", + "severity": "低い", + "text": "スケールダウンモードを使用してノードを削除/割り当て解除する", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "c3c7abc0-716c-4486-893c-40e181d65539", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", + "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", + "service": "AKS", "severity": "中程度", - "text": "異なるアプリケーション サービスを同じクラスターにグループ化しないでください。たとえば、DRBDとセントラルサービスクラスタを同じクラスタに組み合わせないでください。ただし、同じ Pacemaker クラスターを使用して、約 5 つの異なるセントラル サービス (マルチ SID クラスター) を管理できます。", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "確実" + "text": "必要に応じて、AKS クラスターで複数インスタンスの分割 GPU を使用する", + "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "a491dfc4-9353-4213-9217-eef0949f9467", - "link": "https://azure.microsoft.com/pricing/offers/dev-test/", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", + "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", + "service": "AKS", "severity": "低い", - "text": "スヌーズ モデルで開発/テスト システムを実行して、Azure の実行コストを節約および最適化することを検討してください。", + "text": "Dev/Test クラスターを実行している場合は、NodePool Start/Stop を使用します。", "waf": "費用" }, { - "checklist": "SAP Checklist", - "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", - "link": "https://learn.microsoft.com/azure/lighthouse/overview", - "service": "SAP", - "severity": "中程度", - "text": "お客様の SAP 資産を管理することでお客様と提携する場合は、Azure Lighthouse をご検討ください。Azure Lighthouse を使用すると、マネージド サービス プロバイダーは Azure ネイティブ ID サービスを使用して、顧客の環境に対する認証を行うことができます。顧客はいつでもアクセスを取り消し、サービスプロバイダーの行動を監査できるため、制御を顧客の手に委ねることができます。", - "waf": "オペレーションズ" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "中程度", + "text": "Azure Policy for Kubernetes を使用してクラスターのコンプライアンスを確保する", + "waf": "安全" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中程度", - "text": "Azure Update Manager を使用して、1 つまたは複数の VM で利用可能な更新プログラムの状態を確認し、定期的な修正プログラムの適用をスケジュールすることを検討します。", - "training": "https://learn.microsoft.com/training/modules/keep-your-virtual-machines-updated/?source=recommendations", - "waf": "オペレーションズ" + "text": "ユーザー/システムノードプールを使用してコントロールプレーンからアプリケーションを分離する", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", - "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", + "link": "https://learn.microsoft.com/azure/aks/use-system-pools", + "service": "AKS", "severity": "低い", - "text": "SAP Landscape Management (LaMa) を使用して SAP Basis の運用を最適化および管理します。Azure 用の SAP LaMa コネクタを使用して、SAP システムの再配置、コピー、複製、更新を行います。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-remote-management/?source=recommendations", - "waf": "オペレーションズ" + "text": "システム ノードプールにテイントを追加して専用にする", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "14591147-5e39-4e53-89cc-cd979366bcda", - "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", + "link": "https://learn.microsoft.com/azure/container-registry/", + "service": "AKS", "severity": "中程度", - "text": "Azure Monitor for SAP solutions を使用して、Azure 上の SAP ワークロード (SAP HANA、高可用性 SUSE クラスター、SQL システム) を監視します。Azure Monitor for SAP solutions を SAP Solution Manager で補完することを検討してください。", - "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", - "waf": "オペレーションズ" - }, - { - "checklist": "SAP Checklist", - "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", - "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", - "service": "SAP", - "severity": "高い", - "text": "SAP の VM 拡張機能チェックを実行します。VM Extension for SAP では、仮想マシン (VM) の割り当てられたマネージド ID を使用して、VM の監視および構成データにアクセスします。このチェックにより、SAP アプリケーションのすべてのパフォーマンス メトリックが、基になる Azure Extension for SAP からのものであることが確認されます。", - "training": "https://learn.microsoft.com/training/modules/configure-azure-enhanced-monitoring-extension-for-sap/?source=recommendations", - "waf": "オペレーションズ" + "text": "イメージにはプライベート レジストリ (ACR など) を使用する", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure AKS Review", + "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", + "link": "https://learn.microsoft.com/azure/security-center/container-security", + "service": "ACR", "severity": "中程度", - "text": "アクセス制御とコンプライアンス レポートに Azure Policy を使用します。Azure Policy には、一貫したポリシーの遵守と迅速な違反検出を保証するために、組織全体の設定を適用する機能が用意されています。", - "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", - "waf": "オペレーションズ" + "text": "イメージをスキャンして脆弱性を検出する", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", - "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", - "service": "SAP", - "severity": "中程度", - "text": "Azure Network Watcher の接続モニターを使用して、SAP データベースとアプリケーション サーバーの待機時間メトリックを監視します。または、Azure Monitor を使用してネットワーク待機時間の測定値を収集して表示します。", - "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/collecting-and-displaying-niping-network-latency-measurements/ba-p/1833979", - "waf": "オペレーションズ" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", + "service": "AKS", + "severity": "高い", + "text": "アプリの分離要件を定義する (名前空間/ノードプール/クラスター)", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "73686af4-6791-4f89-95ad-a43324e13811", - "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", + "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", + "service": "AKS", "severity": "中程度", - "text": "プロビジョニングされた Azure インフラストラクチャで SAP HANA の品質チェックを実行して、プロビジョニングされた VM が SAP HANA on Azure のベスト プラクティスに準拠していることを確認します。", - "waf": "オペレーションズ" + "text": "CSI シークレット ストア ドライバーを使用して Azure Key Vault にシークレットを格納する", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "616785d6-fa96-4c96-ad88-518f482734c8", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", + "link": "https://learn.microsoft.com/azure/aks/update-credentials", + "service": "AKS", "severity": "高い", - "text": "Azure サブスクリプションごとに、ゾーン デプロイの前に Azure 可用性ゾーンで待機時間テストを実行して、SAP on Azure のデプロイ用に待機時間の短いゾーンを選択します。", - "training": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/AvZone-Latency-Test", - "waf": "パフォーマンス" + "text": "クラスターにサービス プリンシパルを使用する場合は、資格情報を定期的に (四半期ごとなど) 更新します", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", - "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", + "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", + "service": "AKS", "severity": "中程度", - "text": "回復性レポートを実行して、プロビジョニングされた Azure インフラストラクチャ (コンピューティング、データベース、ネットワーク、ストレージ、Site Recovery) 全体の構成が、Cloud Adaption Framework for Azure によって定義された構成に準拠していることを確認します。", - "training": "https://learn.microsoft.com/training/paths/azure-well-architected-framework/", - "waf": "確実" + "text": "必要に応じて、キー管理サービスの etcd 暗号化を追加します", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", - "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", - "service": "SAP", - "severity": "中程度", - "text": "SAP 用 Microsoft Sentinel ソリューションを使用して脅威保護を実装します。このソリューションを使用して、SAPシステムを監視し、ビジネスロジック層とアプリケーション層全体で高度な脅威を検出します。", - "training": "https://learn.microsoft.com/training/modules/plan-microsoft-sentinel-deployment-sap/?source=recommendations", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", + "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", + "service": "AKS", + "severity": "低い", + "text": "必要に応じて、Confidential Compute for AKS の使用を検討してください", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", - "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", + "service": "AKS", "severity": "中程度", - "text": "Azure のタグ付けを利用して、リソースを論理的にグループ化して追跡し、デプロイを自動化し、最も重要なこととして、発生したコストを可視化できます。", - "training": "https://learn.microsoft.com/training/modules/analyze-costs-create-budgets-azure-cost-management/?source=recommendations", - "waf": "オペレーションズ" + "text": "Defender for Containers の使用を検討する", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", - "service": "SAP", - "severity": "低い", - "text": "待機時間の影響を受けやすいアプリケーションには、VM 間の待機時間の監視を使用します。", - "waf": "パフォーマンス" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "高い", + "text": "サービス プリンシパルの代わりにマネージド ID を使用するUse managed identities instead of Service Principals", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中程度", - "text": "Azure Site Recovery の監視を使用して、SAP アプリケーション サーバーのディザスター リカバリー サービスの正常性を維持します。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", - "waf": "確実" + "text": "認証と AAD の統合 (マネージド統合を使用)", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", + "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", + "service": "AKS", "severity": "中程度", - "text": "すべてのデータベース・ファイル・システムおよび実行可能プログラムをウイルス対策スキャンから除外します。これらを含めると、パフォーマンスの問題が発生する可能性があります。除外リストの規範的な詳細については、データベースベンダーに確認してください。たとえば、ウイルス対策スキャンから/oracle//sapdataを除外することをお薦めします。", - "waf": "パフォーマンス" + "text": "管理者 kubeconfig へのアクセスを制限する (get-credentials --admin)", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "c027f893-f404-41a9-b33d-39d625a14964", - "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", - "service": "SAP", - "severity": "低い", - "text": "移行後に、HANA以外のデータベースの完全なデータベース統計を収集することを検討してください。たとえば、SAP ノート 1020260 - Oracle 統計の配信を実装します。", - "waf": "パフォーマンス" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", + "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", + "service": "AKS", + "severity": "中程度", + "text": "承認と AAD RBAC の統合", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", - "service": "SAP", - "severity": "中程度", - "text": "SAP on Azure を使用するすべての Oracle デプロイには、Oracle Automatic Storage Management (ASM) の使用を検討してください。", - "training": "https://learn.microsoft.com/training/paths/administer-infrastructure-resources-in-azure/?source=recommendations", - "waf": "パフォーマンス" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", + "service": "AKS", + "severity": "高い", + "text": "Kubernetes で RBAC 特権を制限するために名前空間を使用する", + "waf": "安全" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", + "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", + "service": "AKS", "severity": "中程度", - "text": "Oracle を実行している SAP on Azure の場合、SQL スクリプトのコレクションは、パフォーマンスの問題の診断に役立ちます。 自動ワークロード・リポジトリ(AWR)レポートには、Oracleシステムの問題を診断するための貴重な情報が含まれています。AWRレポートは、複数のセッションで実行し、ピーク時間を選択して、分析を広範囲にカバーすることをお薦めします。", - "training": "https://learn.microsoft.com/ja-jp/azure/well-architected/oracle-iaas/performance-efficiency", - "waf": "パフォーマンス" + "text": "ポッド ID アクセス管理の場合は、Azure AD ワークロード ID (プレビュー) を使用します", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", - "severity": "高い", - "text": "Azure Site Recovery の監視を使用して、SAP アプリケーション サーバーのディザスター リカバリー サービスの正常性を維持します。", - "training": "https://learn.microsoft.com/training/modules/protect-on-premises-infrastructure-with-azure-site-recovery/?source=recommendations", - "waf": "オペレーションズ" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", + "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", + "service": "AKS", + "severity": "中程度", + "text": "AKS 非対話型ログインの場合は、kubelogin (プレビュー) を使用します", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中程度", - "text": "HTTP/S アプリを安全に配信するには、Application Gateway v2 を使用し、WAF の保護とポリシーが有効になっていることを確認します。", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/", + "text": "AKS ローカル アカウントを無効にする", "waf": "安全" }, { - "checklist": "SAP 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", - "severity": "中程度", - "text": "Azure への移行中に仮想マシンの DNS または仮想名が変更されない場合、バックグラウンド DNS と仮想名によって SAP ランドスケープ内の多くのシステム インターフェイスが接続され、お客様は、開発者が時間の経過と共に定義するインターフェイスに気付くことがあります。移行後に仮想名または DNS 名が変更されると、さまざまなシステム間で接続の問題が発生するため、このような問題を防ぐために DNS エイリアスを保持することをお勧めします。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", - "waf": "オペレーションズ" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "低い", + "text": "必要に応じて Just-In-Time クラスター アクセスを構成する", + "waf": "安全" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "低い", + "text": "必要に応じて AKS の AAD 条件付きアクセスを構成する", + "waf": "安全" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", + "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", + "service": "AKS", + "severity": "低い", + "text": "Windows AKS ワークロードで必要な場合は、gMSA を構成します", + "waf": "安全" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中程度", - "text": "異なる DNS ゾーンを使用して、各環境 (サンドボックス、開発、運用前、運用) を互いに区別します。例外は、独自の VNet を使用する SAP デプロイの場合です。ここでは、プライベート DNS ゾーンは必要ない場合があります。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", - "waf": "オペレーションズ" + "text": "より細かく制御するには、マネージドKubelet Identityの使用を検討してください", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "a3592829-e6e2-4061-9368-6af46791f893", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", + "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", + "service": "AKS", "severity": "中程度", - "text": "ローカルとグローバルの VNet ピアリングは接続を提供し、複数の Azure リージョンにまたがる SAP デプロイのランディング ゾーン間の接続を確保するための推奨されるアプローチです", - "training": "https://learn.microsoft.com/training/modules/configure-vnet-peering/?source=recommendations", + "text": "AGIC を使用している場合は、クラスター間で AppGW を共有しないでください", "waf": "確実" }, { - "checklist": "SAP Checklist", - "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "高い", - "text": "SAP アプリケーションと SAP データベース サーバー間の NVA のデプロイはサポートされていません", - "training": "https://me.sap.com/notes/2731110", - "waf": "パフォーマンス" + "text": "AKS HTTP ルーティング アドオンを使用せず、代わりにアプリケーション ルーティング アドオンでマネージド NGINX イングレスを使用します。", + "waf": "確実" }, { - "checklist": "SAP Checklist", - "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", - "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", + "service": "AKS", "severity": "中程度", - "text": "Azure リージョンとオンプレミスの場所をまたいだグローバルなトランジット接続が必要な新規ネットワーク、大規模ネットワーク、またはグローバル ネットワークでの Azure デプロイに Virtual WAN を使用します。このアプローチでは、Azure ネットワークの推移的なルーティングを手動で設定する必要はなく、SAP on Azure デプロイの標準に従うことができます。", - "training": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", - "waf": "オペレーションズ" + "text": "Windows ワークロードの場合は、高速ネットワークを使用します", + "waf": "パフォーマンス" }, { - "checklist": "SAP Checklist", - "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", - "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", - "service": "SAP", - "severity": "中程度", - "text": "パートナーの NVA が使用されている場合にのみ、リージョン間でネットワーク仮想アプライアンス (NVA) をデプロイすることを検討してください。ネイティブ NVA が存在する場合、リージョン間または VNet 間の NVA は必要ありません。パートナーのネットワーク テクノロジと NVA をデプロイする場合は、ベンダーのガイダンスに従って、Azure ネットワークと競合する構成を確認します。", - "training": "https://learn.microsoft.com/training/modules/control-network-traffic-flow-with-routes/?source=recommendations", - "waf": "オペレーションズ" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "高い", + "text": "標準のALBを使用する(基本的なALBとは対照的)", + "waf": "確実" }, { - "checklist": "SAP Checklist", - "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", - "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中程度", - "text": "Virtual WAN は、仮想 WAN ベースのトポロジのスポーク VNet 間の接続を管理し (ユーザー定義ルーティング (UDR) または NVA を設定する必要はありません)、同じ仮想ハブ内の VNet 間トラフィックの最大ネットワーク スループットは 50 ギガビット/秒です。必要に応じて、SAP ランディング ゾーンは VNet ピアリングを使用して他のランディング ゾーンに接続し、この帯域幅の制限を克服できます。", - "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/?source=recommendations", - "waf": "オペレーションズ" + "text": "Azure CNI を使用する場合は、NodePool に異なるサブネットを使用することを検討してください", + "waf": "安全" }, { - "checklist": "SAP 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", - "severity": "高い", - "text": "SAP ワークロードを実行している VM へのパブリック IP の割り当てはお勧めしません。", - "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", + "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", + "service": "AKS", + "severity": "中程度", + "text": "プライベート エンドポイント (推奨) または Virtual Network サービス エンドポイントを使用して、クラスターから PaaS サービスにアクセスする", "waf": "安全" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "高い", - "text": "ASRの設定時にDR側でIPアドレスを予約することを検討してください", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "オペレーションズ" + "text": "要件に最適な CNI ネットワーク プラグインを選択する (Azure CNI を推奨)", + "waf": "確実" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "severity": "高い", - "text": "運用サイトと DR サイトで重複する IP アドレス範囲を使用しないでください。", - "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", - "waf": "オペレーションズ" + "text": "Azure CNI を使用する場合は、ノードあたりのポッドの最大数を考慮して、サブネットのサイズを適切に設定します", + "waf": "パフォーマンス" }, { - "checklist": "SAP Checklist", - "guid": "6e154e3a-a359-4282-ae6e-206173686af4", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", - "service": "SAP", - "severity": "中程度", - "text": "Azure では 1 つの VNet に複数の委任されたサブネットを作成できますが、Azure NetApp Files の VNet に存在できる委任されたサブネットは 1 つだけです。Azure NetApp Files に複数の委任されたサブネットを使用すると、新しいボリュームを作成しようとしても失敗します。", - "training": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-network-topologies?source=recommendations", - "waf": "オペレーションズ" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", + "severity": "高い", + "text": "Azure CNI を使用している場合は、最大ポッド数/ノード (既定値は 30) を確認します", + "waf": "パフォーマンス" }, { - "checklist": "SAP 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", - "severity": "中程度", - "text": "Azure Firewall を使用して、インターネットへの Azure 送信トラフィック、HTTP/S 以外の受信接続、East/West トラフィック フィルター処理 (組織で必要な場合) を管理します", - "training": "https://learn.microsoft.com/training/paths/secure-networking-infrastructure/", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "description": "内部アプリの場合、組織は多くの場合、ファイアウォールで AKS サブネット全体を開きます。これにより、ノードへのネットワーク アクセスも開かれ、場合によってはポッドへのネットワーク アクセスも開かれます (Azure CNI を使用している場合)。LoadBalancer の IP が別のサブネットにある場合は、この IP のみをアプリ クライアントで使用できる必要があります。もう 1 つの理由は、AKS サブネット内の IP アドレスが希少なリソースである場合、その IP アドレスをサービスに使用すると、クラスターの最大スケーラビリティが低下することです。", + "guid": "13c00567-4b1e-4945-a459-c373e7ed6162", + "link": "https://learn.microsoft.com/azure/aks/internal-lb", + "service": "AKS", + "severity": "低い", + "text": "プライベート IP LoadBalancer サービスを使用する場合は、(AKS サブネットではなく) 専用サブネットを使用します", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", - "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", - "service": "SAP", - "severity": "中程度", - "text": "Application Gateway、SAP Web Dispatcher、およびその他のサードパーティ サービスの比較に示すように、Application Gateway が SAP Web アプリのリバース プロキシとして機能する場合、Application Gateway と Web Application Firewall には制限があります。", - "training": "https://help.sap.com/docs/SUPPORT_CONTENT/si/3362959506.html", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", + "severity": "高い", + "text": "それに応じて、サービスの IP アドレス範囲のサイズを設定します (クラスターのスケーラビリティが制限されます)。", + "waf": "確実" }, { - "checklist": "SAP Checklist", - "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", - "severity": "中程度", - "text": "Azure Front Door と WAF ポリシーを使用して、ランディング ゾーンへの受信 HTTP/S 接続に対して Azure リージョン全体でグローバル保護を提供します。", - "training": "https://learn.microsoft.com/training/paths/secure-application-delivery/", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", + "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", + "service": "AKS", + "severity": "低い", + "text": "必要に応じて、独自のCNIプラグインを追加します", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", - "service": "SAP", - "severity": "中程度", - "text": "Azure Front Door と Application Gateway を使用して HTTP/S アプリケーションを保護する場合は、Azure Front Door の Web アプリケーション ファイアウォール ポリシーを利用します。Application Gateway をロックダウンして、Azure Front Door からのトラフィックのみを受信します。", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "低い", + "text": "必要に応じて、AKS でノードごとにパブリック IP を構成する", + "waf": "パフォーマンス" }, { - "checklist": "SAP Checklist", - "guid": "5ada4332-4e13-4811-9231-81aa41742694", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", + "link": "https://learn.microsoft.com/azure/aks/concepts-network", + "service": "AKS", "severity": "中程度", - "text": "Web アプリケーション ファイアウォールを使用して、インターネットに公開されているトラフィックをスキャンします。別のオプションとして、ロード バランサーや、Application Gateway やサードパーティ ソリューションなどのファイアウォール機能が組み込まれているリソースと共に使用することもできます。", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", - "waf": "安全" + "text": "イングレス コントローラーを使用して、LoadBalancer タイプのサービスで公開する代わりに、Web ベースのアプリを公開します", + "waf": "確実" }, { - "checklist": "SAP Checklist", - "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "SAP", - "severity": "中程度", - "text": "Azure リージョンとオンプレミスの場所をまたいだグローバルなトランジット接続が必要な新規ネットワーク、大規模ネットワーク、またはグローバル ネットワークでの Azure デプロイに Virtual WAN を使用します。このアプローチでは、Azure ネットワークの推移的なルーティングを手動で設定する必要はなく、SAP on Azure デプロイの標準に従うことができます。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/10-explore-azure-front-door", - "waf": "パフォーマンス" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", + "link": "https://learn.microsoft.com/azure/aks/nat-gateway", + "service": "AKS", + "severity": "低い", + "text": "エグレス トラフィックをスケーリングするために Azure NAT Gateway を outboundType として使用する", + "waf": "確実" }, { - "checklist": "SAP Checklist", - "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", - "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中程度", - "text": "データ漏えいを防ぐには、Azure Private Link を使用して、Azure Blob Storage、Azure Files、Azure Data Lake Storage Gen2、Azure Data Factory などのサービスとしてのプラットフォーム リソースに安全にアクセスします。Azure プライベート エンドポイントは、VNet と Azure Storage、Azure Backup などのサービス間のトラフィックをセキュリティで保護するのにも役立ちます。VNet とプライベート エンドポイント対応サービス間のトラフィックは、Microsoft グローバル ネットワークを経由するため、パブリック インターネットへの公開は防止されます。", - "training": "https://learn.microsoft.com/training/modules/design-implement-private-access-to-azure-services/?source=recommendations", - "waf": "安全" + "text": "Azure CNI IP の枯渇を回避するために IP の動的割り当てを使用する", + "waf": "確実" }, { - "checklist": "SAP Checklist", - "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "高い", - "text": "SAP アプリケーションと DBMS レイヤーで使用される VM で Azure 高速ネットワークが有効になっていることを確認します。", - "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", - "waf": "パフォーマンス" - }, - { - "checklist": "SAP Checklist", - "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", - "service": "SAP", - "severity": "中程度", - "text": "Azure Load Balancer の内部デプロイが Direct Server Return (DSR) を使用するように設定されていることを確認します。この設定 (フローティング IP の有効化) により、DBMS レイヤーの高可用性構成に内部ロード バランサー構成が使用されている場合の待機時間が短縮されます。", - "training": "https://learn.microsoft.com/ja-jp/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", + "text": "セキュリティ要件で義務付けられている場合は、AzFW/NVA を使用してエグレス トラフィックをフィルター処理します", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "6791f893-5ada-4433-84e1-3811523181aa", - "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中程度", - "text": "アプリケーション セキュリティ グループ (ASG) と NSG 規則を使用して、SAP アプリケーション層と DBMS 層の間にネットワーク セキュリティのアクセス制御リストを定義できます。ASG は、仮想マシンをグループ化してセキュリティの管理に役立てます。", - "training": "https://learn.microsoft.com/training/modules/configure-network-security-groups/?source=recommendations", + "text": "パブリック API エンドポイントを使用している場合は、アクセスできる IP アドレスを制限します", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "高い", - "text": "ピアリングされていない異なる Azure VNet への SAP アプリケーション レイヤーと SAP DBMS の配置はサポートされていません。", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "パフォーマンス" + "text": "要件で必要な場合は、プライベート クラスターを使用します", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "fa96c96a-d885-418f-9827-34c886ba2802", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中程度", - "text": "SAP アプリケーションで最適なネットワーク待機時間を実現するには、Azure 近接通信配置グループの使用を検討してください。", - "training": "https://learn.microsoft.com/azure/virtual-machines/co-location#planned-maintenance-and-proximity-placement-groups", - "waf": "パフォーマンス" + "text": "Windows 2019 および 2022 AKS ノードでは、Calico ネットワーク ポリシーを使用できます", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "高い", - "text": "オンプレミスと Azure の間で分割された SAP アプリケーション サーバー レイヤーと DBMS レイヤーを実行することは、まったくサポートされていません。どちらのレイヤーも、オンプレミスまたは Azure に完全に存在する必要があります。", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "パフォーマンス" + "text": "Kubernetes ネットワーク ポリシー オプションを有効にする (Calico/Azure)", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", "severity": "高い", - "text": "SAP システムのデータベース管理システム (DBMS) レイヤーとアプリケーション レイヤーを異なる VNet でホストし、それらを VNet ピアリングに接続することは、レイヤー間の過剰なネットワーク トラフィックによって生成される可能性があるため、お勧めしません。Azure 仮想ネットワーク内のサブネットを使用して、SAP アプリケーション レイヤーと DBMS レイヤーを分離することをお勧めします。", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "費用" + "text": "Kubernetesネットワークポリシーを使用してクラスタ内のセキュリティを強化", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "402a9846-d515-4061-aff8-cd30088693fa", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", "severity": "高い", - "text": "Linux ゲスト・オペレーティング・システムで Load Balancer を使用する場合は、Linux ネットワーク・パラメーター net.ipv4.tcp_timestamps が 0 に設定されていることを確認します。", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "パフォーマンス" + "text": "Web ワークロード (UI または API) に WAF を使用するUse a WAF for a web workloads (UI or API)", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "87585797-5551-4d53-bb7d-a94ee415734d", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中程度", - "text": "SAP RISE/ECS デプロイの場合、仮想ピアリングは、お客様の既存の Azure 環境との接続を確立するための推奨される方法です。SAP vnet と顧客 VNet の両方がネットワーク セキュリティ グループ (NSG) で保護され、vnet ピアリングを介した SAP ポートとデータベース ポートでの通信が可能になります", + "text": "AKS Virtual Network で DDoS Standard を使用するUse DDoS Standard in the AKS Virtual Network", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", - "severity": "高い", - "text": "Azure VM の SAP HANA データベースのバックアップを確認します。", - "waf": "費用" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "低い", + "text": "必要に応じて、会社の HTTP プロキシを追加します", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", + "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", + "service": "AKS", "severity": "中程度", - "text": "Site Recovery の組み込み監視 (SAP で使用されている場合) を確認します。", - "waf": "費用" + "text": "高度なマイクロサービス通信管理にサービスメッシュの使用を検討する", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", - "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", + "service": "AKS", "severity": "高い", - "text": "SAP HANA システム ランドスケープの監視に関するガイダンスを確認します。", + "text": "最も重要なメトリックに関するアラートを構成します (推奨事項については、「Container Insights」を参照してください)", "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", - "service": "SAP", - "severity": "中程度", - "text": "Azure Linux VM のバックアップ戦略で Oracle Database を確認します。", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "337453a3-cc63-4963-9a65-22ac19e80696", + "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", + "service": "AKS", + "severity": "低い", + "text": "Azure Advisor でクラスターの推奨事項を定期的に確認する", "waf": "オペレーションズ" }, { - "checklist": "SAP 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", - "severity": "中程度", - "text": "SQL Server 2016 での Azure Blob Storage の使用を確認します。", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", + "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", + "service": "AKS", + "severity": "低い", + "text": "AKS 自動証明書のローテーションを有効にする", "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", - "service": "SAP", - "severity": "中程度", - "text": "Azure VM の自動バックアップ v2 の使用を確認します。", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", + "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", + "service": "AKS", + "severity": "高い", + "text": "kubernetes のバージョンを定期的に (四半期ごとなど) アップグレードする定期的なプロセスを行うか、AKS 自動アップグレード機能を使用します", "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", + "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", + "service": "AKS", "severity": "高い", - "text": "Premium ディスク使用時の M シリーズの書き込みアクセラレータの有効化 (V1)", + "text": "ノードイメージのアップグレードを使用していない場合は、Linuxノードのアップグレードにkuredを使用します", "waf": "オペレーションズ" }, { - "checklist": "SAP 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", - "severity": "中程度", - "text": "可用性ゾーンの待機時間をテストします。", - "waf": "パフォーマンス" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", + "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", + "service": "AKS", + "severity": "高い", + "text": "クラスタノードイメージを定期的に(毎週など)アップグレードする定期的なプロセスを用意します", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", - "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", - "service": "SAP", - "severity": "中程度", - "text": "すべての SAP コンポーネントに対して SAP EarlyWatch Alert を有効化します。", - "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", - "waf": "パフォーマンス" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", + "service": "AKS", + "severity": "低い", + "text": "アプリケーションまたはクラスター構成を複数のクラスターにデプロイするために gitop を検討してください", + "waf": "オペレーションズ" }, { - "checklist": "SAP 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", - "severity": "中程度", - "text": "SAP ABAPMeter report /SSA/CAT を使用して、SAP アプリケーション サーバーからデータベース サーバー間の待機時間を確認します。", - "training": "https://me.sap.com/notes/0002879613", - "waf": "パフォーマンス" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d7672c26-7602-4482-85a4-14527fbe855c", + "link": "https://learn.microsoft.com/azure/aks/command-invoke", + "service": "AKS", + "severity": "低い", + "text": "プライベート クラスターで AKS コマンド呼び出しを使用することを検討する", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", - "service": "SAP", - "severity": "中程度", - "text": "CCMS を使用した SQL Server のパフォーマンス監視を確認します。", - "waf": "パフォーマンス" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", + "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", + "service": "AKS", + "severity": "低い", + "text": "計画されたイベントの場合は、ノードの自動ドレインの使用を検討してください", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", - "link": "https://me.sap.com/notes/500235", - "service": "SAP", - "severity": "中程度", - "text": "SAP アプリケーション レイヤー VM と DBMS VM 間のネットワーク待機時間をテストします (NIPING)。", - "training": "https://me.sap.com/notes/1100926/E", - "waf": "パフォーマンス" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", + "link": "https://learn.microsoft.com/azure/aks/faq", + "service": "AKS", + "severity": "高い", + "text": "独自のガバナンスプラクティスを開発して、ノードRG(別名「インフラRG」)のオペレーターによって変更が実行されないようにします", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", - "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", - "service": "SAP", - "severity": "中程度", - "text": "SAP HANA Studio アラートを確認します。", - "waf": "パフォーマンス" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "低い", + "text": "カスタムノードRG(別名「インフラRG」)名を使用", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", - "link": "https://me.sap.com/notes/1969700", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", + "link": "https://kubernetes.io/docs/setup/release/notes/", + "service": "AKS", "severity": "中程度", - "text": "HANA_Configuration_Minichecks を使用して SAP HANA ヘルスチェックを実行します。", - "waf": "パフォーマンス" + "text": "非推奨の Kubernetes API を YAML マニフェストで使用しないでください", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", - "severity": "中程度", - "text": "Azure、オンプレミス、またはその他のクラウド環境で Windows VM と Linux VM を実行している場合は、Azure Automation の更新管理センターを使用して、セキュリティ パッチを含むオペレーティング システムの更新プログラムを管理できます。", - "training": "https://learn.microsoft.com/azure/automation/update-management/overview", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", + "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", + "service": "AKS", + "severity": "低い", + "text": "Windows ノードのテイント", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "08951710-79a2-492a-adbc-06d7a401545b", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", - "severity": "中程度", - "text": "SAP は、SAP システムを保護するために即時のアクションを必要とする非常に重要なセキュリティ パッチまたはホット フィックスをリリースしているため、SAP セキュリティ OSS ノートを定期的に確認してください。", - "training": "https://support.sap.com/en/my-support/knowledge-base/security-notes-news.html", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "低い", + "text": "Windows コンテナーのパッチ レベルをホストのパッチ レベルと同期させる", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "description": "クラスタレベルでの診断設定経由", + "guid": "5b56ad48-408f-4e72-934c-476ba280dcf5", + "link": "https://learn.microsoft.com/azure/aks/monitor-aks", + "service": "AKS", "severity": "低い", - "text": "SQL Server 上の SAP システムではアカウントを使用しないため、SQL Server 上の SAP システム管理者アカウントを無効にすることができます。元のシステム管理者アカウントを無効にする前に、システム管理者権限を持つ別のユーザーがサーバーにアクセスできることを確認してください。", - "waf": "安全" + "text": "マスター ログ (API ログ) を Azure Monitor または任意のログ管理ソリューションに送信する", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", - "severity": "高い", - "text": "xp_cmdshellを無効にします。SQL Server 機能xp_cmdshell、SQL Server 内部オペレーティング システムのコマンド シェルを有効にします。これは、セキュリティ監査における潜在的なリスクです。", - "training": "https://me.sap.com/notes/3019299/E", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", + "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", + "service": "AKS", + "severity": "低い", + "text": "必要に応じて、nodePool スナップショットを使用します", + "waf": "費用" }, { - "checklist": "SAP 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", - "severity": "高い", - "text": "Azure 上の SAP HANA データベース サーバーの暗号化では、SAP HANA ネイティブ暗号化テクノロジが使用されます。さらに、Azure で SQL Server を使用している場合は、Transparent Data Encryption (TDE) を使用してデータとログ ファイルを保護し、バックアップも暗号化されるようにします。", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", + "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", + "service": "AKS", + "severity": "低い", + "text": "時間的制約のないワークロードのスポット ノード プールを検討する", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", - "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", - "service": "SAP", - "severity": "中程度", - "text": "Azure Storage の暗号化は、すべての Azure Resource Manager とクラシック ストレージ アカウントに対して有効になっており、無効にすることはできません。データは既定で暗号化されるため、Azure Storage 暗号化を使用するためにコードやアプリケーションを変更する必要はありません。", - "training": "https://learn.microsoft.com/training/modules/encrypt-sector-data/?source=recommendations", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "低い", + "text": "クイック バーストのために AKS 仮想ノードを検討する", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", - "link": "https://learn.microsoft.com/azure/key-vault/general/overview", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", + "service": "AKS", "severity": "高い", - "text": "Azure Key Vault を使用してシークレットと資格情報を格納する", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "安全" + "text": "Container Insights (または Prometheus などの他のツール) を使用してクラスター メトリックを監視する", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "829e2edb-2173-4676-aff6-691b4935ada4", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "SAP", - "severity": "中程度", - "text": "デプロイが成功したら、Azure リソースを LOCK して、承認されていない変更から保護することをお勧めします。また、カスタマイズされた Azure ポリシー (Custome ロール) を使用して、サブスクリプションごとに LOCK の制約とルールを適用することもできます。", - "training": "https://learn.microsoft.com/training/modules/use-azure-resource-manager/?source=recommendations", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "高い", + "text": "Container Insights(またはTelegraf/ElasticSearchなどの他のツール)を使用してクラスターログを保存および分析します", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", + "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", + "service": "AKS", "severity": "中程度", - "text": "論理的な削除ポリシーと消去ポリシーを有効にして Azure Key Vault をプロビジョニングし、削除されたオブジェクトの保持保護を許可します。", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "安全" + "text": "ノードの CPU とメモリの使用率を監視する", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", - "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", - "service": "SAP", - "severity": "高い", - "text": "既存の要件、規制、コンプライアンス制御 (内部/外部) に基づいて、必要な Azure ポリシーと Azure RBAC ロールを決定します", - "training": "https://learn.microsoft.com/training/paths/describe-azure-management-governance/?source=recommendations", - "waf": "安全" - }, - { - "checklist": "SAP 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", - "severity": "高い", - "text": "SAP 環境でMicrosoft Defender for Endpointを有効にする場合は、すべてのサーバーを対象とするのではなく、DBMS サーバー上のデータとログ ファイルを除外することをお勧めします。ターゲット ファイルを除外する場合は、DBMS ベンダーの推奨事項に従ってください。", - "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/microsoft-defender-endpoint-mde-for-sap-applications-on-windows/ba-p/3912268", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "1a4835ac-9422-423e-ae80-b123081a5417", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", + "severity": "中程度", + "text": "Azure CNI を使用している場合は、ノードごとに消費されるポッド IP の割合を監視します", + "waf": "オペレーションズ" }, { - "checklist": "SAP 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", - "severity": "高い", - "text": "Microsoft Defender for Cloud の Just-In-Time アクセス権を持つ SAP 管理者カスタム ロールを委任します。", - "training": "https://learn.microsoft.com/training/modules/secure-vms-with-azure-security-center/?source=recommendations", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "description": "OS ディスクの I/O は重要なリソースです。ノード内の OS が I/O で調整されると、予期しない動作が発生し、通常はノードが NotReady と宣言される可能性があります", + "guid": "415833ea-3ad3-4c2d-b733-165c3acbe04b", + "link": "https://learn.microsoft.com/azure/virtual-machines/premium-storage-performance", + "service": "AKS", + "severity": "中程度", + "text": "ノード内の OS ディスク キューの深さを監視する", + "waf": "オペレーションズ" }, { - "checklist": "SAP 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", - "severity": "低い", - "text": "サードパーティのセキュリティ製品を DIAG (SAP GUI)、RFC、および SPNEGO for HTTPS のセキュアネットワーク通信 (SNC) と統合することにより、転送中のデータを暗号化します。", - "training": "https://learn.microsoft.com/azure/security/fundamentals/encryption-overview#encryption-of-data-in-transit", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "be209d39-fda4-4777-a424-d116785c2fa5", + "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", + "service": "AKS", + "severity": "中程度", + "text": "AzFW/NVA でエグレス フィルター処理を使用しない場合は、標準の ALB によって割り当てられた SNAT ポートを監視します", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", - "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", + "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", + "service": "AKS", "severity": "中程度", - "text": "プリンシパル暗号化機能には既定で Microsoft マネージド キーを使用し、必要に応じてカスタマー マネージド キーを使用します。", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "安全" + "text": "AKS クラスターのリソース正常性通知をサブスクライブするSubscribe to resource health notifications for your AKS cluster", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "4935ada4-2223-4ece-a1b1-23181a541741", - "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", "severity": "高い", - "text": "Azure Key Vault は、アプリケーションごと、環境ごと、リージョンごとに使用します。", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "安全" + "text": "ポッド仕様で要求と制限を構成する", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", - "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", - "service": "SAP", - "severity": "高い", - "text": "HANA 以外の Windows オペレーティング システムと Windows 以外のオペレーティング システムのディスク暗号化キーとシークレットを制御および管理するには、Azure Key Vault を使用します。SAP HANA は Azure Key Vault ではサポートされていないため、SAP ABAP キーや SSH キーなどの代替方法を使用する必要があります。", - "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/?source=recommendations", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "769ef669-1a48-435a-a942-223ece80b123", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", + "severity": "中程度", + "text": "名前空間のリソースクォータを適用する", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "209d490d-a477-4784-84d1-16785d2fa56c", - "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "081a5417-4158-433e-a3ad-3c2de733165c", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", + "service": "AKS", "severity": "高い", - "text": "SAP on Azure スポーク サブスクリプションのロールベースのアクセス制御 (RBAC) ロールをカスタマイズして、偶発的なネットワーク関連の変更を回避します", - "training": "https://learn.microsoft.com/training/modules/secure-azure-resources-with-rbac/?source=recommendations", - "waf": "安全" + "text": "サブスクリプションにノードプールをスケールアウトするのに十分なクォータがあることを確認する", + "waf": "オペレーションズ" }, { - "checklist": "SAP Checklist", - "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", - "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", - "service": "SAP", - "severity": "高い", - "text": "DMZ と NVA を SAP 資産の残りの部分から分離し、Azure Private Link を構成し、SAP on Azure リソースを安全に管理および制御します", - "training": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/secure-vnet-dmz?tabs=portal", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "中程度", + "text": "Cluster Autoscaler を使用する", + "waf": "パフォーマンス" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "低い", - "text": "Azure で Microsoft マルウェア対策ソフトウェアを使用して、悪意のあるファイル、アドウェア、その他の脅威から仮想マシンを保護することを検討してください。", - "training": "https://azure.microsoft.com/blog/deploying-antimalware-solutions-on-azure-virtual-machines/", - "waf": "安全" + "text": "AKS ノード プールのノード構成をカスタマイズする", + "waf": "パフォーマンス" }, { - "checklist": "SAP 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", - "severity": "低い", - "text": "さらに強力な保護を行うには、Microsoft Defender for Endpointの使用を検討してください。", - "training": "https://learn.microsoft.com/training/modules/implement-endpoint-protection-use-microsoft-defender/?source=recommendations", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", + "link": "https://learn.microsoft.com/azure/aks/concepts-scale", + "service": "AKS", + "severity": "中程度", + "text": "必要に応じてHorizontal Pod Autoscalerを使用します", + "waf": "パフォーマンス" }, { - "checklist": "SAP Checklist", - "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "description": "ノードが大きくなると、パフォーマンスが向上し、エフェメラル ディスクや高速ネットワークなどの機能が提供されますが、爆発半径が大きくなり、スケーリングの粒度が低下します", + "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", "severity": "高い", - "text": "仮想ネットワーク ピアリングによってスポーク ネットワークに接続されているハブ仮想ネットワークを介してすべてのトラフィックを渡すことで、SAP アプリケーションとデータベース サーバーをインターネットまたはオンプレミス ネットワークから分離します。ピアリングされた仮想ネットワークにより、SAP on Azure ソリューションがパブリック インターネットから分離されることが保証されます。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/?source=recommendations", - "waf": "安全" + "text": "大きすぎず小さすぎない適切なノードサイズを検討してください", + "waf": "パフォーマンス" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", + "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", + "service": "AKS", "severity": "低い", - "text": "SAP Fiori などのインターネットに接続するアプリケーションの場合は、セキュリティレベルを維持しながら、アプリケーション要件ごとに負荷を分散してください。レイヤー 7 セキュリティについては、Azure Marketplace で入手できるサードパーティの Web アプリケーション ファイアウォール (WAF) を使用できます。", - "training": "https://learn.microsoft.com/training/modules/simplify-cloud-procurement-governance-azure-marketplace/?source=recommendations", - "waf": "安全" + "text": "スケーラビリティのために 5,000 を超えるノードが必要な場合は、追加の AKS クラスターの使用を検討してください", + "waf": "パフォーマンス" }, { - "checklist": "SAP Checklist", - "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", - "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", - "service": "SAP", - "severity": "中程度", - "text": "Azure Monitor for SAP solutions でセキュリティで保護された通信を有効にするには、ルート証明書またはサーバー証明書のいずれかを使用することを選択できます。ルート証明書を使用することを強くお勧めします。", - "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", + "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", + "service": "AKS", + "severity": "低い", + "text": "AKS 自動化のために EventGrid イベントをサブスクライブすることを検討する", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", - "service": "AVS", - "severity": "高い", - "text": "ADDS ドメイン コントローラーがネイティブ Azure の ID サブスクリプションにデプロイされていることを確認する", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", + "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", + "service": "AKS", + "severity": "低い", + "text": "AKS クラスターで実行時間の長い操作を行う場合は、イベントの終了を検討してください", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "75089c20-990d-4927-b105-885576f76fc2", - "service": "AVS", - "severity": "中程度", - "text": "Azure ベースのリソース (Azure VMware Solution を含む) からの認証要求を Azure にローカルに保持するように ADDS サイトとサービスが構成されていることを確認します", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", + "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", + "service": "AKS", + "severity": "低い", + "text": "必要に応じて、AKS ノードに Azure Dedicated Hosts を使用することを検討してください", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "高い", - "text": "vCenterがADDに接続されていることを確認し、「名前付きユーザーアカウント」に基づく認証を有効にします", - "waf": "安全" + "text": "エフェメラル OS ディスクを使用する", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", - "service": "AVS", - "severity": "中程度", - "text": "vCenter から ADDS への接続でセキュア プロトコル (LDAPS) が使用されていることを確認します", - "waf": "安全" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", - "service": "AVS", - "severity": "中程度", - "text": "vCenter IdP の CloudAdmin アカウントは、緊急アカウント(非常用アカウント)としてのみ使用されます", - "waf": "安全" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", + "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", + "service": "AKS", "severity": "高い", - "text": "NSX-Manager が外部 ID プロバイダ (LDAPS) と統合されていることを確認します。", - "waf": "安全" + "text": "非エフェメラル ディスクの場合、複数のポッドを実行するには高いパフォーマンスが必要であり、既定の AKS ログ ローテーションしきい値で巨大なログが生成されるため、多くのポッド/ノードを実行する場合は、ノードに高い IOPS とより大きな OS ディスクを使用します", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", - "service": "AVS", - "severity": "中程度", - "text": "VMware vSphere 内で使用するために RBAC モデルが作成されているか", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", + "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", + "service": "AKS", + "severity": "低い", + "text": "ハイパー パフォーマンス ストレージ オプションの場合は、AKS 上の Ultra Disks を使用します", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", + "service": "AKS", "severity": "中程度", - "text": "RBAC アクセス許可は、特定のユーザーではなく、ADDS グループに付与する必要があります", - "waf": "安全" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", - "service": "AVS", - "severity": "高い", - "text": "Azure の Azure VMware Solution リソースに対する RBAC アクセス許可は、限られた所有者のセットのみに \"ロックダウン\" されます", - "waf": "安全" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", - "service": "AVS", - "severity": "高い", - "text": "すべてのカスタム ロールのスコープが CloudAdmin で許可された承認で設定されていることを確認する", - "waf": "安全" + "text": "クラスター内に状態を保持することは避け、外部 (AzStorage、AzSQL、Cosmos など) にデータを格納します", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", - "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", - "service": "AVS", - "severity": "高い", - "text": "お客様のユース ケースに適した Azure VMware Solution 接続モデルが選択されているか", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", + "service": "AKS", + "severity": "中程度", + "text": "AzFiles Standard を使用する場合は、パフォーマンス上の理由から AzFiles Premium や ANF を検討してください", "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", - "service": "AVS", - "severity": "高い", - "text": "オンプレミスから Azure への ExpressRoute または VPN 接続が \"接続モニター\" を使用して監視されていることを確認する", - "waf": "オペレーションズ" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", + "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", + "service": "AKS", + "severity": "中程度", + "text": "Azure ディスクと AZ を使用する場合は、適切なゾーンにストレージをプロビジョニングするために VolumeBindingMode:WaitForFirstConsumer を使用して LRS ディスクのゾーン内にノードプールを配置するか、複数のゾーンにまたがるノードプールに ZRS ディスクを使用することを検討してください", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", + "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", + "service": "SAP", "severity": "中程度", - "text": "Azure VMware Solution バックエンドの ExpressRoute 接続を監視するために、Azure ネイティブ リソースから Azure VMware Solution 仮想マシンへの接続モニターが作成されていることを確認します", + "text": "Azure Center for SAP solutions (ACSS) は、SAP を Azure 上のトップレベルのワークロードにする Azure オファリングです。ACSS は、SAP システムを Azure 上の統合ワークロードとして作成および実行し、イノベーションのためのよりシームレスな基盤を提供するエンドツーエンドのソリューションです。新規と既存の Azure ベースの SAP システムの両方の管理機能を利用できます。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-center-sap-solutions/?source=recommendations", "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", - "service": "AVS", + "checklist": "SAP 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", "severity": "中程度", - "text": "エンド 2 エンドの接続を監視するために、オンプレミス リソースから Azure VMware Solution 仮想マシンへの接続モニターが作成されていることを確認します", + "text": "Azure では、Linux と Windows での SAP デプロイの自動化がサポートされています。SAP Deployment Automation Framework は、SAP 環境をデプロイ、インストール、および保守できるオープンソースのオーケストレーション ツールです。", + "training": "https://github.com/Azure/sap-automation", "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", - "service": "AVS", - "severity": "高い", - "text": "ルート サーバーを使用する場合は、ルート サーバーから ExR ゲートウェイ、オンプレミスに伝達されるルートが 1000 を超えないようにします (ARS 制限)。", - "waf": "オペレーションズ" + "checklist": "SAP Checklist", + "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", + "service": "SAP", + "severity": "中程度", + "text": "運用データベースのポイントインタイム リカバリを、RTOを満たす任意の時点および時間枠で実行します。ポイント・イン・タイム・リカバリには、通常、DBMSレイヤー上またはSAPを介してデータを削除するオペレーター・エラーが含まれます", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", - "service": "AVS", - "severity": "高い", - "text": "Azure Portal で Azure VMware Solution リソースを管理するロールに対して Privileged Identity Management が実装されていますか (永続的なアクセス許可は許可されません)", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", + "service": "SAP", + "severity": "中程度", + "text": "バックアップと復旧の時間をテストして、災害発生後にすべてのシステムを同時に復元するための RTO 要件を満たしていることを確認します。", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "b651423c-8552-42db-a545-5cb50c05527a", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "service": "SAP", "severity": "高い", - "text": "Privileged Identity Management 監査レポートは、Azure VMware Solution PIM ロールに対して実装する必要がある", - "waf": "安全" + "text": "ペアのリージョン間で Standard Storage をレプリケートすることはできますが、Standard Storage を使用してデータベースや仮想ハード ディスクを格納することはできません。バックアップは、使用するペアのリージョン間でのみレプリケートできます。その他のすべてのデータについては、SQL Server Always On や SAP HANA システム レプリケーションなどのネイティブ DBMS 機能を使用してレプリケーションを実行します。SAP アプリケーション層には、Site Recovery、rsync または robocopy、およびその他のサードパーティ ソフトウェアを組み合わせて使用します。", + "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", "severity": "中程度", - "text": "Privileged Identity Management を使用している場合は、Azure VMware Solution のホストの自動置換通知用の有効な SMTP レコードを使用して、有効な Entra ID が有効なアカウントが作成されていることを確認します。(常任許可が必要)", - "waf": "安全" + "text": "Azure Availability Zones を使用して高可用性を実現する場合は、SAP アプリケーション サーバーとデータベース サーバー間の待機時間を考慮する必要があります。待機時間が長いゾーンでは、SAP アプリケーション サーバーとデータベース サーバーが常に同じゾーンで実行されていることを確認するための運用手順を実施する必要があります。", + "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", + "service": "SAP", "severity": "高い", - "text": "CloudAdmin アカウントの使用を緊急アクセスのみに制限する", - "waf": "安全" + "text": "オンプレミスからプライマリおよびセカンダリの Azure ディザスター リカバリー リージョンへの ExpressRoute 接続を設定します。また、ExpressRoute を使用する代わりに、オンプレミスからプライマリおよびセカンダリの Azure ディザスター リカバリー リージョンへの VPN 接続を設定することも検討してください。", + "training": "https://learn.microsoft.com/azure/expressroute/use-s2s-vpn-as-backup-for-expressroute-privatepeering", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", - "service": "AVS", - "severity": "中程度", - "text": "vCenter Server でカスタム RBAC ロールを作成して、vCenter 内に最小特権モデルを実装します", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "SAP", + "severity": "低い", + "text": "証明書、シークレット、キーなどのキー コンテナーの内容をリージョン間でレプリケートして、DR リージョン内のデータの暗号化を解除できるようにします。", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", + "service": "SAP", "severity": "中程度", - "text": "cloudadmin (vCenter) と admin (NSX) の資格情報を定期的にローテーションするように定義されたプロセスです。", - "waf": "安全" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", - "service": "AVS", - "severity": "高い", - "text": "一元化された ID プロバイダーを使用して、Azure VMware Solution で実行されているワークロード (VM) に使用する", - "waf": "安全" + "text": "プライマリ仮想ネットワークとディザスター リカバリー仮想ネットワークをピアリングします。たとえば、HANA システム レプリケーションの場合、SAP HANA DB 仮想ネットワークは、ディザスター リカバリー サイトの SAP HANA DB 仮想ネットワークにピアリングする必要があります。", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", - "service": "AVS", - "severity": "中程度", - "text": "East-West トラフィック フィルタリングは NSX-T 内に実装されていますか", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", + "service": "SAP", + "severity": "低い", + "text": "SAP デプロイに Azure NetApp Files ストレージを使用する場合は、少なくとも、Premium レベルの 2 つのリージョンに 2 つの Azure NetApp Files アカウントを作成します。", + "training": "https://learn.microsoft.com/training/modules/choose-service-level-azure-netapp-files-hpc-applications/2-identify-decision-criteria", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", "severity": "高い", - "text": "Azure VMware Solution 上のワークロードは、インターネットに直接公開されません。トラフィックは、Azure Application Gateway、Azure Firewall、またはサード パーティのソリューションによってフィルター処理され、検査されます", - "waf": "安全" + "text": "ネイティブのデータベースレプリケーションテクノロジーを使用して、HAペアでデータベースを同期する必要があります。", + "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/?source=recommendations", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", + "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", + "service": "SAP", "severity": "高い", - "text": "監査とログ記録は、Azure VMware Solution および Azure VMware Solution ベースのワークロードへの受信インターネット要求に対して実装されます", - "waf": "安全" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", - "service": "AVS", - "severity": "中程度", - "text": "セッション監視は、疑わしい/悪意のあるアクティビティを特定するために、Azure VMware Solution または Azure VMware Solution ベースのワークロードからの送信インターネット接続に実装されます", - "waf": "安全" + "text": "プライマリ仮想ネットワーク (VNet) の CIDR は、DR サイトの VNet の CIDR と競合したり重複したりしないようにする必要があります", + "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "334fdf91-c234-4182-a652-75269440b4be", - "service": "AVS", - "severity": "中程度", - "text": "Azure の ExR/VPN Gateway サブネットで DDoS Standard 保護が有効になっているか", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", + "service": "SAP", + "severity": "高い", + "text": "Site Recovery を使用して、アプリケーション サーバーを DR サイトにレプリケートします。Site Recovery は、セントラル サービス クラスター VM を DR サイトにレプリケートする場合にも役立ちます。DR を呼び出すときは、DR サイトで Linux Pacemaker クラスターを再構成する必要があります (たとえば、VIP または SBD の置き換え、corosync.conf の実行など)。", + "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", - "service": "AVS", - "severity": "中程度", - "text": "専用の特権アクセス ワークステーション (PAW) を使用して、Azure VMware Solution、vCenter、NSX Manager、HCX Manager を管理する", - "waf": "安全" + "checklist": "SAP 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", + "severity": "高い", + "text": "単一障害点に対する SAP ソフトウェアの可用性を検討します。これには、SAP NetWeaver や SAP S/4HANA アーキテクチャ、SAP ABAP、ASCS + SCS で使用される DBMS などのアプリケーション内の単一障害点が含まれます。また、SAP Web ディスパッチャなどの他のツールも必要です。", + "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": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", - "service": "AVS", - "severity": "中程度", - "text": "Azure VMware Solution で実行されているワークロードに対して Advanced Threat Detection (Microsoft Defender for Cloud 別名 ASC) を有効にする", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", + "service": "SAP", + "severity": "高い", + "text": "SAP および SAP データベースの場合は、自動フェールオーバー クラスターの実装を検討してください。Windows では、Windows Server フェールオーバー クラスタリングがフェールオーバーをサポートします。Linux では、Linux Pacemaker や、SIOS Protection Suite や Veritas InfoScale などのサードパーティツールがフェイルオーバーをサポートしています。", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", - "service": "AVS", - "severity": "中程度", - "text": "Azure ARC for Servers を使用して、Azure ネイティブ テクノロジを使用して Azure VMware Solution で実行されているワークロードを適切に管理します (Azure ARC for Azure VMware Solution はまだ利用できません)", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", + "severity": "高い", + "text": "Azure では、プライマリ VM とセカンダリ VM が DBMS データのストレージを共有するアーキテクチャはサポートされていません。DBMSレイヤーの場合、一般的なアーキテクチャパターンは、プライマリおよびセカンダリVMが使用するストレージスタックとは異なるストレージスタックを使用して、データベースを同時にレプリケートすることです。", + "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": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", - "service": "AVS", - "severity": "低い", - "text": "Azure VMware Solution 上のワークロードで、実行時に十分なデータ暗号化 (ゲスト内ディスク暗号化や SQL TDE など) が使用されるようにします。(保存時の vSAN 暗号化がデフォルトです)", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", + "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", + "service": "SAP", + "severity": "高い", + "text": "DBMS データとトランザクション/REDO ログ ファイルは、Azure でサポートされているブロック ストレージまたは Azure NetApp Files に格納されます。Azure Files または Azure Premium Files は、SAP ワークロードでの DBMS データや再実行ログ ファイルのストレージとしてはサポートされていません。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-databases/2-explore-database-support-azure-for-sap-workloads", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "a3592718-e6e2-4051-9267-6ae46691e883", - "service": "AVS", - "severity": "低い", - "text": "ゲスト内暗号化を使用する場合は、可能な場合は Azure Key Vault に暗号化キーを格納します", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", + "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", + "service": "SAP", + "severity": "高い", + "text": "Windows の Azure 共有ディスクは、ASCS + SCS コンポーネントと特定の高可用性シナリオに使用できます。フェールオーバー クラスターは、SAP アプリケーション層コンポーネントと DBMS 層に対して個別に設定します。現在、Azure では、SAP アプリケーション レイヤー コンポーネントと DBMS レイヤーを 1 つのフェールオーバー クラスターに結合する高可用性アーキテクチャはサポートされていません。", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "5ac94222-3e13-4810-9230-81a941741583", - "service": "AVS", - "severity": "中程度", - "text": "Azure VMware Solution で実行されているワークロードには、拡張セキュリティ更新プログラムのサポートの使用を検討してください (Azure VMware Solution は ESU の対象です)", - "waf": "安全" + "checklist": "SAP 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", + "severity": "高い", + "text": "SAP アプリケーション レイヤー コンポーネント (ASCS) と DBMS レイヤーのほとんどのフェールオーバー クラスターでは、フェールオーバー クラスターの仮想 IP アドレスが必要です。 Azure Load Balancer は、他のすべてのケースで仮想 IP アドレスを処理する必要があります。設計原則の 1 つは、クラスター構成ごとに 1 つのロード バランサーを使用することです。ロード バランサーの Standard バージョン (Standard Load Balancer SKU) を使用することをお勧めします。", + "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", + "service": "SAP", "severity": "高い", - "text": "適切な vSAN データ冗長化方式(RAID 仕様)が使用されていることを確認します。", + "text": "ロードバランサーでフローティング IP が有効になっていることを確認します", + "training": "https://learn.microsoft.com/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d88408f3-7273-44c8-96ba-280214590146", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "SAP", "severity": "高い", - "text": "許容障害ポリシーが vSAN ストレージのニーズを満たすために設定されていることを確認します", + "text": "高可用性インフラストラクチャをデプロイする前に、選択したリージョンに応じて、Azure 可用性セットと可用性ゾーンのどちらを使用してデプロイするかを決定します。", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", - "service": "AVS", + "checklist": "SAP 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", "severity": "高い", - "text": "十分なクォータを要求し、拡張とディザスタリカバリの要件を考慮していることを確認します", + "text": "SAP コンポーネント (セントラル サービス、アプリケーション サーバー、データベース) のアプリケーションのインフラストラクチャ SLA を満たす場合は、すべてのコンポーネントに対して同じ高可用性オプション (VM、可用性セット、可用性ゾーン) を選択する必要があります。", "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", - "service": "AVS", - "severity": "中程度", - "text": "ESXiへのアクセス制限を理解し、サードパーティのソリューションに影響を与える可能性のあるアクセス制限があることを確認してください。", - "waf": "オペレーションズ" + "checklist": "SAP Checklist", + "guid": "cbe05bbe-209d-4490-ba47-778424d11678", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", + "severity": "高い", + "text": "同じ可用性セット内に異なるロールのサーバーを混在させないでください。セントラル サービス VM、データベース VM、アプリケーション VM を独自の可用性セットに保持する", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", + "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", + "service": "SAP", "severity": "中程度", - "text": "ESXi ホストの密度と効率に関するポリシーがあることを確認し、新しいノードを要求するためのリード タイムを念頭に置いてください", - "waf": "オペレーションズ" + "text": "近接通信配置グループを使用しない限り、Azure 可用性ゾーン内に Azure 可用性セットをデプロイすることはできません。", + "training": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", - "service": "AVS", - "severity": "中程度", - "text": "Azure VMware Solution の適切なコスト管理プロセスが整っていることを確認する - Azure Cost Management を使用できます", - "waf": "費用" + "checklist": "SAP Checklist", + "guid": "9674e7c7-7796-4181-8920-09f4429543ba", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", + "severity": "高い", + "text": "可用性セットを作成するときは、使用可能な障害ドメインと更新ドメインの最大数を使用します。たとえば、1 つの可用性セットに 2 つ以上の VM をデプロイする場合は、Azure の計画メンテナンスに加えて、潜在的な物理ハードウェア障害、ネットワークの停止、または停電の影響を制限するために、最大数の障害ドメイン (3 つ) と十分な更新ドメインを使用します。障害ドメインの既定の数は 2 であり、後でオンラインで変更することはできません。", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", - "service": "AVS", - "severity": "低い", - "text": "Azure VMware Solution を使用するためのコストを最適化するために Azure 予約インスタンスが使用されているか", - "waf": "費用" + "checklist": "SAP Checklist", + "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", + "severity": "高い", + "text": "可用性セットのデプロイで Azure 近接通信配置グループを使用する場合は、3 つの SAP コンポーネント (セントラル サービス、アプリケーション サーバー、データベース) をすべて同じ近接通信配置グループに含める必要があります。", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6691e883-5ac9-4422-83e1-3810523081a9", - "service": "AVS", - "severity": "中程度", - "text": "他の Azure Native Services を使用する場合は、Azure Private-Link の使用を検討してください", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", + "severity": "高い", + "text": "SAP SID ごとに 1 つの近接配置グループを使用します。グループは、Availability Zones や Azure リージョンにまたがっていません", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", - "service": "AVS", + "checklist": "SAP 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", "severity": "高い", - "text": "必要なすべてのリソースが同じ Azure 可用性ゾーン内に存在することを確認する", - "waf": "パフォーマンス" + "text": "オペレーティング システムに応じて、次のいずれかのサービスを使用して SAP セントラル サービス クラスターを実行します。", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "ed46b937-913e-4018-9c62-8393ab037e53", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", + "service": "SAP", "severity": "中程度", - "text": "Azure VMware Solution ゲスト VM ワークロードに対して Microsoft Defender for Cloud を有効にする", - "waf": "安全" + "text": "現在、Azure では、同じ Linux Pacemaker クラスターでの ASCS と DB HA の組み合わせはサポートされていません。それらを個々のクラスターに分離します。ただし、最大 5 つの複数のセントラル サービス クラスターを 1 つの VM のペアに結合できます。", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", - "service": "AVS", - "severity": "中程度", - "text": "Azure Arc 対応サーバーを使用して Azure VMware Solution ゲスト VM のワークロードを管理する", - "waf": "安全" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", - "service": "AVS", - "severity": "高い", - "text": "Azure VMware Solution での診断ログとメトリック ログを有効にするEnable Diagnostic and metric logging on Azure VMware Solution", - "waf": "オペレーションズ" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", - "service": "AVS", + "checklist": "SAP 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", "severity": "中程度", - "text": "Log Analytics エージェントを Azure VMware Solution ゲスト VM ワークロードにデプロイする", - "waf": "オペレーションズ" + "text": "両方の VM を高可用性ペアの可用性セットまたは可用性ゾーンにデプロイします。これらの VM は、同じサイズで、同じストレージ構成を持つ必要があります。", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "589d457a-927c-4397-9d11-02cad6aae11e", - "service": "AVS", + "checklist": "SAP 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", "severity": "中程度", - "text": "Azure VMware Solution VM ワークロードのバックアップ ポリシーとソリューションが文書化され、実装されていることを確認します", - "waf": "オペレーションズ" + "text": "Azure では、Red Hat Enterprise Linux (RHEL) で実行されている同じ高可用性クラスターへの SAP HANA インスタンスと ASCS/SCS インスタンスと ERS インスタンスのインストールと構成がサポートされています。", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ee29711b-d352-4caa-ab79-b198dab81932", - "service": "AVS", - "severity": "中程度", - "text": "Microsoft Defender for Cloud を使用して、Azure VMware Solution で実行されているワークロードのコンプライアンス監視を行う", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", + "severity": "高い", + "text": "Premium マネージド SSD ですべての運用システムを実行し、Azure NetApp Files または Ultra Disk Storage を使用します。少なくとも、OS ディスクは Premium レベルにすることで、パフォーマンスの向上と最高の SLA を実現できます。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", - "service": "AVS", - "severity": "中程度", - "text": "適用可能なコンプライアンス ベースラインは Microsoft Defender for Cloud に追加されていますか", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", + "service": "SAP", + "severity": "高い", + "text": "SAP HANA on Azure は、SAP によって認定された種類のストレージでのみ実行する必要があります。該当する場合は、特定のボリュームを特定のディスク構成で実行する必要があることに注意してください。これらの構成には、書き込みアクセラレータの有効化と Premium Storage の使用が含まれます。また、ストレージ上で稼働するファイル システムが、マシン上で稼働する DBMS と互換性があることを確認する必要もあります。", + "training": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1?source=recommendations", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", + "service": "SAP", "severity": "高い", - "text": "Azure VMware Solution のデプロイに使用する Azure リージョンを選択するときにデータ所在地が評価されましたか", - "waf": "安全" + "text": "SAP ワークロードに使用するストレージの種類に応じて、高可用性を構成することを検討してください。Azure で使用できる一部のストレージ サービスは Azure Site Recovery でサポートされていないため、高可用性の構成が異なる場合があります。", + "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/2-explore-disaster-recovery-sap-workloads", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", + "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", + "service": "SAP", "severity": "高い", - "text": "データ処理への影響 (サービス プロバイダー/サービス コンシューマー モデル) が明確で文書化されているか", - "waf": "安全" + "text": "さまざまなネイティブ Azure ストレージ サービス (Azure Files、Azure NetApp Files、Azure Shared Disk など) は、リージョンによっては利用できない場合があります。そのため、フェールオーバー後に DR リージョンで同様の SAP 設定を行うには、それぞれのストレージ サービスが DR サイトで提供されていることを確認します。", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "547c1747-dc56-4068-a714-435cd19dd244", - "service": "AVS", + "checklist": "SAP 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", "severity": "中程度", - "text": "コンプライアンス上の理由で必要な場合にのみ、vSAN に CMK (カスタマー マネージド キー) を使用することを検討してください。", - "waf": "安全" + "text": "SAP システムのスタート/ストップを自動化してコストを管理します。", + "waf": "費用" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", - "service": "AVS", - "severity": "高い", - "text": "Azure VMware Solution のコア監視分析情報を有効にするダッシュボードを作成するCreate dashboards to enable a core Azure VMware Solution monitoring insights", - "waf": "オペレーションズ" + "checklist": "SAP Checklist", + "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", + "severity": "低い", + "text": "SAP HANA で Azure Premium Storage を使用する場合は、Azure Standard SSD ストレージを使用して、コスト意識の高いストレージ ソリューションを選択できます。ただし、Standard SSD または Standard HDD Azure Storage を選択すると、個々の VM の SLA に影響することに注意してください。また、非運用環境など、I/O スループットが低く待機時間が短いシステムでは、下位のシリーズ VM を使用できます。", + "waf": "費用" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", - "service": "AVS", - "severity": "高い", - "text": "Azure VMware Solution のパフォーマンス (CPU >80%、平均メモリ >80%、vSAN >70%) に関する自動アラートの重大しきい値の警告アラートを作成する", - "waf": "オペレーションズ" + "checklist": "SAP Checklist", + "guid": "9877f353-2591-4e8b-8381-e9043fed1010", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", + "severity": "低い", + "text": "低コストの代替構成 (多目的) として、非運用環境の HANA データベース サーバー VM に低パフォーマンスの SKU を選択できます。ただし、E シリーズなどの一部の VM の種類は、HANA 認定 (SAP HANA Hardware Directory) されていないか、ストレージ待機時間を 1 ミリ秒未満にできないことに注意することが重要です。", + "waf": "費用" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9659e396-80e7-4828-ac93-5657d02bff45", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", + "service": "SAP", "severity": "高い", - "text": "vSAN の消費量が 75% を下回っているかどうかを監視するための重要なアラートが作成されていることを確認します (これは VMware からのサポートしきい値です)。", - "waf": "オペレーションズ" + "text": "管理グループ、サブスクリプション、リソース グループ、およびリソースに RBAC モデルを適用する", + "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", - "service": "AVS", - "severity": "高い", - "text": "Azure Service Health のアラートと通知に対してアラートが構成されていることを確認する", - "waf": "オペレーションズ" + "checklist": "SAP Checklist", + "guid": "45911475-e39e-4530-accc-d979366bcda2", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", + "severity": "中程度", + "text": "Cloud Connector を介して SAP クラウド アプリケーションからオンプレミス (IaaS を含む) に ID を転送するためのプリンシパル伝達を適用する", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/2-explore-azure-virtual-machine-auth-access-control", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", "severity": "中程度", - "text": "処理のために Azure Storage アカウントまたは Azure EventHub に送信するように Azure VMware Solution ログを構成する", - "waf": "オペレーションズ" + "text": "SAML を使用して Azure AD で SAP Analytics Cloud、SAP Cloud Platform、Business by Design、SAP Qualtrics、SAP C4C などの SAP SaaS アプリケーションに SSO を実装します。", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", - "service": "AVS", - "severity": "低い", - "text": "VMware vSphere での詳細な分析情報が必要な場合:vRealize Operations や vRealize Network Insights がソリューションで使用されていますか?", - "waf": "オペレーションズ" + "checklist": "SAP Checklist", + "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", + "severity": "中程度", + "text": "SAML を使用して、SAP Fiori や SAP Web GUI などの SAP NetWeaver ベースの Web アプリケーションに SSO を実装します。", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", - "service": "AVS", - "severity": "高い", - "text": "仮想マシンの vSAN ストレージ ポリシーはシック プロビジョニングを適用するため、このポリシーがデフォルトのストレージ ポリシーではないことを確認します", - "waf": "オペレーションズ" + "checklist": "SAP Checklist", + "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", + "service": "SAP", + "severity": "中程度", + "text": "SAML を使用して、SAP Fiori や SAP Web GUI などの SAP NetWeaver ベースの Web アプリケーションに SSO を実装します。", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/6-exercise-integrate-azure-active-directory-sap-fiori", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", "severity": "中程度", - "text": "vSAN は有限のリソースであるため、vSphere コンテンツ ライブラリが vSAN に配置されていないことを確認する", - "waf": "オペレーションズ" + "text": "SAP NetWeaver SSO またはパートナーソリューションを使用して、SAP GUI への SSO を実装できます。", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", + "service": "SAP", "severity": "中程度", - "text": "バックアップ ソリューションのデータ リポジトリが vSAN ストレージの外部に保存されていることを確認します。Azure ネイティブまたはディスク プールでバックアップされるデータストア上", - "waf": "オペレーションズ" + "text": "SAP GUI および Web ブラウザアクセスの SSO には、設定とメンテナンスが容易なため、SNC/Kerberos/SPNEGO (シンプルで保護された GSSAPI ネゴシエーションメカニズム) を実装します。X.509 クライアント証明書を使用した SSO の場合は、SAP SSO ソリューションのコンポーネントである SAP セキュアログインサーバーを検討してください。", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/9-exercise-integrate-active-directory-sap-single-sign-on", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", - "service": "AVS", + "checklist": "SAP 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", "severity": "中程度", - "text": "Azure Arc for Servers を使用して Azure VMware Solution で実行されているワークロードがハイブリッド管理されていることを確認する (Arc for Azure VMware Solution はプレビュー段階です)", - "waf": "オペレーションズ" + "text": "SAP GUI および Web ブラウザアクセスの SSO には、設定とメンテナンスが容易なため、SNC/Kerberos/SPNEGO (シンプルで保護された GSSAPI ネゴシエーションメカニズム) を実装します。X.509 クライアント証明書を使用した SSO の場合は、SAP SSO ソリューションのコンポーネントである SAP セキュアログインサーバーを検討してください。", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", - "service": "AVS", + "checklist": "SAP 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", "severity": "中程度", - "text": "Azure VMware Solution で実行されているワークロードが Azure Log Analytics と Azure Monitor を使用して監視されていることを確認する", - "waf": "オペレーションズ" + "text": "OAuth for SAP NetWeaver を使用して SSO を実装し、サードパーティまたはカスタムアプリケーションが SAP NetWeaver OData サービスにアクセスできるようにします。", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "a747c350-8d4c-449c-93af-393dbca77c48", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", + "service": "SAP", "severity": "中程度", - "text": "Azure VMware Solution で実行されているワークロードを、既存の更新プログラム管理ツールまたは Azure Update Management に含める", - "waf": "オペレーションズ" + "text": "SAP HANAへのSSOの実装", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", + "service": "SAP", "severity": "中程度", - "text": "Azure Policy を使用して、Azure の管理、監視、セキュリティ ソリューションに Azure VMware Solution ワークロードをオンボードする", - "waf": "オペレーションズ" + "text": "Azure AD は、RISE でホストされている SAP システムの ID プロバイダーであると考えてください。詳細については、「サービスと Azure AD の統合」を参照してください。", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", + "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", + "service": "SAP", "severity": "中程度", - "text": "Azure VMware Solution で実行されているワークロードが Microsoft Defender for Cloud にオンボードされていることを確認する", + "text": "SAP にアクセスするアプリケーションでは、プリンシパル伝搬を使用して SSO を確立することができます。", "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", - "service": "AVS", + "checklist": "SAP 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", "severity": "中程度", - "text": "vSAN は有限のリソースであるため、バックアップが vSAN に保存されないようにする", - "waf": "確実" + "text": "SAP Identity Authentication Service (IAS) を必要とする SAP BTP サービスまたは SaaS ソリューションを使用している場合は、SAP Cloud Identity Authentication Services と Azure AD の間に SSO を実装して、それらの SAP サービスにアクセスすることを検討してください。この統合により、SAP IAS はプロキシ ID プロバイダーとして機能し、認証要求を中央ユーザー ストアおよび ID プロバイダーとして Azure AD に転送できます。", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", + "service": "SAP", "severity": "中程度", - "text": "すべてのDRソリューションが検討され、ビジネスに最適なソリューションが決定されましたか?[SRM/JetStream/Zerto/Veeam/...]", - "waf": "確実" + "text": "SAP BTP への SSO の実装", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", - "service": "AVS", + "checklist": "SAP 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", "severity": "中程度", - "text": "ディザスター リカバリー テクノロジがネイティブの Azure IaaS の場合は、Azure Site Recovery を使用します", - "waf": "確実" + "text": "SAP SuccessFactors を使用している場合は、Azure AD の自動ユーザー プロビジョニングの使用を検討してください。この統合により、SAP SuccessFactors に新しい従業員を追加するときに、Azure AD でユーザー アカウントを自動的に作成できます。 必要に応じて、Microsoft 365 または Azure AD でサポートされているその他の SaaS アプリケーションでユーザー アカウントを作成できます。 SAP SuccessFactors へのメール アドレスの書き戻しを使用します。", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", - "service": "AVS", + "checklist": "SAP 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", + "severity": "中程度", + "text": "既存の管理グループ ポリシーを SAP サブスクリプションに適用する", + "training": "https://learn.microsoft.com/training/modules/enterprise-scale-organization/4-management-group-subscription-organization", + "waf": "オペレーションズ" + }, + { + "checklist": "SAP Checklist", + "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "severity": "高い", - "text": "いずれかの災害ソリューションで自動復旧計画を使用し、手動タスクを可能な限り回避します", - "waf": "確実" + "text": "緊密に結合されたアプリケーションを同じSAPサブスクリプションに統合し、ルーティングと管理の複雑さを回避", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-subscriptions", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "8255461e-2aee-4345-9aec-8339248b262d", - "service": "AVS", - "severity": "中程度", - "text": "地政学的リージョンのペアをセカンダリディザスタリカバリ環境として使用する", - "waf": "確実" + "checklist": "SAP Checklist", + "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", + "severity": "高い", + "text": "サブスクリプションをスケール ユニットとして活用し、リソースをスケーリングし、環境ごとにサブスクリプションをデプロイすることを検討してください。サンドボックス、非製品、製品", + "training": "https://learn.microsoft.com/training/modules/configure-subscriptions/?source=recommendations", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", + "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", + "service": "SAP", "severity": "高い", - "text": "リージョン間で 2 つの異なるアドレス空間を使用します (例: 10.0.0.0/16 と 192.168.0.0/16)。", - "waf": "確実" + "text": "サブスクリプションのプロビジョニングの一環としてクォータを確実に増やす (例: サブスクリプション内で使用可能な VM コアの合計数)", + "training": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", - "service": "AVS", - "severity": "中程度", - "text": "ExpressRoute Global Reach は、プライマリとセカンダリの Azure VMware Solution プライベート クラウド間の接続に使用されますか、それともネットワーク仮想アプライアンスを介してルーティングされますか?", - "waf": "確実" + "checklist": "SAP Checklist", + "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", + "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", + "service": "SAP", + "severity": "低い", + "text": "クォータ API は、Azure サービスのクォータを表示および管理するために使用できる REST API です。必要に応じて使用を検討してください。", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", + "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", + "service": "SAP", + "severity": "高い", + "text": "可用性ゾーンにデプロイする場合は、クォータが承認されたら、VM のゾーン デプロイが使用可能であることを確認します。必要なサブスクリプション、VM シリーズ、CPU の数、可用性ゾーンを含むサポート リクエストを送信します。", + "waf": "オペレーションズ" + }, + { + "checklist": "SAP Checklist", + "guid": "e6e20617-3686-4af4-9791-f8935ada4332", + "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", + "service": "SAP", + "severity": "高い", + "text": "必要なサービスと機能が、選択した展開リージョン内で利用可能であることを確認します。ANF、ゾーンなど", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/azure-best-practices/multiple-regions?source=recommendations", + "waf": "オペレーションズ" + }, + { + "checklist": "SAP Checklist", + "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", + "service": "SAP", "severity": "中程度", - "text": "すべてのバックアップソリューションが検討され、ビジネスに最適なソリューションが決定されましたか?[ MABS/CommVault/Metallic.io/Veeam/ . ]", + "text": "コストの分類とリソースのグループ化 (BillTo、部門 (または部署)、環境 (運用、ステージ、開発)、層 (Web 層、アプリケーション層)、アプリケーション所有者、プロジェクト名) に Azure リソース タグを活用します", + "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", + "waf": "オペレーションズ" + }, + { + "checklist": "SAP Checklist", + "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", + "severity": "高い", + "text": "Azure Backup サービスを使用して HANA データベースを保護するのに役立ちます。", + "training": "https://learn.microsoft.com/training/modules/implement-azure-backup-sap-workloads-azure-virtual-machines/?source=recommendations", "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", + "service": "SAP", "severity": "中程度", - "text": "バックアップ ソリューションを Azure VMware Solution プライベート クラウドと同じリージョンにデプロイする", + "text": "HANA、Oracle、または DB2 データベースに Azure NetApp Files をデプロイする場合は、Azure アプリケーション整合性スナップショット ツール (AzAcSnap) を使用して、アプリケーション整合性スナップショットを作成します。AzAcSnap は Oracle データベースもサポートしています。個々の VM ではなく、中央の VM で AzAcSnap を使用することを検討してください。", "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", + "severity": "高い", + "text": "オペレーティングシステムと SAP システムの間でタイムゾーンが一致していることを確認します。", + "waf": "オペレーションズ" + }, + { + "checklist": "SAP Checklist", + "guid": "c3c7abc0-716c-4486-893c-40e181d65539", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", + "service": "SAP", "severity": "中程度", - "text": "バックアップ ソリューションを vSan の外部の Azure ネイティブ コンポーネントにデプロイする", + "text": "異なるアプリケーション サービスを同じクラスターにグループ化しないでください。たとえば、DRBDとセントラルサービスクラスタを同じクラスタに組み合わせないでください。ただし、同じ Pacemaker クラスターを使用して、約 5 つの異なるセントラル サービス (マルチ SID クラスター) を管理できます。", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "a491dfc4-9353-4213-9217-eef0949f9467", + "link": "https://azure.microsoft.com/pricing/offers/dev-test/", + "service": "SAP", "severity": "低い", - "text": "Azure プラットフォームによって管理されている VMware コンポーネントの復元を要求するプロセスは用意されていますか?", - "waf": "確実" + "text": "スヌーズ モデルで開発/テスト システムを実行して、Azure の実行コストを節約および最適化することを検討してください。", + "waf": "費用" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", - "service": "AVS", - "severity": "低い", - "text": "手動デプロイの場合、すべての構成とデプロイを文書化する必要があります", + "checklist": "SAP Checklist", + "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", + "link": "https://learn.microsoft.com/azure/lighthouse/overview", + "service": "SAP", + "severity": "中程度", + "text": "お客様の SAP 資産を管理することでお客様と提携する場合は、Azure Lighthouse をご検討ください。Azure Lighthouse を使用すると、マネージド サービス プロバイダーは Azure ネイティブ ID サービスを使用して、顧客の環境に対する認証を行うことができます。顧客はいつでもアクセスを取り消し、サービスプロバイダーの行動を監査できるため、制御を顧客の手に委ねることができます。", "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", - "service": "AVS", - "severity": "低い", - "text": "手動デプロイの場合は、Azure VMware Solution プライベート クラウドでの偶発的なアクションを防ぐために、リソース ロックの実装を検討してください", + "checklist": "SAP 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", + "severity": "中程度", + "text": "Azure Update Manager を使用して、1 つまたは複数の VM で利用可能な更新プログラムの状態を確認し、定期的な修正プログラムの適用をスケジュールすることを検討します。", + "training": "https://learn.microsoft.com/training/modules/keep-your-virtual-machines-updated/?source=recommendations", "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", + "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", + "service": "SAP", "severity": "低い", - "text": "自動デプロイの場合は、最小限のプライベート クラウドをデプロイし、必要に応じてスケーリングします", + "text": "SAP Landscape Management (LaMa) を使用して SAP Basis の運用を最適化および管理します。Azure 用の SAP LaMa コネクタを使用して、SAP システムの再配置、コピー、複製、更新を行います。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-remote-management/?source=recommendations", "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", - "service": "AVS", - "severity": "低い", - "text": "自動デプロイの場合は、デプロイを開始する前にクォータを要求または予約します", - "waf": "オペレーションズ" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", - "service": "AVS", - "severity": "低い", - "text": "自動デプロイの場合は、適切なガバナンスのために、自動化または Azure Policy を使用して関連するリソース ロックが作成されていることを確認します", + "checklist": "SAP Checklist", + "guid": "14591147-5e39-4e53-89cc-cd979366bcda", + "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", + "service": "SAP", + "severity": "中程度", + "text": "Azure Monitor for SAP solutions を使用して、Azure 上の SAP ワークロード (SAP HANA、高可用性 SUSE クラスター、SQL システム) を監視します。Azure Monitor for SAP solutions を SAP Solution Manager で補完することを検討してください。", + "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", - "service": "AVS", - "severity": "低い", - "text": "ExR 認証キーに人間が理解できる名前を実装して、キーの目的/用途を簡単に識別できるようにします", + "checklist": "SAP Checklist", + "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", + "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", + "service": "SAP", + "severity": "高い", + "text": "SAP の VM 拡張機能チェックを実行します。VM Extension for SAP では、仮想マシン (VM) の割り当てられたマネージド ID を使用して、VM の監視および構成データにアクセスします。このチェックにより、SAP アプリケーションのすべてのパフォーマンス メトリックが、基になる Azure Extension for SAP からのものであることが確認されます。", + "training": "https://learn.microsoft.com/training/modules/configure-azure-enhanced-monitoring-extension-for-sap/?source=recommendations", "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "255461e2-aee3-4553-afc8-339248b262d6", - "service": "AVS", - "severity": "低い", - "text": "Azure VMware Solution と ExpressRoute のデプロイに個別のサービス プリンシパルを使用する場合は、キー コンテナーを使用してシークレットと承認キーを格納します", + "checklist": "SAP Checklist", + "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "SAP", + "severity": "中程度", + "text": "アクセス制御とコンプライアンス レポートに Azure Policy を使用します。Azure Policy には、一貫したポリシーの遵守と迅速な違反検出を保証するために、組織全体の設定を適用する機能が用意されています。", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", - "service": "AVS", - "severity": "低い", - "text": "Azure VMware Solution では限られた数の並列操作しかサポートされないため、Azure VMware Solution に多くのリソースをデプロイする必要がある場合に、IaC でアクションをシリアル化するためのリソースの依存関係を定義します。", + "checklist": "SAP Checklist", + "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", + "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", + "service": "SAP", + "severity": "中程度", + "text": "Azure Network Watcher の接続モニターを使用して、SAP データベースとアプリケーション サーバーの待機時間メトリックを監視します。または、Azure Monitor を使用してネットワーク待機時間の測定値を収集して表示します。", + "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/collecting-and-displaying-niping-network-latency-measurements/ba-p/1833979", "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", - "service": "AVS", - "severity": "低い", - "text": "単一の Tier-1 ゲートウェイで NSX-T セグメントの自動構成を実行する場合は、NSX-Manager API ではなく Azure Portal API を使用します", + "checklist": "SAP Checklist", + "guid": "73686af4-6791-4f89-95ad-a43324e13811", + "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", + "service": "SAP", + "severity": "中程度", + "text": "プロビジョニングされた Azure インフラストラクチャで SAP HANA の品質チェックを実行して、プロビジョニングされた VM が SAP HANA on Azure のベスト プラクティスに準拠していることを確認します。", "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", - "service": "AVS", - "severity": "中程度", - "text": "自動スケールアウトを使用する場合は、Azure VMware Solution を実行しているサブスクリプションに対して十分な Azure VMware Solution クォータを申請してください", + "checklist": "SAP Checklist", + "guid": "616785d6-fa96-4c96-ad88-518f482734c8", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", + "severity": "高い", + "text": "Azure サブスクリプションごとに、ゾーン デプロイの前に Azure 可用性ゾーンで待機時間テストを実行して、SAP on Azure のデプロイ用に待機時間の短いゾーンを選択します。", + "training": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/AvZone-Latency-Test", "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", + "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", + "service": "SAP", "severity": "中程度", - "text": "自動スケールインを使用する場合は、そのようなアクションを実行する前に、ストレージ ポリシーの要件を必ず考慮してください", - "waf": "パフォーマンス" + "text": "回復性レポートを実行して、プロビジョニングされた Azure インフラストラクチャ (コンピューティング、データベース、ネットワーク、ストレージ、Site Recovery) 全体の構成が、Cloud Adaption Framework for Azure によって定義された構成に準拠していることを確認します。", + "training": "https://learn.microsoft.com/training/paths/azure-well-architected-framework/", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", + "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", + "service": "SAP", "severity": "中程度", - "text": "スケーリング操作は、一度に 1 つのスケール操作しか実行できないため、常に 1 つの SDDC 内でシリアル化する必要があります (複数のクラスタが使用されている場合でも)", - "waf": "パフォーマンス" + "text": "SAP 用 Microsoft Sentinel ソリューションを使用して脅威保護を実装します。このソリューションを使用して、SAPシステムを監視し、ビジネスロジック層とアプリケーション層全体で高度な脅威を検出します。", + "training": "https://learn.microsoft.com/training/modules/plan-microsoft-sentinel-deployment-sap/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", + "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", + "service": "SAP", "severity": "中程度", - "text": "アーキテクチャで使用されるサードパーティソリューションでのスケーリング操作を検討および検証します(サポートされているかどうか)", - "waf": "パフォーマンス" + "text": "Azure のタグ付けを利用して、リソースを論理的にグループ化して追跡し、デプロイを自動化し、最も重要なこととして、発生したコストを可視化できます。", + "training": "https://learn.microsoft.com/training/modules/analyze-costs-create-budgets-azure-cost-management/?source=recommendations", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", - "service": "AVS", - "severity": "中程度", - "text": "自動化で環境のスケールイン/スケールアウトの上限を定義して適用する", + "checklist": "SAP Checklist", + "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", + "service": "SAP", + "severity": "低い", + "text": "待機時間の影響を受けやすいアプリケーションには、VM 間の待機時間の監視を使用します。", "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", "severity": "中程度", - "text": "監視ルールを実装して、自動スケーリング操作を監視し、成功と失敗を監視して、適切な (自動化された) 応答を有効にします", - "waf": "オペレーションズ" + "text": "Azure Site Recovery の監視を使用して、SAP アプリケーション サーバーのディザスター リカバリー サービスの正常性を維持します。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", + "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c5972cd4-cd21-4b07-9036-f5e6b4bfd3d5", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", - "severity": "高い", - "text": "MONを使用する場合は、同時に構成されたVMの制限(HCXのMON制限[400 - 標準、1000 - 大規模アプライアンス])に注意してください", - "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", - "waf": "確実" + "checklist": "SAP Checklist", + "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", + "severity": "中程度", + "text": "すべてのデータベース・ファイル・システムおよび実行可能プログラムをウイルス対策スキャンから除外します。これらを含めると、パフォーマンスの問題が発生する可能性があります。除外リストの規範的な詳細については、データベースベンダーに確認してください。たとえば、ウイルス対策スキャンから/oracle//sapdataを除外することをお薦めします。", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "be1f38cf-03a8-422b-b463-cbbbc8ac299e", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", - "severity": "高い", - "text": "MON を使用する場合、100 を超えるネットワーク拡張で MON を有効にすることはできません", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", - "waf": "確実" + "checklist": "SAP Checklist", + "guid": "c027f893-f404-41a9-b33d-39d625a14964", + "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", + "service": "SAP", + "severity": "低い", + "text": "移行後に、HANA以外のデータベースの完全なデータベース統計を収集することを検討してください。たとえば、SAP ノート 1020260 - Oracle 統計の配信を実装します。", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", + "service": "SAP", "severity": "中程度", - "text": "移行に VPN 接続を使用する場合は、それに応じて MTU サイズを調整します。", + "text": "SAP on Azure を使用するすべての Oracle デプロイには、Oracle Automatic Storage Management (ASM) の使用を検討してください。", + "training": "https://learn.microsoft.com/training/paths/administer-infrastructure-resources-in-azure/?source=recommendations", "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e614658d-d457-4e92-9139-b821102cad6e", - "service": "AVS", + "checklist": "SAP 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", "severity": "中程度", - "text": "Azure に接続する接続性の低いリージョン (500 Mbps 以下) の場合は、HCX WAN 最適化アプライアンスのデプロイを検討してください", + "text": "Oracle を実行している SAP on Azure の場合、SQL スクリプトのコレクションは、パフォーマンスの問題の診断に役立ちます。 自動ワークロード・リポジトリ(AWR)レポートには、Oracleシステムの問題を診断するための貴重な情報が含まれています。AWRレポートは、複数のセッションで実行し、ピーク時間を選択して、分析を広範囲にカバーすることをお薦めします。", + "training": "https://learn.microsoft.com/ja-jp/azure/well-architected/oracle-iaas/performance-efficiency", "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", - "service": "AVS", - "severity": "中程度", - "text": "移行がオンプレミスアプライアンスから開始され、クラウドアプライアンスから開始されていないことを確認します(逆移行は実行しないでください)", - "waf": "確実" + "checklist": "SAP Checklist", + "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", + "severity": "高い", + "text": "Azure Site Recovery の監視を使用して、SAP アプリケーション サーバーのディザスター リカバリー サービスの正常性を維持します。", + "training": "https://learn.microsoft.com/training/modules/protect-on-premises-infrastructure-with-azure-site-recovery/?source=recommendations", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "SAP", "severity": "中程度", - "text": "Azure NetApp Files を使用して Azure VMware Solution のストレージを拡張する場合は、VM に直接接続するのではなく、これを VMware データストアとして使用することを検討してください。", - "waf": "確実" + "text": "HTTP/S アプリを安全に配信するには、Application Gateway v2 を使用し、WAF の保護とポリシーが有効になっていることを確認します。", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bff4564b-0d93-44a3-98b2-63e7dd60513a", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", - "service": "AVS", + "checklist": "SAP 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", "severity": "中程度", - "text": "専用の ExpressRoute ゲートウェイが外部データ ストレージ ソリューションに使用されていることを確認する", - "waf": "確実" + "text": "Azure への移行中に仮想マシンの DNS または仮想名が変更されない場合、バックグラウンド DNS と仮想名によって SAP ランドスケープ内の多くのシステム インターフェイスが接続され、お客様は、開発者が時間の経過と共に定義するインターフェイスに気付くことがあります。移行後に仮想名または DNS 名が変更されると、さまざまなシステム間で接続の問題が発生するため、このような問題を防ぐために DNS エイリアスを保持することをお勧めします。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "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", + "checklist": "SAP 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", "severity": "中程度", - "text": "外部データ ストレージ ソリューションに使用されている ExpressRoute ゲートウェイで FastPath が有効になっていることを確認します", - "waf": "確実" + "text": "異なる DNS ゾーンを使用して、各環境 (サンドボックス、開発、運用前、運用) を互いに区別します。例外は、独自の VNet を使用する SAP デプロイの場合です。ここでは、プライベート DNS ゾーンは必要ない場合があります。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "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", - "severity": "高い", - "text": "ストレッチ クラスタを使用している場合は、選択したディザスタ リカバリ ソリューションがベンダーによってサポートされていることを確認します", + "checklist": "SAP Checklist", + "guid": "a3592829-e6e2-4061-9368-6af46791f893", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", + "service": "SAP", + "severity": "中程度", + "text": "ローカルとグローバルの VNet ピアリングは接続を提供し、複数の Azure リージョンにまたがる SAP デプロイのランディング ゾーン間の接続を確保するための推奨されるアプローチです", + "training": "https://learn.microsoft.com/training/modules/configure-vnet-peering/?source=recommendations", "waf": "確実" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", + "service": "SAP", "severity": "高い", - "text": "ストレッチ クラスターを使用する場合は、提供される SLA が要件を満たしていることを確認します", - "waf": "確実" + "text": "SAP アプリケーションと SAP データベース サーバー間の NVA のデプロイはサポートされていません", + "training": "https://me.sap.com/notes/2731110", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", - "service": "AVS", - "severity": "高い", - "text": "ストレッチ クラスターを使用している場合は、両方の ExpressRoute 回線が接続ハブに接続されていることを確認します。", - "waf": "確実" + "checklist": "SAP Checklist", + "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", + "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", + "service": "SAP", + "severity": "中程度", + "text": "Azure リージョンとオンプレミスの場所をまたいだグローバルなトランジット接続が必要な新規ネットワーク、大規模ネットワーク、またはグローバル ネットワークでの Azure デプロイに Virtual WAN を使用します。このアプローチでは、Azure ネットワークの推移的なルーティングを手動で設定する必要はなく、SAP on Azure デプロイの標準に従うことができます。", + "training": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", - "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", - "service": "AVS", - "severity": "高い", - "text": "ストレッチ クラスターを使用している場合は、両方の ExpressRoute 回線で GlobalReach が有効になっていることを確認します。", - "waf": "確実" + "checklist": "SAP Checklist", + "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", + "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", + "service": "SAP", + "severity": "中程度", + "text": "パートナーの NVA が使用されている場合にのみ、リージョン間でネットワーク仮想アプライアンス (NVA) をデプロイすることを検討してください。ネイティブ NVA が存在する場合、リージョン間または VNet 間の NVA は必要ありません。パートナーのネットワーク テクノロジと NVA をデプロイする場合は、ベンダーのガイダンスに従って、Azure ネットワークと競合する構成を確認します。", + "training": "https://learn.microsoft.com/training/modules/control-network-traffic-flow-with-routes/?source=recommendations", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", + "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", + "service": "SAP", + "severity": "中程度", + "text": "Virtual WAN は、仮想 WAN ベースのトポロジのスポーク VNet 間の接続を管理し (ユーザー定義ルーティング (UDR) または NVA を設定する必要はありません)、同じ仮想ハブ内の VNet 間トラフィックの最大ネットワーク スループットは 50 ギガビット/秒です。必要に応じて、SAP ランディング ゾーンは VNet ピアリングを使用して他のランディング ゾーンに接続し、この帯域幅の制限を克服できます。", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/?source=recommendations", + "waf": "オペレーションズ" + }, + { + "checklist": "SAP 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", "severity": "高い", - "text": "サイトの耐障害性の設定を適切に検討し、必要に応じてビジネスに合わせて変更しましたか?", - "waf": "確実" + "text": "SAP ワークロードを実行している VM へのパブリック IP の割り当てはお勧めしません。", + "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review Checklist", - "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", - "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", - "service": "Azure MySQL", - "severity": "中程度", - "text": "フレキシブル サーバーの活用", - "waf": "確実" + "checklist": "SAP 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", + "severity": "高い", + "text": "ASRの設定時にDR側でIPアドレスを予約することを検討してください", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review 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", + "checklist": "SAP 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", "severity": "高い", - "text": "Availability Zones (地域的に適用可能な場合) を活用する", - "waf": "確実" + "text": "運用サイトと DR サイトで重複する IP アドレス範囲を使用しないでください。", + "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review 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", + "checklist": "SAP Checklist", + "guid": "6e154e3a-a359-4282-ae6e-206173686af4", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", + "service": "SAP", "severity": "中程度", - "text": "リージョン間の DR シナリオでのデータイン レプリケーションの活用", - "waf": "確実" + "text": "Azure では 1 つの VNet に複数の委任されたサブネットを作成できますが、Azure NetApp Files の VNet に存在できる委任されたサブネットは 1 つだけです。Azure NetApp Files に複数の委任されたサブネットを使用すると、新しいボリュームを作成しようとしても失敗します。", + "training": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-network-topologies?source=recommendations", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", - "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", - "service": "Spring Apps", + "checklist": "SAP 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", "severity": "中程度", - "text": "Azure Spring Apps では、アプリごとに 2 つのデプロイが許可され、そのうちの 1 つだけが運用トラフィックを受信します。ブルーグリーンデプロイ戦略により、ダウンタイムをゼロにすることができます。ブルー グリーン デプロイは、Standard レベルと Enterprise レベルでのみ使用できます。CI/CD と ADO/GitHub Actions を使用してデプロイを自動化できます", - "waf": "確実" + "text": "Azure Firewall を使用して、インターネットへの Azure 送信トラフィック、HTTP/S 以外の受信接続、East/West トラフィック フィルター処理 (組織で必要な場合) を管理します", + "training": "https://learn.microsoft.com/training/paths/secure-networking-infrastructure/", + "waf": "安全" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "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", + "checklist": "SAP Checklist", + "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", + "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", + "service": "SAP", "severity": "中程度", - "text": "Azure Spring Apps インスタンスは、アプリケーション用に複数のリージョンに作成でき、トラフィックは Traffic Manager/Front Door によってルーティングできます。", - "waf": "確実" + "text": "Application Gateway、SAP Web Dispatcher、およびその他のサードパーティ サービスの比較に示すように、Application Gateway が SAP Web アプリのリバース プロキシとして機能する場合、Application Gateway と Web Application Firewall には制限があります。", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/si/3362959506.html", + "waf": "安全" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", - "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", - "service": "Spring Apps", + "checklist": "SAP Checklist", + "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "SAP", "severity": "中程度", - "text": "サポートされているリージョンでは、Azure Spring Apps をゾーン冗長としてデプロイできるため、インスタンスは可用性ゾーン間で自動的に分散されます。この機能は、Standard レベルと Enterprise レベルでのみ使用できます。", - "waf": "確実" + "text": "Azure Front Door と WAF ポリシーを使用して、ランディング ゾーンへの受信 HTTP/S 接続に対して Azure リージョン全体でグローバル保護を提供します。", + "training": "https://learn.microsoft.com/training/paths/secure-application-delivery/", + "waf": "安全" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", - "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", - "service": "Spring Apps", + "checklist": "SAP Checklist", + "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", + "service": "SAP", "severity": "中程度", - "text": "アプリに複数のアプリ インスタンスを使用する", - "waf": "確実" + "text": "Azure Front Door と Application Gateway を使用して HTTP/S アプリケーションを保護する場合は、Azure Front Door の Web アプリケーション ファイアウォール ポリシーを利用します。Application Gateway をロックダウンして、Azure Front Door からのトラフィックのみを受信します。", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "7504c230-6035-4183-95a5-85762acc6075", - "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", - "service": "Spring Apps", + "checklist": "SAP Checklist", + "guid": "5ada4332-4e13-4811-9231-81aa41742694", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "SAP", "severity": "中程度", - "text": "Azure Spring Apps をログ、メトリック、トレースで監視します。ASA を Application Insights と統合し、障害を追跡し、ブックを作成します。", - "waf": "確実" + "text": "Web アプリケーション ファイアウォールを使用して、インターネットに公開されているトラフィックをスキャンします。別のオプションとして、ロード バランサーや、Application Gateway やサードパーティ ソリューションなどのファイアウォール機能が組み込まれているリソースと共に使用することもできます。", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", - "service": "Spring Apps", + "checklist": "SAP Checklist", + "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "SAP", "severity": "中程度", - "text": "Spring Cloud Gateway で自動スケーリングを設定する", - "waf": "確実" + "text": "Azure リージョンとオンプレミスの場所をまたいだグローバルなトランジット接続が必要な新規ネットワーク、大規模ネットワーク、またはグローバル ネットワークでの Azure デプロイに Virtual WAN を使用します。このアプローチでは、Azure ネットワークの推移的なルーティングを手動で設定する必要はなく、SAP on Azure デプロイの標準に従うことができます。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/10-explore-azure-front-door", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "97411607-b6fd-4335-99d1-9885faf4e392", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", - "service": "Spring Apps", - "severity": "低い", - "text": "Standard 従量課金プランと専用プランのアプリの自動スケーリングを有効にします。", - "waf": "確実" + "checklist": "SAP Checklist", + "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", + "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", + "service": "SAP", + "severity": "中程度", + "text": "データ漏えいを防ぐには、Azure Private Link を使用して、Azure Blob Storage、Azure Files、Azure Data Lake Storage Gen2、Azure Data Factory などのサービスとしてのプラットフォーム リソースに安全にアクセスします。Azure プライベート エンドポイントは、VNet と Azure Storage、Azure Backup などのサービス間のトラフィックをセキュリティで保護するのにも役立ちます。VNet とプライベート エンドポイント対応サービス間のトラフィックは、Microsoft グローバル ネットワークを経由するため、パブリック インターネットへの公開は防止されます。", + "training": "https://learn.microsoft.com/training/modules/design-implement-private-access-to-azure-services/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", - "link": "https://learn.microsoft.com/azure/spring-apps/overview", - "service": "Spring Apps", - "severity": "中程度", - "text": "ミッション クリティカルなアプリの Spring Boot の商用サポートには、Enterprise プランを使用します。他のレベルでは、OSS のサポートを受けることができます。", - "waf": "確実" + "checklist": "SAP Checklist", + "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", + "service": "SAP", + "severity": "高い", + "text": "SAP アプリケーションと DBMS レイヤーで使用される VM で Azure 高速ネットワークが有効になっていることを確認します。", + "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "ストレージに関連する Microsoft クラウド セキュリティ ベンチマークのガイダンスを適用する", - "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", - "service": "Azure Storage", + "checklist": "SAP Checklist", + "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", + "service": "SAP", "severity": "中程度", - "text": "\"ストレージの Azure セキュリティ ベースライン\" を検討する", + "text": "Azure Load Balancer の内部デプロイが Direct Server Return (DSR) を使用するように設定されていることを確認します。この設定 (フローティング IP の有効化) により、DBMS レイヤーの高可用性構成に内部ロード バランサー構成が使用されている場合の待機時間が短縮されます。", + "training": "https://learn.microsoft.com/ja-jp/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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 Blob Storage Review", - "description": "新しく作成されたストレージ アカウントは、RBAC や監査などがすべて有効になるように、ARM デプロイ モデルを使用して作成されます。サブスクリプションにクラシック デプロイ モデルの古いストレージ アカウントがないことを確認する", - "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", + "checklist": "SAP Checklist", + "guid": "6791f893-5ada-4433-84e1-3811523181aa", + "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "service": "SAP", "severity": "中程度", - "text": "古いストレージ アカウントで \"クラシック デプロイ モデル\" が使用されていないことを確認する", + "text": "アプリケーション セキュリティ グループ (ASG) と NSG 規則を使用して、SAP アプリケーション層と DBMS 層の間にネットワーク セキュリティのアクセス制御リストを定義できます。ASG は、仮想マシンをグループ化してセキュリティの管理に役立てます。", + "training": "https://learn.microsoft.com/training/modules/configure-network-security-groups/?source=recommendations", "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Microsoft Defender を活用して、不審なアクティビティや構成ミスについて学習します。", - "guid": "fc5972cd-4cd2-41b0-a803-7f5e6b4bfd3d", - "link": "https://learn.microsoft.com/azure/storage/common/azure-defender-storage-configure", - "service": "Azure Storage", + "checklist": "SAP Checklist", + "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "severity": "高い", - "text": "すべてのストレージ アカウントに対して Microsoft Defender を有効にする", - "waf": "安全" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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": "安全" + "text": "ピアリングされていない異なる Azure VNet への SAP アプリケーション レイヤーと SAP DBMS の配置はサポートされていません。", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "たとえば、機密性、プライバシー、コンプライアンス上の理由などから、削除された情報がすぐに削除されるようにアプリケーションで確認する必要がある場合など、特定の BLOB コンテナーに対して \"論理的な削除\" を選択的に無効にすることを検討してください。", - "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", - "service": "Azure Storage", + "checklist": "SAP Checklist", + "guid": "fa96c96a-d885-418f-9827-34c886ba2802", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "severity": "中程度", - "text": "BLOB の '論理的な削除' を無効にする", - "waf": "安全" + "text": "SAP アプリケーションで最適なネットワーク待機時間を実現するには、Azure 近接通信配置グループの使用を検討してください。", + "training": "https://learn.microsoft.com/azure/virtual-machines/co-location#planned-maintenance-and-proximity-placement-groups", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "コンテナーの論理的な削除を使用すると、コンテナーが削除された後に回復できます (たとえば、偶発的な削除操作から回復します)。", - "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview", - "service": "Azure Storage", + "checklist": "SAP Checklist", + "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "severity": "高い", - "text": "コンテナーの \"論理的な削除\" を有効にする", - "waf": "安全" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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": "安全" + "text": "オンプレミスと Azure の間で分割された SAP アプリケーション サーバー レイヤーと DBMS レイヤーを実行することは、まったくサポートされていません。どちらのレイヤーも、オンプレミスまたは Azure に完全に存在する必要があります。", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "削除前に削除ロックを最初に解除するようにユーザーに強制することで、ストレージ アカウントが誤って削除されないようにします", - "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", - "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", - "service": "Azure Storage", + "checklist": "SAP Checklist", + "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "severity": "高い", - "text": "ストレージ アカウントでのリソース ロックの有効化", - "waf": "安全" + "text": "SAP システムのデータベース管理システム (DBMS) レイヤーとアプリケーション レイヤーを異なる VNet でホストし、それらを VNet ピアリングに接続することは、レイヤー間の過剰なネットワーク トラフィックによって生成される可能性があるため、お勧めしません。Azure 仮想ネットワーク内のサブネットを使用して、SAP アプリケーション レイヤーと DBMS レイヤーを分離することをお勧めします。", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "費用" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "checklist": "SAP Checklist", + "guid": "402a9846-d515-4061-aff8-cd30088693fa", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", + "service": "SAP", "severity": "高い", - "text": "不変の BLOB を検討する", - "waf": "安全" + "text": "Linux ゲスト・オペレーティング・システムで Load Balancer を使用する場合は、Linux ネットワーク・パラメーター net.ipv4.tcp_timestamps が 0 に設定されていることを確認します。", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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 を無効にする)", + "checklist": "SAP Checklist", + "guid": "87585797-5551-4d53-bb7d-a94ee415734d", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", + "service": "SAP", + "severity": "中程度", + "text": "SAP RISE/ECS デプロイの場合、仮想ピアリングは、お客様の既存の Azure 環境との接続を確立するための推奨される方法です。SAP vnet と顧客 VNet の両方がネットワーク セキュリティ グループ (NSG) で保護され、vnet ピアリングを介した SAP ポートとデータベース ポートでの通信が可能になります", "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "checklist": "SAP Checklist", + "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", "severity": "高い", - "text": "HTTPS を適用する (HTTP を無効にする) 場合は、ストレージ アカウントにカスタム ドメイン (CNAME) を使用していないことを確認します。", - "waf": "安全" + "text": "Azure VM の SAP HANA データベースのバックアップを確認します。", + "waf": "費用" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "クライアントが SAS トークンを使用して BLOB データにアクセスするときに HTTPS を要求すると、資格情報が失われるリスクを最小限に抑えることができます。", - "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", - "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview", - "service": "Azure Storage", + "checklist": "SAP Checklist", + "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", "severity": "中程度", - "text": "Shared Access Signature (SAS) トークンを HTTPS 接続のみに制限する", - "waf": "安全" + "text": "Site Recovery の組み込み監視 (SAP で使用されている場合) を確認します。", + "waf": "費用" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "AAD トークンは、可能な限り、共有アクセス署名よりも優先する必要があります", - "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", - "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", - "service": "Azure Storage", + "checklist": "SAP Checklist", + "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", + "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", + "service": "SAP", "severity": "高い", - "text": "BLOB アクセスに Azure Active Directory (Azure AD) トークンを使用する", - "waf": "安全" + "text": "SAP HANA システム ランドスケープの監視に関するガイダンスを確認します。", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "ユーザー、グループ、またはアプリケーションにロールを割り当てる場合は、タスクの実行に必要なアクセス許可のみをセキュリティ プリンシパルに付与します。リソースへのアクセスを制限することで、意図しないデータの誤用と悪意のあるデータの誤用の両方を防ぐことができます。", - "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", - "service": "Azure Storage", + "checklist": "SAP Checklist", + "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", + "service": "SAP", "severity": "中程度", - "text": "IaM アクセス許可の最小特権", - "waf": "安全" + "text": "Azure Linux VM のバックアップ戦略で Oracle Database を確認します。", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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": "安全" + "checklist": "SAP 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", + "severity": "中程度", + "text": "SQL Server 2016 での Azure Blob Storage の使用を確認します。", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "ストレージ アカウント キー (\"共有キー\") には、監査機能がほとんどありません。誰がいつキーのコピーを取得したかを監視できますが、キーが複数の人の手に渡ると、使用状況を特定のユーザーに帰属させることは不可能です。AAD 認証のみに依存することで、ストレージへのアクセスをユーザーに結び付けやすくなります。", - "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", - "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", - "service": "Azure Storage", - "severity": "高い", - "text": "ストレージ アカウント キーを無効にして、AAD アクセス (およびユーザー委任 SAS) のみがサポートされるようにすることを検討してください。", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", + "service": "SAP", + "severity": "中程度", + "text": "Azure VM の自動バックアップ v2 の使用を確認します。", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "checklist": "SAP Checklist", + "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", + "service": "SAP", "severity": "高い", - "text": "Azure Monitor を使用して、ストレージ アカウントに対するコントロール プレーン操作を監査することを検討してください", - "waf": "安全" + "text": "Premium ディスク使用時の M シリーズの書き込みアクセラレータの有効化 (V1)", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "checklist": "SAP 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", "severity": "中程度", - "text": "ストレージ アカウント キーを使用する場合は、\"キーの有効期限ポリシー\" を有効にすることを検討してください", - "waf": "安全" + "text": "可用性ゾーンの待機時間をテストします。", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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": "安全" + "checklist": "SAP Checklist", + "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", + "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", + "service": "SAP", + "severity": "中程度", + "text": "すべての SAP コンポーネントに対して SAP EarlyWatch Alert を有効化します。", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "保存されているアクセス ポリシーを使用すると、ストレージ アカウント キーを再生成することなく、サービス SAS のアクセス許可を取り消すことができます。", - "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", - "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy", - "service": "Azure Storage", + "checklist": "SAP 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", "severity": "中程度", - "text": "保存されているアクセス ポリシーに SAS をリンクすることを検討する", - "waf": "安全" + "text": "SAP ABAPMeter report /SSA/CAT を使用して、SAP アプリケーション サーバーからデータベース サーバー間の待機時間を確認します。", + "training": "https://me.sap.com/notes/0002879613", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "checklist": "SAP Checklist", + "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", + "service": "SAP", "severity": "中程度", - "text": "チェックインされた接続文字列とストレージ アカウント キーを検出するようにアプリケーションのソース コード リポジトリを構成することを検討してください。", - "waf": "安全" + "text": "CCMS を使用した SQL Server のパフォーマンス監視を確認します。", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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": "安全" + "checklist": "SAP Checklist", + "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", + "link": "https://me.sap.com/notes/500235", + "service": "SAP", + "severity": "中程度", + "text": "SAP アプリケーション レイヤー VM と DBMS VM 間のネットワーク待機時間をテストします (NIPING)。", + "training": "https://me.sap.com/notes/1100926/E", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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": "安全" + "checklist": "SAP Checklist", + "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", + "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", + "service": "SAP", + "severity": "中程度", + "text": "SAP HANA Studio アラートを確認します。", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "checklist": "SAP Checklist", + "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", + "link": "https://me.sap.com/notes/1969700", + "service": "SAP", "severity": "中程度", - "text": "SAS に狭いスコープを適用する", + "text": "HANA_Configuration_Minichecks を使用して SAP HANA ヘルスチェックを実行します。", + "waf": "パフォーマンス" + }, + { + "checklist": "SAP Checklist", + "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "service": "SAP", + "severity": "中程度", + "text": "Azure、オンプレミス、またはその他のクラウド環境で Windows VM と Linux VM を実行している場合は、Azure Automation の更新管理センターを使用して、セキュリティ パッチを含むオペレーティング システムの更新プログラムを管理できます。", + "training": "https://learn.microsoft.com/azure/automation/update-management/overview", "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "SAS には、SAS を使用してリソースを要求する権限をクライアント IP アドレスまたはアドレス範囲に与えるパラメーターを含めることができます。", - "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", - "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas", - "service": "Azure Storage", + "checklist": "SAP Checklist", + "guid": "08951710-79a2-492a-adbc-06d7a401545b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "service": "SAP", "severity": "中程度", - "text": "可能な限り、SAS のスコープを特定のクライアント IP アドレスに設定することを検討してください", + "text": "SAP は、SAP システムを保護するために即時のアクションを必要とする非常に重要なセキュリティ パッチまたはホット フィックスをリリースしているため、SAP セキュリティ OSS ノートを定期的に確認してください。", + "training": "https://support.sap.com/en/my-support/knowledge-base/security-notes-news.html", "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "SAS は、クライアントがアップロードするデータの量を制限できません。時間の経過に伴うストレージ容量の価格モデルを考えると、クライアントが悪意を持って大きなコンテンツをアップロードしたかどうかを検証することは理にかなっているかもしれません。", - "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", - "service": "Azure Storage", + "checklist": "SAP Checklist", + "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", "severity": "低い", - "text": "クライアントが SAS を使用してファイルをアップロードした後、アップロードされたデータを確認することを検討してください。", + "text": "SQL Server 上の SAP システムではアカウントを使用しないため、SQL Server 上の SAP システム管理者アカウントを無効にすることができます。元のシステム管理者アカウントを無効にする前に、システム管理者権限を持つ別のユーザーがサーバーにアクセスできることを確認してください。", "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "checklist": "SAP Checklist", + "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", "severity": "高い", - "text": "SFTP: SFTPアクセスの「ローカルユーザー」の数を制限し、時間の経過とともにアクセスが必要かどうかを監査します。", + "text": "xp_cmdshellを無効にします。SQL Server 機能xp_cmdshell、SQL Server 内部オペレーティング システムのコマンド シェルを有効にします。これは、セキュリティ監査における潜在的なリスクです。", + "training": "https://me.sap.com/notes/3019299/E", "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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 をサポートしていません。", + "checklist": "SAP 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", + "severity": "高い", + "text": "Azure 上の SAP HANA データベース サーバーの暗号化では、SAP HANA ネイティブ暗号化テクノロジが使用されます。さらに、Azure で SQL Server を使用している場合は、Transparent Data Encryption (TDE) を使用してデータとログ ファイルを保護し、バックアップも暗号化されるようにします。", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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 ポリシーを避ける", + "checklist": "SAP Checklist", + "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "SAP", + "severity": "中程度", + "text": "Azure Storage の暗号化は、すべての Azure Resource Manager とクラシック ストレージ アカウントに対して有効になっており、無効にすることはできません。データは既定で暗号化されるため、Azure Storage 暗号化を使用するためにコードやアプリケーションを変更する必要はありません。", + "training": "https://learn.microsoft.com/training/modules/encrypt-sector-data/?source=recommendations", "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "保存データは常にサーバー側で暗号化され、さらにクライアント側でも暗号化される場合があります。サーバー側の暗号化は、プラットフォーム マネージド キー (既定) またはカスタマー マネージド キーを使用して行われる場合があります。クライアント側の暗号化は、クライアントが BLOB ごとに暗号化/暗号化解除キーを Azure Storage に提供するか、クライアント側で暗号化を完全に処理することによって行われます。そのため、機密性の保証を Azure Storage にまったく依存しません。", - "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", - "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", - "service": "Azure Storage", + "checklist": "SAP Checklist", + "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview", + "service": "SAP", "severity": "高い", - "text": "保存データの暗号化方法を決定します。データのスレッド モデルを理解します。", + "text": "Azure Key Vault を使用してシークレットと資格情報を格納する", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "checklist": "SAP Checklist", + "guid": "829e2edb-2173-4676-aff6-691b4935ada4", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "SAP", "severity": "中程度", - "text": "どのプラットフォーム暗号化を使用するか、または使用するかを決定します。", + "text": "デプロイが成功したら、Azure リソースを LOCK して、承認されていない変更から保護することをお勧めします。また、カスタマイズされた Azure ポリシー (Custome ロール) を使用して、サブスクリプションごとに LOCK の制約とルールを適用することもできます。", + "training": "https://learn.microsoft.com/training/modules/use-azure-resource-manager/?source=recommendations", "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", - "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", - "service": "Azure Storage", + "checklist": "SAP Checklist", + "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "SAP", "severity": "中程度", - "text": "クライアント側の暗号化を使用するかどうかを決定します。", + "text": "論理的な削除ポリシーと消去ポリシーを有効にして Azure Key Vault をプロビジョニングし、削除されたオブジェクトの保持保護を許可します。", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Resource Graph エクスプローラー (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) を利用して、匿名 BLOB アクセスを許可するストレージ アカウントを検索します。", - "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", + "checklist": "SAP Checklist", + "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", + "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", + "service": "SAP", "severity": "高い", - "text": "パブリック BLOB アクセスが必要かどうか、または特定のストレージ アカウントに対して無効にできるかどうかを検討します。", + "text": "既存の要件、規制、コンプライアンス制御 (内部/外部) に基づいて、必要な Azure ポリシーと Azure RBAC ロールを決定します", + "training": "https://learn.microsoft.com/training/paths/describe-azure-management-governance/?source=recommendations", "waf": "安全" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", - "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", - "service": "IoT Hub DPS", + "checklist": "SAP 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", "severity": "高い", - "text": "ビジネスと SLO の要件に基づいて適切なロジック アプリのホスティング プランを選択する", - "waf": "確実" + "text": "SAP 環境でMicrosoft Defender for Endpointを有効にする場合は、すべてのサーバーを対象とするのではなく、DBMS サーバー上のデータとログ ファイルを除外することをお勧めします。ターゲット ファイルを除外する場合は、DBMS ベンダーの推奨事項に従ってください。", + "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/microsoft-defender-endpoint-mde-for-sap-applications-on-windows/ba-p/3912268", + "waf": "安全" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "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", + "checklist": "SAP 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", "severity": "高い", - "text": "ゾーンの冗長性と可用性ゾーンを使用してリージョンの障害からロジック アプリを保護する", - "waf": "確実" + "text": "Microsoft Defender for Cloud の Just-In-Time アクセス権を持つ SAP 管理者カスタム ロールを委任します。", + "training": "https://learn.microsoft.com/training/modules/secure-vms-with-azure-security-center/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "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", - "severity": "高い", - "text": "重要なワークロードに対するリージョン間 DR 戦略を検討する", - "waf": "確実" + "checklist": "SAP 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", + "severity": "低い", + "text": "サードパーティのセキュリティ製品を DIAG (SAP GUI)、RFC、および SPNEGO for HTTPS のセキュアネットワーク通信 (SNC) と統合することにより、転送中のデータを暗号化します。", + "training": "https://learn.microsoft.com/azure/security/fundamentals/encryption-overview#encryption-of-data-in-transit", + "waf": "安全" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "IoT Hub DPS", - "severity": "高い", - "text": "分離環境にデプロイする場合は、App Service Environment (ASE) v3 を使用するか、それらに移行します", - "waf": "確実" - }, - { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "IoT Hub DPS", + "checklist": "SAP Checklist", + "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", + "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", + "service": "SAP", "severity": "中程度", - "text": "Azure DevOps または GitHub を活用して CI/CD を合理化し、ロジック アプリ コードを保護", - "waf": "オペレーションズ" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "高い", - "text": "共鳴可能なAIのためのメタプロンプトガードレールに従う", - "waf": "オペレーショナルエクセレンス" + "text": "プリンシパル暗号化機能には既定で Microsoft マネージド キーを使用し、必要に応じてカスタマー マネージド キーを使用します。", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", - "link": "https://github.com/Azure-Samples/AI-Gateway", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "4935ada4-2223-4ece-a1b1-23181a541741", + "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", + "service": "SAP", "severity": "高い", - "text": "APIM や AI Central などのソリューションを使用したゲートウェイ パターンを検討して、レート制限、負荷分散、認証、ログ記録を改善します", - "waf": "オペレーショナルエクセレンス" + "text": "Azure Key Vault は、アプリケーションごと、環境ごと、リージョンごとに使用します。", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "SAP Checklist", + "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", + "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", + "service": "SAP", "severity": "高い", - "text": "AOAI インスタンスの監視を有効にする", - "waf": "オペレーショナルエクセレンス" + "text": "HANA 以外の Windows オペレーティング システムと Windows 以外のオペレーティング システムのディスク暗号化キーとシークレットを制御および管理するには、Azure Key Vault を使用します。SAP HANA は Azure Key Vault ではサポートされていないため、SAP ABAP キーや SSH キーなどの代替方法を使用する必要があります。", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "697cb391-ed16-4b2d-886f-0a0241addde6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "209d490d-a477-4784-84d1-16785d2fa56c", + "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", + "service": "SAP", "severity": "高い", - "text": "リソースに対して実行されたアクション (サブスクリプション キーの再生成など) によって作成されたアクティビティ ログのエントリや、1 時間に 10 を超えるエラー数などのメトリックしきい値によって作成されたアクティビティ ログのエントリなど、イベントを通知するアラートを作成します", - "waf": "オペレーショナルエクセレンス" + "text": "SAP on Azure スポーク サブスクリプションのロールベースのアクセス制御 (RBAC) ロールをカスタマイズして、偶発的なネットワーク関連の変更を回避します", + "training": "https://learn.microsoft.com/training/modules/secure-azure-resources-with-rbac/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", + "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", + "service": "SAP", "severity": "高い", - "text": "トークンの使用状況を監視して、容量によるサービスの中断を防ぎます", - "waf": "オペレーショナルエクセレンス" + "text": "DMZ と NVA を SAP 資産の残りの部分から分離し、Azure Private Link を構成し、SAP on Azure リソースを安全に管理および制御します", + "training": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/secure-vnet-dmz?tabs=portal", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", - "severity": "中程度", - "text": "処理された推論トークン、生成された完了トークンなどのメトリックを観察し、レート制限を監視します", - "waf": "オペレーショナルエクセレンス" + "checklist": "SAP 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", + "severity": "低い", + "text": "Azure で Microsoft マルウェア対策ソフトウェアを使用して、悪意のあるファイル、アドウェア、その他の脅威から仮想マシンを保護することを検討してください。", + "training": "https://azure.microsoft.com/blog/deploying-antimalware-solutions-on-azure-virtual-machines/", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "SAP 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", "severity": "低い", - "text": "診断が十分でない場合は、Azure OpenAI の前で Azure API Management などのゲートウェイを使用して、受信プロンプトと送信応答の両方をログに記録することを検討してください (許可されている場合)", - "waf": "オペレーショナルエクセレンス" + "text": "さらに強力な保護を行うには、Microsoft Defender for Endpointの使用を検討してください。", + "training": "https://learn.microsoft.com/training/modules/implement-endpoint-protection-use-microsoft-defender/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", - "link": "https://github.com/Azure-Samples/openai-enterprise-iac", - "service": "Azure OpenAI", + "checklist": "SAP Checklist", + "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "severity": "高い", - "text": "コードとしてのインフラストラクチャを使用して、Azure OpenAI Service、モデル デプロイ、およびすべての関連リソースをデプロイします", - "waf": "オペレーショナルエクセレンス" + "text": "仮想ネットワーク ピアリングによってスポーク ネットワークに接続されているハブ仮想ネットワークを介してすべてのトラフィックを渡すことで、SAP アプリケーションとデータベース サーバーをインターネットまたはオンプレミス ネットワークから分離します。ピアリングされた仮想ネットワークにより、SAP on Azure ソリューションがパブリック インターネットから分離されることが保証されます。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "4350d092-d234-4292-a752-8537a551c5bf", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "Azure OpenAI", - "severity": "高い", - "text": "API キーの代わりにマネージド ID で Microsoft Entra 認証を使用する", + "checklist": "SAP 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", + "severity": "低い", + "text": "SAP Fiori などのインターネットに接続するアプリケーションの場合は、セキュリティレベルを維持しながら、アプリケーション要件ごとに負荷を分散してください。レイヤー 7 セキュリティについては、Azure Marketplace で入手できるサードパーティの Web アプリケーション ファイアウォール (WAF) を使用できます。", + "training": "https://learn.microsoft.com/training/modules/simplify-cloud-procurement-governance-azure-marketplace/?source=recommendations", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "高い", - "text": "入力と正しい答えを持つ既知のゴールデンデータセットを使用して、システムのパフォーマンス/精度を評価します。PromptFlowの機能を評価に活用します。", - "waf": "オペレーショナルエクセレンス" + "checklist": "SAP Checklist", + "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", + "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", + "service": "SAP", + "severity": "中程度", + "text": "Azure Monitor for SAP solutions でセキュリティで保護された通信を有効にするには、ルート証明書またはサーバー証明書のいずれかを使用することを選択できます。ルート証明書を使用することを強くお勧めします。", + "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", + "service": "AVS", "severity": "高い", - "text": "プロビジョニング済みスループットモデルの使用状況の評価", - "waf": "パフォーマンス" + "text": "ADDS ドメイン コントローラーがネイティブ Azure の ID サブスクリプションにデプロイされていることを確認する", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", - "service": "Azure OpenAI", - "severity": "高い", - "text": "Azure AI コンテンツの安全性を確認して実装する", - "waf": "オペレーショナルエクセレンス" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "75089c20-990d-4927-b105-885576f76fc2", + "service": "AVS", + "severity": "中程度", + "text": "Azure ベースのリソース (Azure VMware Solution を含む) からの認証要求を Azure にローカルに保持するように ADDS サイトとサービスが構成されていることを確認します", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1193846d-697c-4b39-8ed1-6b2d186f0a02", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#system-level-throughput", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", + "service": "AVS", "severity": "高い", - "text": "トークンと1分あたりのレスポンスに基づいてシステムのスループットを定義および評価し、要件に合わせます", - "waf": "パフォーマンス" + "text": "vCenterがADDに接続されていることを確認し、「名前付きユーザーアカウント」に基づく認証を有効にします", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", + "service": "AVS", "severity": "中程度", - "text": "トークンサイズ、ストリーミングオプションを制限することにより、システムのレイテンシーを改善します", - "waf": "パフォーマンス" + "text": "vCenter から ADDS への接続でセキュア プロトコル (LDAPS) が使用されていることを確認します", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", + "service": "AVS", "severity": "中程度", - "text": "弾力性の要求を見積もり、優先順位に基づいて同期要求とバッチ要求の分離を決定します。優先度が高い場合は同期アプローチを使用し、優先度が低い場合はキューを使用した非同期バッチ処理が推奨されます", - "waf": "パフォーマンス" + "text": "vCenter IdP の CloudAdmin アカウントは、緊急アカウント(非常用アカウント)としてのみ使用されます", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "5bda4332-4f24-4811-9331-82ba51752694", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", + "service": "AVS", "severity": "高い", - "text": "消費者からの推定需要に基づくトークン消費要件のベンチマーク。プロビジョニングされたスループット ユニットのデプロイを使用している場合は、Azure OpenAI ベンチマーク ツールを使用してスループットを検証することを検討してください", - "waf": "パフォーマンス" + "text": "NSX-Manager が外部 ID プロバイダ (LDAPS) と統合されていることを確認します。", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", + "service": "AVS", "severity": "中程度", - "text": "プロビジョニングされたスループットユニット (PTU) を使用している場合は、オーバーフローリクエストに対して Token-Per Minute (TPM) デプロイメントをデプロイすることを検討してください。ゲートウェイを使用して、PTU の制限に達したときに要求を TPM デプロイにルーティングします。", - "waf": "パフォーマンス" + "text": "VMware vSphere 内で使用するために RBAC モデルが作成されているか", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", - "service": "Azure OpenAI", - "severity": "高い", - "text": "適切なタスクに適したモデルを選択してください。速度、応答の品質、出力の複雑さの間で適切なトレードオフを持つモデルを選択する", - "waf": "パフォーマンス" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e9951904-8384-45c9-a6cb-2912156a1147", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", + "service": "AVS", "severity": "中程度", - "text": "微調整によってモデルのパフォーマンスが向上したかどうかを知るための微調整を行わずに、パフォーマンスのベースラインを設定する", - "waf": "パフォーマンス" + "text": "RBAC アクセス許可は、特定のユーザーではなく、ADDS グループに付与する必要があります", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "低い", - "text": "複数のOAIインスタンスを複数のリージョンにデプロイする", - "waf": "確実" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", + "service": "AVS", + "severity": "高い", + "text": "Azure の Azure VMware Solution リソースに対する RBAC アクセス許可は、限られた所有者のセットのみに \"ロックダウン\" されます", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", + "service": "AVS", "severity": "高い", - "text": "APIM のようなゲートウェイ パターンを使用した再試行とヘルスチェックの実装", - "waf": "確実" + "text": "すべてのカスタム ロールのスコープが CloudAdmin で許可された承認で設定されていることを確認する", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "中程度", - "text": "ワークロードに対してTPMとRPMの適切なクォータがあることを確認します", - "waf": "確実" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", + "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", + "service": "AVS", + "severity": "高い", + "text": "お客様のユース ケースに適した Azure VMware Solution 接続モデルが選択されているか", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", - "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", - "service": "Azure OpenAI", - "severity": "中程度", - "text": "HAIツールキットガイダンスの考慮事項を確認し、それらの相互作用の実践をslutionに適用します", - "waf": "オペレーショナルエクセレンス" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", + "service": "AVS", + "severity": "高い", + "text": "オンプレミスから Azure への ExpressRoute または VPN 接続が \"接続モニター\" を使用して監視されていることを確認する", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7f154e3a-a369-4282-ae7e-316183687a04", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", + "service": "AVS", "severity": "中程度", - "text": "ファインチューニングが採用されている場合は、リージョン間で個別の微調整モデルをデプロイします", - "waf": "確実" + "text": "Azure VMware Solution バックエンドの ExpressRoute 接続を監視するために、Azure ネイティブ リソースから Azure VMware Solution 仮想マシンへの接続モニターが作成されていることを確認します", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "77a1f893-5bda-4433-84f2-4811633182ba", - "link": "https://learn.microsoft.com/azure/backup/backup-overview", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", + "service": "AVS", "severity": "中程度", - "text": "重要なデータを定期的にバックアップおよびレプリケートして、データの損失やシステム障害が発生した場合のデータの可用性と回復性を確保します。Azure のバックアップおよびディザスター リカバリー サービスを活用して、データを保護します。", - "waf": "確実" + "text": "エンド 2 エンドの接続を監視するために、オンプレミス リソースから Azure VMware Solution 仮想マシンへの接続モニターが作成されていることを確認します", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", + "service": "AVS", "severity": "高い", - "text": "Azure AI Search サービス レベルは、SLA を持つために選択する必要があります", - "waf": "確実" + "text": "ルート サーバーを使用する場合は、ルート サーバーから ExR ゲートウェイ、オンプレミスに伝達されるルートが 1000 を超えないようにします (ARS 制限)。", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", - "link": "https://learn.microsoft.com/purview/purview", - "service": "Azure OpenAI", - "severity": "低い", - "text": "データと機密性を分類し、埋め込みを生成する前に Microsoft Purview でラベル付けし、生成された埋め込みを同じ感度と分類で処理するようにしてください", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", + "service": "AVS", + "severity": "高い", + "text": "Azure Portal で Azure VMware Solution リソースを管理するロールに対して Privileged Identity Management が実装されていますか (永続的なアクセス許可は許可されません)", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "4fda1dbf-3dd9-45d4-ac7c-891dca1f6d56", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/use-your-data-securely", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", + "service": "AVS", "severity": "高い", - "text": "SSE/ディスク暗号化(オプションのBYOKを使用)を使用してRAGに使用されるデータを暗号化", + "text": "Privileged Identity Management 監査レポートは、Azure VMware Solution PIM ロールに対して実装する必要がある", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", - "link": "https://learn.microsoft.com/azure/search/search-security-overview", - "service": "Azure OpenAI", - "severity": "高い", - "text": "データソース間で転送されるデータ、Retrieval-Augmented Generation(RAG)およびLLM通信に使用されるAI検索にTLSが適用されていることを確認します", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", + "service": "AVS", + "severity": "中程度", + "text": "Privileged Identity Management を使用している場合は、Azure VMware Solution のホストの自動置換通知用の有効な SMTP レコードを使用して、有効な Entra ID が有効なアカウントが作成されていることを確認します。(常任許可が必要)", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7b94ef6e-047d-42ea-8992-b1cd6e2054b2", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", + "service": "AVS", "severity": "高い", - "text": "RBAC を使用して、Azure OpenAI サービスへのアクセスを管理します。ユーザーに適切な権限を割り当て、ユーザーの役割と責任に基づいてアクセスを制限します", + "text": "CloudAdmin アカウントの使用を緊急アクセスのみに制限する", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", - "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", + "service": "AVS", "severity": "中程度", - "text": "データの暗号化、マスキング、または編集技術を実装して、機密データを非表示にしたり、非本番環境で難読化された値に置き換えたり、テストやトラブルシューティングの目的でデータを共有する場合", + "text": "vCenter Server でカスタム RBAC ロールを作成して、vCenter 内に最小特権モデルを実装します", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", + "service": "AVS", + "severity": "中程度", + "text": "cloudadmin (vCenter) と admin (NSX) の資格情報を定期的にローテーションするように定義されたプロセスです。", + "waf": "安全" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", + "service": "AVS", "severity": "高い", - "text": "Azure Defender を利用して、セキュリティの脅威を検出して対応し、監視とアラートのメカニズムを設定して、疑わしいアクティビティや侵害を特定します。Azure Sentinel を活用して高度な脅威の検出と対応を実現", + "text": "一元化された ID プロバイダーを使用して、Azure VMware Solution で実行されているワークロード (VM) に使用する", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", + "service": "AVS", "severity": "中程度", - "text": "コンプライアンス規制を遵守するためのデータ保持および廃棄ポリシーを確立します。不要になったデータに対して安全な削除方法を実装し、データの保持と廃棄活動の監査証跡を維持します", + "text": "East-West トラフィック フィルタリングは NSX-T 内に実装されていますか", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", + "service": "AVS", "severity": "高い", - "text": "Content Safety を使用した Prompt シールドと接地検出の実装", - "waf": "オペレーショナルエクセレンス" + "text": "Azure VMware Solution 上のワークロードは、インターネットに直接公開されません。トラフィックは、Azure Application Gateway、Azure Firewall、またはサード パーティのソリューションによってフィルター処理され、検査されます", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", - "link": "https://learn.microsoft.com/azure/compliance/", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", + "service": "AVS", "severity": "高い", - "text": "GDPRやHIPAAなどの関連するデータ保護規制への準拠を確保するには、プライバシー制御を実装し、データ処理活動に必要な同意または許可を取得します。", + "text": "監査とログ記録は、Azure VMware Solution および Azure VMware Solution ベースのワークロードへの受信インターネット要求に対して実装されます", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", + "service": "AVS", "severity": "中程度", - "text": "データセキュリティのベストプラクティス、データの安全な取り扱いの重要性、データ侵害に関連する潜在的なリスクについて、従業員を教育します。データセキュリティプロトコルに熱心に従うように促します。", + "text": "セッション監視は、疑わしい/悪意のあるアクティビティを特定するために、Azure VMware Solution または Azure VMware Solution ベースのワークロードからの送信インターネット接続に実装されます", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", - "service": "Azure OpenAI", - "severity": "高い", - "text": "運用データを開発データやテストデータから分離します。本番環境では実際の機密データのみを使用し、開発環境やテスト環境では匿名化されたデータや合成データを利用します。", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "334fdf91-c234-4182-a652-75269440b4be", + "service": "AVS", + "severity": "中程度", + "text": "Azure の ExR/VPN Gateway サブネットで DDoS Standard 保護が有効になっているか", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", + "service": "AVS", "severity": "中程度", - "text": "データの機密性のレベルが異なる場合は、レベルごとに個別のインデックスを作成することを検討してください。たとえば、一般的なデータ用に 1 つのインデックスを作成し、機密データ用に別のインデックスを作成し、それぞれ異なるアクセス プロトコルで管理することができます", + "text": "専用の特権アクセス ワークステーション (PAW) を使用して、Azure VMware Solution、vCenter、NSX Manager、HCX Manager を管理する", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", + "service": "AVS", "severity": "中程度", - "text": "分離をさらに一歩進めて、機密性の高いデータセットをサービスの異なるインスタンスに配置します。各インスタンスは、独自のRBACポリシーのセットで制御できます", + "text": "Azure VMware Solution で実行されているワークロードに対して Advanced Threat Detection (Microsoft Defender for Cloud 別名 ASC) を有効にする", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", - "service": "Azure OpenAI", - "severity": "高い", - "text": "機密情報から生成された埋め込みとベクトルは、それ自体が機密性が高いことを認識します。このデータには、ソースマテリアルと同じ保護対策を提供する必要があります", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", + "service": "AVS", + "severity": "中程度", + "text": "Azure ARC for Servers を使用して、Azure ネイティブ テクノロジを使用して Azure VMware Solution で実行されているワークロードを適切に管理します (Azure ARC for Azure VMware Solution はまだ利用できません)", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3571449a-b805-43d8-af89-dc7b33be2a1a", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "Azure OpenAI", - "severity": "高い", - "text": "埋め込みとベクトルを持つデータストアに RBAC を適用し、ロールのアクセス要件に基づいてアクセスのスコープを設定します", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", + "service": "AVS", + "severity": "低い", + "text": "Azure VMware Solution 上のワークロードで、実行時に十分なデータ暗号化 (ゲスト内ディスク暗号化や SQL TDE など) が使用されるようにします。(保存時の vSAN 暗号化がデフォルトです)", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "高い", - "text": "AI サービスのプライベート エンドポイントを構成して、ネットワーク内のサービス アクセスを制限します", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a3592718-e6e2-4051-9267-6ae46691e883", + "service": "AVS", + "severity": "低い", + "text": "ゲスト内暗号化を使用する場合は、可能な場合は Azure Key Vault に暗号化キーを格納します", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", - "service": "Azure OpenAI", - "severity": "高い", - "text": "Azure Firewall と UDR を使用して受信と送信のトラフィック制御を厳密に適用し、外部統合ポイントを制限します", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5ac94222-3e13-4810-9230-81a941741583", + "service": "AVS", + "severity": "中程度", + "text": "Azure VMware Solution で実行されているワークロードには、拡張セキュリティ更新プログラムのサポートの使用を検討してください (Azure VMware Solution は ESU の対象です)", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", + "service": "AVS", "severity": "高い", - "text": "ネットワークのセグメンテーションとアクセス制御を実装して、LLMアプリケーションへのアクセスを許可されたユーザーとシステムのみに制限し、横方向の移動を防ぎます", - "waf": "安全" + "text": "適切な vSAN データ冗長化方式(RAID 仕様)が使用されていることを確認します。", + "waf": "確実" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", - "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", - "service": "Azure OpenAI", - "severity": "中程度", - "text": "LLMLingua や gprtrim などのプロンプト圧縮ツールを使用します", - "waf": "コストの最適化" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d88408f3-7273-44c8-96ba-280214590146", + "service": "AVS", + "severity": "高い", + "text": "許容障害ポリシーが vSAN ストレージのニーズを満たすために設定されていることを確認します", + "waf": "確実" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", + "service": "AVS", "severity": "高い", - "text": "LLM アプリケーションで使用される API とエンドポイントが、マネージド ID、API キー、OAuth などの認証および承認メカニズムで適切に保護され、不正アクセスを防止します。", - "waf": "安全" + "text": "十分なクォータを要求し、拡張とディザスタリカバリの要件を考慮していることを確認します", + "waf": "確実" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", + "service": "AVS", "severity": "中程度", - "text": "多要素認証などの強力なエンドユーザー認証メカニズムを適用して、LLMアプリケーションおよび関連するネットワークリソースへの不正アクセスを防止します", - "waf": "安全" + "text": "ESXiへのアクセス制限を理解し、サードパーティのソリューションに影響を与える可能性のあるアクセス制限があることを確認してください。", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "93555620-2bfe-4456-9b0d-834a348b263e", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", + "service": "AVS", "severity": "中程度", - "text": "ネットワーク監視ツールを実装して、疑わしいアクティビティや悪意のあるアクティビティのネットワークトラフィックを検出および分析します。ロギングを有効にしてネットワークイベントをキャプチャし、セキュリティインシデントが発生した場合のフォレンジック分析を容易にします", - "waf": "安全" + "text": "ESXi ホストの密度と効率に関するポリシーがあることを確認し、新しいノードを要求するためのリード タイムを念頭に置いてください", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", + "service": "AVS", "severity": "中程度", - "text": "セキュリティ監査と侵入テストを実施して、LLMアプリケーションのネットワークインフラストラクチャのネットワークセキュリティの弱点または脆弱性を特定して対処します", - "waf": "安全" + "text": "Azure VMware Solution の適切なコスト管理プロセスが整っていることを確認する - Azure Cost Management を使用できます", + "waf": "費用" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", + "service": "AVS", "severity": "低い", - "text": "Azure AI Services は、管理を改善するために適切にタグ付けされています", - "waf": "オペレーショナルエクセレンス" + "text": "Azure VMware Solution を使用するためのコストを最適化するために Azure 予約インスタンスが使用されているか", + "waf": "費用" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", - "service": "Azure OpenAI", - "severity": "低い", - "text": "Azure AI Service アカウントは、組織の名前付け規則に従います", - "waf": "オペレーショナルエクセレンス" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6691e883-5ac9-4422-83e1-3810523081a9", + "service": "AVS", + "severity": "中程度", + "text": "他の Azure Native Services を使用する場合は、Azure Private-Link の使用を検討してください", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", - "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", + "service": "AVS", "severity": "高い", - "text": "Azure AI サービス リソースの診断ログを有効にする必要がある", - "waf": "オペレーショナルエクセレンス" + "text": "必要なすべてのリソースが同じ Azure 可用性ゾーン内に存在することを確認する", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", - "link": "https://learn.microsoft.com/azure/ai-services/authentication", - "service": "Azure OpenAI", - "severity": "高い", - "text": "セキュリティのため、キーアクセス(ローカル認証)を無効にすることをお勧めします。 キーベースのアクセスを無効にすると、Microsoft Entra IDが唯一のアクセス方法になり、最小限の特権原則ときめ細かな制御を維持できます。", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", + "service": "AVS", + "severity": "中程度", + "text": "Azure VMware Solution ゲスト VM ワークロードに対して Microsoft Defender for Cloud を有効にする", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Azure OpenAI", - "severity": "高い", - "text": "Azure Key Vault を使用して、キーを安全に保存および管理します。LLM アプリケーションのコード内で機密性の高いキーをハードコーディングしたり埋め込んだりすることを避け、マネージド ID を使用して Azure Key Vault から安全に取得します", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", + "service": "AVS", + "severity": "中程度", + "text": "Azure Arc 対応サーバーを使用して Azure VMware Solution ゲスト VM のワークロードを管理する", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", + "service": "AVS", "severity": "高い", - "text": "Azure Key Vault に格納されているキーを定期的にローテーションして期限切れにすることで、不正アクセスのリスクを最小限に抑えます。", - "waf": "安全" + "text": "Azure VMware Solution での診断ログとメトリック ログを有効にするEnable Diagnostic and metric logging on Azure VMware Solution", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "adfe27be-e297-401a-a352-baaab79b088d", - "link": "https://github.com/openai/tiktoken", - "service": "Azure OpenAI", - "severity": "高い", - "text": "tiktokenを使用して、会話モードでのトークン最適化のためのトークンサイズを理解します", - "waf": "コストの最適化" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", + "service": "AVS", + "severity": "中程度", + "text": "Log Analytics エージェントを Azure VMware Solution ゲスト VM ワークロードにデプロイする", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", - "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", - "service": "Azure OpenAI", - "severity": "高い", - "text": "安全なコーディング手法に従って、インジェクション攻撃、クロスサイトスクリプティング(XSS)、セキュリティ設定の誤りなどの一般的な脆弱性を防止します", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "589d457a-927c-4397-9d11-02cad6aae11e", + "service": "AVS", + "severity": "中程度", + "text": "Azure VMware Solution VM ワークロードのバックアップ ポリシーとソリューションが文書化され、実装されていることを確認します", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ee29711b-d352-4caa-ab79-b198dab81932", + "service": "AVS", + "severity": "中程度", + "text": "Microsoft Defender for Cloud を使用して、Azure VMware Solution で実行されているワークロードのコンプライアンス監視を行う", + "waf": "安全" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", + "service": "AVS", + "severity": "中程度", + "text": "適用可能なコンプライアンス ベースラインは Microsoft Defender for Cloud に追加されていますか", + "waf": "安全" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", + "service": "AVS", "severity": "高い", - "text": "LLM ライブラリとその他のシステム コンポーネントを定期的に更新し、パッチを適用するプロセスを設定します", + "text": "Azure VMware Solution のデプロイに使用する Azure リージョンを選択するときにデータ所在地が評価されましたか", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e29711b1-352b-4eee-879b-588defc4972c", - "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", + "service": "AVS", "severity": "高い", - "text": "Azure OpenAI またはその他の LLM の利用規約、ポリシー、ガイダンス、および許可されたユース ケースを順守する", - "waf": "オペレーショナルエクセレンス" + "text": "データ処理への影響 (サービス プロバイダー/サービス コンシューマー モデル) が明確で文書化されているか", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "547c1747-dc56-4068-a714-435cd19dd244", + "service": "AVS", "severity": "中程度", - "text": "基本モデルと微調整されたモデルおよびトークンのステップサイズのコストの違いを理解する", - "waf": "コストの最適化" + "text": "コンプライアンス上の理由で必要な場合にのみ、vSAN に CMK (カスタマー マネージド キー) を使用することを検討してください。", + "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", + "service": "AVS", "severity": "高い", - "text": "可能であれば、呼び出しごとのオーバーヘッドを最小限に抑え、全体的なコストを削減できるバッチ要求。バッチサイズを確実に最適化する", - "waf": "コストの最適化" + "text": "Azure VMware Solution のコア監視分析情報を有効にするダッシュボードを作成するCreate dashboards to enable a core Azure VMware Solution monitoring insights", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", - "service": "Azure OpenAI", - "severity": "中程度", - "text": "モデルの使用状況を監視するコスト追跡システムを設定し、その情報を使用してモデルの選択とプロンプトのサイズを通知します", - "waf": "コストの最適化" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", + "service": "AVS", + "severity": "高い", + "text": "Azure VMware Solution のパフォーマンス (CPU >80%、平均メモリ >80%、vSAN >70%) に関する自動アラートの重大しきい値の警告アラートを作成する", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "中程度", - "text": "モデル応答あたりのトークン数に上限を設定します。サイズを最適化して、有効な応答に十分な大きさになるようにします", - "waf": "コストの最適化" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9659e396-80e7-4828-ac93-5657d02bff45", + "service": "AVS", + "severity": "高い", + "text": "vSAN の消費量が 75% を下回っているかどうかを監視するための重要なアラートが作成されていることを確認します (これは VMware からのサポートしきい値です)。", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", - "link": "https://learn.microsoft.com/azure/search/search-reliability", - "service": "Azure OpenAI", - "severity": "中程度", - "text": "信頼性のための AI 検索の設定に関するガイダンスを確認します", - "waf": "オペレーショナルエクセレンス" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", + "service": "AVS", + "severity": "高い", + "text": "Azure Service Health のアラートと通知に対してアラートが構成されていることを確認する", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3266b225-86f4-4a16-92bd-ddea8a487cde", - "link": "https://learn.microsoft.com/azure/search/vector-search-index-size?tabs=portal-vector-quota", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", + "service": "AVS", "severity": "中程度", - "text": "AI Search Vector ストレージの計画と管理", - "waf": "オペレーショナルエクセレンス" + "text": "処理のために Azure Storage アカウントまたは Azure EventHub に送信するように Azure VMware Solution ログを構成する", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "中程度", - "text": "LLMOpsプラクティスを適用して、GenAIアプリケーションのライフサイクル管理を自動化します", - "waf": "オペレーショナルエクセレンス" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", + "service": "AVS", + "severity": "低い", + "text": "VMware vSphere での詳細な分析情報が必要な場合:vRealize Operations や vRealize Network Insights がソリューションで使用されていますか?", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", + "service": "AVS", "severity": "高い", - "text": "請求モデルの使用状況の評価 - PAYG と PTU の比較", - "waf": "コストの最適化" + "text": "仮想マシンの vSAN ストレージ ポリシーはシック プロビジョニングを適用するため、このポリシーがデフォルトのストレージ ポリシーではないことを確認します", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", + "service": "AVS", "severity": "中程度", - "text": "モデルバージョンを切り替える際のプロンプトとアプリケーションの品質を評価する", - "waf": "オペレーショナルエクセレンス" + "text": "vSAN は有限のリソースであるため、vSphere コンテンツ ライブラリが vSAN に配置されていないことを確認する", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", + "service": "AVS", "severity": "中程度", - "text": "GenAIアプリを評価、監視、改良して、接地性、関連性、精度、一貫性、流暢さなどの機能を確認します。", - "waf": "オペレーショナルエクセレンス" + "text": "バックアップ ソリューションのデータ リポジトリが vSAN ストレージの外部に保存されていることを確認します。Azure ネイティブまたはディスク プールでバックアップされるデータストア上", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "294798b1-578b-4219-a46c-eb5443513592", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", + "service": "AVS", "severity": "中程度", - "text": "さまざまな検索パラメーターに基づいて Azure AI Search の結果を評価する", - "waf": "オペレーショナルエクセレンス" + "text": "Azure Arc for Servers を使用して Azure VMware Solution で実行されているワークロードがハイブリッド管理されていることを確認する (Arc for Azure VMware Solution はプレビュー段階です)", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "2744293b-b628-4537-a551-19b08e8f5854", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", + "service": "AVS", "severity": "中程度", - "text": "精度を向上させる方法としてモデルの微調整を検討するのは、データを使用してプロンプトエンジニアリングやRAGなどの他の基本的なアプローチを試した場合のみです", - "waf": "オペレーショナルエクセレンス" + "text": "Azure VMware Solution で実行されているワークロードが Azure Log Analytics と Azure Monitor を使用して監視されていることを確認する", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", + "service": "AVS", "severity": "中程度", - "text": "プロンプトエンジニアリング手法を使用して、LLM応答の精度を向上させる", - "waf": "オペレーショナルエクセレンス" + "text": "Azure VMware Solution で実行されているワークロードを、既存の更新プログラム管理ツールまたは Azure Update Management に含める", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e737897e-71ca-47da-acfa-962a1594946d", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", + "service": "AVS", "severity": "中程度", - "text": "GenAIアプリケーションをレッドチーム化", + "text": "Azure Policy を使用して、Azure の管理、監視、セキュリティ ソリューションに Azure VMware Solution ワークロードをオンボードする", + "waf": "オペレーションズ" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", + "service": "AVS", + "severity": "中程度", + "text": "Azure VMware Solution で実行されているワークロードが Microsoft Defender for Cloud にオンボードされていることを確認する", "waf": "安全" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", - "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", + "service": "AVS", "severity": "中程度", - "text": "エンドユーザーにLLM応答のスコアリングオプションを提供し、これらのスコアを追跡します。", - "waf": "オペレーショナルエクセレンス" + "text": "vSAN は有限のリソースであるため、バックアップが vSAN に保存されないようにする", + "waf": "確実" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "高い", - "text": "クォータ管理の実践を検討する", - "waf": "コストの最適化" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", + "service": "AVS", + "severity": "中程度", + "text": "すべてのDRソリューションが検討され、ビジネスに最適なソリューションが決定されましたか?[SRM/JetStream/Zerto/Veeam/...]", + "waf": "確実" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", - "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", - "service": "Azure OpenAI", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", + "service": "AVS", "severity": "中程度", - "text": "APIM ベースのゲートウェイなどのロード バランサー ソリューションを使用して、サービスやリージョン間で負荷と容量を分散します", - "waf": "オペレーショナルエクセレンス" + "text": "ディザスター リカバリー テクノロジがネイティブの Azure IaaS の場合は、Azure Site Recovery を使用します", + "waf": "確実" }, { - "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": "中程度", - "text": "Azure リソースの管理には 1 つの Entra テナントを使用します (マルチテナントに対する明確な規制要件やビジネス要件がない限り)。", - "waf": "オペレーションズ" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", + "service": "AVS", + "severity": "高い", + "text": "いずれかの災害ソリューションで自動復旧計画を使用し、手動タスクを可能な限り回避します", + "waf": "確実" }, { - "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": "低い", - "text": "マルチテナント自動化アプローチを使用して、Microsoft Entra ID テナントを管理します。", - "waf": "オペレーションズ" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "8255461e-2aee-4345-9aec-8339248b262d", + "service": "AVS", + "severity": "中程度", + "text": "地政学的リージョンのペアをセカンダリディザスタリカバリ環境として使用する", + "waf": "確実" }, { - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", + "service": "AVS", "severity": "高い", - "text": "同じ ID でマルチテナント管理に Azure Lighthouse を使用します。", - "training": "https://learn.microsoft.com/azure/lighthouse/concepts/cross-tenant-management-experience", - "waf": "オペレーションズ" + "text": "リージョン間で 2 つの異なるアドレス空間を使用します (例: 10.0.0.0/16 と 192.168.0.0/16)。", + "waf": "確実" }, { - "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": "高い", - "text": "テナントを管理するためのアクセス権をパートナーに付与する場合は、Azure Lighthouse を使用します。", - "waf": "費用" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", + "service": "AVS", + "severity": "中程度", + "text": "ExpressRoute Global Reach は、プライマリとセカンダリの Azure VMware Solution プライベート クラウド間の接続に使用されますか、それともネットワーク仮想アプライアンスを介してルーティングされますか?", + "waf": "確実" }, { - "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": "高い", - "text": "クラウド運用モデルに合わせた RBAC モデルを適用します。管理グループとサブスクリプション全体のスコープと割り当て。", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", + "service": "AVS", + "severity": "中程度", + "text": "すべてのバックアップソリューションが検討され、ビジネスに最適なソリューションが決定されましたか?[ MABS/CommVault/Metallic.io/Veeam/ . ]", + "waf": "確実" }, { - "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": "高い", - "text": "すべてのアカウントの種類に対して、認証の種類である [職場または学校アカウント] のみを使用します。Microsoftアカウントの使用は避けてください", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", + "service": "AVS", + "severity": "中程度", + "text": "バックアップ ソリューションを Azure VMware Solution プライベート クラウドと同じリージョンにデプロイする", + "waf": "確実" }, { - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", + "service": "AVS", "severity": "中程度", - "text": "権限の割り当てには、グループのみを使用してください。グループ管理システムがすでに導入されている場合は、オンプレミス グループを Entra ID のみのグループに追加します。", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", - "waf": "安全" + "text": "バックアップ ソリューションを vSan の外部の Azure ネイティブ コンポーネントにデプロイする", + "waf": "確実" }, { - "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": "高い", - "text": "Azure 環境に対する権限を持つすべてのユーザーに対して、Microsoft Entra ID 条件付きアクセス ポリシーを適用します。", - "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", + "service": "AVS", + "severity": "低い", + "text": "Azure プラットフォームによって管理されている VMware コンポーネントの復元を要求するプロセスは用意されていますか?", + "waf": "確実" }, { - "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": "高い", - "text": "Azure 環境に対する権限を持つすべてのユーザーに多要素認証を適用します。", - "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", + "service": "AVS", + "severity": "低い", + "text": "手動デプロイの場合、すべての構成とデプロイを文書化する必要があります", + "waf": "オペレーションズ" }, { - "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": "中程度", - "text": "Microsoft Entra ID Privileged Identity Management (PIM) を適用して、ゼロスタンディング アクセスと最小特権を確立します。", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", + "service": "AVS", + "severity": "低い", + "text": "手動デプロイの場合は、Azure VMware Solution プライベート クラウドでの偶発的なアクションを防ぐために、リソース ロックの実装を検討してください", + "waf": "オペレーションズ" }, { - "checklist": "Azure Landing Zone Review", - "guid": "8b9fe5c4-1049-4d40-9a92-3c3474d00018", - "link": "https://learn.microsoft.com/en-us/entra/identity/domain-services/overview", - "service": "Entra", - "severity": "中程度", - "text": "Active Directory Domain Services から Entra ドメイン サービスへの切り替えを計画している場合は、すべてのワークロードの互換性を評価します。", - "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", + "service": "AVS", + "severity": "低い", + "text": "自動デプロイの場合は、最小限のプライベート クラウドをデプロイし、必要に応じてスケーリングします", + "waf": "オペレーションズ" }, { - "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": "中程度", - "text": "Microsoft Entra ID ログをプラットフォーム中央の Azure Monitor と統合します。Azure Monitor を使用すると、Azure のログと監視データに関する信頼できる唯一の情報源を使用できるため、ログの収集と保持に関する要件を満たすためのクラウド ネイティブ オプションを組織に提供できます。", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", + "service": "AVS", + "severity": "低い", + "text": "自動デプロイの場合は、デプロイを開始する前にクォータを要求または予約します", + "waf": "オペレーションズ" }, { - "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": "高い", - "text": "テナント全体のアカウント ロックアウトを防ぐために、緊急アクセスまたは非常用アカウントを実装します。", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", + "service": "AVS", + "severity": "低い", + "text": "自動デプロイの場合は、適切なガバナンスのために、自動化または Azure Policy を使用して関連するリソース ロックが作成されていることを確認します", + "waf": "オペレーションズ" }, { - "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": "中程度", - "text": "特に必要なシナリオがない限り、Microsoft Entra ID ロールの割り当てにオンプレミスの同期アカウントを使用しないでください。", - "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", + "service": "AVS", + "severity": "低い", + "text": "ExR 認証キーに人間が理解できる名前を実装して、キーの目的/用途を簡単に識別できるようにします", + "waf": "オペレーションズ" }, { - "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": "中程度", - "text": "Microsoft Entra ID アプリケーション プロキシを使用してリモート ユーザーにアプリケーションへのアクセス権を付与する場合は、テナントごとに 1 つのインスタンスしか持つことができないため、プラットフォーム リソースとして管理します。", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "255461e2-aee3-4553-afc8-339248b262d6", + "service": "AVS", + "severity": "低い", + "text": "Azure VMware Solution と ExpressRoute のデプロイに個別のサービス プリンシパルを使用する場合は、キー コンテナーを使用してシークレットと承認キーを格納します", + "waf": "オペレーションズ" }, { - "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": "中程度", - "text": "ハブアンドスポークネットワークトポロジは、最大限の柔軟性を必要とするネットワークシナリオに使用します。", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", + "service": "AVS", + "severity": "低い", + "text": "Azure VMware Solution では限られた数の並列操作しかサポートされないため、Azure VMware Solution に多くのリソースをデプロイする必要がある場合に、IaC でアクションをシリアル化するためのリソースの依存関係を定義します。", + "waf": "オペレーションズ" }, { - "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": "高い", - "text": "ExpressRoute ゲートウェイ、VPN ゲートウェイ、Azure Firewall またはパートナー NVA などの共有ネットワーク サービスを中央ハブ仮想ネットワークにデプロイします。必要に応じて、DNS サービスもデプロイします。", - "waf": "費用" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", + "service": "AVS", + "severity": "低い", + "text": "単一の Tier-1 ゲートウェイで NSX-T セグメントの自動構成を実行する場合は、NSX-Manager API ではなく Azure Portal API を使用します", + "waf": "オペレーションズ" }, { - "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": "高い", - "text": "アプリケーション ランディング ゾーン内のすべてのパブリック IP アドレスに対して、DDoS ネットワークまたは IP 保護プランを使用します。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", + "service": "AVS", + "severity": "中程度", + "text": "自動スケールアウトを使用する場合は、Azure VMware Solution を実行しているサブスクリプションに対して十分な Azure VMware Solution クォータを申請してください", + "waf": "パフォーマンス" }, { - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", + "service": "AVS", "severity": "中程度", - "text": "パートナー ネットワーク テクノロジまたは NVA をデプロイする場合は、パートナー ベンダーのガイダンスに従ってください。", - "waf": "確実" + "text": "自動スケールインを使用する場合は、そのようなアクションを実行する前に、ストレージ ポリシーの要件を必ず考慮してください", + "waf": "パフォーマンス" }, { - "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": "低い", - "text": "ハブ アンド スポークのシナリオで ExpressRoute ゲートウェイと VPN ゲートウェイ間のトランジットが必要な場合は、Azure Route Server を使用します。", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", + "service": "AVS", + "severity": "中程度", + "text": "スケーリング操作は、一度に 1 つのスケール操作しか実行できないため、常に 1 つの SDDC 内でシリアル化する必要があります (複数のクラスタが使用されている場合でも)", + "waf": "パフォーマンス" }, { - "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": "低い", - "text": "Route Server を使用する場合は、Route Server サブネットに /27 プレフィックスを使用します。", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", + "service": "AVS", + "severity": "中程度", + "text": "アーキテクチャで使用されるサードパーティソリューションでのスケーリング操作を検討および検証します(サポートされているかどうか)", + "waf": "パフォーマンス" }, { - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", + "service": "AVS", "severity": "中程度", - "text": "Azure リージョン間で複数のハブ アンド スポーク トポロジを持つネットワーク アーキテクチャの場合は、ハブ VNet 間でグローバル仮想ネットワーク ピアリングを使用して、リージョンを相互に接続します。", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-virtual-networks/", + "text": "自動化で環境のスケールイン/スケールアウトの上限を定義して適用する", "waf": "パフォーマンス" }, { - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", + "service": "AVS", "severity": "中程度", - "text": "Azure Monitor for Networks を使用して、Azure 上のネットワークのエンドツーエンドの状態を監視します。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "text": "監視ルールを実装して、自動スケーリング操作を監視し、成功と失敗を監視して、適切な (自動化された) 応答を有効にします", "waf": "オペレーションズ" }, { - "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": "中程度", - "text": "リージョンに 400 を超えるスポーク ネットワークがある場合は、VNet ピアリングの制限 (500) と ExpressRoute 経由でアドバタイズできるプレフィックスの最大数 (1000) をバイパスするために、追加のハブをデプロイします。", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c5972cd4-cd21-4b07-9036-f5e6b4bfd3d5", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "AVS", + "severity": "高い", + "text": "MONを使用する場合は、同時に構成されたVMの制限(HCXのMON制限[400 - 標準、1000 - 大規模アプライアンス])に注意してください", + "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", "waf": "確実" }, { - "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": "中程度", - "text": "ルート テーブルあたりのルート数を 400 に制限します。", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "be1f38cf-03a8-422b-b463-cbbbc8ac299e", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "AVS", + "severity": "高い", + "text": "MON を使用する場合、100 を超えるネットワーク拡張で MON を有効にすることはできません", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", "waf": "確実" }, { - "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": "高い", - "text": "VNet ピアリングを構成するときは、\"リモート仮想ネットワークへのトラフィックを許可する\" 設定を使用します。", - "waf": "確実" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", + "service": "AVS", + "severity": "中程度", + "text": "移行に VPN 接続を使用する場合は、それに応じて MTU サイズを調整します。", + "waf": "パフォーマンス" }, { - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e614658d-d457-4e92-9139-b821102cad6e", + "service": "AVS", "severity": "中程度", - "text": "ExpressRoute Direct を使用している場合は、組織のルーターと MSEE の間のレイヤー 2 レベルでトラフィックを暗号化するために MACsec を構成します。この図は、フロー内のこの暗号化を示しています。", - "waf": "安全" + "text": "Azure に接続する接続性の低いリージョン (500 Mbps 以下) の場合は、HCX WAN 最適化アプライアンスのデプロイを検討してください", + "waf": "パフォーマンス" }, { - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", + "service": "AVS", "severity": "中程度", - "text": "MACsec がオプションではないシナリオ (ExpressRoute Direct を使用しない場合など) は、VPN ゲートウェイを使用して、ExpressRoute プライベート ピアリング経由で IPsec トンネルを確立します。", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", - "waf": "安全" + "text": "移行がオンプレミスアプライアンスから開始され、クラウドアプライアンスから開始されていないことを確認します(逆移行は実行しないでください)", + "waf": "確実" }, { - "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": "高い", - "text": "Azure リージョンとオンプレミスの場所間で重複する IP アドレス空間が使用されていないことを確認します。", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", + "service": "AVS", + "severity": "中程度", + "text": "Azure NetApp Files を使用して Azure VMware Solution のストレージを拡張する場合は、VM に直接接続するのではなく、これを VMware データストアとして使用することを検討してください。", + "waf": "確実" }, { - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bff4564b-0d93-44a3-98b2-63e7dd60513a", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", + "service": "AVS", "severity": "中程度", - "text": "プライベートインターネットのアドレス割り当て範囲(RFC 1918)のIPアドレスを使用します。", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "安全" + "text": "専用の ExpressRoute ゲートウェイが外部データ ストレージ ソリューションに使用されていることを確認する", + "waf": "確実" }, { - "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": "高い", - "text": "IP アドレス空間が無駄にならないようにし、不必要に大規模な仮想ネットワーク (/16 など) を作成しないでください。", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "パフォーマンス" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "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", + "severity": "中程度", + "text": "外部データ ストレージ ソリューションに使用されている ExpressRoute ゲートウェイで FastPath が有効になっていることを確認します", + "waf": "確実" }, { - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "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", "severity": "高い", - "text": "運用サイトとディザスター リカバリー サイトで重複する IP アドレス範囲を使用しないでください。", - "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "text": "ストレッチ クラスタを使用している場合は、選択したディザスタ リカバリ ソリューションがベンダーによってサポートされていることを確認します", "waf": "確実" }, { - "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": "中程度", - "text": "Azure での名前解決が必要な環境では、Azure プライベート DNS を使用して解決し、名前解決に委任されたゾーン ('azure.contoso.com' など) を使用します。", - "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", - "waf": "オペレーションズ" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", + "service": "AVS", + "severity": "高い", + "text": "ストレッチ クラスターを使用する場合は、提供される SLA が要件を満たしていることを確認します", + "waf": "確実" }, { - "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": "中程度", - "text": "Azure とオンプレミス間での名前解決が必要で、Active Directory のような既存のエンタープライズ DNS サービスがない環境の場合は、Azure DNS Private Resolver を使用して DNS 要求を Azure またはオンプレミスの DNS サーバーにルーティングします。", - "training": "https://learn.microsoft.com/training/modules/intro-to-azure-dns-private-resolver/", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", + "service": "AVS", + "severity": "高い", + "text": "ストレッチ クラスターを使用している場合は、両方の ExpressRoute 回線が接続ハブに接続されていることを確認します。", + "waf": "確実" }, { - "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": "低い", - "text": "独自の DNS が必要でデプロイする特別なワークロード (Red Hat OpenShift など) は、優先する DNS ソリューションを使用する必要があります。", - "waf": "オペレーションズ" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", + "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", + "service": "AVS", + "severity": "高い", + "text": "ストレッチ クラスターを使用している場合は、両方の ExpressRoute 回線で GlobalReach が有効になっていることを確認します。", + "waf": "確実" }, { - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", + "service": "AVS", "severity": "高い", - "text": "Azure DNS の自動登録を有効にすると、仮想ネットワーク内にデプロイされた仮想マシンの DNS レコードのライフサイクルが自動的に管理されます。", - "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", - "waf": "オペレーションズ" + "text": "サイトの耐障害性の設定を適切に検討し、必要に応じてビジネスに合わせて変更しましたか?", + "waf": "確実" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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 Bastion を使用して、ネットワークに安全に接続します。", + "text": "\"ストレージの Azure セキュリティ ベースライン\" を検討する", "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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 Blob Storage Review", + "description": "新しく作成されたストレージ アカウントは、RBAC や監査などがすべて有効になるように、ARM デプロイ モデルを使用して作成されます。サブスクリプションにクラシック デプロイ モデルの古いストレージ アカウントがないことを確認する", + "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": "Azure Bastion は、/26 以上のサブネットで使用します。", + "text": "古いストレージ アカウントで \"クラシック デプロイ モデル\" が使用されていないことを確認する", "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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 Blob Storage Review", + "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": "Azure Front Door と WAF ポリシーを使用して、ランディング ゾーンへの受信 HTTP/S 接続に対して Azure リージョン間でグローバルな保護を提供します。", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "text": "BLOB の \"論理的な削除\" を有効にする", "waf": "安全" }, { - "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": "低い", - "text": "Azure Front Door と Azure Application Gateway を使用して HTTP/S アプリを保護する場合は、Azure Front Door の WAF ポリシーを使用します。Azure Application Gateway をロックダウンして、Azure Front Door からのトラフィックのみを受信するようにします。", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "コンテナーの論理的な削除を使用すると、コンテナーが削除された後に回復できます (たとえば、偶発的な削除操作から回復します)。", + "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview", + "service": "Azure Storage", "severity": "高い", - "text": "受信 HTTP/S 接続に WAF やその他のリバース プロキシが必要な場合は、ランディング ゾーン仮想ネットワーク内にデプロイし、保護してインターネットに公開するアプリと共にデプロイします。", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "text": "コンテナーの \"論理的な削除\" を有効にする", "waf": "安全" }, { - "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": "高い", - "text": "Azure DDoS ネットワークまたは IP Protection プランを使用して、仮想ネットワーク内のパブリック IP アドレス エンドポイントを保護します。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "削除前に削除ロックを最初に解除するようにユーザーに強制することで、ストレージ アカウントが誤って削除されないようにします", + "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", + "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", + "service": "Azure Storage", "severity": "高い", - "text": "ネットワークの送信トラフィックの構成と戦略を管理する方法を、今後の破壊的変更の前に計画します。2025 年 9 月 30 日に、新しいデプロイの既定の送信アクセスは廃止され、明示的なアクセス構成のみが許可されます。", - "waf": "確実" + "text": "ストレージ アカウントでのリソース ロックの有効化", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "診断設定を追加して、保護されたすべてのパブリック IP アドレス (DDoS IP またはネットワーク保護) の DDoS 関連のログを保存します。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "不変の BLOB を検討する", "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "Virtual Machines に直接関連付けられているパブリック IP アドレスを拒否するポリシーの割り当てがあることを確認します。 特定の VM でパブリック IP が必要な場合は、除外を使用します。", + "text": "HTTPS を要求する (つまり、ストレージ アカウントのポート 80 を無効にする)", "waf": "安全" }, { - "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": "中程度", - "text": "ExpressRoute を Azure へのプライマリ接続として使用します。 バックアップ接続のソースとして VPN を使用します。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "パフォーマンス" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.network/expressRouteCircuits", - "checklist": "Azure Landing Zone Review", - "description": "AS パスの先頭と接続の重みを使用して Azure からオンプレミスへのトラフィックに影響を与えたり、独自のルーターの BGP 属性の全範囲を使用してオンプレミスから Azure へのトラフィックに影響を与えたりできます。", - "guid": "f29812b2-363c-4efe-879b-599de0d5973c", - "link": "https://learn.microsoft.com/azure/expressroute/expressroute-routing", - "service": "ExpressRoute", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "複数の ExpressRoute 回線または複数のオンプレミスの場所を使用する場合は、BGP 属性を使用してルーティングを最適化します。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "確実" + "text": "Shared Access Signature (SAS) トークンを HTTPS 接続のみに制限する", + "waf": "安全" }, { - "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": "中程度", - "text": "ExpressRoute/VPN ゲートウェイの適切な SKU は、帯域幅とパフォーマンスの要件に基づいて選択してください。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "パフォーマンス" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "AAD トークンは、可能な限り、共有アクセス署名よりも優先する必要があります", + "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", + "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", + "service": "Azure Storage", + "severity": "高い", + "text": "BLOB アクセスに Azure Active Directory (Azure AD) トークンを使用する", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "ユーザー、グループ、またはアプリケーションにロールを割り当てる場合は、タスクの実行に必要なアクセス許可のみをセキュリティ プリンシパルに付与します。リソースへのアクセスを制限することで、意図しないデータの誤用と悪意のあるデータの誤用の両方を防ぐことができます。", + "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", + "service": "Azure Storage", + "severity": "中程度", + "text": "IaM アクセス許可の最小特権", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "無制限のデータ ExpressRoute 回線を使用しているのは、そのコストを正当化する帯域幅に達した場合にのみしてください。", - "waf": "費用" + "text": "SAS を使用する場合は、ストレージ アカウント キー ベースの SAS よりも \"ユーザー委任 SAS\" を優先します。", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "ストレージ アカウント キー (\"共有キー\") には、監査機能がほとんどありません。誰がいつキーのコピーを取得したかを監視できますが、キーが複数の人の手に渡ると、使用状況を特定のユーザーに帰属させることは不可能です。AAD 認証のみに依存することで、ストレージへのアクセスをユーザーに結び付けやすくなります。", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", + "service": "Azure Storage", "severity": "高い", - "text": "ExpressRoute のローカル SKU を活用して、回線のコストを削減します (回線ピアリングの場所がローカル SKU の Azure リージョンをサポートしている場合)。", - "waf": "費用" + "text": "ストレージ アカウント キーを無効にして、AAD アクセス (およびユーザー委任 SAS) のみがサポートされるようにすることを検討してください。", + "waf": "安全" }, { - "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": "中程度", - "text": "ゾーン冗長 ExpressRoute ゲートウェイをサポートされている Azure リージョンにデプロイします。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "確実" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "10 Gbps を超える帯域幅または専用の 10/100 Gbps ポートが必要なシナリオでは、ExpressRoute Direct を使用します。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "パフォーマンス" + "text": "ストレージ アカウント キーを使用する場合は、\"キーの有効期限ポリシー\" を有効にすることを検討してください", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "待機時間を短くする必要がある場合、またはオンプレミスから Azure へのスループットを 10 Gbps より大きくする必要がある場合は、FastPath を有効にして、データ パスから ExpressRoute ゲートウェイをバイパスします。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "パフォーマンス" + "text": "SAS 有効期限ポリシーの構成を検討する", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "ゾーン冗長 VPN ゲートウェイを使用して、ブランチまたはリモートの場所を Azure (使用可能な場合) に接続します。", - "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", - "waf": "確実" + "text": "保存されているアクセス ポリシーに SAS をリンクすることを検討する", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "オンプレミスで冗長な VPN アプライアンス (アクティブ/アクティブまたはアクティブ/パッシブ) を使用します。", - "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", - "waf": "確実" + "text": "チェックインされた接続文字列とストレージ アカウント キーを検出するようにアプリケーションのソース コード リポジトリを構成することを検討してください。", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "ExpressRoute Direct を使用する場合は、コストを節約するために、ローカル Azure リージョンへの ExpressRoute ローカル回線を使用することを検討してください。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "費用" + "text": "接続文字列を Azure KeyVault に格納することを検討する (マネージド ID が不可能なシナリオの場合)", + "waf": "安全" }, { - "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": "中程度", - "text": "運用環境と非運用環境を分離する場合など、トラフィックの分離または専用の帯域幅が必要な場合は、異なる ExpressRoute 回線を使用します。これにより、ルーティングドメインを分離し、ノイズの多い隣人のリスクを軽減できます。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "ExpressRoute の可用性と使用率は、組み込みの Express Route Insights を使用して監視します。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "オペレーションズ" + "text": "SAS に狭いスコープを適用する", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "接続モニターは、ネットワーク全体 (特にオンプレミスと Azure の間) の接続監視に使用します。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "オペレーションズ" + "text": "可能な限り、SAS のスコープを特定のクライアント IP アドレスに設定することを検討してください", + "waf": "安全" }, { - "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": "中程度", - "text": "冗長性を確保するために、さまざまなピアリングの場所から ExpressRoute 回線を使用します。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "確実" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "SAS は、クライアントがアップロードするデータの量を制限できません。時間の経過に伴うストレージ容量の価格モデルを考えると、クライアントが悪意を持って大きなコンテンツをアップロードしたかどうかを検証することは理にかなっているかもしれません。", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "service": "Azure Storage", + "severity": "低い", + "text": "クライアントが SAS を使用してファイルをアップロードした後、アップロードされたデータを確認することを検討してください。", + "waf": "安全" }, { - "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": "中程度", - "text": "ExpressRoute 回線を 1 つだけ使用する場合は、ExpressRoute のフェールオーバーとしてサイト間 VPN を使用します。", - "waf": "確実" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.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": "高い", - "text": "GatewaySubnet でルート テーブルを使用している場合は、ゲートウェイ ルートが伝達されていることを確認してください。", - "waf": "確実" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "ExpressRoute を使用する場合、オンプレミスのルーティングは動的である必要があり、接続エラーが発生した場合は、回線の残りの接続に収束する必要があります。負荷は、アクティブ/アクティブとして両方の接続で共有するのが理想的ですが、アクティブ/パッシブもサポートされています。", - "waf": "確実" + "text": "過度に広範な CORS ポリシーを避ける", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "保存データは常にサーバー側で暗号化され、さらにクライアント側でも暗号化される場合があります。サーバー側の暗号化は、プラットフォーム マネージド キー (既定) またはカスタマー マネージド キーを使用して行われる場合があります。クライアント側の暗号化は、クライアントが BLOB ごとに暗号化/暗号化解除キーを Azure Storage に提供するか、クライアント側で暗号化を完全に処理することによって行われます。そのため、機密性の保証を 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 Blob Storage Review", + "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": "ExpressRoute 回線の 2 つの物理リンクが、ネットワーク内の 2 つの異なるエッジ デバイスに接続されていることを確認します。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "確実" + "text": "どのプラットフォーム暗号化を使用するか、または使用するかを決定します。", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", + "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", + "service": "Azure Storage", "severity": "中程度", - "text": "BFD(Bidirectional Forwarding Detection)が顧客またはプロバイダのエッジルーティングデバイスで有効で設定されていることを確認します。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "確実" + "text": "クライアント側の暗号化を使用するかどうかを決定します。", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Resource Graph エクスプローラー (resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true) を利用して、匿名 BLOB アクセスを許可するストレージ アカウントを検索します。", + "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": "ExpressRoute ゲートウェイを異なるピアリングの場所から 2 つ以上の回線に接続すると、回復性が向上します。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "確実" + "text": "パブリック BLOB アクセスが必要かどうか、または特定のストレージ アカウントに対して無効にできるかどうかを検討します。", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", + "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", + "service": "APIM", "severity": "中程度", - "text": "ExpressRoute 仮想ネットワーク ゲートウェイの診断ログとアラートを構成します。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "text": "グローバルレベルでのエラー処理ポリシーの実装", "waf": "オペレーションズ" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "中程度", - "text": "VNet 間通信に ExpressRoute 回線を使用しないでください。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "パフォーマンス" + "text": "すべての API ポリシーに要素が含まれていることを確認します。", + "waf": "オペレーションズ" }, { - "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": "低い", - "text": "検査のために Azure トラフィックをハイブリッドの場所に送信しないでください。 代わりに、Azure のリソース間の通信が Microsoft バックボーン ネットワーク経由で行われるように、\"Azure のトラフィックは Azure にとどまる\" という原則に従います。", - "waf": "パフォーマンス" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", + "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", + "service": "APIM", + "severity": "中程度", + "text": "ポリシーフラグメントを使用して、複数の API で同じポリシー定義を繰り返さないようにする", + "waf": "オペレーションズ" }, { - "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": "高い", - "text": "Azure Firewall を使用して、インターネットへの Azure 送信トラフィック、HTTP/S 以外の受信接続、East/West トラフィック フィルタリング (組織で必要な場合) を管理します。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "安全" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", + "link": "https://learn.microsoft.com/azure/api-management/monetization-support", + "service": "APIM", + "severity": "中程度", + "text": "API の収益化を計画している場合は、「収益化のサポート」の記事でおすすめの方法をご確認ください", + "waf": "オペレーションズ" }, { - "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": "中程度", - "text": "グローバル ネットワーク環境全体のセキュリティ体制を管理するためのグローバル Azure Firewall ポリシーを作成し、それをすべての Azure Firewall インスタンスに割り当てます。Azure のロールベースのアクセス制御を介して、増分ファイアウォール ポリシーをローカル セキュリティ チームに委任することで、特定のリージョンの要件を満たすためのきめ細かなポリシーを可能にします。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "安全" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "a7d0840a-c8c4-4e83-adec-5ca578eb4049", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", + "service": "APIM", + "severity": "高い", + "text": "診断設定を有効にしてログを Azure Monitor にエクスポートする", + "waf": "オペレーションズ" }, { - "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": "低い", - "text": "サポートされているパートナー SaaS セキュリティプロバイダーを Firewall Manager 内で構成します。これは、組織がアウトバウンド接続を保護するためにそのようなソリューションを使用する場合です。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "安全" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", + "service": "APIM", + "severity": "中程度", + "text": "Application Insights を有効にして、より詳細なテレメトリを実現する", + "waf": "オペレーションズ" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", + "service": "APIM", "severity": "高い", - "text": "アプリケーション・ルールを使用して、サポートされているプロトコルの宛先ホスト名でアウトバウンド・トラフィックをフィルタリングします。 FQDN ベースのネットワーク規則と Azure Firewall と DNS プロキシを使用して、他のプロトコル経由でインターネットへのエグレス トラフィックをフィルター処理します。", - "waf": "安全" + "text": "最も重要なメトリックに関するアラートを構成する", + "waf": "オペレーションズ" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "高い", - "text": "Azure Firewall Premium を使用して、追加のセキュリティ機能を有効にします。", + "text": "カスタム SSL 証明書が Azure Key Vault に格納され、安全にアクセスして更新できるようにする", "waf": "安全" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "高い", - "text": "Azure Firewall の脅威インテリジェンス モードを [アラート] と [拒否] に構成して、保護を強化します。", + "text": "Azure AD を使用して API (データ プレーン) への受信要求を保護する", "waf": "安全" }, { - "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": "高い", - "text": "Azure Firewall の IDPS モードを [拒否] に構成して、保護を強化します。", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", + "service": "APIM", + "severity": "中程度", + "text": "Microsoft Entra ID を使用して開発者ポータルでユーザーを認証する", "waf": "安全" }, { - "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": "高い", - "text": "Virtual WAN に接続されていない VNet 内のサブネットの場合は、インターネット トラフィックが Azure Firewall またはネットワーク仮想アプライアンスにリダイレクトされるようにルート テーブルをアタッチします。", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", + "service": "APIM", + "severity": "中程度", + "text": "適切なグループを作成して、製品の可視性を制御します", "waf": "安全" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "06862505-2d9a-4874-9491-2837b00a3475", + "link": "https://learn.microsoft.com/azure/api-management/backends", + "service": "APIM", "severity": "中程度", - "text": "診断設定を追加して、リソース固有の宛先テーブルを使用して、すべての Azure Firewall デプロイのログを保存します。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "バックエンド機能を使用して、冗長な API バックエンド構成を排除します", "waf": "オペレーションズ" }, { - "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": "大事な", - "text": "Azure Firewall クラシック ルール (存在する場合) からファイアウォール ポリシーに移行します。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", + "service": "APIM", + "severity": "中程度", + "text": "名前付き値を使用して、ポリシーで使用できる共通の値を格納します", "waf": "オペレーションズ" }, { - "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": "高い", - "text": "Azure Firewall サブネットに /26 プレフィックスを使用します。", - "waf": "安全" - }, - { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", + "service": "APIM", "severity": "中程度", - "text": "ファイアウォールポリシー内のルールを、使用頻度に基づいて「ルールコレクショングループ」と「ルールコレクション」に整理します。", - "waf": "パフォーマンス" + "text": "DR の場合は、99.99% の SLA で 2 つ以上のリージョンにスケーリングされたデプロイで Premium レベルを活用します", + "waf": "確実" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", + "link": "https://learn.microsoft.com/azure/api-management/high-availability", + "service": "APIM", "severity": "中程度", - "text": "IP グループまたは IP プレフィックスを使用して、IP テーブル・ルールの数を減らします。", - "waf": "パフォーマンス" + "text": "少なくとも 1 つのユニットを 2 つ以上の可用性ゾーンにデプロイして、SLA を 99.99% に向上させる", + "waf": "確実" }, { - "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": "中程度", - "text": "DNATSのソースIPとしてワイルドカード(*やanyなど)を使用せず、受信DNATのソースIPを指定する必要があります。", - "waf": "パフォーマンス" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "高い", + "text": "自動バックアップ・ルーチンがあることを確認する", + "waf": "確実" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", + "link": "https://learn.microsoft.com/azure/api-management/retry-policy", + "service": "APIM", "severity": "中程度", - "text": "SNAT ポートの使用状況を監視し、NAT ゲートウェイの設定を評価し、シームレスなフェールオーバーを確保することで、SNAT ポートの枯渇を防ぎます。ポート数が制限に近づく場合は、SNAT の枯渇が差し迫っている可能性があります。", - "waf": "パフォーマンス" + "text": "ポリシーを使用して、フェイルオーバー・バックエンドURLとキャッシュを追加し、コールの失敗を減らします。", + "waf": "確実" }, { - "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": "高い", - "text": "Azure Firewall Premium を使用している場合は、TLS 検査を有効にします。", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", + "service": "APIM", + "severity": "低い", + "text": "高パフォーマンス レベルでログを記録する必要がある場合は、Event Hubs ポリシーを検討してください", + "waf": "オペレーションズ" + }, + { + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", + "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", + "service": "APIM", + "severity": "中程度", + "text": "調整ポリシーを適用して、毎秒の要求数を制御する", + "training": "https://learn.microsoft.com/training/modules/protect-apis-on-api-management/", "waf": "パフォーマンス" }, { - "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": "低い", - "text": "Web カテゴリを使用して、特定のトピックへの送信アクセスを許可または拒否します。", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", + "service": "APIM", + "severity": "中程度", + "text": "負荷が増加したときにインスタンスの数をスケールアウトするように自動スケーリングを構成する", "waf": "パフォーマンス" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", + "service": "APIM", "severity": "中程度", - "text": "TLS 検査の一環として、Azure App Gateway からのトラフィックの受信を検査用に計画します。", + "text": "セルフホステッド ゲートウェイをデプロイする場所は、バックエンド API に近いリージョンが Azure にありません。", "waf": "パフォーマンス" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", + "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", + "service": "APIM", "severity": "中程度", - "text": "Azure Firewall DNS プロキシ構成を有効にします。", - "waf": "安全" + "text": "運用環境のワークロードには Premium レベルを使用します。", + "waf": "確実" }, { - "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": "高い", - "text": "Azure Firewall を Azure Monitor と統合し、診断ログを有効にしてファイアウォール ログを格納および分析します。", - "waf": "オペレーションズ" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "中程度", + "text": "複数リージョン モデルでは、ポリシーを使用して、可用性または待機時間に基づいてリージョン バックエンドに要求をルーティングします。", + "waf": "確実" }, { - "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": "低い", - "text": "ファイアウォールルールのバックアップを実装する", - "waf": "オペレーションズ" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "高い", + "text": "APIM の制限に注意する", + "waf": "確実" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", + "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", + "service": "APIM", "severity": "高い", - "text": "0.0.0.0/0 ルートやコントロール プレーン トラフィックをブロックする NSG ルールなど、仮想ネットワークに挿入された Azure PaaS サービスのコントロール プレーン通信を中断しないでください。", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", - "waf": "安全" + "text": "セルフホステッド ゲートウェイのデプロイに回復性があることを確認します。", + "waf": "確実" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "7519e385-a88b-4d34-966b-6269d686e890", + "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", + "service": "APIM", "severity": "中程度", - "text": "オンプレミスからプライベート エンドポイントと ExpressRoute プライベート ピアリングを介して Azure PaaS サービスにアクセスします。この方法では、公共のインターネット経由のトランジットを回避できます。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "安全" + "text": "複数リージョンのデプロイに APIM の前で Azure Front Door を使用するUse Azure Front Door in front of APIM for multi-region deployment", + "waf": "パフォーマンス" }, { - "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": "高い", - "text": "既定では、すべてのサブネットで仮想ネットワーク サービス エンドポイントを有効にしないでください。", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "中程度", + "text": "仮想ネットワーク (VNet) 内にサービスをデプロイするDeploy the service within a Virtual Network (VNet)", "waf": "安全" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "中程度", - "text": "Azure Firewall または NVA の IP アドレスではなく FQDN を使用して Azure PaaS サービスへのエグレス トラフィックをフィルター処理し、データの流出を防ぎます。Private Link を使用している場合は、すべての FQDN をブロックでき、それ以外の場合は必要な PaaS サービスのみを許可できます。", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "text": "ネットワーク セキュリティ グループ (NSG) をサブネットにデプロイして、APIM との間のトラフィックを制限または監視します。", "waf": "安全" }, { - "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": "高い", - "text": "Gateway サブネットには、少なくとも /27 プレフィックスを使用します。", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "中程度", + "text": "プライベート エンドポイントをデプロイして、APIM が VNet にデプロイされていない場合に受信トラフィックをフィルター処理します。", "waf": "安全" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "高い", - "text": "VirtualNetwork サービス タグを使用して接続を制限する NSG 受信既定の規則に依存しないでください。", + "text": "パブリックネットワークアクセスの無効化", "waf": "安全" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", + "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", + "service": "APIM", "severity": "中程度", - "text": "NSG を使用して、サブネット間のトラフィックと、プラットフォーム全体の East/West トラフィック (ランディング ゾーン間のトラフィック) を保護します。", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", - "waf": "安全" - }, - { - "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": "中程度", - "text": "NSG とアプリケーション セキュリティ グループを使用して、ランディング ゾーン内のトラフィックをマイクロセグメント化し、中央の NVA を使用してトラフィック フローをフィルター処理しないようにします。", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", - "waf": "安全" - }, - { - "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": "中程度", - "text": "VNet フロー ログを有効にし、Traffic Analytics にフィードして、内部および外部のトラフィック フローに関する分析情報を取得します。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", - "waf": "安全" + "text": "PowerShell 自動化スクリプトで管理を簡素化", + "waf": "オペレーションズ" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "中程度", - "text": "1000 ルールの制限があるため、NSG ごとに 900 を超える NSG ルールを実装しないでください。", - "training": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", - "waf": "確実" + "text": "Infrastructure-as-code を使用して APIM を構成します。Cloud Adaption Framework APIM Landing Zone Accelerator から DevOps のベスト プラクティスを確認する", + "waf": "オペレーションズ" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", + "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", + "service": "APIM", "severity": "中程度", - "text": "Virtual WAN ルーティング設計の一覧にシナリオが明示的に説明されている場合は、Virtual WAN を使用します。", - "training": "https://learn.microsoft.com/learn/modules/introduction-azure-virtual-wan/", + "text": "Visual Studio Code APIM 拡張機能の使用を促進して API 開発を迅速化する", "waf": "オペレーションズ" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "354f1c03-8112-4965-85ad-c0074bddf231", + "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", + "service": "APIM", "severity": "中程度", - "text": "Azure リージョンごとに Virtual WAN ハブを使用して、共通のグローバル Azure Virtual WAN を介して Azure リージョン間で複数のランディング ゾーンを接続します。", - "waf": "パフォーマンス" + "text": "DevOpsとCI/CDをワークフローに実装する", + "waf": "オペレーションズ" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "b6439493-426a-45f3-9697-cf65baee208d", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", + "service": "APIM", "severity": "中程度", - "text": "送信インターネット トラフィックの保護とフィルタリングを行うには、セキュリティで保護されたハブに Azure Firewall をデプロイします。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "クライアント証明書認証を使用した API の保護", "waf": "安全" }, { - "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": "中程度", - "text": "Virtual WAN ネットワーク アーキテクチャが、特定されたアーキテクチャ シナリオと一致していることを確認します。", - "waf": "確実" - }, - { - "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": "中程度", - "text": "Azure Monitor Insights for Virtual WAN を使用して、Virtual WAN のエンドツーエンド トポロジ、状態、および主要なメトリックを監視します。", - "waf": "オペレーションズ" - }, - { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "2a67d143-1033-4c0a-8732-680896478f08", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", + "service": "APIM", "severity": "中程度", - "text": "Virtual WAN のブランチ間トラフィックは、これらのフローを明示的にブロックする必要がない限り、無効にしないでください。", - "waf": "確実" + "text": "クライアント証明書認証を使用したバックエンド サービスのセキュリティ保護", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", + "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", + "service": "APIM", "severity": "中程度", - "text": "AS-Path は ExpressRoute や VPN よりも柔軟性が高いため、ハブ ルーティング設定として使用します。", - "waf": "確実" + "text": "「OWASP API Security Top 10 の脅威を軽減するための推奨事項」の記事を確認し、API に適用できるものを確認します", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", + "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", + "service": "APIM", "severity": "中程度", - "text": "Virtual WAN でラベルベースの伝達を構成すると、仮想ハブ間の接続が損なわれます。", - "waf": "確実" + "text": "承認機能を使用して、バックエンド API の OAuth 2.0 トークンの管理を簡素化します", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", + "service": "APIM", "severity": "高い", - "text": "仮想ハブに少なくとも /23 プレフィックスを割り当てて、十分な IP スペースが使用可能であることを確認します。", - "waf": "確実" + "text": "転送中の情報を暗号化する場合は、最新のTLSバージョンを使用します。可能であれば、古くて不要なプロトコルと暗号を無効にします。", + "waf": "安全" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "高い", - "text": "Azure Policy を戦略的に活用し、環境のコントロールを定義し、ポリシー イニシアチブを使用して関連するポリシーをグループ化します。", + "text": "シークレット (名前付き値) が Azure Key Vault に格納され、安全にアクセスして更新できるようにする", "waf": "安全" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "中程度", - "text": "規制とコンプライアンスの要件を Azure Policy 定義と Azure ロールの割り当てにマップします。", + "text": "可能な限りマネージド ID を使用して、他の Azure リソースに対する認証を行う", "waf": "安全" }, { - "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": "中程度", - "text": "中間ルート管理グループで Azure Policy 定義を確立して、継承されたスコープで割り当てられるようにします。", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "高い", + "text": "Web アプリケーション ファイアウォール (WAF) を使用するには、APIM の前に Application Gateway をデプロイします", "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", + "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", + "service": "IoT Hub DPS", "severity": "高い", - "text": "ポリシーの割り当てを適切な最上位レベルで管理し、必要に応じて下位レベルで除外します。", - "waf": "安全" + "text": "ビジネスと SLO の要件に基づいて適切なロジック アプリのホスティング プランを選択する", + "waf": "確実" }, { - "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": "低い", - "text": "Azure Policy を使用して、ユーザーがサブスクリプション/管理グループ レベルでプロビジョニングできるサービスを制御します。", - "waf": "安全" + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "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", + "severity": "高い", + "text": "ゾーンの冗長性と可用性ゾーンを使用してリージョンの障害からロジック アプリを保護する", + "waf": "確実" }, { - "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", + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "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", "severity": "高い", - "text": "可能な場合は組み込みポリシーを使用して、運用オーバーヘッドを最小限に抑えます。", - "waf": "安全" + "text": "重要なワークロードに対するリージョン間 DR 戦略を検討する", + "waf": "確実" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "Azure Landing Zone Review", - "description": "Resource Policy Contributor ロールを特定のスコープに割り当てると、ポリシー管理を関連するチームに委任できます。たとえば、中央のITチームが管理グループレベルのポリシーを監督し、アプリケーションチームがサブスクリプションのポリシーを処理することで、組織の標準に準拠した分散型ガバナンスが可能になります。", - "guid": "3f988795-25d6-4268-a6d7-0ba6c97be995", - "link": "https://learn.microsoft.com/azure/governance/policy/overview#azure-rbac-permissions-in-azure-policy", - "service": "Policy", - "severity": "中程度", - "text": "特定のスコープで組み込みのリソース ポリシー共同作成者ロールを割り当てて、アプリケーション レベルのガバナンスを有効にします。", - "waf": "安全" + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "IoT Hub DPS", + "severity": "高い", + "text": "分離環境にデプロイする場合は、App Service Environment (ASE) v3 を使用するか、それらに移行します", + "waf": "確実" }, { - "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": "中程度", - "text": "ルート管理グループのスコープで行われる Azure Policy の割り当ての数を制限して、継承されたスコープでの除外による管理を回避します。", - "waf": "安全" - }, - { - "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", + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "IoT Hub DPS", "severity": "中程度", - "text": "データ主権の要件が存在する場合は、それらを適用するために Azure ポリシーをデプロイする必要があります。", - "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", - "waf": "安全" + "text": "Azure DevOps または GitHub を活用して CI/CD を合理化し、ロジック アプリ コードを保護", + "waf": "オペレーションズ" }, { - "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": "中程度", - "text": "ソブリン ランディング ゾーンの場合は、ソブリン ポリシー ベースラインをデプロイし、正しい管理グループ レベルで割り当てます。", - "waf": "安全" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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", + "severity": "低い", + "text": "ベスト プラクティスについては、「ベースラインの高可用性ゾーン冗長 Web アプリケーション アーキテクチャ」を参照してください", + "waf": "確実" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", + "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", + "service": "App Services", "severity": "中程度", - "text": "ソブリン ランディング ゾーンの場合は、ソブリン制御の目標をポリシー マッピングに文書化します。", - "waf": "安全" + "text": "Premium レベルと Standard レベルを使用します。これらの層では、ステージング スロットと自動バックアップがサポートされています。", + "waf": "確実" }, { - "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": "中程度", - "text": "ソブリン・ランディング・ゾーンについては、「ソブリン・コントロールの目標からポリシー・マッピングまで」の管理プロセスが実施されていることを確認してください。", - "waf": "安全" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", + "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", + "service": "App Services", + "severity": "高い", + "text": "リージョンで適用可能な場合は Availability Zones を活用します (Premium v2 または v3 レベルが必要)", + "waf": "確実" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Services", "severity": "中程度", - "text": "Azure ロールベースのアクセス制御 (Azure RBAC)、データ主権要件、またはデータ保持ポリシーで個別のワークスペースが義務付けられている場合を除き、1 つのモニター ログ ワークスペースを使用してプラットフォームを一元的に管理します。", - "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "waf": "オペレーションズ" + "text": "ヘルスチェックの実装", + "waf": "確実" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", + "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", + "service": "App Services", "severity": "高い", - "text": "ログの保持要件が 12 年を超える場合は、ログを Azure Storage にエクスポートします。write-once、read-many ポリシーで不変ストレージを使用して、ユーザーが指定した間隔でデータを消去および変更できないようにします。", - "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", - "waf": "オペレーションズ" - }, - { - "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": "中程度", - "text": "Azure Policy を使用して、OS レベルの仮想マシン (VM) 構成のずれを監視します。ポリシーを使用して Azure Automanage マシン構成の監査機能を有効にすると、アプリケーション チームのワークロードは、わずかな労力で機能機能をすぐに使用できます。", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "オペレーションズ" + "text": "「Azure App Service のバックアップと復元のベスト プラクティス」を参照してください", + "waf": "確実" }, { - "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": "中程度", - "text": "Azure Update Manager は、Azure の Windows VM と Linux VM の修正プログラム適用メカニズムとして使用します。", - "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", - "waf": "オペレーションズ" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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", + "severity": "高い", + "text": "Azure App Service の信頼性に関するベスト プラクティスを実装する", + "waf": "確実" }, { - "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": "中程度", - "text": "Azure Arc を使用して、Azure の外部にある Windows および Linux VM の修正プログラム適用メカニズムとして Azure Update Manager を使用します。", - "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", - "waf": "オペレーションズ" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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", + "severity": "低い", + "text": "災害時に App Service アプリを別のリージョンに移動する方法を理解する", + "waf": "確実" }, { - "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": "中程度", - "text": "Network Watcher を使用して、トラフィック フローを事前に監視します。", - "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", - "waf": "オペレーションズ" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", + "service": "App Services", + "severity": "高い", + "text": "Azure App Service の信頼性サポートについて理解する", + "waf": "確実" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "App Services", "severity": "中程度", - "text": "Azure Monitor ログを使用して、分析情報とレポートを作成します。", - "waf": "オペレーションズ" + "text": "App Service プランで実行されている Function Apps に対して \"Always On\" が有効になっていることを確認する", + "waf": "確実" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Services", "severity": "中程度", - "text": "Azure Monitor アラートを使用して、運用アラートを生成します。", - "waf": "オペレーションズ" + "text": "正常性チェックを使用した App Service インスタンスの監視", + "waf": "確実" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", + "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", + "service": "App Services", "severity": "中程度", - "text": "Azure Automation アカウントを使用して変更とインベントリの追跡を使用する場合は、Log Analytics ワークスペースと Automation アカウントをリンクするためにサポートされているリージョンが選択されていることを確認してください。", - "waf": "オペレーションズ" + "text": "Application Insights の可用性テストを使用して Web アプリまたは Web サイトの可用性と応答性を監視する", + "waf": "確実" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "b4e3f2d5-a5c6-4d7e-8b2f-c5d9e7a8f0ea", + "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", + "service": "App Services", "severity": "低い", - "text": "Azure Backup を使用する場合は、既定の設定が GRS であるため、バックアップに正しいバックアップの種類 (GRS、ZRS、LRS) を使用します。", + "text": "Application Insights Standard テストを使用して、Web アプリまたは Web サイトの可用性と応答性を監視する", "waf": "確実" }, { - "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": "中程度", - "text": "Azure ゲスト ポリシーを使用して、VM 拡張機能を通じてソフトウェア構成を自動的にデプロイし、準拠したベースライン VM 構成を適用します。", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Azure Key Vault を使用して、アプリケーションに必要なシークレットを格納します。 Key Vault は、シークレットを格納するための安全で監査された環境を提供し、Key Vault SDK または App Service Key Vault リファレンスを通じて App Service と適切に統合されています。", + "guid": "834ac932-223e-4ce8-8b12-3071a5416415", + "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", + "service": "App Services", + "severity": "高い", + "text": "Key Vault を使用してシークレットを格納する", "waf": "安全" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Azure Landing Zone Review", - "description": "Azure Policy のゲスト構成機能を使用して、マシンの設定 (OS、アプリケーション、環境など) を監査および修復し、リソースが予想される構成と一致していることを確認し、Update Management では VM のパッチ管理を適用できます。", - "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": "中程度", - "text": "Azure Policy を使用して VM セキュリティ構成のドリフトを監視します。", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "マネージド ID を使用して、Key Vault SDK または App Service Key Vault 参照を使用して Key Vault に接続します。", + "guid": "833ea3ad-2c2d-4e73-8165-c3acbef4abe1", + "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", + "service": "App Services", + "severity": "高い", + "text": "マネージド ID を使用して Key Vault に接続する", "waf": "安全" }, { - "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": "中程度", - "text": "Azure Site Recovery は、Azure から Azure Virtual Machines へのディザスター リカバリー シナリオに使用します。これにより、リージョン間でワークロードをレプリケートできます。", - "waf": "オペレーションズ" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "App Service TLS 証明書を Key Vault に格納します。", + "guid": "f8d39fda-4776-4831-9c11-5775c2ea55b4", + "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-certificate", + "service": "App Services", + "severity": "高い", + "text": "Key Vault を使用して TLS 証明書を格納します。", + "waf": "安全" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "機密情報を処理するシステムは分離する必要があります。 そのためには、個別の App Service プランまたは App Service Environment を使用し、異なるサブスクリプションまたは管理グループの使用を検討してください。", + "guid": "6ad48408-ee72-4734-a475-ba18fdbf590c", + "link": "https://learn.microsoft.com/azure/app-service/overview-hosting-plans", + "service": "App Services", "severity": "中程度", - "text": "Azure ネイティブのバックアップ機能、または Azure と互換性のあるサード パーティのバックアップ ソリューションを使用します。", - "waf": "オペレーションズ" + "text": "機密情報を処理するシステムを分離する", + "waf": "安全" }, { - "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": "高い", - "text": "診断設定を追加して、Azure Front Door や Azure Application Gateway などのアプリケーション配信サービスから WAF ログを保存します。ログを定期的に確認して、攻撃や誤検知の検出がないか確認します。", - "waf": "オペレーションズ" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "App Service のローカル ディスクは暗号化されていないため、機密データを格納しないでください。 (例: 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", + "severity": "中程度", + "text": "機密データをローカルディスクに保存しない", + "waf": "安全" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "認証された Web アプリケーションの場合は、Azure AD や Azure AD B2C などの確立された ID プロバイダーを使用します。 選択したアプリケーション フレームワークを利用して、このプロバイダーと統合するか、App Service の認証/承認機能を使用します。", + "guid": "919ca0b2-c121-459e-814b-933df574eccc", + "link": "https://learn.microsoft.com/azure/app-service/overview-authentication-authorization", + "service": "App Services", "severity": "中程度", - "text": "Azure Front Door や Azure Application Gateway などのアプリケーション配信サービスから WAF ログを Microsoft Sentinel に送信します。攻撃を検出し、WAF テレメトリを Azure 環境全体に統合します。", - "waf": "オペレーションズ" + "text": "認証に確立された ID プロバイダーを使用する", + "waf": "安全" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "適切に管理され、セキュリティで保護された DevOps デプロイ パイプラインなど、制御された信頼できる環境から App Service にコードをデプロイします。これにより、バージョン管理されておらず、悪意のあるホストからデプロイされることが確認されていないコードが回避されます。", + "guid": "3f9bcbd4-6826-46ab-aa26-4f9a19aed9c5", + "link": "https://learn.microsoft.com/azure/app-service/deploy-best-practices", + "service": "App Services", "severity": "高い", - "text": "Azure Key Vault を使用して、シークレットと資格情報を格納します。", + "text": "信頼できる環境からのデプロイ", "waf": "安全" }, { - "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": "中程度", - "text": "アプリケーションやリージョンごとに異なる Azure Key Vault を使用して、トランザクションのスケール制限を回避し、シークレットへのアクセスを制限します。", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "FTP/FTPS と WebDeploy/SCM の両方の基本認証を無効にします。 これにより、これらのサービスへのアクセスが無効になり、デプロイに Azure AD で保護されたエンドポイントの使用が強制されます。 SCM サイトは、Azure AD 資格情報を使用して開くこともできます。", + "guid": "5d04c2c3-919c-4a0b-8c12-159e114b933d", + "link": "https://learn.microsoft.com/azure/app-service/deploy-configure-credentials#disable-basic-authentication", + "service": "App Services", + "severity": "高い", + "text": "基本認証の無効化", "waf": "安全" }, { - "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": "中程度", - "text": "論理的な削除ポリシーと消去ポリシーを有効にして Azure Key Vault をプロビジョニングし、削除されたオブジェクトの保持保護を許可します。", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "可能な場合は、マネージド ID を使用して Azure AD のセキュリティで保護されたリソースに接続します。 これが不可能な場合は、Key Vault にシークレットを格納し、代わりにマネージド ID を使用して Key Vault に接続します。", + "guid": "f574eccc-d9bd-43ba-bcda-3b54eb2eb03d", + "link": "https://learn.microsoft.com/azure/app-service/overview-managed-identity?tabs=portal%2Chttp", + "service": "App Services", + "severity": "高い", + "text": "マネージド ID を使用してリソースに接続する", "waf": "安全" }, { - "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": "中程度", - "text": "最小特権モデルに従って、キー、シークレット、証明書を完全に削除する承認を、特殊なカスタム Microsoft Entra ID ロールに制限します。", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Azure Container Registry に格納されているイメージを使用する場合は、マネージド ID を使用してこれらをプルします。", + "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", + "severity": "高い", + "text": "マネージド ID を使用してコンテナーをプルするPull containers using a Managed Identity", "waf": "安全" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "App Service の診断設定を構成することで、ログ記録と監視の中央の宛先として、すべてのテレメトリを Log Analytics に送信できます。これにより、HTTP ログ、アプリケーション ログ、プラットフォーム ログなどの App Service のランタイム アクティビティを監視できます。", + "guid": "47768314-c115-4775-a2ea-55b46ad48408", + "link": "https://learn.microsoft.com/azure/app-service/troubleshoot-diagnostic-logs", + "service": "App Services", "severity": "中程度", - "text": "公開認証局を使用して証明書の管理と更新プロセスを自動化し、管理を容易にします。", + "text": "App Service ランタイム ログを Log Analytics に送信する", "waf": "安全" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "ログ記録と監視の中央の宛先としてアクティビティ ログを Log Analytics に送信するための診断設定を設定します。これにより、App Service リソース自体のコントロール プレーンのアクティビティを監視できます。", + "guid": "ee72734b-475b-4a18-bdbf-590ce65de8e0", + "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", + "service": "App Services", "severity": "中程度", - "text": "キーと証明書のローテーションのための自動化されたプロセスを確立します。", + "text": "App Service アクティビティ ログを Log Analytics に送信する", "waf": "安全" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "リージョンの VNet 統合、ネットワーク セキュリティ グループ、および UDR の組み合わせを使用して、送信ネットワーク アクセスを制御します。 トラフィックは、Azure Firewall などの NVA にルーティングする必要があります。 ファイアウォールのログを必ず監視してください。", + "guid": "c12159e1-14b9-433d-b574-ecccd9bd3baf", + "link": "https://learn.microsoft.com/azure/app-service/overview-vnet-integration", + "service": "App Services", "severity": "中程度", - "text": "コンテナーでファイアウォールと仮想ネットワーク サービス エンドポイントまたはプライベート エンドポイントを有効にして、キー コンテナーへのアクセスを制御します。", + "text": "送信ネットワーク アクセスを制御する必要がある", "waf": "安全" }, { - "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": "中程度", - "text": "プラットフォーム中央の Azure Monitor Log Analytics ワークスペースを使用して、Key Vault の各インスタンス内のキー、証明書、シークレットの使用状況を監査します。", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "VNet 統合を使用し、VNet NAT ゲートウェイまたは Azure Firewall などの NVA を使用することで、安定した送信 IP を提供できます。 これにより、受信側は必要に応じて IP に基づいて許可リストに登録できます。 多くの場合、Azure サービスへの通信では、IP アドレスに依存する必要はなく、代わりにサービス エンドポイントなどのメカニズムを使用する必要があります。 (また、受信側でプライベート エンドポイントを使用すると、SNAT の発生が回避され、安定した送信 IP 範囲が提供されます)。", + "guid": "cda3b54e-b2eb-403d-b9a2-582718d2ddb1", + "link": "https://learn.microsoft.com/azure/app-service/networking/nat-gateway-integration", + "service": "App Services", + "severity": "低い", + "text": "インターネットアドレスへの送信通信のIPを安定させる", "waf": "安全" }, { - "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": "中程度", - "text": "Key Vault のインスタンス化と特権アクセスを委任し、Azure Policy を使用して一貫した準拠構成を適用します。", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "App Service のアクセス制限、サービス エンドポイント、またはプライベート エンドポイントの組み合わせを使用して、受信ネットワーク アクセスを制御します。Web アプリ自体と SCM サイトに対して異なるアクセス制限を要求し、構成できます。", + "guid": "0725769e-e669-41a4-a34a-c932223ece80", + "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", + "service": "App Services", + "severity": "高い", + "text": "受信ネットワーク アクセスを制御する必要がある", "waf": "安全" }, { - "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": "中程度", - "text": "Azure Key Vault は、アプリケーションごと、環境ごと、リージョンごとに使用します。", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Application Gateway や Azure Front Door などの Web アプリケーション ファイアウォールを使用して、悪意のある受信トラフィックから保護します。 WAFのログを必ず監視してください。", + "guid": "b123071a-5416-4415-a33e-a3ad2c2de732", + "link": "https://learn.microsoft.com/azure/app-service/networking/app-gateway-with-service-endpoints", + "service": "App Services", + "severity": "高い", + "text": "App Service の前で WAF を使用するUse a WAF in Front of App Service", "waf": "安全" }, { - "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": "中程度", - "text": "独自のキーを持ち込む場合、これは考慮されるすべてのサービスでサポートされているとは限りません。不整合が望ましい結果を妨げないように、適切な軽減策を実装します。レイテンシを最小限に抑える適切なリージョンペアとディザスタリカバリリージョンを選択します。", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "WAFのみへのアクセスをロックダウンすることで、WAFをバイパスできないようにします。 アクセス制限、サービス・エンドポイントおよびプライベート・エンドポイントを組み合わせて使用します。", + "guid": "165c3acb-ef4a-4be1-b8d3-9fda47768314", + "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", + "service": "App Services", + "severity": "高い", + "text": "WAFをバイパスすることは避けてください", "waf": "安全" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "App Service の構成で最小 TLS ポリシーを 1.2 に設定します。", + "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", "severity": "中程度", - "text": "ソブリン ランディング ゾーンの場合は、Azure Key Vault マネージド HSM を使用してシークレットと資格情報を格納します。", + "text": "最小 TLS ポリシーを 1.2 に設定します。", "waf": "安全" }, { - "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": "中程度", - "text": "Microsoft Entra ID レポート機能を使用して、アクセス制御監査レポートを生成します。", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "HTTPS のみを使用するように App Service を構成します。 これにより、App Service は HTTP から HTTPS にリダイレクトされます。 HTTP Strict Transport Security (HSTS) をコード内または WAF から使用して、サイトに 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", + "severity": "高い", + "text": "HTTPS のみを使用", "waf": "安全" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "CORS 構成では、すべての配信元がサービスにアクセスできるため、ワイルドカードを使用しないでください (これにより、CORS の目的が損なわれます)。具体的には、サービスにアクセスできると予想される配信元のみを許可します。", + "guid": "68266abc-a264-4f9a-89ae-d9c55d04c2c3", + "link": "https://learn.microsoft.com/azure/app-service/app-service-web-tutorial-rest-api", + "service": "App Services", "severity": "高い", - "text": "すべてのサブスクリプションで Defender Cloud セキュリティ態勢管理を有効にします。", + "text": "ワイルドカードは CORS に使用しないでください", "waf": "安全" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "リモート デバッグは、サービスに追加のポートが開き、攻撃対象領域が増加するため、運用環境でオンにしないでください。このサービスは、48 時間後に自動的にリモート デバッグをオフにすることに注意してください。", + "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", "severity": "高い", - "text": "すべてのサブスクリプションで、サーバーの Defender Cloud ワークロード保護プランを有効にします。", + "text": "リモートデバッグをオフにする", "waf": "安全" }, { - "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": "高い", - "text": "すべてのサブスクリプションで Azure リソースの Defender Cloud ワークロード保護プランを有効にします。", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Defender for App Service を有効にします。 これは(他の脅威の中でも)既知の悪意のあるIPアドレスへの通信を検出します。 操作の一環として、Defender for App Service からの推奨事項を確認します。", + "guid": "18d2ddb1-0725-4769-be66-91a4834ac932", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-app-service-introduction", + "service": "App Services", + "severity": "中程度", + "text": "Defender for Cloud を有効にする - Defender for App Service", "waf": "安全" }, { - "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": "高い", - "text": "IaaS サーバーでエンドポイント保護を有効にします。", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Azure は、ネットワーク上で DDoS Basic 保護を提供しており、通常のトラフィック パターンを学習し、異常な動作を検出できるインテリジェントな DDoS Standard 機能によって改善できます。DDoS Standard は仮想ネットワークに適用されるため、Application Gateway や NVA など、アプリの前にあるネットワーク リソース用に構成する必要があります。", + "guid": "223ece80-b123-4071-a541-6415833ea3ad", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "App Services", + "severity": "中程度", + "text": "WAF VNet で DDoS Protection Standard を有効にするEnable DDOS Protection Standard on the WAF VNet", "waf": "安全" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Azure Container Registry に格納されているイメージを使用する場合は、プライベート エンドポイントとアプリ設定 \"WEBSITE_PULL_IMAGE_OVER_VNET\" を使用して、Azure Container Registry から仮想ネットワーク経由でイメージをプルします。", + "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", "severity": "中程度", - "text": "Azure Monitor ログと Defender for Cloud を使用して、基本オペレーティング システムの修正プログラムのずれを監視します。", + "text": "Virtual Network 経由でコンテナーをプルする", "waf": "安全" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "ペネトレーションテストのルールに従って、Webアプリケーションでペネトレーションテストを実施します。", + "guid": "eb2eb03d-d9a2-4582-918d-2ddb10725769", + "link": "https://learn.microsoft.com/azure/security/fundamentals/pen-testing", + "service": "App Services", "severity": "中程度", - "text": "既定のリソース構成を一元化された Azure Monitor Log Analytics ワークスペースに接続します。", + "text": "ペネトレーションテストの実施", "waf": "安全" }, { - "checklist": "Azure Landing Zone Review", - "guid": "1761e147-f65e-4d09-bbc2-f464f23e2eba", - "link": "https://learn.microsoft.com/industry/sovereignty/transparency-logs", - "service": "Entra", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "DevSecOps プラクティスに従って脆弱性が検証およびスキャンされた信頼できるコードをデプロイします。", + "guid": "19aed9c5-5d04-4c2c-9919-ca0b2c12159e", + "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/devsecops-in-azure", + "service": "App Services", "severity": "中程度", - "text": "ソブリン ランディング ゾーンの場合は、Entra ID テナントで透明度ログを有効にします。", + "text": "検証済みコードのデプロイ", + "waf": "安全" + }, + { + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "サポートされているプラットフォーム、プログラミング言語、プロトコル、およびフレームワークの最新バージョンを使用します。", + "guid": "114b933d-f574-4ecc-ad9b-d3bafcda3b54", + "link": "https://learn.microsoft.com/azure/app-service/overview-patch-os-runtime", + "service": "App Services", + "severity": "高い", + "text": "最新のプラットフォーム、言語、プロトコル、フレームワークを使用", "waf": "安全" }, { "checklist": "Azure Landing Zone Review", - "guid": "d21a922d-5ca7-427a-82a6-35f7b21f1bfc", - "link": "https://learn.microsoft.com/azure/security/fundamentals/customer-lockbox-overview", + "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": "中程度", - "text": "Sovereign Landing Zone の場合は、Entra ID テナントでカスタマー ロックボックスを有効にします。", - "waf": "安全" + "text": "Azure リソースの管理には 1 つの Entra テナントを使用します (マルチテナントに対する明確な規制要件やビジネス要件がない限り)。", + "waf": "オペレーションズ" }, { - "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": "高い", - "text": "ストレージ アカウントへの安全な転送を有効にします。", - "waf": "安全" + "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": "低い", + "text": "マルチテナント自動化アプローチを使用して、Microsoft Entra ID テナントを管理します。", + "waf": "オペレーションズ" }, { - "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", + "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": "高い", - "text": "ストレージ アカウントのコンテナーの論理的な削除を有効にして、削除されたコンテナーとその内容を回復します。", - "waf": "安全" + "text": "同じ ID でマルチテナント管理に Azure Lighthouse を使用します。", + "training": "https://learn.microsoft.com/azure/lighthouse/concepts/cross-tenant-management-experience", + "waf": "オペレーションズ" }, { - "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", + "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": "高い", - "text": "Key Vault シークレットを使用して、資格情報 (仮想マシン、ユーザー パスワード)、証明書、キーなどの機密情報のハードコーディングを回避します。", - "waf": "オペレーションズ" + "text": "テナントを管理するためのアクセス権をパートナーに付与する場合は、Azure Lighthouse を使用します。", + "waf": "費用" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "ac1d6380-f866-4bbd-a9b4-b1ee5d7908b8", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#availability-zones", - "service": "IoT", + "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": "高い", - "text": "Availability Zones (リージョンで適用可能な場合) を活用する (これは自動的に有効になります)", - "waf": "確実" + "text": "クラウド運用モデルに合わせた RBAC モデルを適用します。管理グループとサブスクリプション全体のスコープと割り当て。", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "安全" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "35f651e8-0124-4ef7-8c57-658e38609e6e", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", - "service": "IoT", - "severity": "中程度", - "text": "Microsoft が開始するフェールオーバーに注意してください。これらは、まれに、影響を受けるリージョンから対応する geo ペア リージョンにすべての IoT ハブをフェールオーバーするために Microsoft によって実行されます。", - "waf": "確実" + "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": "高い", + "text": "すべてのアカウントの種類に対して、認証の種類である [職場または学校アカウント] のみを使用します。Microsoftアカウントの使用は避けてください", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "安全" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "4ed3e490-dc06-4a1e-b467-5d0239d85540", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#cross-region-dr", - "service": "IoT", - "severity": "高い", - "text": "重要なワークロードに対するリージョン間 DR 戦略を検討する", - "waf": "確実" + "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": "中程度", + "text": "権限の割り当てには、グループのみを使用してください。グループ管理システムがすでに導入されている場合は、オンプレミス グループを Entra ID のみのグループに追加します。", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "安全" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "a11ecab0-db47-46f7-9aa7-17764e7e45a1", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", - "service": "IoT", + "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": "高い", - "text": "手動フェールオーバーをトリガーする方法を学習します。", - "waf": "確実" + "text": "Azure 環境に対する権限を持つすべてのユーザーに対して、Microsoft Entra ID 条件付きアクセス ポリシーを適用します。", + "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "waf": "安全" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "f9db8dfb-1194-460b-aedd-34dd6a69db22", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#failback", - "service": "IoT", + "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": "高い", - "text": "フェールオーバー後にフェールバックする方法を学習します。", - "waf": "確実" + "text": "Azure 環境に対する権限を持つすべてのユーザーに多要素認証を適用します。", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "waf": "安全" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization Checklist", - "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", - "service": "Azure Monitor", - "text": "Azure Monitor のデータ収集ルール - https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview", - "training": "https://azure.microsoft.com/pricing/reservations/", - "waf": "費用" + "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": "中程度", + "text": "Microsoft Entra ID Privileged Identity Management (PIM) を適用して、ゼロスタンディング アクセスと最小特権を確立します。", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "安全" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "text": "基になるデータソースが見つからないバックアップインスタンスを確認する", - "waf": "費用" + "checklist": "Azure Landing Zone Review", + "guid": "8b9fe5c4-1049-4d40-9a92-3c3474d00018", + "link": "https://learn.microsoft.com/en-us/entra/identity/domain-services/overview", + "service": "Entra", + "severity": "中程度", + "text": "Active Directory Domain Services から Entra ドメイン サービスへの切り替えを計画している場合は、すべてのワークロードの互換性を評価します。", + "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", + "waf": "安全" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "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", - "text": "関連づけられていないサービス(ディスク、NIC、IPアドレスなど)を削除またはアーカイブする", - "waf": "費用" + "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": "中程度", + "text": "Microsoft Entra ID ログをプラットフォーム中央の Azure Monitor と統合します。Azure Monitor を使用すると、Azure のログと監視データに関する信頼できる唯一の情報源を使用できるため、ログの収集と保持に関する要件を満たすためのクラウド ネイティブ オプションを組織に提供できます。", + "waf": "安全" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "text": "ミッション クリティカルでないアプリケーションの Site Recovery ストレージとバックアップのバランスを考慮する", - "waf": "費用" + "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": "高い", + "text": "テナント全体のアカウント ロックアウトを防ぐために、緊急アクセスまたは非常用アカウントを実装します。", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "安全" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization 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", - "text": "40 の異なるログ分析ワークスペース間で支出と節約の機会を確認する - 非運用ワークスペースに異なる保持とデータ収集を使用する - 認識と階層サイズ設定のための日次上限を作成する - 日次上限を設定する場合は、上限に達したときにアラートを作成するだけでなく、ある割合 (90% など) に達したときに通知されるアラート ルールも作成してください。- 可能であればワークスペースの変革を検討する - 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": "費用" + "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": "中程度", + "text": "特に必要なシナリオがない限り、Microsoft Entra ID ロールの割り当てにオンプレミスの同期アカウントを使用しないでください。", + "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", + "waf": "安全" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization 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", - "text": "ログのパージポリシーと自動化を適用する(必要に応じて、ログをコールドストレージに移動できます)", - "training": "https://www.youtube.com/watch?v=nHQYcYGKuyw", - "waf": "費用" + "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": "中程度", + "text": "Microsoft Entra ID アプリケーション プロキシを使用してリモート ユーザーにアプリケーションへのアクセス権を付与する場合は、テナントごとに 1 つのインスタンスしか持つことができないため、プラットフォーム リソースとして管理します。", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "waf": "安全" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "text": "ディスクが本当に必要かどうかを確認し、必要でない場合は削除します。必要な場合は、下位のストレージ階層を見つけるか、バックアップを使用します。", - "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/manage-automation", - "waf": "費用" + "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": "中程度", + "text": "ハブアンドスポークネットワークトポロジは、最大限の柔軟性を必要とするネットワークシナリオに使用します。", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization 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", - "text": "未使用のストレージを下位階層に移動し、カスタマイズされたルールを使用することを検討する - https://learn.microsoft.com/azure/storage/blobs/lifecycle-management-policy-configure", - "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", + "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": "高い", + "text": "ExpressRoute ゲートウェイ、VPN ゲートウェイ、Azure Firewall またはパートナー NVA などの共有ネットワーク サービスを中央ハブ仮想ネットワークにデプロイします。必要に応じて、DNS サービスもデプロイします。", "waf": "費用" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "VM", - "text": "advisor が VM の適切なサイズ設定用に構成されていることを確認する", - "waf": "費用" + "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": "高い", + "text": "アプリケーション ランディング ゾーン内のすべてのパブリック IP アドレスに対して、DDoS ネットワークまたは IP 保護プランを使用します。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "安全" }, { "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "description": "コスト分析でメーターカテゴリライセンスを検索して確認してください", - "guid": "59ae568b-a38d-4498-9e22-13dbd7bb012f", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/manage/centralize-operations", - "service": "VM", - "text": "すべての Windows VM でスクリプトを実行する 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- Windows VM が頻繁に作成される場合は、ポリシーの実装を検討してください", - "waf": "費用" + "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": "中程度", + "text": "パートナー ネットワーク テクノロジまたは NVA をデプロイする場合は、パートナー ベンダーのガイダンスに従ってください。", + "waf": "確実" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", - "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", - "service": "VM", - "text": "これは、すでにライセンスを持っている場合は、AHUBの下に置くこともできます https://learn.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux?tabs=rhelpayg%2Crhelbyos%2CrhelEnablebyos%2Crhelcompliance", - "waf": "費用" + "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": "低い", + "text": "ハブ アンド スポークのシナリオで ExpressRoute ゲートウェイと VPN ゲートウェイ間のトランジットが必要な場合は、Azure Route Server を使用します。", + "waf": "安全" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", - "service": "VM", - "text": "予約済み VM ファミリを柔軟性オプションで統合する (4 から 5 ファミリ以下)", - "training": "https://learn.microsoft.com/azure/automation/automation-solution-vm-management", - "waf": "費用" + "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": "低い", + "text": "Route Server を使用する場合は、Route Server サブネットに /27 プレフィックスを使用します。", + "waf": "安全" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "text": "Azure 予約インスタンスを利用する: この機能を使用すると、VM を 1 年または 3 年間予約できるため、PAYG 価格と比較して大幅なコスト削減が実現します。", - "waf": "費用" + "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": "中程度", + "text": "Azure リージョン間で複数のハブ アンド スポーク トポロジを持つネットワーク アーキテクチャの場合は、ハブ VNet 間でグローバル仮想ネットワーク ピアリングを使用して、リージョンを相互に接続します。", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-virtual-networks/", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", - "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", - "service": "VM", - "text": "より大きなディスクのみ予約できます => 1 TiB -", - "waf": "費用" + "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": "中程度", + "text": "Azure Monitor for Networks を使用して、Azure 上のネットワークのエンドツーエンドの状態を監視します。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", - "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", - "service": "VM", - "text": "適切なサイズ最適化の後", - "waf": "費用" + "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": "中程度", + "text": "リージョンに 400 を超えるスポーク ネットワークがある場合は、VNet ピアリングの制限 (500) と ExpressRoute 経由でアドバタイズできるプレフィックスの最大数 (1000) をバイパスするために、追加のハブをデプロイします。", + "waf": "確実" }, { - "arm-service": "Microsoft.Sql/servers", - "checklist": "Cost Optimization Checklist", - "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", - "service": "Azure SQL", - "text": "該当するかどうかを確認し、ポリシー/変更 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": "費用" + "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": "中程度", + "text": "ルート テーブルあたりのルート数を 400 に制限します。", + "waf": "確実" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", - "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", - "service": "VM", - "text": "VM +ライセンス部分の割引(ahub + 3YRI)は約70%の割引です", - "waf": "費用" + "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": "高い", + "text": "VNet ピアリングを構成するときは、\"リモート仮想ネットワークへのトラフィックを許可する\" 設定を使用します。", + "waf": "確実" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "text": "需要に合わせて、フラットなサイジングではなく、VMSS の使用を検討してください", - "waf": "費用" + "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": "中程度", + "text": "ExpressRoute Direct を使用している場合は、組織のルーターと MSEE の間のレイヤー 2 レベルでトラフィックを暗号化するために MACsec を構成します。この図は、フロー内のこの暗号化を示しています。", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Cost Optimization Checklist", - "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "AKS", - "text": "AKS オートスケーラーを使用してクラスターの使用量に一致させる (ポッドの要件がスケーラーと一致していることを確認する)", - "waf": "費用" + "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": "中程度", + "text": "MACsec がオプションではないシナリオ (ExpressRoute Direct を使用しない場合など) は、VPN ゲートウェイを使用して、ExpressRoute プライベート ピアリング経由で IPsec トンネルを確立します。", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "安全" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "text": "該当する場合は、復旧ポイントを vault-archive に移動します (検証)", - "training": "https://azure.microsoft.com/pricing/reservations/", - "waf": "費用" + "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": "高い", + "text": "Azure リージョンとオンプレミスの場所間で重複する IP アドレス空間が使用されていないことを確認します。", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "安全" }, { - "arm-service": "Microsoft.Databricks/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", - "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", - "service": "Databricks", - "text": "可能な場合は、フォールバックでスポット VM を使用することを検討してください。クラスターの自動終了を検討してください。", - "waf": "費用" + "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": "中程度", + "text": "プライベートインターネットのアドレス割り当て範囲(RFC 1918)のIPアドレスを使用します。", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "安全" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", - "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", - "service": "Azure Functions", - "text": "関数 - 接続の再利用", - "training": "https://learn.microsoft.com/azure/cost-management-billing/reservations/reservation-apis?toc=%2Fazure%2Fcost-management-billing%2Ftoc.json", - "waf": "費用" + "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": "高い", + "text": "IP アドレス空間が無駄にならないようにし、不必要に大規模な仮想ネットワーク (/16 など) を作成しないでください。", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "パフォーマンス" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", - "link": "https://learn.microsoft.com/azure/automation/update-management/overview", - "service": "Azure Functions", - "text": "関数 - データをローカルにキャッシュする", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", - "waf": "費用" + "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": "高い", + "text": "運用サイトとディザスター リカバリー サイトで重複する IP アドレス範囲を使用しないでください。", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "確実" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", - "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", - "service": "Azure Functions", - "text": "関数 - コールド スタート - 「パッケージから実行」機能を使用します。このようにして、コードは単一のzipファイルとしてダウンロードされます。これにより、たとえば、多くのノードモジュールを持つJavascript関数が大幅に改善される可能性があります。言語固有のツールを使用してパッケージサイズを縮小します (ツリーを揺るがす Javascript アプリケーションなど)。", - "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", - "waf": "費用" + "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": "中程度", + "text": "Azure での名前解決が必要な環境では、Azure プライベート DNS を使用して解決し、名前解決に委任されたゾーン ('azure.contoso.com' など) を使用します。", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "Azure Functions", - "text": "関数 - 関数を暖かく保つ", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "費用" + "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": "中程度", + "text": "Azure とオンプレミス間での名前解決が必要で、Active Directory のような既存のエンタープライズ DNS サービスがない環境の場合は、Azure DNS Private Resolver を使用して DNS 要求を Azure またはオンプレミスの DNS サーバーにルーティングします。", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-dns-private-resolver/", + "waf": "安全" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "Azure Functions", - "text": "さまざまな関数で自動スケーリングを使用する場合、すべてのリソースのすべての自動スケーリングを駆動する 1 つが存在する可能性があるため、別の従量課金プランに移行することを検討してください (また、CPU のより高いプランを検討してください)", - "waf": "費用" + "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": "低い", + "text": "独自の DNS が必要でデプロイする特別なワークロード (Red Hat OpenShift など) は、優先する DNS ソリューションを使用する必要があります。", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", - "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", - "service": "Azure Functions", - "text": "特定のプランの関数アプリはすべて一緒にスケーリングされるため、スケーリングに関する問題はプラン内のすべてのアプリに影響を与える可能性があります。", - "waf": "費用" + "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": "高い", + "text": "Azure DNS の自動登録を有効にすると、仮想ネットワーク内にデプロイされた仮想マシンの DNS レコードのライフサイクルが自動的に管理されます。", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", - "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", - "service": "Azure Functions", - "text": "「待機時間」に対して請求されますか?この質問は、通常、非同期操作を実行して結果を待機する C# 関数のコンテキストで尋ねられます (例: await Task.Delay(1000) や await client)。GetAsync('http://google.com') です。答えはイエスです-GB秒の計算は、関数の開始時刻と終了時刻、およびその期間のメモリ使用量に基づいています。その間に CPU アクティビティに関して実際に何が起こるかは、計算には考慮されません。この規則の 1 つの例外は、永続関数を使用している場合です。オーケストレーター関数で待機に費やされた時間に対しては課金されません。可能な場合は、デマンド シェーピング技術を適用します (開発環境?) https://github.com/Azure-Samples/functions-csharp-premium-scaler", - "waf": "費用" + "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": "中程度", + "text": "Azure Bastion を使用して、ネットワークに安全に接続します。", + "waf": "安全" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Cost Optimization Checklist", - "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "Front Door", - "text": "Frontdoor - 既定のホームページをオフにするアプリのアプリケーション設定で、AzureWebJobsDisableHomepage を true に設定します。これにより、PoPに204(No Content)が返されるため、ヘッダーデータのみが返されます。", - "waf": "費用" + "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": "中程度", + "text": "Azure Bastion は、/26 以上のサブネットで使用します。", + "waf": "安全" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Cost Optimization 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", - "text": "Frontdoor - 何も返さないものへのルーティング。関数、関数プロキシを設定するか、200 (OK) を返し、コンテンツを送信しない、または最小限のコンテンツを送信 するルートを Web アプリに追加します。これの利点は、呼び出されたときにログアウトできることです。", - "waf": "費用" + "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": "中程度", + "text": "Azure Front Door と WAF ポリシーを使用して、ランディング ゾーンへの受信 HTTP/S 接続に対して Azure リージョン間でグローバルな保護を提供します。", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", - "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", - "service": "Storage", - "text": "使用頻度の低いデータの階層のアーカイブを検討する", - "waf": "費用" + "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": "低い", + "text": "Azure Front Door と Azure Application Gateway を使用して HTTP/S アプリを保護する場合は、Azure Front Door の WAF ポリシーを使用します。Azure Application Gateway をロックダウンして、Azure Front Door からのトラフィックのみを受信するようにします。", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "安全" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", - "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", - "service": "VM", - "text": "サイズが階層と一致しない場合は、ディスク サイズを確認します (つまり、513 GiB のディスクは P30 (1TiB) を支払います) と、サイズ変更を検討してください", - "waf": "費用" + "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": "高い", + "text": "受信 HTTP/S 接続に WAF やその他のリバース プロキシが必要な場合は、ランディング ゾーン仮想ネットワーク内にデプロイし、保護してインターネットに公開するアプリと共にデプロイします。", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", - "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", - "service": "Storage", - "text": "可能な場合は、Premium や Ultra ではなく Standard SSD の使用を検討してください", - "waf": "費用" + "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": "高い", + "text": "Azure DDoS ネットワークまたは IP Protection プランを使用して、仮想ネットワーク内のパブリック IP アドレス エンドポイントを保護します。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization 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", - "text": "ストレージ アカウントの場合は、選択したレベルによってトランザクション料金が加算されていないことを確認します (次のレベルに移動する方が安くなる可能性があります)", - "waf": "費用" + "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": "高い", + "text": "ネットワークの送信トラフィックの構成と戦略を管理する方法を、今後の破壊的変更の前に計画します。2025 年 9 月 30 日に、新しいデプロイの既定の送信アクセスは廃止され、明示的なアクセス構成のみが許可されます。", + "waf": "確実" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization Checklist", - "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", - "service": "Site Recovery", - "text": "ASR の場合、RPO/RTO とレプリケーション スループットで許可されている場合は、Standard SSD ディスクの使用を検討してください", - "waf": "費用" + "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": "高い", + "text": "診断設定を追加して、保護されたすべてのパブリック IP アドレス (DDoS IP またはネットワーク保護) の DDoS 関連のログを保存します。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "安全" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", - "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", - "service": "Storage", - "text": "ストレージ アカウント: 必要なホット層や GRS を確認する", + "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": "高い", + "text": "Virtual Machines に直接関連付けられているパブリック IP アドレスを拒否するポリシーの割り当てがあることを確認します。 特定の VM でパブリック IP が必要な場合は、除外を使用します。", + "waf": "安全" + }, + { + "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": "中程度", + "text": "ExpressRoute を Azure へのプライマリ接続として使用します。 バックアップ接続のソースとして VPN を使用します。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "パフォーマンス" + }, + { + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "description": "AS パスの先頭と接続の重みを使用して Azure からオンプレミスへのトラフィックに影響を与えたり、独自のルーターの BGP 属性の全範囲を使用してオンプレミスから Azure へのトラフィックに影響を与えたりできます。", + "guid": "f29812b2-363c-4efe-879b-599de0d5973c", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-routing", + "service": "ExpressRoute", + "severity": "中程度", + "text": "複数の ExpressRoute 回線または複数のオンプレミスの場所を使用する場合は、BGP 属性を使用してルーティングを最適化します。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "確実" + }, + { + "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": "中程度", + "text": "ExpressRoute/VPN ゲートウェイの適切な SKU は、帯域幅とパフォーマンスの要件に基づいて選択してください。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "パフォーマンス" + }, + { + "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": "高い", + "text": "無制限のデータ ExpressRoute 回線を使用しているのは、そのコストを正当化する帯域幅に達した場合にのみしてください。", + "waf": "費用" + }, + { + "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": "高い", + "text": "ExpressRoute のローカル SKU を活用して、回線のコストを削減します (回線ピアリングの場所がローカル SKU の Azure リージョンをサポートしている場合)。", + "waf": "費用" + }, + { + "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": "中程度", + "text": "ゾーン冗長 ExpressRoute ゲートウェイをサポートされている Azure リージョンにデプロイします。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "確実" + }, + { + "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": "中程度", + "text": "10 Gbps を超える帯域幅または専用の 10/100 Gbps ポートが必要なシナリオでは、ExpressRoute Direct を使用します。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "パフォーマンス" + }, + { + "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": "中程度", + "text": "待機時間を短くする必要がある場合、またはオンプレミスから Azure へのスループットを 10 Gbps より大きくする必要がある場合は、FastPath を有効にして、データ パスから ExpressRoute ゲートウェイをバイパスします。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "パフォーマンス" + }, + { + "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": "中程度", + "text": "ゾーン冗長 VPN ゲートウェイを使用して、ブランチまたはリモートの場所を Azure (使用可能な場合) に接続します。", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", + "waf": "確実" + }, + { + "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": "中程度", + "text": "オンプレミスで冗長な VPN アプライアンス (アクティブ/アクティブまたはアクティブ/パッシブ) を使用します。", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", + "waf": "確実" + }, + { + "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": "高い", + "text": "ExpressRoute Direct を使用する場合は、コストを節約するために、ローカル Azure リージョンへの ExpressRoute ローカル回線を使用することを検討してください。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "費用" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", - "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", - "service": "VM", - "text": "ディスク - あらゆる場所で Premium SSD ディスクの使用を検証: たとえば、非運用環境を Standard SSD またはオンデマンド Premium SSD にスワップできます", - "waf": "費用" + "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": "中程度", + "text": "運用環境と非運用環境を分離する場合など、トラフィックの分離または専用の帯域幅が必要な場合は、異なる ExpressRoute 回線を使用します。これにより、ルーティングドメインを分離し、ノイズの多い隣人のリスクを軽減できます。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "安全" + }, + { + "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": "中程度", + "text": "ExpressRoute の可用性と使用率は、組み込みの Express Route Insights を使用して監視します。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "オペレーションズ" + }, + { + "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": "中程度", + "text": "接続モニターは、ネットワーク全体 (特にオンプレミスと Azure の間) の接続監視に使用します。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "オペレーションズ" + }, + { + "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": "中程度", + "text": "冗長性を確保するために、さまざまなピアリングの場所から ExpressRoute 回線を使用します。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "確実" + }, + { + "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": "中程度", + "text": "ExpressRoute 回線を 1 つだけ使用する場合は、ExpressRoute のフェールオーバーとしてサイト間 VPN を使用します。", + "waf": "確実" + }, + { + "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": "高い", + "text": "GatewaySubnet でルート テーブルを使用している場合は、ゲートウェイ ルートが伝達されていることを確認してください。", + "waf": "確実" + }, + { + "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": "高い", + "text": "ExpressRoute を使用する場合、オンプレミスのルーティングは動的である必要があり、接続エラーが発生した場合は、回線の残りの接続に収束する必要があります。負荷は、アクティブ/アクティブとして両方の接続で共有するのが理想的ですが、アクティブ/パッシブもサポートされています。", + "waf": "確実" + }, + { + "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": "中程度", + "text": "ExpressRoute 回線の 2 つの物理リンクが、ネットワーク内の 2 つの異なるエッジ デバイスに接続されていることを確認します。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "確実" + }, + { + "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": "中程度", + "text": "BFD(Bidirectional Forwarding Detection)が顧客またはプロバイダのエッジルーティングデバイスで有効で設定されていることを確認します。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "確実" + }, + { + "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": "高い", + "text": "ExpressRoute ゲートウェイを異なるピアリングの場所から 2 つ以上の回線に接続すると、回復性が向上します。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "確実" + }, + { + "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": "中程度", + "text": "ExpressRoute 仮想ネットワーク ゲートウェイの診断ログとアラートを構成します。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "オペレーションズ" + }, + { + "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": "中程度", + "text": "VNet 間通信に ExpressRoute 回線を使用しないでください。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "パフォーマンス" + }, + { + "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": "低い", + "text": "検査のために Azure トラフィックをハイブリッドの場所に送信しないでください。 代わりに、Azure のリソース間の通信が Microsoft バックボーン ネットワーク経由で行われるように、\"Azure のトラフィックは Azure にとどまる\" という原則に従います。", + "waf": "パフォーマンス" + }, + { + "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": "高い", + "text": "Azure Firewall を使用して、インターネットへの Azure 送信トラフィック、HTTP/S 以外の受信接続、East/West トラフィック フィルタリング (組織で必要な場合) を管理します。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "安全" + }, + { + "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": "中程度", + "text": "グローバル ネットワーク環境全体のセキュリティ体制を管理するためのグローバル Azure Firewall ポリシーを作成し、それをすべての Azure Firewall インスタンスに割り当てます。Azure のロールベースのアクセス制御を介して、増分ファイアウォール ポリシーをローカル セキュリティ チームに委任することで、特定のリージョンの要件を満たすためのきめ細かなポリシーを可能にします。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "安全" + }, + { + "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": "低い", + "text": "サポートされているパートナー SaaS セキュリティプロバイダーを Firewall Manager 内で構成します。これは、組織がアウトバウンド接続を保護するためにそのようなソリューションを使用する場合です。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "安全" + }, + { + "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": "高い", + "text": "アプリケーション・ルールを使用して、サポートされているプロトコルの宛先ホスト名でアウトバウンド・トラフィックをフィルタリングします。 FQDN ベースのネットワーク規則と Azure Firewall と DNS プロキシを使用して、他のプロトコル経由でインターネットへのエグレス トラフィックをフィルター処理します。", + "waf": "安全" + }, + { + "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": "高い", + "text": "Azure Firewall Premium を使用して、追加のセキュリティ機能を有効にします。", + "waf": "安全" + }, + { + "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": "高い", + "text": "Azure Firewall の脅威インテリジェンス モードを [アラート] と [拒否] に構成して、保護を強化します。", + "waf": "安全" + }, + { + "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": "高い", + "text": "Azure Firewall の IDPS モードを [拒否] に構成して、保護を強化します。", + "waf": "安全" + }, + { + "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": "高い", + "text": "Virtual WAN に接続されていない VNet 内のサブネットの場合は、インターネット トラフィックが Azure Firewall またはネットワーク仮想アプライアンスにリダイレクトされるようにルート テーブルをアタッチします。", + "waf": "安全" + }, + { + "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": "中程度", + "text": "診断設定を追加して、リソース固有の宛先テーブルを使用して、すべての Azure Firewall デプロイのログを保存します。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "オペレーションズ" + }, + { + "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": "大事な", + "text": "Azure Firewall クラシック ルール (存在する場合) からファイアウォール ポリシーに移行します。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "オペレーションズ" + }, + { + "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": "高い", + "text": "Azure Firewall サブネットに /26 プレフィックスを使用します。", + "waf": "安全" + }, + { + "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": "中程度", + "text": "ファイアウォールポリシー内のルールを、使用頻度に基づいて「ルールコレクショングループ」と「ルールコレクション」に整理します。", + "waf": "パフォーマンス" + }, + { + "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": "中程度", + "text": "IP グループまたは IP プレフィックスを使用して、IP テーブル・ルールの数を減らします。", + "waf": "パフォーマンス" + }, + { + "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": "中程度", + "text": "DNATSのソースIPとしてワイルドカード(*やanyなど)を使用せず、受信DNATのソースIPを指定する必要があります。", + "waf": "パフォーマンス" + }, + { + "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": "中程度", + "text": "SNAT ポートの使用状況を監視し、NAT ゲートウェイの設定を評価し、シームレスなフェールオーバーを確保することで、SNAT ポートの枯渇を防ぎます。ポート数が制限に近づく場合は、SNAT の枯渇が差し迫っている可能性があります。", + "waf": "パフォーマンス" + }, + { + "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": "高い", + "text": "Azure Firewall Premium を使用している場合は、TLS 検査を有効にします。", + "waf": "パフォーマンス" + }, + { + "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": "低い", + "text": "Web カテゴリを使用して、特定のトピックへの送信アクセスを許可または拒否します。", + "waf": "パフォーマンス" + }, + { + "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": "中程度", + "text": "TLS 検査の一環として、Azure App Gateway からのトラフィックの受信を検査用に計画します。", + "waf": "パフォーマンス" + }, + { + "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": "中程度", + "text": "Azure Firewall DNS プロキシ構成を有効にします。", + "waf": "安全" + }, + { + "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": "高い", + "text": "Azure Firewall を Azure Monitor と統合し、診断ログを有効にしてファイアウォール ログを格納および分析します。", + "waf": "オペレーションズ" + }, + { + "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": "低い", + "text": "ファイアウォールルールのバックアップを実装する", + "waf": "オペレーションズ" + }, + { + "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": "高い", + "text": "0.0.0.0/0 ルートやコントロール プレーン トラフィックをブロックする NSG ルールなど、仮想ネットワークに挿入された Azure PaaS サービスのコントロール プレーン通信を中断しないでください。", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "安全" + }, + { + "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": "中程度", + "text": "オンプレミスからプライベート エンドポイントと ExpressRoute プライベート ピアリングを介して Azure PaaS サービスにアクセスします。この方法では、公共のインターネット経由のトランジットを回避できます。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "安全" + }, + { + "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": "高い", + "text": "既定では、すべてのサブネットで仮想ネットワーク サービス エンドポイントを有効にしないでください。", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "安全" + }, + { + "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": "中程度", + "text": "Azure Firewall または NVA の IP アドレスではなく FQDN を使用して Azure PaaS サービスへのエグレス トラフィックをフィルター処理し、データの流出を防ぎます。Private Link を使用している場合は、すべての FQDN をブロックでき、それ以外の場合は必要な PaaS サービスのみを許可できます。", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "安全" + }, + { + "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": "高い", + "text": "Gateway サブネットには、少なくとも /27 プレフィックスを使用します。", + "waf": "安全" + }, + { + "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": "高い", + "text": "VirtualNetwork サービス タグを使用して接続を制限する NSG 受信既定の規則に依存しないでください。", + "waf": "安全" + }, + { + "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": "中程度", + "text": "NSG を使用して、サブネット間のトラフィックと、プラットフォーム全体の East/West トラフィック (ランディング ゾーン間のトラフィック) を保護します。", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "安全" + }, + { + "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": "中程度", + "text": "NSG とアプリケーション セキュリティ グループを使用して、ランディング ゾーン内のトラフィックをマイクロセグメント化し、中央の NVA を使用してトラフィック フローをフィルター処理しないようにします。", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "安全" + }, + { + "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": "中程度", + "text": "VNet フロー ログを有効にし、Traffic Analytics にフィードして、内部および外部のトラフィック フローに関する分析情報を取得します。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "waf": "安全" + }, + { + "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": "中程度", + "text": "1000 ルールの制限があるため、NSG ごとに 900 を超える NSG ルールを実装しないでください。", + "training": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "waf": "確実" + }, + { + "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": "中程度", + "text": "Virtual WAN ルーティング設計の一覧にシナリオが明示的に説明されている場合は、Virtual WAN を使用します。", + "training": "https://learn.microsoft.com/learn/modules/introduction-azure-virtual-wan/", + "waf": "オペレーションズ" + }, + { + "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": "中程度", + "text": "Azure リージョンごとに Virtual WAN ハブを使用して、共通のグローバル Azure Virtual WAN を介して Azure リージョン間で複数のランディング ゾーンを接続します。", + "waf": "パフォーマンス" + }, + { + "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": "中程度", + "text": "送信インターネット トラフィックの保護とフィルタリングを行うには、セキュリティで保護されたハブに Azure Firewall をデプロイします。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "安全" + }, + { + "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": "中程度", + "text": "Virtual WAN ネットワーク アーキテクチャが、特定されたアーキテクチャ シナリオと一致していることを確認します。", + "waf": "確実" + }, + { + "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": "中程度", + "text": "Azure Monitor Insights for Virtual WAN を使用して、Virtual WAN のエンドツーエンド トポロジ、状態、および主要なメトリックを監視します。", + "waf": "オペレーションズ" + }, + { + "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": "中程度", + "text": "Virtual WAN のブランチ間トラフィックは、これらのフローを明示的にブロックする必要がない限り、無効にしないでください。", + "waf": "確実" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", - "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", - "service": "Synapse", - "text": "予算を作成してコストを管理し、支出の異常や過剰支出のリスクを関係者に自動的に通知するアラートを作成します。", - "waf": "費用" + "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": "中程度", + "text": "AS-Path は ExpressRoute や VPN よりも柔軟性が高いため、ハブ ルーティング設定として使用します。", + "waf": "確実" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "Synapse", - "text": "追加のデータ分析のために、コスト データをストレージ アカウントにエクスポートします。", - "waf": "費用" + "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": "中程度", + "text": "Virtual WAN でラベルベースの伝達を構成すると、仮想ハブ間の接続が損なわれます。", + "waf": "確実" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "Synapse", - "text": "専用 SQL プールのコストを制御するには、リソースが使用されていないときに一時停止します。", - "waf": "費用" + "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": "高い", + "text": "仮想ハブに少なくとも /23 プレフィックスを割り当てて、十分な IP スペースが使用可能であることを確認します。", + "waf": "確実" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", - "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", - "service": "Synapse", - "text": "サーバーレス Apache Spark の自動一時停止機能を有効にし、それに応じてタイムアウト値を設定します。", - "waf": "費用" + "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": "高い", + "text": "Azure Policy を戦略的に活用し、環境のコントロールを定義し、ポリシー イニシアチブを使用して関連するポリシーをグループ化します。", + "waf": "安全" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization 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", - "text": "さまざまなサイズの複数の Apache Spark プール定義を作成します。", - "waf": "費用" + "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": "中程度", + "text": "規制とコンプライアンスの要件を Azure Policy 定義と Azure ロールの割り当てにマップします。", + "waf": "安全" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization 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", - "text": "Azure Synapse Analytics のコストを節約するために、事前購入プランで Azure Synapse コミット ユニット (SCU) を 1 年間購入します。", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "費用" + "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": "中程度", + "text": "中間ルート管理グループで Azure Policy 定義を確立して、継承されたスコープで割り当てられるようにします。", + "waf": "安全" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", - "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", - "service": "VM", - "text": "中断可能なジョブにスポット VM を使用する: これらは、割引価格で入札および購入できる VM であり、重要でないワークロードにコスト効率の高いソリューションを提供します。", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "費用" + "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": "高い", + "text": "ポリシーの割り当てを適切な最上位レベルで管理し、必要に応じて下位レベルで除外します。", + "waf": "安全" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "544451e1-92d3-4442-a3c7-628637a551c5", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "VM", - "text": "すべての VM の適切なサイズ設定", - "waf": "費用" + "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": "低い", + "text": "Azure Policy を使用して、ユーザーがサブスクリプション/管理グループ レベルでプロビジョニングできるサービスを制御します。", + "waf": "安全" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", - "service": "VM", - "text": "正規化されたサイズと最新のサイズでサイズをスワップする VM", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "費用" + "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": "高い", + "text": "可能な場合は組み込みポリシーを使用して、運用オーバーヘッドを最小限に抑えます。", + "waf": "安全" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", - "text": "VM の適切なサイズ設定 - 使用率を 5% 未満で監視することから始めて、その後 40% まで作業します", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "費用" + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "description": "Resource Policy Contributor ロールを特定のスコープに割り当てると、ポリシー管理を関連するチームに委任できます。たとえば、中央のITチームが管理グループレベルのポリシーを監督し、アプリケーションチームがサブスクリプションのポリシーを処理することで、組織の標準に準拠した分散型ガバナンスが可能になります。", + "guid": "3f988795-25d6-4268-a6d7-0ba6c97be995", + "link": "https://learn.microsoft.com/azure/governance/policy/overview#azure-rbac-permissions-in-azure-policy", + "service": "Policy", + "severity": "中程度", + "text": "特定のスコープで組み込みのリソース ポリシー共同作成者ロールを割り当てて、アプリケーション レベルのガバナンスを有効にします。", + "waf": "安全" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", - "text": "アプリケーションをコンテナー化すると、VM の密度が向上し、スケーリングにかかるコストを節約できます", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "費用" + "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": "中程度", + "text": "ルート管理グループのスコープで行われる Azure Policy の割り当ての数を制限して、継承されたスコープでの除外による管理を回避します。", + "waf": "安全" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Azure Functions", - "severity": "高い", - "text": "ビジネスとSLOの要件に基づいて適切な関数ホスティングプランを選択します", - "waf": "確実" + "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": "中程度", + "text": "データ主権の要件が存在する場合は、それらを適用するために Azure ポリシーをデプロイする必要があります。", + "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "waf": "安全" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Azure Functions", - "severity": "高い", - "text": "リージョンで適用可能な場合は Availability Zones を活用します (従量課金レベルでは使用できません)", - "waf": "確実" + "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": "中程度", + "text": "ソブリン ランディング ゾーンの場合は、ソブリン ポリシー ベースラインをデプロイし、正しい管理グループ レベルで割り当てます。", + "waf": "安全" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "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", + "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": "中程度", - "text": "重要なワークロードに対するリージョン間 DR 戦略を検討する", - "waf": "確実" + "text": "ソブリン ランディング ゾーンの場合は、ソブリン制御の目標をポリシー マッピングに文書化します。", + "waf": "安全" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "Azure Functions", - "severity": "高い", - "text": "分離環境にデプロイする場合は、App Service Environment (ASE) v3 を使用するか、それらに移行します", - "waf": "確実" + "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": "中程度", + "text": "ソブリン・ランディング・ゾーンについては、「ソブリン・コントロールの目標からポリシー・マッピングまで」の管理プロセスが実施されていることを確認してください。", + "waf": "安全" + }, + { + "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": "中程度", + "text": "Azure ロールベースのアクセス制御 (Azure RBAC)、データ主権要件、またはデータ保持ポリシーで個別のワークスペースが義務付けられている場合を除き、1 つのモニター ログ ワークスペースを使用してプラットフォームを一元的に管理します。", + "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "Azure Functions", + "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": "高い", - "text": "App Service プランで実行されているすべての関数アプリで \"Always On\" が有効になっていることを確認する", - "waf": "確実" + "text": "ログの保持要件が 12 年を超える場合は、ログを Azure Storage にエクスポートします。write-once、read-many ポリシーで不変ストレージを使用して、ユーザーが指定した間隔でデータを消去および変更できないようにします。", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "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", + "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": "中程度", - "text": "関数アプリを独自のストレージ アカウントにペアリングします。Function Apps のストレージ アカウントは、緊密に結合されていない限り、再利用しないようにしてください", - "waf": "確実" + "text": "Azure Policy を使用して、OS レベルの仮想マシン (VM) 構成のずれを監視します。ポリシーを使用して Azure Automanage マシン構成の監査機能を有効にすると、アプリケーション チームのワークロードは、わずかな労力で機能機能をすぐに使用できます。", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "オペレーションズ" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "Azure Functions", + "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": "中程度", - "text": "Azure DevOps または GitHub を活用して CI/CD を合理化し、関数アプリのコードを保護します", + "text": "Azure Update Manager は、Azure の Windows VM と Linux VM の修正プログラム適用メカニズムとして使用します。", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", "waf": "オペレーションズ" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", - "severity": "低い", - "text": "ベスト プラクティスについては、「ベースラインの高可用性ゾーン冗長 Web アプリケーション アーキテクチャ」を参照してください", - "waf": "確実" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", - "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", - "service": "App Services", + "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": "中程度", - "text": "Premium レベルと Standard レベルを使用します。これらの層では、ステージング スロットと自動バックアップがサポートされています。", - "waf": "確実" + "text": "Azure Arc を使用して、Azure の外部にある Windows および Linux VM の修正プログラム適用メカニズムとして Azure Update Manager を使用します。", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "waf": "オペレーションズ" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", - "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", - "service": "App Services", - "severity": "高い", - "text": "リージョンで適用可能な場合は Availability Zones を活用します (Premium v2 または v3 レベルが必要)", - "waf": "確実" + "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": "中程度", + "text": "Network Watcher を使用して、トラフィック フローを事前に監視します。", + "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", + "waf": "オペレーションズ" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Services", + "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": "中程度", - "text": "ヘルスチェックの実装", - "waf": "確実" + "text": "Azure Monitor ログを使用して、分析情報とレポートを作成します。", + "waf": "オペレーションズ" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", - "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", - "service": "App Services", - "severity": "高い", - "text": "「Azure App Service のバックアップと復元のベスト プラクティス」を参照してください", - "waf": "確実" + "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": "中程度", + "text": "Azure Monitor アラートを使用して、運用アラートを生成します。", + "waf": "オペレーションズ" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", - "severity": "高い", - "text": "Azure App Service の信頼性に関するベスト プラクティスを実装する", - "waf": "確実" + "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": "中程度", + "text": "Azure Automation アカウントを使用して変更とインベントリの追跡を使用する場合は、Log Analytics ワークスペースと Automation アカウントをリンクするためにサポートされているリージョンが選択されていることを確認してください。", + "waf": "オペレーションズ" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", + "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": "低い", - "text": "災害時に App Service アプリを別のリージョンに移動する方法を理解する", - "waf": "確実" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", - "service": "App Services", - "severity": "高い", - "text": "Azure App Service の信頼性サポートについて理解する", + "text": "Azure Backup を使用する場合は、既定の設定が GRS であるため、バックアップに正しいバックアップの種類 (GRS、ZRS、LRS) を使用します。", "waf": "確実" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "App Services", + "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": "中程度", - "text": "App Service プランで実行されている Function Apps に対して \"Always On\" が有効になっていることを確認する", - "waf": "確実" + "text": "Azure ゲスト ポリシーを使用して、VM 拡張機能を通じてソフトウェア構成を自動的にデプロイし、準拠したベースライン VM 構成を適用します。", + "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Services", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "description": "Azure Policy のゲスト構成機能を使用して、マシンの設定 (OS、アプリケーション、環境など) を監査および修復し、リソースが予想される構成と一致していることを確認し、Update Management では VM のパッチ管理を適用できます。", + "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": "中程度", - "text": "正常性チェックを使用した App Service インスタンスの監視", - "waf": "確実" + "text": "Azure Policy を使用して VM セキュリティ構成のドリフトを監視します。", + "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", - "service": "App Services", + "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": "中程度", - "text": "Application Insights の可用性テストを使用して Web アプリまたは Web サイトの可用性と応答性を監視する", - "waf": "確実" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "b4e3f2d5-a5c6-4d7e-8b2f-c5d9e7a8f0ea", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", - "service": "App Services", - "severity": "低い", - "text": "Application Insights Standard テストを使用して、Web アプリまたは Web サイトの可用性と応答性を監視する", - "waf": "確実" + "text": "Azure Site Recovery は、Azure から Azure Virtual Machines へのディザスター リカバリー シナリオに使用します。これにより、リージョン間でワークロードをレプリケートできます。", + "waf": "オペレーションズ" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Azure Key Vault を使用して、アプリケーションに必要なシークレットを格納します。 Key Vault は、シークレットを格納するための安全で監査された環境を提供し、Key Vault SDK または App Service Key Vault リファレンスを通じて App Service と適切に統合されています。", - "guid": "834ac932-223e-4ce8-8b12-3071a5416415", - "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", - "service": "App Services", - "severity": "高い", - "text": "Key Vault を使用してシークレットを格納する", - "waf": "安全" + "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": "中程度", + "text": "Azure ネイティブのバックアップ機能、または Azure と互換性のあるサード パーティのバックアップ ソリューションを使用します。", + "waf": "オペレーションズ" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "マネージド ID を使用して、Key Vault SDK または App Service Key Vault 参照を使用して Key Vault に接続します。", - "guid": "833ea3ad-2c2d-4e73-8165-c3acbef4abe1", - "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", - "service": "App Services", + "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": "高い", - "text": "マネージド ID を使用して Key Vault に接続する", - "waf": "安全" + "text": "診断設定を追加して、Azure Front Door や Azure Application Gateway などのアプリケーション配信サービスから WAF ログを保存します。ログを定期的に確認して、攻撃や誤検知の検出がないか確認します。", + "waf": "オペレーションズ" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "App Service TLS 証明書を Key Vault に格納します。", - "guid": "f8d39fda-4776-4831-9c11-5775c2ea55b4", - "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-certificate", - "service": "App Services", + "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": "中程度", + "text": "Azure Front Door や Azure Application Gateway などのアプリケーション配信サービスから WAF ログを Microsoft Sentinel に送信します。攻撃を検出し、WAF テレメトリを Azure 環境全体に統合します。", + "waf": "オペレーションズ" + }, + { + "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": "高い", - "text": "Key Vault を使用して TLS 証明書を格納します。", + "text": "Azure Key Vault を使用して、シークレットと資格情報を格納します。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "機密情報を処理するシステムは分離する必要があります。 そのためには、個別の App Service プランまたは App Service Environment を使用し、異なるサブスクリプションまたは管理グループの使用を検討してください。", - "guid": "6ad48408-ee72-4734-a475-ba18fdbf590c", - "link": "https://learn.microsoft.com/azure/app-service/overview-hosting-plans", - "service": "App Services", + "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": "中程度", - "text": "機密情報を処理するシステムを分離する", + "text": "アプリケーションやリージョンごとに異なる Azure Key Vault を使用して、トランザクションのスケール制限を回避し、シークレットへのアクセスを制限します。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "App Service のローカル ディスクは暗号化されていないため、機密データを格納しないでください。 (例: 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", + "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": "中程度", - "text": "機密データをローカルディスクに保存しない", + "text": "論理的な削除ポリシーと消去ポリシーを有効にして Azure Key Vault をプロビジョニングし、削除されたオブジェクトの保持保護を許可します。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "認証された Web アプリケーションの場合は、Azure AD や Azure AD B2C などの確立された ID プロバイダーを使用します。 選択したアプリケーション フレームワークを利用して、このプロバイダーと統合するか、App Service の認証/承認機能を使用します。", - "guid": "919ca0b2-c121-459e-814b-933df574eccc", - "link": "https://learn.microsoft.com/azure/app-service/overview-authentication-authorization", - "service": "App Services", + "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": "中程度", - "text": "認証に確立された ID プロバイダーを使用する", + "text": "最小特権モデルに従って、キー、シークレット、証明書を完全に削除する承認を、特殊なカスタム Microsoft Entra ID ロールに制限します。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "適切に管理され、セキュリティで保護された DevOps デプロイ パイプラインなど、制御された信頼できる環境から App Service にコードをデプロイします。これにより、バージョン管理されておらず、悪意のあるホストからデプロイされることが確認されていないコードが回避されます。", - "guid": "3f9bcbd4-6826-46ab-aa26-4f9a19aed9c5", - "link": "https://learn.microsoft.com/azure/app-service/deploy-best-practices", - "service": "App Services", - "severity": "高い", - "text": "信頼できる環境からのデプロイ", + "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": "中程度", + "text": "公開認証局を使用して証明書の管理と更新プロセスを自動化し、管理を容易にします。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "FTP/FTPS と WebDeploy/SCM の両方の基本認証を無効にします。 これにより、これらのサービスへのアクセスが無効になり、デプロイに Azure AD で保護されたエンドポイントの使用が強制されます。 SCM サイトは、Azure AD 資格情報を使用して開くこともできます。", - "guid": "5d04c2c3-919c-4a0b-8c12-159e114b933d", - "link": "https://learn.microsoft.com/azure/app-service/deploy-configure-credentials#disable-basic-authentication", - "service": "App Services", - "severity": "高い", - "text": "基本認証の無効化", + "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": "中程度", + "text": "キーと証明書のローテーションのための自動化されたプロセスを確立します。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "可能な場合は、マネージド ID を使用して Azure AD のセキュリティで保護されたリソースに接続します。 これが不可能な場合は、Key Vault にシークレットを格納し、代わりにマネージド ID を使用して Key Vault に接続します。", - "guid": "f574eccc-d9bd-43ba-bcda-3b54eb2eb03d", - "link": "https://learn.microsoft.com/azure/app-service/overview-managed-identity?tabs=portal%2Chttp", - "service": "App Services", - "severity": "高い", - "text": "マネージド ID を使用してリソースに接続する", + "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": "中程度", + "text": "コンテナーでファイアウォールと仮想ネットワーク サービス エンドポイントまたはプライベート エンドポイントを有効にして、キー コンテナーへのアクセスを制御します。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Azure Container Registry に格納されているイメージを使用する場合は、マネージド ID を使用してこれらをプルします。", - "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", - "severity": "高い", - "text": "マネージド ID を使用してコンテナーをプルするPull containers using a Managed Identity", + "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": "中程度", + "text": "プラットフォーム中央の Azure Monitor Log Analytics ワークスペースを使用して、Key Vault の各インスタンス内のキー、証明書、シークレットの使用状況を監査します。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "App Service の診断設定を構成することで、ログ記録と監視の中央の宛先として、すべてのテレメトリを Log Analytics に送信できます。これにより、HTTP ログ、アプリケーション ログ、プラットフォーム ログなどの App Service のランタイム アクティビティを監視できます。", - "guid": "47768314-c115-4775-a2ea-55b46ad48408", - "link": "https://learn.microsoft.com/azure/app-service/troubleshoot-diagnostic-logs", - "service": "App Services", + "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": "中程度", - "text": "App Service ランタイム ログを Log Analytics に送信する", + "text": "Key Vault のインスタンス化と特権アクセスを委任し、Azure Policy を使用して一貫した準拠構成を適用します。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "ログ記録と監視の中央の宛先としてアクティビティ ログを Log Analytics に送信するための診断設定を設定します。これにより、App Service リソース自体のコントロール プレーンのアクティビティを監視できます。", - "guid": "ee72734b-475b-4a18-bdbf-590ce65de8e0", - "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", - "service": "App Services", + "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": "中程度", - "text": "App Service アクティビティ ログを Log Analytics に送信する", + "text": "Azure Key Vault は、アプリケーションごと、環境ごと、リージョンごとに使用します。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "リージョンの VNet 統合、ネットワーク セキュリティ グループ、および UDR の組み合わせを使用して、送信ネットワーク アクセスを制御します。 トラフィックは、Azure Firewall などの NVA にルーティングする必要があります。 ファイアウォールのログを必ず監視してください。", - "guid": "c12159e1-14b9-433d-b574-ecccd9bd3baf", - "link": "https://learn.microsoft.com/azure/app-service/overview-vnet-integration", - "service": "App Services", + "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": "中程度", - "text": "送信ネットワーク アクセスを制御する必要がある", + "text": "独自のキーを持ち込む場合、これは考慮されるすべてのサービスでサポートされているとは限りません。不整合が望ましい結果を妨げないように、適切な軽減策を実装します。レイテンシを最小限に抑える適切なリージョンペアとディザスタリカバリリージョンを選択します。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "VNet 統合を使用し、VNet NAT ゲートウェイまたは Azure Firewall などの NVA を使用することで、安定した送信 IP を提供できます。 これにより、受信側は必要に応じて IP に基づいて許可リストに登録できます。 多くの場合、Azure サービスへの通信では、IP アドレスに依存する必要はなく、代わりにサービス エンドポイントなどのメカニズムを使用する必要があります。 (また、受信側でプライベート エンドポイントを使用すると、SNAT の発生が回避され、安定した送信 IP 範囲が提供されます)。", - "guid": "cda3b54e-b2eb-403d-b9a2-582718d2ddb1", - "link": "https://learn.microsoft.com/azure/app-service/networking/nat-gateway-integration", - "service": "App Services", - "severity": "低い", - "text": "インターネットアドレスへの送信通信のIPを安定させる", + "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": "中程度", + "text": "ソブリン ランディング ゾーンの場合は、Azure Key Vault マネージド HSM を使用してシークレットと資格情報を格納します。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "App Service のアクセス制限、サービス エンドポイント、またはプライベート エンドポイントの組み合わせを使用して、受信ネットワーク アクセスを制御します。Web アプリ自体と SCM サイトに対して異なるアクセス制限を要求し、構成できます。", - "guid": "0725769e-e669-41a4-a34a-c932223ece80", - "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", - "service": "App Services", - "severity": "高い", - "text": "受信ネットワーク アクセスを制御する必要がある", + "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": "中程度", + "text": "Microsoft Entra ID レポート機能を使用して、アクセス制御監査レポートを生成します。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Application Gateway や Azure Front Door などの Web アプリケーション ファイアウォールを使用して、悪意のある受信トラフィックから保護します。 WAFのログを必ず監視してください。", - "guid": "b123071a-5416-4415-a33e-a3ad2c2de732", - "link": "https://learn.microsoft.com/azure/app-service/networking/app-gateway-with-service-endpoints", - "service": "App Services", + "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": "高い", - "text": "App Service の前で WAF を使用するUse a WAF in Front of App Service", + "text": "すべてのサブスクリプションで Defender Cloud セキュリティ態勢管理を有効にします。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "WAFのみへのアクセスをロックダウンすることで、WAFをバイパスできないようにします。 アクセス制限、サービス・エンドポイントおよびプライベート・エンドポイントを組み合わせて使用します。", - "guid": "165c3acb-ef4a-4be1-b8d3-9fda47768314", - "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", - "service": "App Services", + "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": "高い", - "text": "WAFをバイパスすることは避けてください", - "waf": "安全" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "App Service の構成で最小 TLS ポリシーを 1.2 に設定します。", - "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", - "severity": "中程度", - "text": "最小 TLS ポリシーを 1.2 に設定します。", + "text": "すべてのサブスクリプションで、サーバーの Defender Cloud ワークロード保護プランを有効にします。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "HTTPS のみを使用するように App Service を構成します。 これにより、App Service は HTTP から HTTPS にリダイレクトされます。 HTTP Strict Transport Security (HSTS) をコード内または WAF から使用して、サイトに 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", + "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": "高い", - "text": "HTTPS のみを使用", + "text": "すべてのサブスクリプションで Azure リソースの Defender Cloud ワークロード保護プランを有効にします。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "CORS 構成では、すべての配信元がサービスにアクセスできるため、ワイルドカードを使用しないでください (これにより、CORS の目的が損なわれます)。具体的には、サービスにアクセスできると予想される配信元のみを許可します。", - "guid": "68266abc-a264-4f9a-89ae-d9c55d04c2c3", - "link": "https://learn.microsoft.com/azure/app-service/app-service-web-tutorial-rest-api", - "service": "App Services", + "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": "高い", - "text": "ワイルドカードは CORS に使用しないでください", + "text": "IaaS サーバーでエンドポイント保護を有効にします。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "リモート デバッグは、サービスに追加のポートが開き、攻撃対象領域が増加するため、運用環境でオンにしないでください。このサービスは、48 時間後に自動的にリモート デバッグをオフにすることに注意してください。", - "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", - "severity": "高い", - "text": "リモートデバッグをオフにする", + "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": "中程度", + "text": "Azure Monitor ログと Defender for Cloud を使用して、基本オペレーティング システムの修正プログラムのずれを監視します。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Defender for App Service を有効にします。 これは(他の脅威の中でも)既知の悪意のあるIPアドレスへの通信を検出します。 操作の一環として、Defender for App Service からの推奨事項を確認します。", - "guid": "18d2ddb1-0725-4769-be66-91a4834ac932", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-app-service-introduction", - "service": "App Services", + "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": "中程度", - "text": "Defender for Cloud を有効にする - Defender for App Service", + "text": "既定のリソース構成を一元化された Azure Monitor Log Analytics ワークスペースに接続します。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Azure は、ネットワーク上で DDoS Basic 保護を提供しており、通常のトラフィック パターンを学習し、異常な動作を検出できるインテリジェントな DDoS Standard 機能によって改善できます。DDoS Standard は仮想ネットワークに適用されるため、Application Gateway や NVA など、アプリの前にあるネットワーク リソース用に構成する必要があります。", - "guid": "223ece80-b123-4071-a541-6415833ea3ad", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "App Services", + "checklist": "Azure Landing Zone Review", + "guid": "1761e147-f65e-4d09-bbc2-f464f23e2eba", + "link": "https://learn.microsoft.com/industry/sovereignty/transparency-logs", + "service": "Entra", "severity": "中程度", - "text": "WAF VNet で DDoS Protection Standard を有効にするEnable DDOS Protection Standard on the WAF VNet", + "text": "ソブリン ランディング ゾーンの場合は、Entra ID テナントで透明度ログを有効にします。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Azure Container Registry に格納されているイメージを使用する場合は、プライベート エンドポイントとアプリ設定 \"WEBSITE_PULL_IMAGE_OVER_VNET\" を使用して、Azure Container Registry から仮想ネットワーク経由でイメージをプルします。", - "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", + "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": "中程度", - "text": "Virtual Network 経由でコンテナーをプルする", + "text": "Sovereign Landing Zone の場合は、Entra ID テナントでカスタマー ロックボックスを有効にします。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "ペネトレーションテストのルールに従って、Webアプリケーションでペネトレーションテストを実施します。", - "guid": "eb2eb03d-d9a2-4582-918d-2ddb10725769", - "link": "https://learn.microsoft.com/azure/security/fundamentals/pen-testing", - "service": "App Services", - "severity": "中程度", - "text": "ペネトレーションテストの実施", + "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": "高い", + "text": "ストレージ アカウントへの安全な転送を有効にします。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "DevSecOps プラクティスに従って脆弱性が検証およびスキャンされた信頼できるコードをデプロイします。", - "guid": "19aed9c5-5d04-4c2c-9919-ca0b2c12159e", - "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/devsecops-in-azure", - "service": "App Services", - "severity": "中程度", - "text": "検証済みコードのデプロイ", + "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": "高い", + "text": "ストレージ アカウントのコンテナーの論理的な削除を有効にして、削除されたコンテナーとその内容を回復します。", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "サポートされているプラットフォーム、プログラミング言語、プロトコル、およびフレームワークの最新バージョンを使用します。", - "guid": "114b933d-f574-4ecc-ad9b-d3bafcda3b54", - "link": "https://learn.microsoft.com/azure/app-service/overview-patch-os-runtime", - "service": "App Services", + "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": "高い", - "text": "最新のプラットフォーム、言語、プロトコル、フレームワークを使用", - "waf": "安全" + "text": "Key Vault シークレットを使用して、資格情報 (仮想マシン、ユーザー パスワード)、証明書、キーなどの機密情報のハードコーディングを回避します。", + "waf": "オペレーションズ" }, { "arm-service": "Microsoft.Web/sites", @@ -7716,178 +8078,6 @@ "text": "Azure DevOps または GitHub を活用して CI/CD を合理化し、ロジック アプリ コードを保護", "waf": "オペレーションズ" }, - { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", - "service": "Bot service", - "severity": "中程度", - "text": "Azure Bot Service の信頼性サポートの推奨事項に従う", - "waf": "確実" - }, - { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", - "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", - "service": "Bot service", - "severity": "中程度", - "text": "ローカル データ所在地とリージョン コンプライアンスを備えたボットのデプロイ", - "waf": "確実" - }, - { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "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", - "severity": "中程度", - "text": "Azure Bot Service は、グローバル サービスとリージョン サービスの両方に対してアクティブ/アクティブ モードで実行されます。停止が発生した場合、エラーを検出したり、サービスを管理したりする必要はありません。Azure Bot Service は、複数リージョンの地理的アーキテクチャで自動フェールオーバーと自動復旧を自動的に実行します。EU ボット リージョン サービスの場合、Azure Bot Service は、冗長性を確保するために、アクティブ/アクティブ レプリケーションを備えたヨーロッパ内の 2 つの完全なリージョンを提供します。グローバル ボット サービスの場合、使用可能なすべてのリージョン/地域をグローバル フットプリントとして提供できます。", - "waf": "確実" - }, - { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "ab91932c-9fc9-4d1b-a881-37f5e6c0cb9e", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ADF_v1.docx", - "service": "Azure Data Factory", - "severity": "中程度", - "text": "Azure Data Factory の FTA 回復性プレイブックの活用", - "waf": "確実" - }, - { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "e503547c-d447-4e82-9138-a7200f1cac6d", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", - "severity": "高い", - "text": "Availability Zones をサポートするリージョンでゾーン冗長パイプラインを使用するUse zone redundant pipelines in regions that support Availability Zones", - "waf": "確実" - }, - { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "9ef1d6e8-32e5-42e3-911c-818b1a0bc511", - "link": "https://learn.microsoft.com/azure/data-factory/source-control", - "service": "Azure Data Factory", - "severity": "中程度", - "text": "DevOps を使用して Github と Azure DevOps の統合で ARM テンプレートをバックアップする", - "waf": "確実" - }, - { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "e43a18a9-cd29-49cf-b7b1-7db8255562f2", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", - "severity": "中程度", - "text": "セルフホステッド統合ランタイム VM を別のリージョンにレプリケートしてください", - "waf": "確実" - }, - { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "aee4563a-fd83-4393-98b2-62d6dc5f512a", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", - "severity": "中程度", - "text": "必ず、姉妹リージョンでネットワークをレプリケートまたは複製してください。別のリージョンに VNet のコピーを作成する必要があります", - "waf": "確実" - }, - { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "description": "ADF パイプラインで Key Vault が使用されている場合は、Key Vault をレプリケートするために何もする必要はありません。Key Vault はマネージド サービスであり、Microsoft が処理します", - "guid": "25498f6d-bad3-47da-a43b-c6ce1d7aa9b2", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "Azure Data Factory", - "severity": "低い", - "text": "Keyvault 統合を使用している場合は、Keyvault の SLA を使用して可用性を把握します", - "waf": "確実" - }, - { - "checklist": "Identity Review Checklist", - "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", - "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", - "service": "Entra", - "severity": "中程度", - "text": "有効期間の長い取り消し可能なトークンを使用し、トークンをキャッシュし、Microsoft ID ライブラリを使用してサイレントに取得します", - "waf": "確実" - }, - { - "checklist": "Identity Review Checklist", - "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", - "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", - "service": "AAD B2C", - "severity": "中程度", - "text": "サインイン ユーザー フローがバックアップされ、回復性があることを確認します。ユーザーのサインインに使用するコードがバックアップされ、回復可能であることを確認します。外部プロセスとの回復力のあるインターフェース", - "waf": "確実" - }, - { - "checklist": "Identity Review 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", - "severity": "中程度", - "text": "カスタムブランドアセットはCDNでホストする必要がある", - "waf": "パフォーマンス" - }, - { - "checklist": "Identity Review Checklist", - "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", - "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", - "service": "AAD B2C", - "severity": "低い", - "text": "複数のIDプロバイダーを持っている(つまり、Microsoft、Google、Facebookアカウントでログインする)", - "waf": "確実" - }, - { - "checklist": "Identity Review 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", - "severity": "中程度", - "text": "VM レベルでの高可用性に関する VM ルールに従う (Premium ディスク、リージョン内の 2 つ以上、異なる可用性ゾーン内)", - "waf": "確実" - }, - { - "checklist": "Identity Review 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", - "severity": "中程度", - "text": "複製しないでください!レプリケーションにより、ディレクトリ同期に関する問題が発生する可能性があります", - "waf": "確実" - }, - { - "checklist": "Identity Review 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", - "severity": "中程度", - "text": "マルチリージョンのアクティブ/アクティブを持つ", - "waf": "確実" - }, - { - "checklist": "Identity Review Checklist", - "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", - "severity": "中程度", - "text": "Azure AD Domain Service スタンプを追加のリージョンと場所に追加する", - "waf": "確実" - }, - { - "checklist": "Identity Review Checklist", - "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", - "severity": "中程度", - "text": "DR にレプリカ セットを使用する", - "waf": "確実" - }, { "arm-service": "microsoft.network/frontdoors", "checklist": "Azure Application Delivery Networking", @@ -7895,7 +8085,7 @@ "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-latest-version-for-customer-managed-certificates", "service": "Front Door", "severity": "中程度", - "text": "Azure Front Door でカスタマー マネージド TLS 証明書を使用する場合は、\"最新\" の証明書バージョンを使用します。証明書の手動更新によって引き起こされる停止のリスクを軽減", + "text": "Azure Front Door でカスタマー マネージド TLS 証明書を使用する場合は、\"最新\" の証明書バージョンを使用します。証明書の手動更新による停止のリスクを軽減", "waf": "オペレーションズ" }, { @@ -7918,7 +8108,7 @@ "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", "service": "Load Balancer", "severity": "中程度", - "text": "Azure Load Balancer に Standard SKU を使用していることを確認する", + "text": "Azure Load Balancers に Standard SKU を使用していることを確認します", "waf": "安全" }, { @@ -7939,19 +8129,19 @@ "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", "service": "App Gateway", "severity": "中程度", - "text": "Application Gateway v2 は、IP プレフィックスが /24 以上のサブネットにデプロイする必要があります", + "text": "Application Gateways v2 は、IP プレフィックスが /24 以上のサブネットにデプロイする必要があります", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "安全" }, { "arm-service": "microsoft.network/applicationGateways", "checklist": "Azure Application Delivery Networking", - "description": "リバースプロキシ全般、特にWAFの管理は、ネットワークよりもアプリケーションに近いため、アプリと同じサブスクリプションに属します。Application Gateway と WAF を接続サブスクリプションに一元化することは、1 つのチームによって管理されている場合は問題ない場合があります。", + "description": "リバースプロキシの管理全般、特にWAFの管理は、ネットワーキングよりもアプリケーションに近いため、アプリと同じサブスクリプションに属します。Application Gateway と WAF を接続サブスクリプションに一元化することは、1 つのチームによって管理されている場合は問題ない可能性があります。", "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "App Gateway", "severity": "中程度", - "text": "ランディング ゾーン仮想ネットワーク内およびそれらがセキュリティで保護しているアプリと共に、受信 HTTP(S) 接続のプロキシに使用される Azure Application Gateway v2 またはパートナーの NVA をデプロイします。", + "text": "ランディング ゾーン仮想ネットワーク内の受信 HTTP(S) 接続のプロキシに使用される Azure Application Gateway v2 またはパートナー NVA と、それらがセキュリティ保護しているアプリをデプロイします。", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "安全" }, @@ -7962,7 +8152,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "App Gateway", "severity": "中程度", - "text": "アプリケーション ランディング ゾーン内のすべてのパブリック IP アドレスに対して DDoS ネットワークまたは IP 保護プランを使用します。", + "text": "アプリケーション ランディング ゾーン内のすべてのパブリック IP アドレスに対して、DDoS ネットワークまたは IP 保護プランを使用します。", "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "安全" }, @@ -7974,7 +8164,7 @@ "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-autoscaling-zone-redundant", "service": "App Gateway", "severity": "中程度", - "text": "最小数のインスタンスが 2 つになる自動スケーリングを構成します。", + "text": "自動スケールは、最小インスタンス数が 2 になるように構成します。", "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "確実" }, @@ -7997,7 +8187,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "Front Door", "severity": "中程度", - "text": "Azure Front Door と WAF ポリシーを使用して、複数の Azure リージョンにまたがるグローバル HTTP/S アプリを配信し、保護します。", + "text": "Azure Front Door と WAF ポリシーを使用して、複数の Azure リージョンにまたがるグローバル HTTP/S アプリを提供し、保護します。", "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "安全" }, @@ -8030,7 +8220,7 @@ "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", "service": "Entra", "severity": "低い", - "text": "ユーザーが内部アプリケーションへのアクセスのみを必要とする場合、Microsoft Entra ID アプリケーション プロキシは Azure Virtual Desktop (AVD) の代替として検討されていますか?", + "text": "ユーザーが内部アプリケーションへのアクセスのみを必要とする場合、Microsoft Entra ID アプリケーション プロキシは Azure Virtual Desktop (AVD) の代替手段として検討されていますか?", "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", "waf": "安全" }, @@ -8040,7 +8230,7 @@ "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", "service": "Entra", "severity": "中程度", - "text": "ネットワーク内の着信接続用に開かれているファイアウォール ポートの数を減らすには、Microsoft Entra ID アプリケーション プロキシを使用して、リモート ユーザーに内部アプリケーションへの安全で認証されたアクセスを提供することを検討してください。", + "text": "ネットワーク内の着信接続用に開かれるファイアウォール ポートの数を減らすには、Microsoft Entra ID アプリケーション プロキシを使用して、リモート ユーザーに内部アプリケーションへの安全で認証されたアクセスを提供することを検討してください。", "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", "waf": "安全" }, @@ -8053,7 +8243,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", "service": "Front Door", "severity": "高い", - "text": "Front Door の WAF ポリシーを \"防止\" モードでデプロイします。", + "text": "Front Door の WAF ポリシーを \"防止\" モードでデプロイし、Web アプリケーション ファイアウォールがトラフィックを許可または拒否するための適切なアクションを実行するようにします。", "waf": "安全" }, { @@ -8064,7 +8254,7 @@ "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", "service": "Front Door", "severity": "高い", - "text": "Azure Traffic Manager と Azure Front Door の組み合わせは避けてください。", + "text": "Azure Traffic Manager と Azure Front Door を組み合わせることは避けてください。", "waf": "安全" }, { @@ -8086,7 +8276,7 @@ "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#disable-health-probes-when-theres-only-one-origin-in-an-origin-group", "service": "Front Door", "severity": "低い", - "text": "Azure Front Door 配信元グループに配信元が 1 つしかない場合は、正常性プローブを無効にします。", + "text": "Azure Front Door の配信元グループに配信元が 1 つしかない場合は、正常性プローブを無効にします。", "waf": "パフォーマンス" }, { @@ -8096,7 +8286,7 @@ "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", "service": "Front Door", "severity": "中程度", - "text": "Azure Front Door に適した正常性プローブ エンドポイントを選択します。アプリケーションのすべての依存関係をチェックする正常性エンドポイントを構築することを検討してください。", + "text": "Azure Front Door の適切な正常性プローブ エンドポイントを選択します。アプリケーションのすべての依存関係をチェックする正常性エンドポイントの構築を検討してください。", "waf": "確実" }, { @@ -8119,7 +8309,7 @@ "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", "service": "Load Balancer", "severity": "高い", - "text": "Load Balancer の送信規則の代わりに Azure NAT Gateway を使用して、SNAT のスケーラビリティを向上させる", + "text": "Load Balancer のアウトバウンド規則の代わりに Azure NAT Gateway を使用して SNAT のスケーラビリティを向上させる", "waf": "確実" }, { @@ -8141,7 +8331,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#define-your-waf-configuration-as-code", "service": "Front Door", "severity": "中程度", - "text": "Azure Front Door WAF の構成をコードとして定義します。コードを使用すると、新しいルール セット バージョンをより簡単に採用し、追加の保護を得ることができます。", + "text": "Azure Front Door WAF 構成をコードとして定義します。コードを使用すると、新しいルール セット バージョンをより簡単に採用し、追加の保護を得ることができます。", "waf": "オペレーションズ" }, { @@ -8152,7 +8342,7 @@ "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", "service": "Front Door", "severity": "高い", - "text": "Azure Front Door でエンド ツー エンドの TLS を使用します。クライアントから Front Door への接続、および Front Door から配信元への接続には TLS を使用します。", + "text": "Azure Front Door でエンド ツー エンド TLS を使用します。クライアントから Front Door への接続、および Front Door から配信元への接続には TLS を使用します。", "waf": "安全" }, { @@ -8162,7 +8352,7 @@ "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", "service": "Front Door", "severity": "中程度", - "text": "Azure Front Door で HTTP から HTTPS へのリダイレクトを使用します。古いクライアントをHTTPSリクエストに自動的にリダイレクトすることでサポートします。", + "text": "Azure Front Door で HTTP から HTTPS へのリダイレクトを使用します。古いクライアントを自動的に HTTPS リクエストにリダイレクトすることで、クライアントをサポートします。", "waf": "安全" }, { @@ -8184,7 +8374,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#tune-your-waf", "service": "Front Door", "severity": "高い", - "text": "ワークロードに合わせて Azure Front Door WAF を調整します。誤検知を減らします。", + "text": "ワークロードに合わせて Azure Front Door WAF を調整するには、検出モードで WAF を構成して誤検知の検出を減らして修正します。", "waf": "安全" }, { @@ -8195,7 +8385,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", "service": "Front Door", "severity": "高い", - "text": "Azure Front Door WAF ポリシーで要求本文検査機能を有効にします。", + "text": "Azure Front Door WAF ポリシーで有効になっている要求本文の検査機能を有効にします。", "waf": "安全" }, { @@ -8206,7 +8396,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-default-rule-sets", "service": "Front Door", "severity": "高い", - "text": "Azure Front Door WAF の既定の規則セットを有効にします。既定のルール セットは、一般的な攻撃を検出してブロックします。", + "text": "Azure Front Door WAF の既定のルール セットを有効にします。デフォルトのルールセットは、一般的な攻撃を検出してブロックします。", "waf": "安全" }, { @@ -8217,7 +8407,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#enable-bot-management-rules", "service": "Front Door", "severity": "高い", - "text": "Azure Front Door WAF ボット保護ルール セットを有効にします。ボットルールは、良いボットと悪いボットを検出します。", + "text": "Azure Front Door WAF ボット保護ルール セットを有効にします。ボット ルールは、良いボットと悪いボットを検出します。", "waf": "安全" }, { @@ -8227,7 +8417,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#use-the-latest-ruleset-versions", "service": "Front Door", "severity": "中程度", - "text": "最新の Azure Front Door WAF ルール セット バージョンを使用します。ルール セットの更新は、現在の脅威の状況を考慮して定期的に更新されます。", + "text": "最新の Azure Front Door WAF ルール セット バージョンを使用します。ルールセットの更新は、現在の脅威の状況を考慮して定期的に更新されます。", "waf": "安全" }, { @@ -8237,7 +8427,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#add-rate-limiting", "service": "Front Door", "severity": "中程度", - "text": "Azure Front Door WAF にレート制限を追加します。レート制限は、クライアントが短期間に大量のトラフィックを誤ってまたは意図的に送信することをブロックします。", + "text": "Azure Front Door WAF にレート制限を追加します。レート制限は、クライアントが誤ってまたは意図的に短時間に大量のトラフィックを送信するのをブロックします。", "waf": "安全" }, { @@ -8247,7 +8437,7 @@ "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", "severity": "中程度", - "text": "Azure Front Door WAF のレート制限には、高いしきい値を使用します。高いレート制限しきい値は、正当なトラフィックのブロックを回避しながら、インフラストラクチャを圧倒する可能性のある非常に多数の要求に対する保護を提供します。", + "text": "Azure Front Door WAF のレート制限には高いしきい値を使用します。レート制限のしきい値を高くすると、正当なトラフィックのブロックを回避しながら、インフラストラクチャを圧倒する可能性のある非常に多くのリクエストに対する保護を提供します。", "waf": "安全" }, { @@ -8257,7 +8447,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#geo-filter-traffic", "service": "Front Door", "severity": "低い", - "text": "すべての地域からのトラフィックが想定されていない場合は、地域フィルタを使用して、想定外の国からのトラフィックをブロックします。", + "text": "すべての地理的地域からのトラフィックを想定していない場合は、geo フィルタを使用して、想定外の国からのトラフィックをブロックします。", "waf": "安全" }, { @@ -8267,7 +8457,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-best-practices#specify-the-unknown-zz-location", "service": "Front Door", "severity": "中程度", - "text": "Azure Front Door WAF を使用してトラフィックをジオフィルター処理するときに、不明な (ZZ) 場所を指定します。IP アドレスを地理的に一致させることができない場合に、正当な要求を誤ってブロックしないようにします。", + "text": "Azure Front Door WAF を使用してトラフィックを geo フィルタリングする場合は、不明な (ZZ) 場所を指定します。IP アドレスを地理的に一致できない場合に、正当な要求を誤ってブロックしないようにします。", "waf": "安全" }, { @@ -8279,7 +8469,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/bot-protection", "service": "App Gateway", "severity": "高い", - "text": "Azure Application Gateway WAF ボット保護ルール セットを有効にする ボット ルールは、良いボットと悪いボットを検出します。", + "text": "Azure Application Gateway WAF ボット保護ルール セットを有効にします。ボット ルールは、良いボットと悪いボットを検出します。", "waf": "安全" }, { @@ -8290,7 +8480,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/application-gateway-waf-request-size-limits#request-body-inspection", "service": "App Gateway", "severity": "高い", - "text": "Azure Application Gateway WAF ポリシーで有効になっている要求本文検査機能を有効にします。", + "text": "Azure Application Gateway WAF ポリシーで有効になっている要求本文の検査機能を有効にします。", "waf": "安全" }, { @@ -8301,7 +8491,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", "service": "App Gateway", "severity": "高い", - "text": "ワークロードに合わせて Azure Application Gateway WAF を調整します。誤検知を減らします。", + "text": "ワークロードの検出モードで Azure Application Gateway WAF を調整します。誤検出を減らします。", "waf": "安全" }, { @@ -8323,7 +8513,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", "service": "App Gateway", "severity": "中程度", - "text": "Azure Application Gateway WAF にレート制限を追加します。レート制限は、クライアントが短期間に大量のトラフィックを誤ってまたは意図的に送信することをブロックします。", + "text": "Azure Application Gateway WAF にレート制限を追加します。レート制限は、クライアントが誤ってまたは意図的に短時間に大量のトラフィックを送信するのをブロックします。", "waf": "安全" }, { @@ -8333,7 +8523,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview#rate-limiting-details", "service": "App Gateway", "severity": "中程度", - "text": "Azure Application Gateway の WAF レート制限には高いしきい値を使用します。高いレート制限しきい値は、正当なトラフィックのブロックを回避しながら、インフラストラクチャを圧倒する可能性のある非常に多数の要求に対する保護を提供します。", + "text": "Azure Application Gateway WAF のレート制限には高いしきい値を使用します。レート制限のしきい値を高くすると、正当なトラフィックのブロックを回避しながら、インフラストラクチャを圧倒する可能性のある非常に多くのリクエストに対する保護を提供します。", "waf": "安全" }, { @@ -8343,7 +8533,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#geo-filtering-best-practices", "service": "App Gateway", "severity": "低い", - "text": "すべての地域からのトラフィックが想定されていない場合は、地域フィルタを使用して、想定外の国からのトラフィックをブロックします。", + "text": "すべての地理的地域からのトラフィックを想定していない場合は、geo フィルタを使用して、想定外の国からのトラフィックをブロックします。", "waf": "安全" }, { @@ -8353,7 +8543,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", "service": "App Gateway", "severity": "中程度", - "text": "Azure Application Gateway WAF でトラフィックを geo フィルタリングするときに、不明 (ZZ) の場所を指定します。IP アドレスを地理的に一致させることができない場合に、正当な要求を誤ってブロックしないようにします。", + "text": "Azure Application Gateway WAF を使用してトラフィックを geo フィルタリングする場合は、不明な (ZZ) 場所を指定します。IP アドレスを地理的に一致できない場合に、正当な要求を誤ってブロックしないようにします。", "waf": "安全" }, { @@ -8363,7 +8553,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#use-the-latest-ruleset-versions", "service": "App Gateway", "severity": "中程度", - "text": "最新バージョンの Azure Application Gateway WAF ルール セットを使用します。ルール セットの更新は、現在の脅威の状況を考慮して定期的に更新されます。", + "text": "最新の Azure Application Gateway WAF ルール セット バージョンを使用します。ルールセットの更新は、現在の脅威の状況を考慮して定期的に更新されます。", "waf": "安全" }, { @@ -8373,7 +8563,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#add-diagnostic-settings-to-save-your-wafs-logs", "service": "App Gateway", "severity": "中程度", - "text": "診断設定を追加して、Azure Application Gateway の WAF ログを保存します。", + "text": "診断設定を追加して、Azure Application Gateway WAF ログを保存します。", "waf": "オペレーションズ" }, { @@ -8413,7 +8603,7 @@ "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#define-your-waf-configuration-as-code", "service": "App Gateway", "severity": "中程度", - "text": "Azure Application Gateway の WAF 構成をコードとして定義します。コードを使用すると、新しいルール セット バージョンをより簡単に採用し、追加の保護を得ることができます。", + "text": "Azure Application Gateway WAF 構成をコードとして定義します。コードを使用すると、新しいルール セット バージョンをより簡単に採用し、追加の保護を得ることができます。", "waf": "オペレーションズ" }, { @@ -8433,7 +8623,7 @@ "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", "service": "App Gateway", "severity": "中程度", - "text": "バックエンドの受信トラフィックをフィルター処理して、Application Gateway サブネットからの接続 (NSG など) のみを受け入れるようにします。", + "text": "バックエンドの受信トラフィックをフィルター処理して、Application Gateway サブネット (NSG など) からの接続のみを受け入れるようにします。", "waf": "安全" }, { @@ -8443,7 +8633,7 @@ "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", "service": "Front Door", "severity": "中程度", - "text": "配信元が Azure Front Door インスタンスからのトラフィックのみを受け取るようにします。", + "text": "配信元が Azure Front Door インスタンスからのトラフィックのみを受け取ることを確認します。", "waf": "安全" }, { @@ -8453,7 +8643,7 @@ "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", "service": "App Gateway", "severity": "高い", - "text": "バックエンド・サーバーへのトラフィックを暗号化する必要があります。", + "text": "バックエンド サーバーへのトラフィックを暗号化する必要があります。", "waf": "安全" }, { @@ -8473,7 +8663,7 @@ "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", "service": "App Gateway", "severity": "中程度", - "text": "HTTPをHTTPSにリダイレクトする", + "text": "HTTP を HTTPS にリダイレクトする", "waf": "安全" }, { @@ -8483,7 +8673,7 @@ "link": "https://learn.microsoft.com/azure/application-gateway/how-application-gateway-works#modifications-to-the-request", "service": "App Gateway", "severity": "中程度", - "text": "ゲートウェイ管理の Cookie を使用して、ユーザー セッションから同じサーバーにトラフィックを送信して処理する", + "text": "ゲートウェイで管理される Cookie を使用して、ユーザーセッションからのトラフィックを同じサーバーに転送して処理する", "waf": "オペレーションズ" }, { @@ -8513,7 +8703,7 @@ "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", "service": "App Gateway", "severity": "中程度", - "text": "HTTPリクエストとレスポンスヘッダーを編集して、クライアントとサーバー間のルーティングと情報交換を容易にします", + "text": "HTTP 要求と応答ヘッダーを編集して、クライアントとサーバー間のルーティングと情報交換を容易にします", "waf": "安全" }, { @@ -8523,7 +8713,7 @@ "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", "service": "App Gateway", "severity": "中程度", - "text": "Front Door を構成して、グローバルな Web トラフィック ルーティングとトップレベルのエンド ユーザーのパフォーマンスを最適化し、迅速なグローバル フェールオーバーを通じて信頼性を確保します", + "text": "Front Door を構成して、グローバル Web トラフィックのルーティングと最上位のエンドユーザーのパフォーマンス、および迅速なグローバル フェイルオーバーによる信頼性を最適化する", "waf": "パフォーマンス" }, { @@ -8553,7 +8743,7 @@ "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", "service": "App Gateway", "severity": "中程度", - "text": "SSL証明書管理を一元化して、バックエンドサーバーファームからの暗号化と復号化のオーバーヘッドを削減", + "text": "SSL証明書管理を一元化して、バックエンドサーバーファームからの暗号化と復号化のオーバーヘッドを削減します", "waf": "安全" }, { @@ -8563,434 +8753,244 @@ "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", "service": "App Gateway", "severity": "低い", - "text": "Application Gateway を使用して WebSocket と HTTP/2 プロトコルをネイティブにサポートする", + "text": "Application Gateway を使用して WebSocket プロトコルと HTTP/2 プロトコルをネイティブにサポートする", "waf": "安全" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", - "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", - "service": "APIM", - "severity": "中程度", - "text": "グローバルレベルでのエラー処理ポリシーの実装", - "waf": "オペレーションズ" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "中程度", - "text": "すべての API ポリシーに要素が含まれていることを確認します。", - "waf": "オペレーションズ" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", - "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", - "service": "APIM", - "severity": "中程度", - "text": "ポリシーフラグメントを使用して、複数の API で同じポリシー定義を繰り返さないようにする", - "waf": "オペレーションズ" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", - "link": "https://learn.microsoft.com/azure/api-management/monetization-support", - "service": "APIM", - "severity": "中程度", - "text": "API の収益化を計画している場合は、「収益化のサポート」の記事でおすすめの方法をご確認ください", - "waf": "オペレーションズ" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "a7d0840a-c8c4-4e83-adec-5ca578eb4049", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", - "service": "APIM", - "severity": "高い", - "text": "診断設定を有効にしてログを Azure Monitor にエクスポートする", - "waf": "オペレーションズ" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", - "service": "APIM", - "severity": "中程度", - "text": "Application Insights を有効にして、より詳細なテレメトリを実現する", - "waf": "オペレーションズ" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", - "service": "APIM", - "severity": "高い", - "text": "最も重要なメトリックに関するアラートを構成する", - "waf": "オペレーションズ" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "高い", - "text": "カスタム SSL 証明書が Azure Key Vault に格納され、安全にアクセスして更新できるようにする", - "waf": "安全" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "高い", - "text": "Azure AD を使用して API (データ プレーン) への受信要求を保護する", - "waf": "安全" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", - "service": "APIM", - "severity": "中程度", - "text": "Microsoft Entra ID を使用して開発者ポータルでユーザーを認証する", - "waf": "安全" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", - "service": "APIM", - "severity": "中程度", - "text": "適切なグループを作成して、製品の可視性を制御します", - "waf": "安全" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "06862505-2d9a-4874-9491-2837b00a3475", - "link": "https://learn.microsoft.com/azure/api-management/backends", - "service": "APIM", - "severity": "中程度", - "text": "バックエンド機能を使用して、冗長な API バックエンド構成を排除します", - "waf": "オペレーションズ" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", - "service": "APIM", - "severity": "中程度", - "text": "名前付き値を使用して、ポリシーで使用できる共通の値を格納します", - "waf": "オペレーションズ" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", - "service": "APIM", - "severity": "中程度", - "text": "DR の場合は、99.99% の SLA で 2 つ以上のリージョンにスケーリングされたデプロイで Premium レベルを活用します", - "waf": "確実" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", - "link": "https://learn.microsoft.com/azure/api-management/high-availability", - "service": "APIM", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "ab91932c-9fc9-4d1b-a881-37f5e6c0cb9e", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ADF_v1.docx", + "service": "Azure Data Factory", "severity": "中程度", - "text": "少なくとも 1 つのユニットを 2 つ以上の可用性ゾーンにデプロイして、SLA を 99.99% に向上させる", + "text": "Azure Data Factory の FTA 回復性プレイブックの活用", "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "e503547c-d447-4e82-9138-a7200f1cac6d", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", "severity": "高い", - "text": "自動バックアップ・ルーチンがあることを確認する", + "text": "Availability Zones をサポートするリージョンでゾーン冗長パイプラインを使用するUse zone redundant pipelines in regions that support Availability Zones", "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", - "link": "https://learn.microsoft.com/azure/api-management/retry-policy", - "service": "APIM", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "9ef1d6e8-32e5-42e3-911c-818b1a0bc511", + "link": "https://learn.microsoft.com/azure/data-factory/source-control", + "service": "Azure Data Factory", "severity": "中程度", - "text": "ポリシーを使用して、フェイルオーバー・バックエンドURLとキャッシュを追加し、コールの失敗を減らします。", + "text": "DevOps を使用して Github と Azure DevOps の統合で ARM テンプレートをバックアップする", "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", - "service": "APIM", - "severity": "低い", - "text": "高パフォーマンス レベルでログを記録する必要がある場合は、Event Hubs ポリシーを検討してください", - "waf": "オペレーションズ" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", - "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", - "service": "APIM", - "severity": "中程度", - "text": "調整ポリシーを適用して、毎秒の要求数を制御する", - "training": "https://learn.microsoft.com/training/modules/protect-apis-on-api-management/", - "waf": "パフォーマンス" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", - "service": "APIM", - "severity": "中程度", - "text": "負荷が増加したときにインスタンスの数をスケールアウトするように自動スケーリングを構成する", - "waf": "パフォーマンス" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", - "service": "APIM", - "severity": "中程度", - "text": "セルフホステッド ゲートウェイをデプロイする場所は、バックエンド API に近いリージョンが Azure にありません。", - "waf": "パフォーマンス" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", - "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", - "service": "APIM", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "e43a18a9-cd29-49cf-b7b1-7db8255562f2", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", "severity": "中程度", - "text": "運用環境のワークロードには Premium レベルを使用します。", + "text": "セルフホステッド統合ランタイム VM を別のリージョンにレプリケートしてください", "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "aee4563a-fd83-4393-98b2-62d6dc5f512a", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", "severity": "中程度", - "text": "複数リージョン モデルでは、ポリシーを使用して、可用性または待機時間に基づいてリージョン バックエンドに要求をルーティングします。", + "text": "必ず、姉妹リージョンでネットワークをレプリケートまたは複製してください。別のリージョンに VNet のコピーを作成する必要があります", "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "高い", - "text": "APIM の制限に注意する", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "description": "ADF パイプラインで Key Vault が使用されている場合は、Key Vault をレプリケートするために何もする必要はありません。Key Vault はマネージド サービスであり、Microsoft が処理します", + "guid": "25498f6d-bad3-47da-a43b-c6ce1d7aa9b2", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "Azure Data Factory", + "severity": "低い", + "text": "Keyvault 統合を使用している場合は、Keyvault の SLA を使用して可用性を把握します", "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", - "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", - "service": "APIM", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "ac1d6380-f866-4bbd-a9b4-b1ee5d7908b8", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#availability-zones", + "service": "IoT", "severity": "高い", - "text": "セルフホステッド ゲートウェイのデプロイに回復性があることを確認します。", + "text": "Availability Zones (リージョンで適用可能な場合) を活用する (これは自動的に有効になります)", "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "7519e385-a88b-4d34-966b-6269d686e890", - "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", - "service": "APIM", - "severity": "中程度", - "text": "複数リージョンのデプロイに APIM の前で Azure Front Door を使用するUse Azure Front Door in front of APIM for multi-region deployment", - "waf": "パフォーマンス" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "35f651e8-0124-4ef7-8c57-658e38609e6e", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", + "service": "IoT", "severity": "中程度", - "text": "仮想ネットワーク (VNet) 内にサービスをデプロイするDeploy the service within a Virtual Network (VNet)", - "waf": "安全" + "text": "Microsoft が開始するフェールオーバーに注意してください。これらは、まれに、影響を受けるリージョンから対応する geo ペア リージョンにすべての IoT ハブをフェールオーバーするために Microsoft によって実行されます。", + "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "中程度", - "text": "ネットワーク セキュリティ グループ (NSG) をサブネットにデプロイして、APIM との間のトラフィックを制限または監視します。", - "waf": "安全" + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "4ed3e490-dc06-4a1e-b467-5d0239d85540", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#cross-region-dr", + "service": "IoT", + "severity": "高い", + "text": "重要なワークロードに対するリージョン間 DR 戦略を検討する", + "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "中程度", - "text": "プライベート エンドポイントをデプロイして、APIM が VNet にデプロイされていない場合に受信トラフィックをフィルター処理します。", - "waf": "安全" + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "a11ecab0-db47-46f7-9aa7-17764e7e45a1", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", + "service": "IoT", + "severity": "高い", + "text": "手動フェールオーバーをトリガーする方法を学習します。", + "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "f9db8dfb-1194-460b-aedd-34dd6a69db22", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#failback", + "service": "IoT", "severity": "高い", - "text": "パブリックネットワークアクセスの無効化", - "waf": "安全" + "text": "フェールオーバー後にフェールバックする方法を学習します。", + "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", - "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", - "service": "APIM", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", + "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", + "service": "Spring Apps", "severity": "中程度", - "text": "PowerShell 自動化スクリプトで管理を簡素化", - "waf": "オペレーションズ" + "text": "Azure Spring Apps では、アプリごとに 2 つのデプロイが許可され、そのうちの 1 つだけが運用トラフィックを受信します。ブルーグリーンデプロイ戦略により、ダウンタイムをゼロにすることができます。ブルー グリーン デプロイは、Standard レベルと Enterprise レベルでのみ使用できます。CI/CD と ADO/GitHub Actions を使用してデプロイを自動化できます", + "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "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", "severity": "中程度", - "text": "Infrastructure-as-code を使用して APIM を構成します。Cloud Adaption Framework APIM Landing Zone Accelerator から DevOps のベスト プラクティスを確認する", - "waf": "オペレーションズ" + "text": "Azure Spring Apps インスタンスは、アプリケーション用に複数のリージョンに作成でき、トラフィックは Traffic Manager/Front Door によってルーティングできます。", + "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", - "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", - "service": "APIM", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", + "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", + "service": "Spring Apps", "severity": "中程度", - "text": "Visual Studio Code APIM 拡張機能の使用を促進して API 開発を迅速化する", - "waf": "オペレーションズ" + "text": "サポートされているリージョンでは、Azure Spring Apps をゾーン冗長としてデプロイできるため、インスタンスは可用性ゾーン間で自動的に分散されます。この機能は、Standard レベルと Enterprise レベルでのみ使用できます。", + "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "354f1c03-8112-4965-85ad-c0074bddf231", - "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", - "service": "APIM", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", + "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", + "service": "Spring Apps", "severity": "中程度", - "text": "DevOpsとCI/CDをワークフローに実装する", - "waf": "オペレーションズ" + "text": "アプリに複数のアプリ インスタンスを使用する", + "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "b6439493-426a-45f3-9697-cf65baee208d", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", - "service": "APIM", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "7504c230-6035-4183-95a5-85762acc6075", + "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", + "service": "Spring Apps", "severity": "中程度", - "text": "クライアント証明書認証を使用した API の保護", - "waf": "安全" + "text": "Azure Spring Apps をログ、メトリック、トレースで監視します。ASA を Application Insights と統合し、障害を追跡し、ブックを作成します。", + "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "2a67d143-1033-4c0a-8732-680896478f08", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", - "service": "APIM", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", + "service": "Spring Apps", "severity": "中程度", - "text": "クライアント証明書認証を使用したバックエンド サービスのセキュリティ保護", - "waf": "安全" + "text": "Spring Cloud Gateway で自動スケーリングを設定する", + "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", - "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", - "service": "APIM", - "severity": "中程度", - "text": "「OWASP API Security Top 10 の脅威を軽減するための推奨事項」の記事を確認し、API に適用できるものを確認します", - "waf": "安全" + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "97411607-b6fd-4335-99d1-9885faf4e392", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", + "service": "Spring Apps", + "severity": "低い", + "text": "Standard 従量課金プランと専用プランのアプリの自動スケーリングを有効にします。", + "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", - "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", - "service": "APIM", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", + "link": "https://learn.microsoft.com/azure/spring-apps/overview", + "service": "Spring Apps", "severity": "中程度", - "text": "承認機能を使用して、バックエンド API の OAuth 2.0 トークンの管理を簡素化します", - "waf": "安全" + "text": "ミッション クリティカルなアプリの Spring Boot の商用サポートには、Enterprise プランを使用します。他のレベルでは、OSS のサポートを受けることができます。", + "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", - "service": "APIM", + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency checklist", + "guid": "65285269-440b-44be-9d3e-0844276d4bdc", + "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-zone-redundancy", + "service": "Redis", "severity": "高い", - "text": "転送中の情報を暗号化する場合は、最新のTLSバージョンを使用します。可能であれば、古くて不要なプロトコルと暗号を無効にします。", - "waf": "安全" + "text": "Azure Cache for Redis のゾーン冗長を有効にします。Azure Cache for Redis では、Premium レベルと Enterprise レベルでゾーン冗長構成がサポートされています。ゾーン冗長キャッシュでは、同じリージョン内の異なる Azure Availability Zones にノードを配置できます。これにより、データセンターや AZ の停止が単一障害点として排除され、キャッシュの全体的な可用性が向上します。", + "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "高い", - "text": "シークレット (名前付き値) が Azure Key Vault に格納され、安全にアクセスして更新できるようにする", - "waf": "安全" + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency 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", + "severity": "中程度", + "text": "Azure Cache for Redis インスタンスのデータ永続化を構成します。キャッシュ データはメモリに格納されるため、まれに複数のノードで計画外の障害が発生すると、すべてのデータがドロップされる可能性があります。データの完全な損失を回避するために、Redis 永続化では、メモリ内データのスナップショットを定期的に取得し、ストレージ アカウントに格納できます。", + "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency 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", "severity": "中程度", - "text": "可能な限りマネージド ID を使用して、他の Azure リソースに対する認証を行う", - "waf": "安全" + "text": "geo 冗長ストレージ アカウントを使用して Azure Cache for Redis データを保持するか、geo 冗長性を使用できない場合はゾーン冗長を使用します", + "waf": "確実" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "高い", - "text": "Web アプリケーション ファイアウォール (WAF) を使用するには、APIM の前に Application Gateway をデプロイします", - "waf": "安全" + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency checklist", + "guid": "a8c26c9b-32ab-45bd-bc69-98a135e33789", + "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-geo-replication", + "service": "Redis", + "severity": "中程度", + "text": "Premium Azure Cache for Redis インスタンスのパッシブ geo レプリケーションを構成します。geo レプリケーションは、2 つ以上の Azure Cache for Redis インスタンス (通常は 2 つの Azure リージョンにまたがる) をリンクするためのメカニズムです。geo レプリケーションは、主にリージョン間のディザスター リカバリー用に設計されています。2 つの Premium レベルのキャッシュ インスタンスは、プライマリ キャッシュへの読み取りと書き込みを提供する方法で geo レプリケーションを介して接続され、そのデータはセカンダリ キャッシュにレプリケートされます。", + "waf": "確実" } ], "metadata": { "name": "WAF checklist", - "timestamp": "August 05, 2024" + "timestamp": "August 08, 2024" }, "severities": [ { diff --git a/checklists/waf_checklist.ko.json b/checklists/waf_checklist.ko.json index c6bc5a06d..83be3434f 100644 --- a/checklists/waf_checklist.ko.json +++ b/checklists/waf_checklist.ko.json @@ -1,3941 +1,3867 @@ { "items": [ { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", - "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", - "service": "APIM", + "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": "보통", - "text": "전역 수준에서 오류 처리 정책 구현", + "text": "다중 테넌트에 대한 명확한 규정 또는 비즈니스 요구 사항이 없는 한 Azure 리소스를 관리하기 위해 하나의 Entra 테넌트를 사용합니다.", "waf": "작업" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "보통", - "text": "모든 API 정책에 요소가 포함되어 있는지 확인합니다.", + "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": "낮다", + "text": "다중 테넌트 자동화 접근 방식을 사용하여 Microsoft Entra ID 테넌트를 관리합니다.", "waf": "작업" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", - "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", - "service": "APIM", - "severity": "보통", - "text": "정책 조각을 사용하여 여러 API에서 동일한 정책 정의를 반복하지 않도록 합니다.", + "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": "높다", + "text": "동일한 ID로 다중 테넌트 관리에 Azure Lighthouse를 사용합니다.", + "training": "https://learn.microsoft.com/azure/lighthouse/concepts/cross-tenant-management-experience", "waf": "작업" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", - "link": "https://learn.microsoft.com/azure/api-management/monetization-support", - "service": "APIM", - "severity": "보통", - "text": "API로 수익을 창출할 계획이라면 '수익 창출 지원' 도움말에서 권장사항을 확인하세요", - "waf": "작업" + "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": "높다", + "text": "파트너에게 테넌트를 관리할 수 있는 액세스 권한을 부여하는 경우 Azure Lighthouse를 사용합니다.", + "waf": "비용" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "a7d0840a-c8c4-4e83-adec-5ca578eb4049", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", - "service": "APIM", + "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": "높다", - "text": "진단 설정을 사용하도록 설정하여 로그를 Azure Monitor로 내보내기", - "waf": "작업" + "text": "클라우드 운영 모델에 맞는 RBAC 모델을 적용합니다. Scope and Assign across Management Groups and Subscriptions.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", - "service": "APIM", - "severity": "보통", - "text": "더 자세한 원격 분석을 위해 Application Insights 사용", - "waf": "작업" + "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": "높다", + "text": "모든 계정 유형에 대해 회사 또는 학교 계정 인증 유형만 사용합니다. Microsoft 계정을 사용하지 마십시오.", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", - "service": "APIM", - "severity": "높다", - "text": "가장 중요한 메트릭에 대한 경고 구성", - "waf": "작업" + "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": "보통", + "text": "그룹만 사용하여 사용 권한을 할당합니다. 그룹 관리 시스템이 이미 있는 경우 Entra ID 전용 그룹에 온-프레미스 그룹을 추가합니다.", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "높다", - "text": "사용자 지정 SSL 인증서가 안전하게 액세스하고 업데이트할 수 있도록 Azure Key Vault에 저장되어 있는지 확인합니다", + "text": "Azure 환경에 대한 권한이 있는 모든 사용자에 대해 Microsoft Entra ID 조건부 액세스 정책을 적용합니다.", + "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "높다", - "text": "Azure AD를 사용하여 API(데이터 평면)에 들어오는 요청 보호", + "text": "Azure 환경에 대한 권한이 있는 모든 사용자에 대해 Multi-Factor Authentication을 적용합니다.", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", - "service": "APIM", + "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": "보통", - "text": "Microsoft Entra ID를 사용하여 개발자 포털에서 사용자 인증", + "text": "Microsoft Entra ID PIM(Privileged Identity Management)을 적용하여 제로 스탠딩 액세스 및 최소 권한을 설정합니다.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", - "service": "APIM", + "checklist": "Azure Landing Zone Review", + "guid": "8b9fe5c4-1049-4d40-9a92-3c3474d00018", + "link": "https://learn.microsoft.com/en-us/entra/identity/domain-services/overview", + "service": "Entra", "severity": "보통", - "text": "제품의 가시성을 제어하기 위해 적절한 그룹을 만듭니다", + "text": "Active Directory Domain Services에서 Entra Domain Services로 전환하려는 경우 모든 워크로드의 호환성을 평가합니다.", + "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "06862505-2d9a-4874-9491-2837b00a3475", - "link": "https://learn.microsoft.com/azure/api-management/backends", - "service": "APIM", + "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": "보통", - "text": "백엔드 기능을 사용하여 중복 API 백엔드 구성 제거", - "waf": "작업" + "text": "Microsoft Entra ID 로그를 플랫폼 중앙 Azure Monitor와 통합합니다. Azure Monitor는 Azure의 로그 및 모니터링 데이터에 대한 단일 정보 소스를 허용하여 조직에 로그 수집 및 보존에 대한 요구 사항을 충족하는 클라우드 네이티브 옵션을 제공합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", - "service": "APIM", + "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": "높다", + "text": "응급 액세스 또는 비상 계정을 구현하여 테넌트 전체 계정 잠금을 방지합니다.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "안전" + }, + { + "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": "보통", - "text": "명명된 값을 사용하여 정책에서 사용할 수 있는 공통 값 저장", - "waf": "작업" + "text": "특별히 필요한 시나리오가 없는 한 Microsoft Entra ID 역할 할당에 온-프레미스 동기화 계정을 사용하지 마세요.", + "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", + "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", - "service": "APIM", + "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": "보통", - "text": "DR의 경우 99.99% SLA를 위해 둘 이상의 지역에 걸쳐 확장된 배포와 함께 프리미엄 계층을 활용합니다", - "waf": "신뢰도" + "text": "Microsoft Entra ID 애플리케이션 프록시를 사용하여 원격 사용자에게 애플리케이션에 대한 액세스 권한을 부여하는 경우 테넌트당 하나의 인스턴스만 가질 수 있으므로 플랫폼 리소스로 관리합니다.", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", - "link": "https://learn.microsoft.com/azure/api-management/high-availability", - "service": "APIM", + "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": "보통", - "text": "99.99%의 SLA 증가를 위해 둘 이상의 가용성 영역에 하나 이상의 단위를 배포합니다.", - "waf": "신뢰도" + "text": "최대한의 유연성이 필요한 네트워크 시나리오에는 허브 및 스포크(hub-and-spoke) 네트워크 토폴로지를 사용합니다.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "높다", - "text": "자동화된 백업 루틴이 있는지 확인", - "waf": "신뢰도" + "text": "ExpressRoute 게이트웨이, VPN 게이트웨이 및 Azure Firewall 또는 파트너 NVA를 포함한 공유 네트워킹 서비스를 중앙 허브 가상 네트워크에 배포합니다. 필요한 경우 DNS 서비스도 배포합니다.", + "waf": "비용" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", - "link": "https://learn.microsoft.com/azure/api-management/retry-policy", - "service": "APIM", + "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": "높다", + "text": "애플리케이션 랜딩 존의 모든 공용 IP 주소에 대해 DDoS 네트워크 또는 IP 보호 계획을 사용합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "안전" + }, + { + "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": "보통", - "text": "정책을 사용하여 장애 조치 백엔드 URL 및 캐싱을 추가하여 실패한 호출을 줄입니다.", + "text": "파트너 네트워킹 기술 또는 NVA를 배포할 때 파트너 공급업체의 지침을 따릅니다.", "waf": "신뢰도" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", - "service": "APIM", + "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": "낮다", - "text": "고성능 수준에서 기록해야 하는 경우 Event Hubs 정책을 고려합니다", - "waf": "작업" + "text": "허브 및 스포크 시나리오에서 ExpressRoute와 VPN 게이트웨이 간의 전송이 필요한 경우 Azure Route Server를 사용합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", - "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", - "service": "APIM", - "severity": "보통", - "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": "공연" + "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": "낮다", + "text": "Route Server를 사용하는 경우 Route Server 서브넷에 /27 접두사를 사용합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", - "service": "APIM", + "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": "보통", - "text": "부하가 증가할 때 인스턴스 수를 확장하도록 자동 크기 조정 구성Configure autoscaling to scale out the number of instances when the load increases", + "text": "Azure 지역 간에 여러 허브 및 스포크 토폴로지가 있는 네트워크 아키텍처의 경우 허브 VNet 간의 글로벌 가상 네트워크 피어링을 사용하여 지역을 서로 연결합니다.", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-virtual-networks/", "waf": "공연" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", - "service": "APIM", + "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": "보통", - "text": "Azure에 백 엔드 API에 가까운 지역이 없는 자체 호스팅 게이트웨이를 배포합니다.", - "waf": "공연" + "text": "네트워크용 Azure Monitor를 사용하여 Azure에서 네트워크의 엔드투엔드 상태를 모니터링합니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "waf": "작업" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", - "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", - "service": "APIM", + "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": "보통", - "text": "프로덕션 워크로드에 프리미엄 계층을 사용합니다.", + "text": "한 지역에 400개 이상의 스포크 네트워크가 있는 경우 VNet 피어링 제한(500) 및 ExpressRoute를 통해 보급할 수 있는 최대 접두사 수(1000)를 우회하기 위해 추가 허브를 배포합니다.", "waf": "신뢰도" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "보통", - "text": "다중 리전 모델에서는 Policies를 사용하여 가용성 또는 지연 시간에 따라 리전 백엔드로 요청을 라우팅합니다.", - "waf": "신뢰도" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "높다", - "text": "APIM의 제한에 유의해야 합니다.", + "text": "경로 테이블당 경로 수를 400개로 제한합니다.", "waf": "신뢰도" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", - "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", - "service": "APIM", + "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": "높다", - "text": "자체 호스팅 게이트웨이 배포가 복원력이 있는지 확인합니다.", + "text": "VNet 피어링을 구성할 때 '원격 가상 네트워크에 대한 트래픽 허용' 설정을 사용합니다.", "waf": "신뢰도" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "7519e385-a88b-4d34-966b-6269d686e890", - "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", - "service": "APIM", + "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": "보통", - "text": "다중 지역 배포를 위해 APIM 앞에서 Azure Front Door 사용Use Azure Front Door in front of APIM for multi-region deployment", - "waf": "공연" + "text": "ExpressRoute Direct를 사용하는 경우 조직의 라우터와 MSEE 간의 계층 2 레벨에서 트래픽을 암호화하도록 MACsec을 구성합니다. 다이어그램은 흐름에서 이 암호화를 보여 줍니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "보통", - "text": "VNet(Virtual Network) 내에 서비스 배포Deploy the service within a Virtual Network (VNet)", + "text": "MACsec을 사용할 수 없는 시나리오(예: ExpressRoute Direct를 사용하지 않음)의 경우 VPN 게이트웨이를 사용하여 ExpressRoute 개인 피어링을 통해 IPsec 터널을 설정합니다.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "보통", - "text": "서브넷에 NSG(네트워크 보안 그룹)를 배포하여 APIM에서 들어오고 나가는 트래픽을 제한하거나 모니터링합니다.", + "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": "높다", + "text": "Azure 지역 및 온-프레미스 위치에서 겹치는 IP 주소 공간이 사용되지 않는지 확인합니다.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "보통", - "text": "프라이빗 엔드포인트를 배포하여 APIM이 VNet에 배포되지 않은 경우 들어오는 트래픽을 필터링합니다.", + "text": "개인 인터넷(RFC 1918)에 대한 주소 할당 범위의 IP 주소를 사용합니다.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "높다", - "text": "공용 네트워크 액세스 사용 안 함", - "waf": "안전" + "text": "IP 주소 공간이 낭비되지 않는지 확인하고 불필요하게 큰 가상 네트워크(예: /16)를 만들지 마세요.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "공연" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", - "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", - "service": "APIM", - "severity": "보통", - "text": "PowerShell 자동화 스크립트로 관리 간소화", - "waf": "작업" + "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": "높다", + "text": "프로덕션 및 재해 복구 사이트에 대해 겹치는 IP 주소 범위를 사용하지 마세요.", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "보통", - "text": "Infrastructure-as-code를 통해 APIM을 구성합니다. Cloud Adaption Framework APIM 랜딩 존 가속기에서 DevOps 모범 사례 검토", + "text": "Azure의 이름 확인만 필요한 환경의 경우 이름 확인을 위해 위임된 영역(예: 'azure.contoso.com')을 사용하여 확인을 위해 Azure 프라이빗 DNS를 사용합니다.", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", "waf": "작업" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", - "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", - "service": "APIM", + "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": "보통", - "text": "더 빠른 API 개발을 위해 Visual Studio Code APIM 확장 사용 촉진", + "text": "Azure 및 온-프레미스에서 이름 확인이 필요하고 Active Directory와 같은 기존 엔터프라이즈 DNS 서비스가 없는 환경의 경우 Azure DNS Private Resolver를 사용하여 DNS 요청을 Azure 또는 온-프레미스 DNS 서버로 라우팅합니다.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-dns-private-resolver/", + "waf": "안전" + }, + { + "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": "낮다", + "text": "자체 DNS(예: Red Hat OpenShift)가 필요하고 배포하는 특수 워크로드는 선호하는 DNS 솔루션을 사용해야 합니다.", "waf": "작업" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "354f1c03-8112-4965-85ad-c0074bddf231", - "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", - "service": "APIM", - "severity": "보통", - "text": "워크플로에서 DevOps 및 CI/CD 구현", + "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": "높다", + "text": "Azure DNS에 대한 자동 등록을 사용하도록 설정하여 가상 네트워크 내에 배포된 가상 머신에 대한 DNS 레코드의 수명 주기를 자동으로 관리합니다.", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", "waf": "작업" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "b6439493-426a-45f3-9697-cf65baee208d", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", - "service": "APIM", + "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": "보통", - "text": "클라이언트 인증서 인증을 사용하여 API 보안", + "text": "Azure Bastion을 사용하여 네트워크에 안전하게 연결합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "2a67d143-1033-4c0a-8732-680896478f08", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", - "service": "APIM", + "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": "보통", - "text": "클라이언트 인증서 인증을 사용한 보안 백엔드 서비스", + "text": "서브넷 /26 이상에서 Azure Bastion을 사용합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", - "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", - "service": "APIM", + "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": "보통", - "text": "'OWASP API 보안 상위 10개 위협을 완화하기 위한 권장 사항' 문서를 검토하고 API에 적용할 수 있는 항목을 확인합니다.", + "text": "Azure Front Door 및 WAF 정책을 사용하여 랜딩 존에 대한 인바운드 HTTP/S 연결을 위해 Azure 지역 전체에서 전역 보호를 제공합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", - "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", - "service": "APIM", - "severity": "보통", - "text": "권한 부여 기능을 사용하여 백엔드 API에 대한 OAuth 2.0 토큰 관리 간소화", + "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": "낮다", + "text": "Azure Front Door 및 Azure Application Gateway를 사용하여 HTTP/S 앱을 보호하는 경우 Azure Front Door에서 WAF 정책을 사용합니다. Azure Front Door에서만 트래픽을 수신하도록 Azure Application Gateway를 잠급니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", - "service": "APIM", + "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": "높다", - "text": "전송 중인 정보를 암호화할 때 최신 TLS 버전을 사용합니다. 가능한 경우 오래되고 불필요한 프로토콜과 암호를 사용하지 않도록 설정합니다.", + "text": "인바운드 HTTP/S 연결에 WAF 및 기타 역방향 프록시가 필요한 경우 랜딩 존 가상 네트워크 내에 배포하고 보호하고 인터넷에 노출하는 앱과 함께 배포합니다.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "높다", - "text": "비밀(명명된 값)이 안전하게 액세스하고 업데이트할 수 있도록 Azure Key Vault에 저장되었는지 확인합니다.", + "text": "Azure DDoS 네트워크 또는 IP 보호 플랜을 사용하여 가상 네트워크 내의 공용 IP 주소 엔드포인트를 보호할 수 있습니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "보통", - "text": "가능할 때마다 관리 ID를 사용하여 다른 Azure 리소스에 인증", + "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": "높다", + "text": "예정된 호환성이 손상되는 변경 전에 네트워크 아웃바운드 트래픽 구성 및 전략을 관리하는 방법을 계획합니다. 2025년 9월 30일에 새 배포에 대한 기본 아웃바운드 액세스가 사용 중지되고 명시적 액세스 구성만 허용됩니다.", + "waf": "신뢰도" + }, + { + "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": "높다", + "text": "보호된 모든 공용 IP 주소(DDoS IP 또는 네트워크 보호)에 대한 DDoS 관련 로그를 저장하는 진단 설정을 추가합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "안전" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "높다", - "text": "APIM 앞에 Application Gateway를 배포하여 WAF(웹 애플리케이션 방화벽) 사용Use Web Application Firewall (WAF) by deploying Application Gateway in of APIM", + "text": "Virtual Machines에 직접 연결된 공용 IP 주소를 거부하는 정책 할당이 있는지 확인합니다. 특정 VM에서 공용 IP가 필요한 경우 제외를 사용합니다.", "waf": "안전" }, { - "checklist": "Identity Review Checklist", - "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", - "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", - "service": "Entra", + "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": "보통", - "text": "장기 취소 가능 토큰을 사용하고, 토큰을 캐시하고, Microsoft ID 라이브러리를 사용하여 자동으로 획득합니다.", - "waf": "신뢰도" + "text": "ExpressRoute를 Azure에 대한 기본 연결로 사용합니다. VPN을 백업 연결의 소스로 사용합니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "공연" }, { - "checklist": "Identity Review Checklist", - "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", - "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", - "service": "AAD B2C", + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "description": "AS-path 접두사 및 연결 가중치를 사용하여 Azure에서 온-프레미스로의 트래픽에 영향을 주고, 자체 라우터의 전체 BGP 특성 범위를 사용하여 온-프레미스에서 Azure로의 트래픽에 영향을 줄 수 있습니다.", + "guid": "f29812b2-363c-4efe-879b-599de0d5973c", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-routing", + "service": "ExpressRoute", "severity": "보통", - "text": "로그인 사용자 흐름이 백업되고 복원력이 있는지 확인합니다. 사용자를 로그인하는 데 사용하는 코드가 백업되고 복구 가능한지 확인합니다. 외부 프로세스와의 복원력 있는 인터페이스", + "text": "여러 ExpressRoute 회로 또는 여러 온-프레미스 위치를 사용하는 경우 BGP 특성을 사용하여 라우팅을 최적화합니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "신뢰도" }, { - "checklist": "Identity Review 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", + "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": "보통", - "text": "사용자 지정 브랜드 자산은 CDN에서 호스팅되어야 합니다.", + "text": "대역폭 및 성능 요구 사항에 따라 ExpressRoute/VPN 게이트웨이에 적합한 SKU를 선택합니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "공연" }, { - "checklist": "Identity Review Checklist", - "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", - "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", - "service": "AAD B2C", - "severity": "낮다", - "text": "여러 ID 공급자가 있어야 합니다(예: Microsoft, Google, Facebook 계정으로 로그인).", - "waf": "신뢰도" - }, - { - "checklist": "Identity Review 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", - "severity": "보통", - "text": "VM 수준에서 고가용성을 위한 VM 규칙(프리미엄 디스크, 서로 다른 가용성 영역에 있는 지역에 두 개 이상)을 따릅니다.", - "waf": "신뢰도" + "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": "높다", + "text": "비용을 정당화하는 대역폭에 도달하는 경우에만 무제한 데이터 ExpressRoute 회로를 사용해야 합니다.", + "waf": "비용" }, { - "checklist": "Identity Review 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", - "severity": "보통", - "text": "복제하지 마세요! 복제로 인해 디렉터리 동기화에 문제가 발생할 수 있습니다", - "waf": "신뢰도" + "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": "높다", + "text": "회로 피어링 위치가 로컬 SKU에 대한 Azure 지역을 지원하는 경우 ExpressRoute의 로컬 SKU를 활용하여 회로 비용을 줄입니다.", + "waf": "비용" }, { - "checklist": "Identity Review 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", + "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": "보통", - "text": "다중 지역에 대해 활성-활성 상태 보유", + "text": "지원되는 Azure 지역에 영역 중복 ExpressRoute 게이트웨이를 배포합니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "신뢰도" }, { - "checklist": "Identity Review Checklist", - "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", + "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": "보통", - "text": "추가 지역 및 위치에 Azure AD 도메인 서비스 스탬프 추가Add Azure AD Domain service stamps to additional regions and locations", - "waf": "신뢰도" + "text": "10Gbps보다 높은 대역폭 또는 전용 10/100Gbps 포트가 필요한 시나리오의 경우 ExpressRoute Direct를 사용합니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "공연" }, { - "checklist": "Identity Review Checklist", - "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", + "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": "보통", - "text": "DR에 복제본 세트 사용", - "waf": "신뢰도" + "text": "짧은 대기 시간이 필요하거나 온-프레미스에서 Azure로의 처리량이 10Gbps보다 커야 하는 경우 FastPath를 사용하도록 설정하여 데이터 경로에서 ExpressRoute 게이트웨이를 우회합니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "공연" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", - "service": "Bot service", + "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": "보통", - "text": "Azure Bot Service의 안정성 지원 권장 사항을 따릅니다", + "text": "영역 중복 VPN 게이트웨이를 사용하여 분기 또는 원격 위치를 Azure(사용 가능한 경우)에 연결합니다.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", "waf": "신뢰도" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", - "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", - "service": "Bot service", + "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": "보통", - "text": "로컬 데이터 레지던시 및 지역 규정 준수를 통해 봇 배포Deploying bots with local data residency and regional compliance", + "text": "온-프레미스에서 중복 VPN 어플라이언스(활성/활성 또는 활성/수동)를 사용합니다.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", "waf": "신뢰도" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "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", + "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": "높다", + "text": "ExpressRoute Direct를 사용하는 경우 비용을 절감하기 위해 로컬 Azure 지역에 대한 ExpressRoute 로컬 회로를 사용하는 것이 좋습니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "비용" + }, + { + "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": "보통", - "text": "Azure Bot Service는 글로벌 및 지역 서비스 모두에 대해 활성-활성 모드로 실행됩니다. 중단이 발생하면 오류를 감지하거나 서비스를 관리할 필요가 없습니다. Azure Bot Service는 다중 지역 지리적 아키텍처에서 자동 장애 조치(failover) 및 자동 복구를 자동으로 수행합니다. EU 봇 지역 서비스의 경우 Azure Bot Service는 중복성을 보장하기 위해 활성/활성 복제가 있는 유럽 내 두 개의 전체 지역을 제공합니다. 글로벌 봇 서비스의 경우 사용 가능한 모든 지역/지역을 글로벌 공간으로 제공할 수 있습니다.", - "waf": "신뢰도" + "text": "트래픽 격리 또는 전용 대역폭이 필요한 경우(예: 프로덕션 환경과 비프로덕션 환경 분리) 다른 ExpressRoute 회로를 사용합니다. 이는 격리된 라우팅 도메인을 보장하고 시끄러운 이웃 위험을 완화하는 데 도움이 됩니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", - "severity": "낮다", - "text": "모범 사례는 기준 고가용성 영역 중복 웹 애플리케이션 아키텍처를 참조하세요.", - "waf": "신뢰도" + "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": "보통", + "text": "기본 제공 Express Route Insights를 사용하여 ExpressRoute 가용성 및 사용률을 모니터링합니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "작업" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", - "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", - "service": "App Services", + "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": "보통", - "text": "프리미엄 및 표준 계층을 사용합니다. 이러한 계층은 스테이징 슬롯 및 자동 백업을 지원합니다.", - "waf": "신뢰도" + "text": "네트워크 전반, 특히 온-프레미스와 Azure 간의 연결을 모니터링하려면 연결 모니터를 사용합니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "작업" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", - "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", - "service": "App Services", - "severity": "높다", - "text": "지역적으로 적용 가능한 경우 가용성 영역 활용(프리미엄 v2 또는 v3 계층 필요)", + "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": "보통", + "text": "중복성을 위해 서로 다른 피어링 위치의 ExpressRoute 회로를 사용합니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "신뢰도" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Services", + "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": "보통", - "text": "상태 확인 구현", + "text": "단일 ExpressRoute 회로만 사용하는 경우 사이트 간 VPN을 ExpressRoute의 장애 조치(failover)로 사용합니다.", "waf": "신뢰도" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", - "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", - "service": "App Services", + "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": "높다", - "text": "Azure App Service에 대한 백업 및 복원 모범 사례를 참조하세요.", + "text": "GatewaySubnet에서 경로 테이블을 사용하는 경우 게이트웨이 경로가 전파되었는지 확인합니다.", "waf": "신뢰도" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", + "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": "높다", - "text": "Azure App Service 안정성 모범 사례 구현", + "text": "ExpressRoute를 사용하는 경우 온-프레미스 라우팅은 동적이어야 하며, 연결 오류가 발생할 경우 회로의 나머지 연결로 수렴해야 합니다. 로드는 두 연결 모두에서 이상적으로는 액티브/액티브로 공유해야 하지만 액티브/패시브도 지원됩니다.", "waf": "신뢰도" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", - "severity": "낮다", - "text": "App Service 앱을 다른 지역으로 이동하는 방법을 숙지합니다. 재해가 발생하는 동안", + "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": "보통", + "text": "ExpressRoute 회로의 두 물리적 링크가 네트워크에 있는 두 개의 고유한 에지 디바이스에 연결되어 있는지 확인합니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "신뢰도" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", - "service": "App Services", - "severity": "높다", - "text": "Azure App Service의 안정성 지원 숙지", + "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": "보통", + "text": "BFD(Bidirectional Forwarding Detection)가 고객 또는 프로바이더 에지 라우팅 디바이스에서 활성화되고 구성되도록 보장합니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "신뢰도" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "App Services", - "severity": "보통", - "text": "App Service 계획에서 실행되는 Function Apps에 대해 \"Always On\"이 사용하도록 설정되어 있는지 확인합니다.", + "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": "높다", + "text": "복원력을 높이기 위해 ExpressRoute 게이트웨이를 서로 다른 피어링 위치에서 둘 이상의 회로에 연결합니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "신뢰도" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Services", + "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": "보통", - "text": "상태 검사를 사용하여 App Service 인스턴스 모니터링Monitor App Service instances using Health checks", - "waf": "신뢰도" + "text": "ExpressRoute 가상 네트워크 게이트웨이에 대한 진단 로그 및 경고를 구성합니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "작업" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", - "service": "App Services", + "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": "보통", - "text": "Application Insights 가용성 테스트를 사용하여 웹앱 또는 웹 사이트의 가용성 및 응답성 모니터링", - "waf": "신뢰도" + "text": "VNet 간 통신에 ExpressRoute 회로를 사용하지 마세요.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "공연" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "b4e3f2d5-a5c6-4d7e-8b2f-c5d9e7a8f0ea", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", - "service": "App Services", + "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": "낮다", - "text": "Application Insights 표준 테스트를 사용하여 웹앱 또는 웹 사이트의 가용성 및 응답성 모니터링", - "waf": "신뢰도" + "text": "검사를 위해 Azure 트래픽을 하이브리드 위치로 보내지 마세요. 대신 'Azure의 트래픽이 Azure에 유지됨' 원칙을 따라 Azure의 리소스 간 통신이 Microsoft 백본 네트워크를 통해 발생하도록 합니다.", + "waf": "공연" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Azure Key Vault를 사용하여 애플리케이션에 필요한 모든 비밀을 저장합니다. Key Vault는 비밀을 저장하기 위한 안전하고 감사된 환경을 제공하며 Key Vault SDK 또는 App Service Key Vault 참조를 통해 App Service와 잘 통합됩니다.", - "guid": "834ac932-223e-4ce8-8b12-3071a5416415", - "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", - "service": "App Services", + "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": "높다", - "text": "Key Vault를 사용하여 비밀 저장", + "text": "Azure Firewall을 사용하여 인터넷에 대한 Azure 아웃바운드 트래픽, HTTP/S가 아닌 인바운드 연결 및 East/West 트래픽 필터링(조직에 필요한 경우)을 제어합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "관리 ID를 사용하여 Key Vault SDK를 사용하거나 App Service Key Vault 참조를 통해 Key Vault에 연결합니다.", - "guid": "833ea3ad-2c2d-4e73-8165-c3acbef4abe1", - "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", - "service": "App Services", - "severity": "높다", - "text": "관리 ID를 사용하여 Key Vault에 연결", + "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": "보통", + "text": "글로벌 Azure Firewall 정책을 만들어 글로벌 네트워크 환경에서 보안 태세를 제어하고 모든 Azure Firewall 인스턴스에 할당합니다. Azure 역할 기반 액세스 제어를 통해 증분 방화벽 정책을 로컬 보안 팀에 위임하여 특정 지역의 요구 사항을 충족하는 세분화된 정책을 허용합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "App Service TLS 인증서를 Key Vault에 저장합니다.", - "guid": "f8d39fda-4776-4831-9c11-5775c2ea55b4", - "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-certificate", - "service": "App Services", + "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": "낮다", + "text": "조직에서 아웃바운드 연결을 보호하기 위해 이러한 솔루션을 사용하려는 경우 Firewall Manager 내에서 지원되는 파트너 SaaS 보안 공급자를 구성합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "안전" + }, + { + "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": "높다", - "text": "Key Vault를 사용하여 TLS 인증서를 저장합니다.", + "text": "응용 프로그램 규칙을 사용하여 지원되는 프로토콜에 대한 대상 호스트 이름에서 아웃바운드 트래픽을 필터링합니다. FQDN 기반 네트워크 규칙 및 DNS 프록시와 함께 Azure Firewall을 사용하여 다른 프로토콜을 통해 인터넷으로의 송신 트래픽을 필터링합니다.", "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "중요한 정보를 처리하는 시스템은 격리해야 합니다. 이렇게 하려면 별도의 App Service 계획 또는 App Service Environment를 사용하고 다른 구독 또는 관리 그룹을 사용하는 것이 좋습니다.", - "guid": "6ad48408-ee72-4734-a475-ba18fdbf590c", - "link": "https://learn.microsoft.com/azure/app-service/overview-hosting-plans", - "service": "App Services", - "severity": "보통", - "text": "민감한 정보를 처리하는 시스템 격리", + "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": "높다", + "text": "Azure Firewall 프리미엄을 사용하여 추가 보안 기능을 사용하도록 설정합니다.", "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "App Service의 로컬 디스크는 암호화되지 않으며 중요한 데이터를 저장해서는 안 됩니다. (예: 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", - "severity": "보통", - "text": "로컬 디스크에 중요한 데이터를 저장하지 마십시오.", + "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": "높다", + "text": "추가 보호를 위해 Azure Firewall 위협 인텔리전스 모드를 경고 및 거부로 구성합니다.", "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "인증된 웹 애플리케이션의 경우 Azure AD 또는 Azure AD B2C와 같이 잘 설정된 ID 공급자를 사용합니다. 선택한 애플리케이션 프레임워크를 활용하여 이 공급자와 통합하거나 App Service 인증/권한 부여 기능을 사용합니다.", - "guid": "919ca0b2-c121-459e-814b-933df574eccc", - "link": "https://learn.microsoft.com/azure/app-service/overview-authentication-authorization", - "service": "App Services", - "severity": "보통", - "text": "인증에 설정된 ID 공급자 사용", + "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": "높다", + "text": "추가 보호를 위해 Azure Firewall IDPS 모드를 거부로 구성합니다.", "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "잘 관리되고 안전한 DevOps 배포 파이프라인과 같이 제어되고 신뢰할 수 있는 환경에서 App Service에 코드를 배포합니다. 이렇게 하면 버전이 제어되지 않고 악성 호스트에서 배포되는 것으로 확인되지 않은 코드를 방지할 수 있습니다.", - "guid": "3f9bcbd4-6826-46ab-aa26-4f9a19aed9c5", - "link": "https://learn.microsoft.com/azure/app-service/deploy-best-practices", - "service": "App Services", + "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": "높다", - "text": "신뢰할 수 있는 환경에서 배포", + "text": "Virtual WAN에 연결되지 않은 VNet의 서브넷의 경우 인터넷 트래픽이 Azure Firewall 또는 네트워크 가상 어플라이언스로 리디렉션되도록 경로 테이블을 연결합니다.", "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "FTP/FTPS 및 WebDeploy/SCM 모두에 대한 기본 인증을 사용 안함으로 설정합니다. 이렇게 하면 이러한 서비스에 대한 액세스가 비활성화되고 배포에 Azure AD 보안 엔드포인트가 사용됩니다. SCM 사이트는 Azure AD 자격 증명을 사용하여 열 수도 있습니다.", - "guid": "5d04c2c3-919c-4a0b-8c12-159e114b933d", - "link": "https://learn.microsoft.com/azure/app-service/deploy-configure-credentials#disable-basic-authentication", - "service": "App Services", - "severity": "높다", - "text": "기본 인증 사용 안 함", - "waf": "안전" + "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": "보통", + "text": "모든 Azure Firewall 배포에 대해 리소스별 대상 테이블을 사용하여 로그를 저장하는 진단 설정을 추가합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "작업" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "가능한 경우 관리 ID를 사용하여 Azure AD 보안 리소스에 연결합니다. 이렇게 할 수 없는 경우 Key Vault에 비밀을 저장하고 대신 관리 ID를 사용하여 Key Vault에 연결합니다.", - "guid": "f574eccc-d9bd-43ba-bcda-3b54eb2eb03d", - "link": "https://learn.microsoft.com/azure/app-service/overview-managed-identity?tabs=portal%2Chttp", - "service": "App Services", - "severity": "높다", - "text": "관리 ID를 사용하여 리소스에 연결", - "waf": "안전" + "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": "중요하다", + "text": "Azure Firewall 클래식 규칙(있는 경우)에서 방화벽 정책으로 마이그레이션합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "작업" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Azure Container Registry에 저장된 이미지를 사용하는 경우 관리 ID를 사용하여 끌어옵니다.", - "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", + "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": "높다", - "text": "관리 ID를 사용하여 컨테이너 끌어오기", + "text": "Azure Firewall 서브넷에 /26 접두사를 사용합니다.", "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "App Service의 진단 설정을 구성하면 모든 원격 분석을 로깅 및 모니터링의 중앙 대상으로 Log Analytics에 보낼 수 있습니다. 이를 통해 HTTP 로그, 애플리케이션 로그, 플랫폼 로그 등과 같은 App Service의 런타임 활동을 모니터링할 수 있습니다.", - "guid": "47768314-c115-4775-a2ea-55b46ad48408", - "link": "https://learn.microsoft.com/azure/app-service/troubleshoot-diagnostic-logs", - "service": "App Services", + "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": "보통", - "text": "Log Analytics에 App Service 런타임 로그 보내기Send App Service runtime logs to Log Analytics", - "waf": "안전" + "text": "방화벽 정책 내의 규칙을 Rule Collection Groups(규칙 컬렉션 그룹) 및 Rule Collections(규칙 컬렉션)로 정렬하고 사용 빈도에 따라 정렬합니다.", + "waf": "공연" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "활동 로그를 Log Analytics에 로깅 및 모니터링의 중앙 대상으로 보내도록 진단 설정을 지정합니다. 이렇게 하면 App Service 리소스 자체에서 컨트롤 플레인 작업을 모니터링할 수 있습니다.", - "guid": "ee72734b-475b-4a18-bdbf-590ce65de8e0", - "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", - "service": "App Services", + "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": "보통", - "text": "Log Analytics에 App Service 활동 로그 보내기Send App Service activity logs to Log Analytics", - "waf": "안전" + "text": "IP 그룹 또는 IP 접두사를 사용하여 IP 테이블 규칙의 수를 줄입니다.", + "waf": "공연" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "지역 VNet 통합, 네트워크 보안 그룹 및 UDR의 조합을 사용하여 아웃바운드 네트워크 액세스를 제어합니다. 트래픽은 Azure Firewall과 같은 NVA로 라우팅되어야 합니다. 방화벽의 로그를 모니터링해야 합니다.", - "guid": "c12159e1-14b9-433d-b574-ecccd9bd3baf", - "link": "https://learn.microsoft.com/azure/app-service/overview-vnet-integration", - "service": "App Services", + "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": "보통", - "text": "아웃바운드 네트워크 액세스를 제어해야 함", - "waf": "안전" + "text": "와일드카드를 DNAT의 소스 IP로 사용하지 마십시오(예: * 또는 any). 들어오는 DNAT에 대한 소스 IP를 지정해야 합니다.", + "waf": "공연" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "VNet 통합을 사용하고 VNet NAT Gateway 또는 NVA와 같은 Azure Firewall을 사용하여 안정적인 아웃바운드 IP를 제공할 수 있습니다. 이렇게 하면 필요한 경우 수신 당사자가 IP를 기반으로 허용 목록을 만들 수 있습니다. Azure 서비스에 대한 통신의 경우 IP 주소에 의존할 필요가 없는 경우가 많으며 서비스 엔드포인트와 같은 메커니즘을 대신 사용해야 합니다. (또한 수신 끝에서 프라이빗 엔드포인트를 사용하면 SNAT가 발생하지 않고 안정적인 아웃바운드 IP 범위를 제공합니다.)", - "guid": "cda3b54e-b2eb-403d-b9a2-582718d2ddb1", - "link": "https://learn.microsoft.com/azure/app-service/networking/nat-gateway-integration", - "service": "App Services", - "severity": "낮다", - "text": "인터넷 주소에 대한 아웃바운드 통신을 위한 안정적인 IP 보장", - "waf": "안전" + "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": "보통", + "text": "SNAT 포트 사용량을 모니터링하고, NAT 게이트웨이 설정을 평가하고, 원활한 장애 조치(failover)를 보장하여 SNAT 포트 고갈을 방지합니다. 포트 수가 제한에 가까워지면 SNAT 고갈이 임박했을 수 있다는 신호입니다.", + "waf": "공연" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "App Service 액세스 제한, 서비스 엔드포인트 또는 프라이빗 엔드포인트의 조합을 사용하여 인바운드 네트워크 액세스를 제어합니다. 웹앱 자체 및 SCM 사이트에 대해 서로 다른 액세스 제한이 필요하고 구성될 수 있습니다.", - "guid": "0725769e-e669-41a4-a34a-c932223ece80", - "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", - "service": "App Services", + "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": "높다", - "text": "인바운드 네트워크 액세스를 제어해야 합니다.", - "waf": "안전" + "text": "Azure Firewall 프리미엄을 사용하는 경우 TLS 검사를 사용하도록 설정합니다.", + "waf": "공연" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Application Gateway 또는 Azure Front Door와 같은 Web Application Firewall을 사용하여 악의적인 인바운드 트래픽으로부터 보호합니다. WAF의 로그를 모니터링해야 합니다.", - "guid": "b123071a-5416-4415-a33e-a3ad2c2de732", - "link": "https://learn.microsoft.com/azure/app-service/networking/app-gateway-with-service-endpoints", - "service": "App Services", - "severity": "높다", - "text": "App Service 앞에서 WAF 사용Use a WAF in front of App Service", - "waf": "안전" + "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": "낮다", + "text": "웹 범주를 사용하여 특정 주제에 대한 아웃바운드 액세스를 허용하거나 거부할 수 있습니다.", + "waf": "공연" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "WAF에 대한 액세스만 잠궈 WAF를 우회할 수 없는지 확인합니다. 액세스 제한, 서비스 엔드포인트 및 프라이빗 엔드포인트의 조합을 사용합니다.", - "guid": "165c3acb-ef4a-4be1-b8d3-9fda47768314", - "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", - "service": "App Services", - "severity": "높다", - "text": "WAF가 우회되지 않도록 방지", - "waf": "안전" + "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": "보통", + "text": "TLS 검사의 일환으로 검사를 위해 Azure App Gateway에서 트래픽을 수신하도록 계획합니다.", + "waf": "공연" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "App Service 구성에서 최소 TLS 정책을 1.2로 설정합니다.", - "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", + "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": "보통", - "text": "최소 TLS 정책을 1.2로 설정합니다.", + "text": "Azure Firewall DNS 프록시 구성을 사용하도록 설정합니다.", "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "HTTPS만 사용하도록 App Service를 구성합니다. 이로 인해 App Service가 HTTP에서 HTTPS로 리디렉션됩니다. 코드 또는 WAF에서 HSTS(HTTP Strict Transport Security)를 사용하여 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", + "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": "높다", - "text": "HTTPS만 사용", - "waf": "안전" + "text": "Azure Firewall을 Azure Monitor와 통합하고 진단 로깅을 사용하도록 설정하여 방화벽 로그를 저장하고 분석합니다.", + "waf": "작업" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "CORS 구성에서 와일드카드를 사용하면 모든 원본이 서비스에 액세스할 수 있으므로 CORS의 목적에 어긋나므로 사용하지 마세요. 특히 서비스에 액세스할 수 있을 것으로 예상되는 원본만 허용합니다.", - "guid": "68266abc-a264-4f9a-89ae-d9c55d04c2c3", - "link": "https://learn.microsoft.com/azure/app-service/app-service-web-tutorial-rest-api", - "service": "App Services", - "severity": "높다", - "text": "와일드카드는 CORS에 사용할 수 없습니다.", - "waf": "안전" + "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": "낮다", + "text": "방화벽 규칙에 대한 백업 구현Implement backups for your firewall rules", + "waf": "작업" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "원격 디버깅은 서비스에서 추가 포트를 열어 공격 노출 영역을 증가시키므로 프로덕션에서 켜면 안 됩니다. 서비스는 48시간 후에 자동으로 원격 디버깅을 설정합니다.", - "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", + "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": "높다", - "text": "원격 디버깅 끄기", + "text": "컨트롤 플레인 트래픽을 차단하는 0.0.0.0/0 경로 또는 NSG 규칙과 같이 가상 네트워크에 삽입된 Azure PaaS 서비스에 대한 컨트롤 플레인 통신을 중단하지 마세요.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "App Service용 Defender를 사용하도록 설정합니다. 이는 다른 위협 중에서도 알려진 악성 IP 주소에 대한 통신을 탐지합니다. 작업의 일부로 App Service용 Defender의 권장 사항을 검토합니다.", - "guid": "18d2ddb1-0725-4769-be66-91a4834ac932", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-app-service-introduction", - "service": "App Services", + "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": "보통", - "text": "클라우드용 Defender 사용 - App Service용 Defender", + "text": "프라이빗 엔드포인트 및 ExpressRoute 프라이빗 피어링을 통해 온-프레미스에서 Azure PaaS 서비스에 액세스하세요. 이 방법을 사용하면 공용 인터넷을 통해 전송되지 않습니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Azure는 네트워크에서 DDoS 기본 보호를 제공하며, 정상적인 트래픽 패턴을 학습하고 비정상적인 동작을 감지할 수 있는 지능형 DDoS 표준 기능으로 개선할 수 있습니다. DDoS 표준은 Virtual Network에 적용되므로 Application Gateway 또는 NVA와 같은 앱 앞의 네트워크 리소스에 대해 구성해야 합니다.", - "guid": "223ece80-b123-4071-a541-6415833ea3ad", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "App Services", - "severity": "보통", - "text": "WAF VNet에서 DDOS 보호 표준 사용Enable DDOS Protection Standard on the WAF VNet", + "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": "높다", + "text": "모든 서브넷에서 기본적으로 가상 네트워크 서비스 엔드포인트를 사용하도록 설정하지 마세요.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Azure Container Registry에 저장된 이미지를 사용하는 경우 프라이빗 엔드포인트 및 앱 설정 'WEBSITE_PULL_IMAGE_OVER_VNET'를 사용하여 Azure Container Registry에서 가상 네트워크를 통해 끌어옵니다.", - "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", + "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": "보통", - "text": "Virtual Network를 통해 컨테이너 끌어오기", + "text": "Azure Firewall 또는 NVA의 IP 주소 대신 FQDN을 사용하여 Azure PaaS 서비스에 대한 송신 트래픽을 필터링하여 데이터 반출을 방지합니다. Private Link를 사용하는 경우 모든 FQDN을 차단할 수 있으며, 그렇지 않으면 필요한 PaaS 서비스만 허용할 수 있습니다.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "참여의 침투 테스트 규칙에 따라 웹 응용 프로그램에 대한 침투 테스트를 수행합니다.", - "guid": "eb2eb03d-d9a2-4582-918d-2ddb10725769", - "link": "https://learn.microsoft.com/azure/security/fundamentals/pen-testing", - "service": "App Services", - "severity": "보통", - "text": "침투 테스트 수행", + "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": "높다", + "text": "게이트웨이 서브넷에 /27 이상의 접두사를 사용합니다.", "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "DevSecOps 사례에 따라 취약성을 검증하고 검사한 신뢰할 수 있는 코드를 배포합니다.", - "guid": "19aed9c5-5d04-4c2c-9919-ca0b2c12159e", - "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/devsecops-in-azure", - "service": "App Services", - "severity": "보통", - "text": "유효성이 검사된 코드 배포", + "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": "높다", + "text": "VirtualNetwork 서비스 태그를 사용하여 연결을 제한하는 NSG 인바운드 기본 규칙에 의존하지 마세요.", "waf": "안전" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "지원되는 플랫폼, 프로그래밍 언어, 프로토콜 및 프레임워크의 최신 버전을 사용합니다.", - "guid": "114b933d-f574-4ecc-ad9b-d3bafcda3b54", - "link": "https://learn.microsoft.com/azure/app-service/overview-patch-os-runtime", - "service": "App Services", - "severity": "높다", - "text": "최신 플랫폼, 언어, 프로토콜 및 프레임워크 사용", + "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": "보통", + "text": "NSG를 사용하여 서브넷 간의 트래픽과 플랫폼 전체의 동쪽/서쪽 트래픽(랜딩 존 간 트래픽)을 보호할 수 있습니다.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "높다", - "text": "공명형 AI를 위한 Metaprompting 가드레일 따르기", - "waf": "운영 우수성" + "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": "보통", + "text": "NSG 및 애플리케이션 보안 그룹을 사용하여 랜딩 존 내의 트래픽을 마이크로 세그먼트화하고 중앙 NVA를 사용하여 트래픽 흐름을 필터링하지 않도록 합니다.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", - "link": "https://github.com/Azure-Samples/AI-Gateway", - "service": "Azure OpenAI", - "severity": "높다", - "text": "더 나은 속도 제한, 부하 분산, 인증 및 로깅을 위해 APIM 또는 AI Central과 같은 솔루션을 사용하여 게이트웨이 패턴을 고려합니다.", - "waf": "운영 우수성" + "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": "보통", + "text": "VNet 흐름 로그를 사용하도록 설정하고 트래픽 분석에 제공하여 내부 및 외부 트래픽 흐름에 대한 인사이트를 얻을 수 있습니다.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "높다", - "text": "AOAI 인스턴스에 대한 모니터링 활성화", - "waf": "운영 우수성" + "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": "보통", + "text": "1,000개의 규칙 제한으로 인해 NSG당 900개 이상의 NSG 규칙을 구현하지 마세요.", + "training": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "697cb391-ed16-4b2d-886f-0a0241addde6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", - "service": "Azure OpenAI", - "severity": "높다", - "text": "리소스에 대해 수행된 작업(예: 구독 키 다시 생성) 또는 메트릭 임계값(예: 한 시간에 10을 초과하는 오류 수)에 의해 생성된 활동 로그의 항목과 같은 이벤트를 팀에 알리는 경고를 만듭니다", - "waf": "운영 우수성" + "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": "보통", + "text": "시나리오가 Virtual WAN 라우팅 디자인 목록에 명시적으로 설명된 경우 Virtual WAN을 사용합니다.", + "training": "https://learn.microsoft.com/learn/modules/introduction-azure-virtual-wan/", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", - "severity": "높다", - "text": "용량으로 인한 서비스 중단을 방지하기 위해 토큰 사용량을 모니터링합니다.", - "waf": "운영 우수성" + "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": "보통", + "text": "Azure 지역당 Virtual WAN 허브를 사용하여 공통 글로벌 Azure Virtual WAN을 통해 Azure 지역 간에 여러 랜딩 존을 함께 연결합니다.", + "waf": "공연" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", + "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": "보통", - "text": "처리된 추론 토큰, 생성된 완료 토큰, 속도 제한 모니터링과 같은 메트릭 관찰", - "waf": "운영 우수성" + "text": "아웃바운드 인터넷 트래픽 보호 및 필터링을 위해 보안 허브에 Azure Firewall을 배포합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "낮다", - "text": "진단이 충분하지 않은 경우 Azure OpenAI 앞에 있는 Azure API Managements와 같은 게이트웨이를 사용하여 허용되는 경우 들어오는 프롬프트와 나가는 응답을 모두 기록하는 것이 좋습니다", - "waf": "운영 우수성" + "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": "보통", + "text": "Virtual WAN 네트워크 아키텍처가 식별된 아키텍처 시나리오에 맞는지 확인합니다.", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", - "link": "https://github.com/Azure-Samples/openai-enterprise-iac", - "service": "Azure OpenAI", - "severity": "높다", - "text": "Infrastructure as code를 사용하여 Azure OpenAI Service, 모델 배포 및 모든 관련 리소스를 배포합니다", - "waf": "운영 우수성" + "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": "보통", + "text": "Virtual WAN용 Azure Monitor Insights를 사용하여 Virtual WAN의 엔드투엔드 토폴로지, 상태 및 주요 메트릭을 모니터링합니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "4350d092-d234-4292-a752-8537a551c5bf", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "Azure OpenAI", - "severity": "높다", - "text": "API 키 대신 관리 ID로 Microsoft Entra 인증 사용", - "waf": "안전" + "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": "보통", + "text": "이러한 흐름을 명시적으로 차단해야 하는 경우가 아니면 Virtual WAN에서 분기 간 트래픽을 사용하지 않도록 설정하지 마세요.", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "높다", - "text": "입력과 정답이 있는 알려진 골든 데이터 세트를 사용하여 시스템의 성능/정확도를 평가합니다. 평가를 위해 PromptFlow의 기능을 활용합니다.", - "waf": "운영 우수성" + "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": "보통", + "text": "AS-Path는 ExpressRoute 또는 VPN보다 유연하므로 허브 라우팅 기본 설정으로 사용합니다.", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "높다", - "text": "프로비저닝된 처리량 모델의 사용 평가 ", - "waf": "공연" + "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": "보통", + "text": "Virtual WAN에서 레이블 기반 전파를 구성하지 않으면 가상 허브 간의 연결이 손상됩니다.", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", - "service": "Azure OpenAI", + "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": "높다", - "text": "Azure AI 콘텐츠 안전성 검토 및 구현", - "waf": "운영 우수성" + "text": "가상 허브에 /23 접두사 이상을 할당하여 충분한 IP 공간을 사용할 수 있도록 합니다.", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1193846d-697c-4b39-8ed1-6b2d186f0a02", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#system-level-throughput", - "service": "Azure OpenAI", + "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": "높다", - "text": "분당 토큰 및 응답을 기반으로 시스템의 처리량을 정의 및 평가하고 요구 사항에 맞춥니다.", - "waf": "공연" + "text": "Azure Policy를 전략적으로 활용하고, 정책 이니셔티브를 사용하여 관련 정책을 그룹화하여 환경에 대한 컨트롤을 정의합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", - "service": "Azure OpenAI", + "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": "보통", - "text": "토큰 크기, 스트리밍 옵션을 제한하여 시스템의 대기 시간을 개선합니다.", - "waf": "공연" + "text": "규정 및 규정 준수 요구 사항을 Azure Policy 정의 및 Azure 역할 할당에 매핑합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", - "service": "Azure OpenAI", + "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": "보통", - "text": "탄력성 요구를 예측하여 우선 순위에 따라 동기 및 일괄 처리 요청 분리를 결정합니다. 우선 순위가 높은 경우 동기 접근 방식을 사용하고 낮은 우선 순위의 경우 큐를 사용한 비동기 일괄 처리가 선호됩니다", - "waf": "공연" + "text": "상속된 범위에서 할당할 수 있도록 중간 루트 관리 그룹에서 Azure Policy 정의를 설정합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "5bda4332-4f24-4811-9331-82ba51752694", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", + "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": "높다", - "text": "소비자의 예상 수요를 기반으로 토큰 사용 요구 사항을 벤치마킹합니다. 프로비저닝된 처리량 단위 배포를 사용하는 경우 처리량의 유효성을 검사하는 데 도움이 되도록 Azure OpenAI 벤치마킹 도구를 사용하는 것이 좋습니다", - "waf": "공연" + "text": "필요한 경우 최하위 수준에서 제외를 사용하여 가장 적절한 수준에서 정책 할당을 관리합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "보통", - "text": "PTU(프로비저닝된 처리량 단위)를 사용하는 경우 오버플로 요청에 대한 TPM(분당 토큰) 배포를 배포하는 것이 좋습니다. 게이트웨이를 사용하여 PTU 제한에 도달할 때 TPM 배포로 요청을 라우팅합니다.", - "waf": "공연" + "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": "낮다", + "text": "Azure Policy를 사용하여 사용자가 구독/관리 그룹 수준에서 프로비전할 수 있는 서비스를 제어합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", - "service": "Azure OpenAI", + "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": "높다", - "text": "올바른 작업에 적합한 모델을 선택하십시오. 속도, 응답 품질 및 출력 복잡성 간에 적절한 절충점이 있는 모델 선택", - "waf": "공연" + "text": "가능한 경우 기본 제공 정책을 사용하여 운영 오버헤드를 최소화합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e9951904-8384-45c9-a6cb-2912156a1147", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "description": "Resource Policy Contributor 역할을 특정 범위에 할당하면 정책 관리를 관련 팀에 위임할 수 있습니다. 예를 들어 중앙 IT 팀은 관리 그룹 수준 정책을 감독하고 응용 프로그램 팀은 구독에 대한 정책을 처리하여 조직 표준을 준수하는 분산 거버넌스를 가능하게 할 수 있습니다.", + "guid": "3f988795-25d6-4268-a6d7-0ba6c97be995", + "link": "https://learn.microsoft.com/azure/governance/policy/overview#azure-rbac-permissions-in-azure-policy", + "service": "Policy", "severity": "보통", - "text": "미세 조정으로 모델 성능이 향상되었는지 여부를 파악하기 위해 미세 조정 없이 성능에 대한 기준이 있습니다.", - "waf": "공연" + "text": "특정 범위에서 기본 제공 Resource Policy Contributor 역할을 할당하여 응용 프로그램 수준 거버넌스를 사용하도록 설정합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "낮다", - "text": "여러 지역에 여러 OAI 인스턴스 배포", - "waf": "신뢰도" + "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": "보통", + "text": "상속된 범위에서 제외를 통해 관리하지 않도록 루트 관리 그룹 범위에서 수행된 Azure Policy 할당 수를 제한합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "높다", - "text": "APIM과 같은 게이트웨이 패턴을 사용하여 재시도 및 상태 확인 구현Implement retry & healthchecks with gateway pattern like APIM", - "waf": "신뢰도" + "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": "보통", + "text": "데이터 주권 요구 사항이 있는 경우 이를 적용하기 위해 Azure 정책을 배포해야 합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "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": "보통", - "text": "워크로드에 대한 TPM 및 RPM의 적절한 할당량이 있는지 확인합니다.", - "waf": "신뢰도" + "text": "Sovereign Landing Zone의 경우 주권 정책 기준을 배포하고 올바른 관리 그룹 수준에서 할당합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", - "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", - "service": "Azure OpenAI", + "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": "보통", - "text": "HAI 도구 키트 지침의 고려 사항을 검토하고 slution에 대한 이러한 상호 작용 방법을 적용합니다", - "waf": "운영 우수성" + "text": "Sovereign Landing Zone의 경우 정책 매핑에 대한 Sovereign Control 목표를 문서화합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7f154e3a-a369-4282-ae7e-316183687a04", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", - "service": "Azure OpenAI", + "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": "보통", - "text": "미세 조정이 사용되는 경우 지역 간에 별도의 미세 조정된 모델을 배포합니다.", - "waf": "신뢰도" + "text": "Sovereign Landing Zone의 경우 '정책 매핑에 대한 Sovereign Control 목표'를 관리하기 위한 프로세스가 마련되어 있는지 확인합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "77a1f893-5bda-4433-84f2-4811633182ba", - "link": "https://learn.microsoft.com/azure/backup/backup-overview", - "service": "Azure OpenAI", + "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": "보통", - "text": "중요한 데이터를 정기적으로 백업 및 복제하여 데이터 손실 또는 시스템 장애 발생 시 데이터 가용성과 복구 가능성을 보장합니다. Azure의 백업 및 재해 복구 서비스를 활용하여 데이터를 보호하세요.", - "waf": "신뢰도" + "text": "Azure RBAC(Azure 역할 기반 액세스 제어), 데이터 주권 요구 사항 또는 데이터 보존 정책에 따라 별도의 작업 영역이 필요한 경우를 제외하고 단일 모니터 로그 작업 영역을 사용하여 플랫폼을 중앙에서 관리합니다.", + "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "높다", - "text": "SLA를 갖도록 Azure AI 검색 서비스 계층을 선택해야 합니다. ", - "waf": "신뢰도" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", - "link": "https://learn.microsoft.com/purview/purview", - "service": "Azure OpenAI", - "severity": "낮다", - "text": "임베딩을 생성하기 전에 데이터 및 민감도를 분류하고 Microsoft Purview를 사용하여 레이블을 지정하고 생성된 임베딩을 동일한 민감도 및 분류로 처리해야 합니다", - "waf": "안전" + "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": "높다", + "text": "로그 보존 요구 사항이 12년을 초과하는 경우 로그를 Azure Storage로 내보냅니다. Write-once, Read-Many 정책과 함께 변경할 수 없는 스토리지를 사용하여 사용자가 지정한 간격 동안 데이터를 지우거나 수정할 수 없도록 합니다.", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "4fda1dbf-3dd9-45d4-ac7c-891dca1f6d56", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/use-your-data-securely", - "service": "Azure OpenAI", - "severity": "높다", - "text": "BYOK(옵션)를 사용한 SSE/디스크 암호화로 RAG에 사용되는 데이터 암호화", - "waf": "안전" + "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": "보통", + "text": "Azure Policy를 사용하여 OS 수준 VM(가상 머신) 구성 드리프트를 모니터링합니다. 정책을 통해 Azure Automanage Machine Configuration 감사 기능을 사용하도록 설정하면 애플리케이션 팀 워크로드가 적은 노력으로 기능 기능을 즉시 사용할 수 있습니다.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", - "link": "https://learn.microsoft.com/azure/search/search-security-overview", - "service": "Azure OpenAI", - "severity": "높다", - "text": "데이터 소스 간 전송 중인 데이터, RAG(Retrieval-Augmented Generation) 및 LLM 통신에 사용되는 AI 검색에 TLS가 적용되는지 확인합니다.", - "waf": "안전" + "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": "보통", + "text": "Azure Update Manager를 Azure의 Windows 및 Linux VM에 대한 패치 메커니즘으로 사용합니다.", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7b94ef6e-047d-42ea-8992-b1cd6e2054b2", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "Azure OpenAI", - "severity": "높다", - "text": "RBAC를 사용하여 Azure OpenAI 서비스에 대한 액세스를 관리합니다. 사용자에게 적절한 권한을 할당하고 사용자의 역할과 책임에 따라 액세스를 제한합니다.", - "waf": "안전" + "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": "보통", + "text": "Azure Arc를 사용하여 Azure 외부의 Windows 및 Linux VM에 대한 패치 메커니즘으로 Azure Update Manager를 사용합니다.", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", - "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", - "service": "Azure OpenAI", + "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": "보통", - "text": "데이터 암호화, 마스킹 또는 수정 기술을 구현하여 비프로덕션 환경에서 또는 테스트 또는 문제 해결을 위해 데이터를 공유할 때 민감한 데이터를 숨기거나 난독화된 값으로 대체합니다.", - "waf": "안전" + "text": "Network Watcher를 사용하여 트래픽 흐름을 사전에 모니터링합니다.", + "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", - "service": "Azure OpenAI", - "severity": "높다", - "text": "Azure Defender를 활용하여 보안 위협을 탐지 및 대응하고 의심스러운 활동 또는 위반을 식별하기 위한 모니터링 및 경고 메커니즘을 설정합니다. 고급 위협 탐지 및 대응을 위해 Azure Sentinel 활용", - "waf": "안전" + "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": "보통", + "text": "인사이트 및 보고를 위해 Azure Monitor 로그를 사용합니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "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": "보통", - "text": "규정 준수 규정을 준수하기 위해 데이터 보존 및 폐기 정책을 수립합니다. 더 이상 필요하지 않은 데이터에 대한 안전한 삭제 방법을 구현하고 데이터 보존 및 폐기 활동에 대한 감사 추적을 유지 관리합니다.", - "waf": "안전" + "text": "Azure Monitor 경고를 사용하여 운영 경고를 생성합니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", - "service": "Azure OpenAI", - "severity": "높다", - "text": "Content Safety를 사용하여 Prompt shields 및 groundedness detection 구현 ", - "waf": "운영 우수성" + "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": "보통", + "text": "Azure Automation 계정을 통해 변경 및 인벤토리 추적을 사용하는 경우 Log Analytics 작업 영역과 자동화 계정을 함께 연결하는 데 지원되는 지역을 선택했는지 확인합니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", - "link": "https://learn.microsoft.com/azure/compliance/", - "service": "Azure OpenAI", - "severity": "높다", - "text": "개인 정보 보호 제어를 구현하고 데이터 처리 활동에 필요한 동의 또는 권한을 얻어 GDPR 또는 HIPAA와 같은 관련 데이터 보호 규정을 준수하도록 합니다.", - "waf": "안전" + "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": "낮다", + "text": "Azure Backup을 사용하는 경우 기본 설정은 GRS이므로 백업에 올바른 백업 유형(GRS, ZRS & LRS)을 사용합니다.", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", - "service": "Azure OpenAI", + "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": "보통", - "text": "데이터 보안 모범 사례, 데이터 안전한 처리의 중요성, 데이터 침해와 관련된 잠재적 위험에 대해 직원을 교육합니다. 데이터 보안 프로토콜을 성실히 따르도록 권장합니다.", + "text": "Azure 게스트 정책을 사용하여 VM 확장을 통해 소프트웨어 구성을 자동으로 배포하고 규격 기준 VM 구성을 적용합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", - "service": "Azure OpenAI", - "severity": "높다", - "text": "생산 데이터를 개발 및 테스트 데이터와 분리합니다. 프로덕션에서는 실제 민감한 데이터만 사용하고 개발 및 테스트 환경에서는 익명 또는 합성 데이터를 활용합니다.", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "description": "Azure Policy의 게스트 구성 기능을 사용하여 컴퓨터 설정(예: OS, 애플리케이션, 환경)을 감사하고 수정하여 리소스가 예상 구성에 맞게 조정되도록 하고, 업데이트 관리는 VM에 대한 패치 관리를 적용할 수 있습니다.", + "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": "보통", + "text": "Azure Policy를 통해 VM 보안 구성 드리프트를 모니터링합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", - "service": "Azure OpenAI", + "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": "보통", - "text": "데이터 민감도 수준이 다양하다면 각 수준에 대해 별도의 인덱스를 만드는 것이 좋습니다. 예를 들어, 일반 데이터에 대한 인덱스와 민감한 데이터에 대한 인덱스가 있을 수 있으며, 각각 다른 액세스 프로토콜에 의해 제어됩니다", - "waf": "안전" + "text": "Azure-to-Azure Virtual Machines 재해 복구 시나리오에는 Azure Site Recovery를 사용합니다. 이렇게 하면 지역 간에 워크로드를 복제할 수 있습니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", - "service": "Azure OpenAI", + "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": "보통", - "text": "한 단계 더 나아가 중요한 데이터 세트를 서비스의 다른 인스턴스에 배치합니다. 각 인스턴스는 고유한 특정 RBAC 정책 집합으로 제어할 수 있습니다", - "waf": "안전" + "text": "Azure 네이티브 백업 기능 또는 Azure 호환 타사 백업 솔루션을 사용합니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", - "service": "Azure OpenAI", + "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": "높다", - "text": "민감한 정보에서 생성된 임베딩과 벡터는 그 자체로 민감하다는 점을 인식해야 합니다. 이 데이터에는 원본 자료와 동일한 보호 조치가 제공되어야 합니다", - "waf": "안전" + "text": "Azure Front Door 및 Azure Application Gateway와 같은 애플리케이션 배달 서비스에서 WAF 로그를 저장하는 진단 설정을 추가합니다. 로그를 정기적으로 검토하여 공격 및 가양성 탐지를 확인합니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3571449a-b805-43d8-af89-dc7b33be2a1a", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "Azure OpenAI", - "severity": "높다", - "text": "임베딩 및 벡터가 있는 데이터 저장소에 RBAC를 적용하고 역할의 액세스 요구 사항에 따라 액세스 범위를 지정합니다.", - "waf": "안전" + "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": "보통", + "text": "Azure Front Door 및 Azure Application Gateway와 같은 애플리케이션 배달 서비스에서 Microsoft Sentinel로 WAF 로그를 보냅니다. 공격을 탐지하고 WAF 텔레메트리를 전체 Azure 환경에 통합합니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "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": "높다", - "text": "AI 서비스에 대한 프라이빗 엔드포인트를 구성하여 네트워크 내 서비스 액세스를 제한합니다.", + "text": "Azure Key Vault를 사용하여 비밀과 자격 증명을 저장합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", - "service": "Azure OpenAI", - "severity": "높다", - "text": "Azure Firewall 및 UDR을 사용하여 엄격한 인바운드 및 아웃바운드 트래픽 제어를 적용하고 외부 통합 지점을 제한합니다.", + "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": "보통", + "text": "서로 다른 애플리케이션 및 지역에 대해 서로 다른 Azure Key Vault를 사용하여 트랜잭션 규모 제한을 방지하고 비밀에 대한 액세스를 제한합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", - "service": "Azure OpenAI", - "severity": "높다", - "text": "네트워크 세분화 및 액세스 제어를 구현하여 LLM 애플리케이션에 대한 액세스를 인증된 사용자 및 시스템으로만 제한하고 측면 이동을 방지합니다.", + "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": "보통", + "text": "삭제된 개체에 대한 보존 보호를 허용하기 위해 일시 삭제 및 제거 정책을 사용하도록 설정된 Azure Key Vault를 프로비전합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", - "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", - "service": "Azure OpenAI", + "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": "보통", - "text": "LLMLingua 또는 gprtrim과 같은 프롬프트 압축 도구 사용", - "waf": "비용 최적화" + "text": "키, 비밀 및 인증서를 영구적으로 삭제할 수 있는 권한 부여를 특수 사용자 지정 Microsoft Entra ID 역할로 제한하여 최소 권한 모델을 따릅니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "Azure OpenAI", - "severity": "높다", - "text": "LLM 애플리케이션에서 사용하는 API 및 엔드포인트가 관리 ID, API 키 또는 OAuth와 같은 인증 및 권한 부여 메커니즘으로 적절하게 보호되어 무단 액세스를 방지해야 합니다.", + "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": "보통", + "text": "공용 인증 기관을 통해 인증서 관리 및 갱신 프로세스를 자동화하여 관리를 용이하게 합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "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": "보통", - "text": "다단계 인증(multi-factor authentication)과 같은 강력한 최종 사용자 인증 메커니즘을 적용하여 LLM 애플리케이션 및 관련 네트워크 리소스에 대한 무단 액세스를 방지합니다.", + "text": "키 및 인증서 교체를 위한 자동화된 프로세스를 설정합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "93555620-2bfe-4456-9b0d-834a348b263e", - "service": "Azure OpenAI", + "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": "보통", - "text": "네트워크 모니터링 도구를 구현하여 의심스럽거나 악의적인 활동에 대한 네트워크 트래픽을 탐지하고 분석합니다. 로깅을 활성화하여 네트워크 이벤트를 캡처하고 보안 사고 발생 시 포렌식 분석을 용이하게 합니다.", + "text": "자격 증명 모음에서 방화벽 및 가상 네트워크 서비스 엔드포인트 또는 프라이빗 엔드포인트를 사용하도록 설정하여 키 자격 증명 모음에 대한 액세스를 제어합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", - "service": "Azure OpenAI", + "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": "보통", - "text": "보안 감사 및 침투 테스트를 수행하여 LLM 애플리케이션의 네트워크 인프라에서 네트워크 보안 약점 또는 취약성을 식별하고 해결합니다.", + "text": "플랫폼 중앙 Azure Monitor Log Analytics 작업 영역을 사용하여 Key Vault의 각 인스턴스 내에서 키, 인증서 및 비밀 사용을 감사합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", - "service": "Azure OpenAI", - "severity": "낮다", - "text": "Azure AI 서비스는 더 나은 관리를 위해 적절하게 태그가 지정됩니다.", - "waf": "운영 우수성" + "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": "보통", + "text": "Key Vault 인스턴스화 및 권한 있는 액세스를 위임하고 Azure Policy를 사용하여 일관된 규정 준수 구성을 적용합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", - "service": "Azure OpenAI", - "severity": "낮다", - "text": "Azure AI Service 계정은 조직의 명명 규칙을 따릅니다.", - "waf": "운영 우수성" + "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": "보통", + "text": "애플리케이션별, 환경별, 지역별 Azure Key Vault를 사용합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", - "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", - "service": "Azure OpenAI", - "severity": "높다", - "text": "Azure AI Services 리소스의 진단 로그를 사용하도록 설정해야 함", - "waf": "운영 우수성" + "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": "보통", + "text": "사용자 고유의 키를 가져오려는 경우 고려되는 모든 서비스에서 지원되지 않을 수 있습니다. 불일치가 원하는 결과를 방해하지 않도록 관련 완화를 구현합니다. 대기 시간을 최소화하는 적절한 지역 쌍과 재해 복구 지역을 선택합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", - "link": "https://learn.microsoft.com/azure/ai-services/authentication", - "service": "Azure OpenAI", - "severity": "높다", - "text": "키 액세스(로컬 인증)는 보안을 위해 사용하지 않도록 설정하는 것이 좋습니다. 키 기반 액세스를 사용하지 않도록 설정하면 Microsoft Entra ID가 유일한 액세스 방법이 되어 최소 권한 원칙과 세분화된 제어를 유지할 수 있습니다. ", + "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": "보통", + "text": "Sovereign Landing Zone의 경우 Azure Key Vault 관리형 HSM을 사용하여 비밀과 자격 증명을 저장합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Azure OpenAI", - "severity": "높다", - "text": "Azure Key Vault를 사용하여 키를 안전하게 저장하고 관리하세요. LLM 애플리케이션의 코드 내에 중요한 키를 하드 코딩하거나 포함하지 않도록 하고 관리 ID를 사용하여 Azure Key Vault에서 안전하게 검색합니다.", + "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": "보통", + "text": "Microsoft Entra ID 보고 기능을 사용하여 액세스 제어 감사 보고서를 생성합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", - "service": "Azure OpenAI", + "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": "높다", - "text": "Azure Key Vault에 저장된 키를 정기적으로 회전하고 만료하여 무단 액세스의 위험을 최소화합니다.", + "text": "모든 구독에 대해 Defender 클라우드 보안 태세 관리를 사용하도록 설정합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "adfe27be-e297-401a-a352-baaab79b088d", - "link": "https://github.com/openai/tiktoken", - "service": "Azure OpenAI", + "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": "높다", - "text": "tiktoken을 사용하여 대화 모드에서 토큰 최적화를 위한 토큰 크기 이해", - "waf": "비용 최적화" + "text": "모든 구독에서 서버에 대해 Defender 클라우드 워크로드 보호 계획을 사용하도록 설정합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", - "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", - "service": "Azure OpenAI", + "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": "높다", - "text": "보안 코딩 관행에 따라 주입 공격, XSS(교차 사이트 스크립팅) 또는 보안 구성 오류와 같은 일반적인 취약성을 방지합니다", + "text": "모든 구독에서 Azure 리소스에 대한 Defender 클라우드 워크로드 보호 계획을 사용하도록 설정합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "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": "높다", - "text": "LLM 라이브러리와 다른 시스템 컴포넌트를 정기적으로 업데이트하고 패치하는 프로세스를 설정합니다.", + "text": "IaaS 서버에서 Endpoint Protection을 사용하도록 설정합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e29711b1-352b-4eee-879b-588defc4972c", - "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", - "service": "Azure OpenAI", - "severity": "높다", - "text": "Azure OpenAI 또는 기타 LLM 사용 약관, 정책 및 지침, 허용되는 사용 사례 준수", - "waf": "운영 우수성" + "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": "보통", + "text": "Azure Monitor 로그 및 클라우드용 Defender를 통해 기본 운영 체제 패치 드리프트를 모니터링합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "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": "보통", - "text": "기본 모델과 미세 조정된 모델 및 토큰 단계 크기의 비용 차이를 이해합니다.", - "waf": "비용 최적화" + "text": "기본 리소스 구성을 중앙 집중식 Azure Monitor Log Analytics 작업 영역에 연결합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", - "service": "Azure OpenAI", - "severity": "높다", - "text": "가능한 경우 호출당 오버헤드를 최소화하여 전체 비용을 줄일 수 있는 일괄 처리 요청. 배치 크기를 최적화해야 합니다.", - "waf": "비용 최적화" + "checklist": "Azure Landing Zone Review", + "guid": "1761e147-f65e-4d09-bbc2-f464f23e2eba", + "link": "https://learn.microsoft.com/industry/sovereignty/transparency-logs", + "service": "Entra", + "severity": "보통", + "text": "Sovereign Landing Zone의 경우 Entra ID 테넌트에서 투명 로그를 사용하도록 설정합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", - "service": "Azure OpenAI", + "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": "보통", - "text": "모델 사용을 모니터링하는 비용 추적 시스템을 설정하고 해당 정보를 사용하여 모델 선택 및 프롬프트 크기를 알립니다", - "waf": "비용 최적화" + "text": "Sovereign Landing Zone의 경우 Entra ID 테넌트에서 고객 Lockbox를 사용하도록 설정합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "보통", - "text": "모델 응답당 토큰 수에 대한 최대 제한을 설정합니다. 유효한 응답에 사용할 수 있을 만큼 충분히 큰지 확인하기 위해 크기를 최적화합니다", - "waf": "비용 최적화" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", - "link": "https://learn.microsoft.com/azure/search/search-reliability", - "service": "Azure OpenAI", - "severity": "보통", - "text": "안정성을 위한 AI 검색 설정에 대해 제공된 지침을 검토합니다.", - "waf": "운영 우수성" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3266b225-86f4-4a16-92bd-ddea8a487cde", - "link": "https://learn.microsoft.com/azure/search/vector-search-index-size?tabs=portal-vector-quota", - "service": "Azure OpenAI", - "severity": "보통", - "text": "AI Search Vector 스토리지 계획 및 관리", - "waf": "운영 우수성" + "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": "높다", + "text": "스토리지 계정에 대한 보안 전송을 사용하도록 설정합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "보통", - "text": "LLMOps 사례를 적용하여 GenAI 애플리케이션의 라이프사이클 관리를 자동화합니다.", - "waf": "운영 우수성" + "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": "높다", + "text": "스토리지 계정에 대해 컨테이너 일시 삭제를 사용하도록 설정하여 삭제된 컨테이너와 해당 콘텐츠를 복구합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "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": "높다", - "text": "청구 모델 사용 평가 - PAYG 대 PTU", - "waf": "비용 최적화" + "text": "Key Vault 비밀을 사용하여 자격 증명(가상 머신 사용자 암호), 인증서 또는 키와 같은 중요한 정보를 하드 코딩하지 않도록 합니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "Identity Review Checklist", + "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", + "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", + "service": "Entra", "severity": "보통", - "text": "모델 버전 간에 전환할 때 프롬프트와 응용 프로그램의 품질을 평가합니다.", - "waf": "운영 우수성" + "text": "장기 취소 가능 토큰을 사용하고, 토큰을 캐시하고, Microsoft ID 라이브러리를 사용하여 자동으로 획득합니다.", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "Identity Review Checklist", + "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", + "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", + "service": "AAD B2C", "severity": "보통", - "text": "GenAI 앱을 평가, 모니터링 및 개선하여 근거, 관련성, 정확성, 일관성, 유창성 등의 기능을 제공합니다.", - "waf": "운영 우수성" + "text": "로그인 사용자 흐름이 백업되고 복원력이 있는지 확인합니다. 사용자를 로그인하는 데 사용하는 코드가 백업되고 복구 가능한지 확인합니다. 외부 프로세스와의 복원력 있는 인터페이스", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "294798b1-578b-4219-a46c-eb5443513592", - "service": "Azure OpenAI", + "checklist": "Identity Review 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", "severity": "보통", - "text": "다양한 검색 매개 변수를 기반으로 Azure AI Search 결과를 평가합니다", - "waf": "운영 우수성" + "text": "사용자 지정 브랜드 자산은 CDN에서 호스팅되어야 합니다.", + "waf": "공연" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "2744293b-b628-4537-a551-19b08e8f5854", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", - "service": "Azure OpenAI", - "severity": "보통", - "text": "데이터를 사용하여 프롬프트 엔지니어링 및 RAG와 같은 다른 기본 접근 방식을 시도한 경우에만 모델을 미세 조정하여 정확도를 높이는 방법으로 살펴보십시오", - "waf": "운영 우수성" + "checklist": "Identity Review Checklist", + "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", + "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", + "service": "AAD B2C", + "severity": "낮다", + "text": "여러 ID 공급자가 있어야 합니다(예: Microsoft, Google, Facebook 계정으로 로그인).", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "checklist": "Identity Review 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", "severity": "보통", - "text": "프롬프트 엔지니어링 기법을 사용하여 LLM 응답의 정확도 향상", - "waf": "운영 우수성" + "text": "VM 수준에서 고가용성을 위한 VM 규칙(프리미엄 디스크, 서로 다른 가용성 영역에 있는 지역에 두 개 이상)을 따릅니다.", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e737897e-71ca-47da-acfa-962a1594946d", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", - "service": "Azure OpenAI", + "checklist": "Identity Review 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", "severity": "보통", - "text": "GenAI 애플리케이션을 위한 레드 팀", - "waf": "안전" + "text": "복제하지 마세요! 복제로 인해 디렉터리 동기화에 문제가 발생할 수 있습니다", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", - "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", - "service": "Azure OpenAI", + "checklist": "Identity Review 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", "severity": "보통", - "text": "최종 사용자에게 LLM 응답에 대한 점수 매기기 옵션을 제공하고 이러한 점수를 추적합니다. ", - "waf": "운영 우수성" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "높다", - "text": "할당량 관리 방법 고려", - "waf": "비용 최적화" + "text": "다중 지역에 대해 활성-활성 상태 보유", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", - "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", - "service": "Azure OpenAI", + "checklist": "Identity Review Checklist", + "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", "severity": "보통", - "text": "APIM 기반 게이트웨이와 같은 Load Balancer 솔루션을 사용하여 서비스 및 지역 간에 부하와 용량을 분산합니다", - "waf": "운영 우수성" + "text": "추가 지역 및 위치에 Azure AD 도메인 서비스 스탬프 추가Add Azure AD Domain service stamps to additional regions and locations", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review Checklist", - "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", - "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", - "service": "Azure MySQL", + "checklist": "Identity Review Checklist", + "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", "severity": "보통", - "text": "유연한 서버 활용", + "text": "DR에 복제본 세트 사용", "waf": "신뢰도" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review 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", - "severity": "높다", - "text": "지역적으로 적용 가능한 경우 가용 영역 활용Leverage Availability Zones where regionally applicable", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", + "service": "Bot service", + "severity": "보통", + "text": "Azure Bot Service의 안정성 지원 권장 사항을 따릅니다", "waf": "신뢰도" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review 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", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", + "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", + "service": "Bot service", "severity": "보통", - "text": "지역 간 DR 시나리오에 입력 데이터 복제 활용", + "text": "로컬 데이터 레지던시 및 지역 규정 준수를 통해 봇 배포Deploying bots with local data residency and regional compliance", "waf": "신뢰도" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", - "severity": "높다", - "text": "읽기 작업에 대해 99.9%의 가용성을 갖도록 복제본 2개 사용", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "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", + "severity": "보통", + "text": "Azure Bot Service는 글로벌 및 지역 서비스 모두에 대해 활성-활성 모드로 실행됩니다. 중단이 발생하면 오류를 감지하거나 서비스를 관리할 필요가 없습니다. Azure Bot Service는 다중 지역 지리적 아키텍처에서 자동 장애 조치(failover) 및 자동 복구를 자동으로 수행합니다. EU 봇 지역 서비스의 경우 Azure Bot Service는 중복성을 보장하기 위해 활성/활성 복제가 있는 유럽 내 두 개의 전체 지역을 제공합니다. 글로벌 봇 서비스의 경우 사용 가능한 모든 지역/지역을 글로벌 공간으로 제공할 수 있습니다.", "waf": "신뢰도" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "읽기/쓰기 작업에 대해 99.9%의 가용성을 갖도록 복제본 3개 사용", - "waf": "신뢰도" + "text": "'스토리지에 대한 Azure 보안 기준' 고려", + "waf": "안전" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", - "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", - "service": "Cognitive Search", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "읽기 및/또는 쓰기 복제본을 활성화하여 가용 영역 활용Leverage Availability Zones by enabling read and/or write replicas", - "waf": "신뢰도" - }, + "text": "Azure Storage에 프라이빗 엔드포인트를 사용하는 것이 좋습니다.", + "waf": "안전" + }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review 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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "지역 중복의 경우 Manually create services in 2 or more regions for Search는 지리적 지역 간에 검색 인덱스를 복제하는 자동화된 방법을 제공하지 않습니다", - "waf": "신뢰도" + "text": "이전 스토리지 계정이 '클래식 배포 모델'을 사용하지 않는지 확인", + "waf": "안전" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", - "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", - "service": "Cognitive Search", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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 Blob Storage Review", + "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": "여러 서비스에서 데이터를 동기화하려면 인덱서를 사용하여 여러 서비스의 콘텐츠를 업데이트하거나 REST API를 사용하여 여러 서비스에서 콘텐츠 업데이트를 푸시합니다.", - "waf": "신뢰도" + "text": "Blob에 대해 '일시 삭제' 사용Enable 'soft delete' for blobs", + "waf": "안전" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review 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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "Azure Traffic Manager를 사용하여 요청 조정", - "waf": "신뢰도" + "text": "Blob에 대해 '일시 삭제' 사용 안 함", + "waf": "안전" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", - "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", - "service": "Cognitive Search", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "컨테이너에 대한 일시 삭제를 사용하면 컨테이너가 삭제된 후 컨테이너를 복구할 수 있습니다(예: 실수로 인한 삭제 작업에서 복구).", + "guid": "43a58a9c-2289-4c3d-9b57-d0c655462f2a", + "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-overview", + "service": "Azure Storage", "severity": "높다", - "text": "Azure Cognitive Search 인덱스를 백업 및 복원합니다. 이 샘플 코드를 사용하여 인덱스 정의 및 스냅샷을 일련의 Json 파일에 백업합니다", - "waf": "신뢰도" + "text": "컨테이너에 대해 '일시 삭제' 사용Enable 'soft delete' for containers", + "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "다중 테넌트에 대한 명확한 규정 또는 비즈니스 요구 사항이 없는 한 Azure 리소스를 관리하기 위해 하나의 Entra 테넌트를 사용합니다.", - "waf": "작업" - }, - { - "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": "낮다", - "text": "다중 테넌트 자동화 접근 방식을 사용하여 Microsoft Entra ID 테넌트를 관리합니다.", - "waf": "작업" + "text": "컨테이너에 대해 '일시 삭제' 사용 안 함", + "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "사용자가 삭제하기 전에 먼저 삭제 잠금을 제거하도록 강제하여 저장소 계정이 실수로 삭제되는 것을 방지합니다.", + "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", + "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", + "service": "Azure Storage", "severity": "높다", - "text": "동일한 ID로 다중 테넌트 관리에 Azure Lighthouse를 사용합니다.", - "training": "https://learn.microsoft.com/azure/lighthouse/concepts/cross-tenant-management-experience", - "waf": "작업" + "text": "스토리지 계정에 대한 리소스 잠금 사용Enable resource locks on storage accounts", + "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "파트너에게 테넌트를 관리할 수 있는 액세스 권한을 부여하는 경우 Azure Lighthouse를 사용합니다.", - "waf": "비용" + "text": "변경할 수 없는 Blob 고려", + "waf": "안전" }, { - "checklist": "Azure Landing Zone Review", - "guid": "348ef254-c27d-442e-abba-c7571559ab91", - "link": "https://learn.microsoft.com/azure/role-based-access-control/overview", - "service": "Entra", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "클라우드 운영 모델에 맞는 RBAC 모델을 적용합니다. Scope and Assign across Management Groups and Subscriptions.", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "text": "HTTPS 필요, 즉 스토리지 계정에서 포트 80 사용 안 함Require HTTPS, i.e. disable port 80 on the storage account", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "모든 계정 유형에 대해 회사 또는 학교 계정 인증 유형만 사용합니다. Microsoft 계정을 사용하지 마십시오.", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "text": "HTTPS를 적용할 때(HTTP 사용 안 함) 스토리지 계정에 사용자 지정 도메인(CNAME)을 사용하지 않는지 확인합니다.", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "그룹만 사용하여 사용 권한을 할당합니다. 그룹 관리 시스템이 이미 있는 경우 Entra ID 전용 그룹에 온-프레미스 그룹을 추가합니다.", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", - "waf": "안전" - }, - { - "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": "높다", - "text": "Azure 환경에 대한 권한이 있는 모든 사용자에 대해 Microsoft Entra ID 조건부 액세스 정책을 적용합니다.", - "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "text": "SAS(공유 액세스 서명) 토큰을 HTTPS 연결로만 제한", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "AAD 토큰은 가능한 경우 공유 액세스 서명보다 우선해야 합니다", + "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", + "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", + "service": "Azure Storage", "severity": "높다", - "text": "Azure 환경에 대한 권한이 있는 모든 사용자에 대해 Multi-Factor Authentication을 적용합니다.", - "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "text": "Blob 액세스에 Azure AD(Azure Active Directory) 토큰 사용Use Azure Active Directory (Azure AD) tokens for blob access", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "사용자, 그룹 또는 응용 프로그램에 역할을 할당할 때 해당 보안 주체가 작업을 수행하는 데 필요한 권한만 부여합니다. 리소스에 대한 액세스를 제한하면 의도하지 않은 데이터 오용과 악의적인 데이터 오용을 모두 방지할 수 있습니다.", + "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", + "service": "Azure Storage", "severity": "보통", - "text": "Microsoft Entra ID PIM(Privileged Identity Management)을 적용하여 제로 스탠딩 액세스 및 최소 권한을 설정합니다.", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "text": "IaM 권한의 최소 권한", "waf": "안전" }, { - "checklist": "Azure Landing Zone Review", - "guid": "8b9fe5c4-1049-4d40-9a92-3c3474d00018", - "link": "https://learn.microsoft.com/en-us/entra/identity/domain-services/overview", - "service": "Entra", - "severity": "보통", - "text": "Active Directory Domain Services에서 Entra Domain Services로 전환하려는 경우 모든 워크로드의 호환성을 평가합니다.", - "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "안전" }, { - "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": "보통", - "text": "Microsoft Entra ID 로그를 플랫폼 중앙 Azure Monitor와 통합합니다. Azure Monitor는 Azure의 로그 및 모니터링 데이터에 대한 단일 정보 소스를 허용하여 조직에 로그 수집 및 보존에 대한 요구 사항을 충족하는 클라우드 네이티브 옵션을 제공합니다.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "스토리지 계정 키('공유 키')에는 감사 기능이 거의 없습니다. 누가/언제 키 사본을 가져왔는지 모니터링할 수 있지만, 키가 여러 사람의 손에 들어가면 특정 사용자의 사용을 귀속시키는 것은 불가능합니다. AAD 인증에만 의존하면 스토리지 액세스를 사용자에게 더 쉽게 연결할 수 있습니다. ", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", + "service": "Azure Storage", + "severity": "높다", + "text": "AAD 액세스(및 사용자 위임 SAS)만 지원되도록 스토리지 계정 키를 사용하지 않도록 설정하는 것이 좋습니다.", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "응급 액세스 또는 비상 계정을 구현하여 테넌트 전체 계정 잠금을 방지합니다.", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "text": "Azure Monitor를 사용하여 스토리지 계정에 대한 컨트롤 플레인 작업을 감사하는 것이 좋습니다.", "waf": "안전" }, { - "checklist": "Azure Landing Zone Review", - "guid": "35037e68-9349-4c15-b371-228514f4cdff", - "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", - "service": "Entra", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "특별히 필요한 시나리오가 없는 한 Microsoft Entra ID 역할 할당에 온-프레미스 동기화 계정을 사용하지 마세요.", - "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", + "text": "스토리지 계정 키를 사용하는 경우 '키 만료 정책'을 사용하도록 설정하는 것이 좋습니다", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "Microsoft Entra ID 애플리케이션 프록시를 사용하여 원격 사용자에게 애플리케이션에 대한 액세스 권한을 부여하는 경우 테넌트당 하나의 인스턴스만 가질 수 있으므로 플랫폼 리소스로 관리합니다.", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "text": "SAS 만료 정책 구성 고려", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "최대한의 유연성이 필요한 네트워크 시나리오에는 허브 및 스포크(hub-and-spoke) 네트워크 토폴로지를 사용합니다.", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "text": "SAS를 저장된 액세스 정책에 연결하는 것이 좋습니다.", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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 Blob Storage Review", + "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": "ExpressRoute 게이트웨이, VPN 게이트웨이 및 Azure Firewall 또는 파트너 NVA를 포함한 공유 네트워킹 서비스를 중앙 허브 가상 네트워크에 배포합니다. 필요한 경우 DNS 서비스도 배포합니다.", - "waf": "비용" + "text": "Azure KeyVault에 연결 문자열을 저장하는 것이 좋습니다(관리 ID를 사용할 수 없는 시나리오에서).", + "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "임시 SAS 서비스 SAS 또는 계정 SAS에서 단기 만료 시간을 사용합니다. 이러한 방식으로 SAS가 손상되더라도 짧은 시간 동안만 유효합니다. 이 방법은 저장된 액세스 정책을 참조할 수 없는 경우에 특히 중요합니다. 또한 단기 만료 시간은 업로드에 사용할 수 있는 시간을 제한하여 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": "애플리케이션 랜딩 존의 모든 공용 IP 주소에 대해 DDoS 네트워크 또는 IP 보호 계획을 사용합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "임시 SAS의 유효 기간을 단축하기 위해 노력", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "파트너 네트워킹 기술 또는 NVA를 배포할 때 파트너 공급업체의 지침을 따릅니다.", - "waf": "신뢰도" + "text": "SAS에 좁은 범위 적용", + "waf": "안전" }, { - "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": "낮다", - "text": "허브 및 스포크 시나리오에서 ExpressRoute와 VPN 게이트웨이 간의 전송이 필요한 경우 Azure Route Server를 사용합니다.", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "SAS는 클라이언트가 업로드하는 데이터의 양을 제한할 수 없습니다. 시간 경과에 따른 스토리지 양의 가격 책정 모델을 고려할 때 클라이언트가 악의적으로 큰 콘텐츠를 업로드했는지 여부를 확인하는 것이 합리적일 수 있습니다.", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "service": "Azure Storage", "severity": "낮다", - "text": "Route Server를 사용하는 경우 Route Server 서브넷에 /27 접두사를 사용합니다.", + "text": "클라이언트가 SAS를 사용하여 파일을 업로드한 후 업로드된 데이터를 확인하는 것이 좋습니다. ", "waf": "안전" }, { - "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": "보통", - "text": "Azure 지역 간에 여러 허브 및 스포크 토폴로지가 있는 네트워크 아키텍처의 경우 허브 VNet 간의 글로벌 가상 네트워크 피어링을 사용하여 지역을 서로 연결합니다.", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-virtual-networks/", - "waf": "공연" - }, - { - "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": "보통", - "text": "네트워크용 Azure Monitor를 사용하여 Azure에서 네트워크의 엔드투엔드 상태를 모니터링합니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", - "waf": "작업" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "한 지역에 400개 이상의 스포크 네트워크가 있는 경우 VNet 피어링 제한(500) 및 ExpressRoute를 통해 보급할 수 있는 최대 접두사 수(1000)를 우회하기 위해 추가 허브를 배포합니다.", - "waf": "신뢰도" + "text": "SFTP: SFTP 엔드포인트는 POSIX와 유사한 ACL을 지원하지 않습니다.", + "waf": "안전" }, { - "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": "보통", - "text": "경로 테이블당 경로 수를 400개로 제한합니다.", - "waf": "신뢰도" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "VNet 피어링을 구성할 때 '원격 가상 네트워크에 대한 트래픽 허용' 설정을 사용합니다.", - "waf": "신뢰도" + "text": "미사용 데이터를 암호화하는 방법을 결정합니다. 데이터에 대한 스레드 모델을 이해합니다.", + "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "ExpressRoute Direct를 사용하는 경우 조직의 라우터와 MSEE 간의 계층 2 레벨에서 트래픽을 암호화하도록 MACsec을 구성합니다. 다이어그램은 흐름에서 이 암호화를 보여 줍니다.", + "text": "사용해야 하는 플랫폼 암호화를 결정합니다.", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", + "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", + "service": "Azure Storage", "severity": "보통", - "text": "MACsec을 사용할 수 없는 시나리오(예: ExpressRoute Direct를 사용하지 않음)의 경우 VPN 게이트웨이를 사용하여 ExpressRoute 개인 피어링을 통해 IPsec 터널을 설정합니다.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "text": "사용해야 하는 클라이언트 쪽 암호화를 결정합니다.", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Resource Graph Explorer(resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true)를 활용하여 익명 Blob 액세스를 허용하는 스토리지 계정을 찾습니다.", + "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": "Azure 지역 및 온-프레미스 위치에서 겹치는 IP 주소 공간이 사용되지 않는지 확인합니다.", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "text": "공용 Blob 액세스가 필요한지 또는 특정 스토리지 계정에 대해 사용하지 않도록 설정할 수 있는지 여부를 고려합니다. ", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review Checklist", + "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", + "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", + "service": "Azure MySQL", "severity": "보통", - "text": "개인 인터넷(RFC 1918)에 대한 주소 할당 범위의 IP 주소를 사용합니다.", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "안전" + "text": "유연한 서버 활용", + "waf": "신뢰도" }, { - "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", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review 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", "severity": "높다", - "text": "IP 주소 공간이 낭비되지 않는지 확인하고 불필요하게 큰 가상 네트워크(예: /16)를 만들지 마세요.", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "공연" - }, - { - "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": "높다", - "text": "프로덕션 및 재해 복구 사이트에 대해 겹치는 IP 주소 범위를 사용하지 마세요.", - "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "text": "지역적으로 적용 가능한 경우 가용 영역 활용Leverage Availability Zones where regionally applicable", "waf": "신뢰도" }, { - "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", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review 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", "severity": "보통", - "text": "Azure의 이름 확인만 필요한 환경의 경우 이름 확인을 위해 위임된 영역(예: 'azure.contoso.com')을 사용하여 확인을 위해 Azure 프라이빗 DNS를 사용합니다.", - "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", - "waf": "작업" + "text": "지역 간 DR 시나리오에 입력 데이터 복제 활용", + "waf": "신뢰도" }, { - "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": "보통", - "text": "Azure 및 온-프레미스에서 이름 확인이 필요하고 Active Directory와 같은 기존 엔터프라이즈 DNS 서비스가 없는 환경의 경우 Azure DNS Private Resolver를 사용하여 DNS 요청을 Azure 또는 온-프레미스 DNS 서버로 라우팅합니다.", - "training": "https://learn.microsoft.com/training/modules/intro-to-azure-dns-private-resolver/", - "waf": "안전" + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization Checklist", + "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", + "service": "Azure Monitor", + "text": "Azure Monitor -https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview 의 데이터 수집 규칙", + "training": "https://azure.microsoft.com/pricing/reservations/", + "waf": "비용" }, { - "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": "낮다", - "text": "자체 DNS(예: Red Hat OpenShift)가 필요하고 배포하는 특수 워크로드는 선호하는 DNS 솔루션을 사용해야 합니다.", - "waf": "작업" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "text": "기본 데이터 원본을 찾을 수 없는 백업 인스턴스 확인", + "waf": "비용" }, { - "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": "높다", - "text": "Azure DNS에 대한 자동 등록을 사용하도록 설정하여 가상 네트워크 내에 배포된 가상 머신에 대한 DNS 레코드의 수명 주기를 자동으로 관리합니다.", - "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", - "waf": "작업" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "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", + "text": "연결되지 않은 서비스(디스크, NIC, IP 주소 등) 삭제 또는 보관", + "waf": "비용" }, { - "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": "보통", - "text": "Azure Bastion을 사용하여 네트워크에 안전하게 연결합니다.", - "waf": "안전" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "text": "중요 업무용 응용 프로그램에 대한 Site Recovery 저장소와 백업 간의 적절한 균형을 고려합니다.", + "waf": "비용" }, { - "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": "보통", - "text": "서브넷 /26 이상에서 Azure Bastion을 사용합니다.", - "waf": "안전" + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization 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", + "text": "40개의 서로 다른 로그 분석 작업 영역 간의 지출 및 절감 기회 확인 - 비프로덕션 작업 영역에 대해 서로 다른 보존 및 데이터 수집 사용-인식 및 계층 크기 조정을 위한 일일 한도 만들기 - 일일 한도를 설정하는 경우 한도에 도달할 때 경고를 만드는 것 외에도 특정 비율(예: 90%)에 도달했을 때 알림을 받을 경고 규칙도 만들어야 합니다. - 가능한 경우 작업 영역 변환 고려 - 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": "비용" }, { - "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": "보통", - "text": "Azure Front Door 및 WAF 정책을 사용하여 랜딩 존에 대한 인바운드 HTTP/S 연결을 위해 Azure 지역 전체에서 전역 보호를 제공합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "안전" + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization 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", + "text": "제거 로그 정책 및 자동화 적용(필요한 경우 로그를 콜드 스토리지로 이동할 수 있음)", + "training": "https://www.youtube.com/watch?v=nHQYcYGKuyw", + "waf": "비용" }, { - "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": "낮다", - "text": "Azure Front Door 및 Azure Application Gateway를 사용하여 HTTP/S 앱을 보호하는 경우 Azure Front Door에서 WAF 정책을 사용합니다. Azure Front Door에서만 트래픽을 수신하도록 Azure Application Gateway를 잠급니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "안전" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "text": "디스크가 실제로 필요한지 확인하고, 그렇지 않은 경우 삭제하십시오. 필요한 경우 더 낮은 스토리지 계층을 찾거나 백업을 사용합니다.", + "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/manage-automation", + "waf": "비용" }, { - "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": "높다", - "text": "인바운드 HTTP/S 연결에 WAF 및 기타 역방향 프록시가 필요한 경우 랜딩 존 가상 네트워크 내에 배포하고 보호하고 인터넷에 노출하는 앱과 함께 배포합니다.", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "안전" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization 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", + "text": "사용자 지정 규칙을 사용하여 사용하지 않는 스토리지를 하위 계층으로 이동하는 것이 좋습니다 - 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": "비용" }, { - "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": "높다", - "text": "Azure DDoS 네트워크 또는 IP 보호 플랜을 사용하여 가상 네트워크 내의 공용 IP 주소 엔드포인트를 보호할 수 있습니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "안전" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "VM", + "text": "Advisor가 VM 올바른 크기 조정에 대해 구성되어 있는지 확인합니다. ", + "waf": "비용" }, { - "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": "높다", - "text": "예정된 호환성이 손상되는 변경 전에 네트워크 아웃바운드 트래픽 구성 및 전략을 관리하는 방법을 계획합니다. 2025년 9월 30일에 새 배포에 대한 기본 아웃바운드 액세스가 사용 중지되고 명시적 액세스 구성만 허용됩니다.", - "waf": "신뢰도" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "description": "Cost analysys에서 Meter Category Licenses를 검색하여 확인합니다.", + "guid": "59ae568b-a38d-4498-9e22-13dbd7bb012f", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/manage/centralize-operations", + "service": "VM", + "text": "모든 Windows VM에서 스크립트 실행 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- Windows VM을 자주 만드는 경우 정책 구현을 고려합니다.", + "waf": "비용" }, { - "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": "높다", - "text": "보호된 모든 공용 IP 주소(DDoS IP 또는 네트워크 보호)에 대한 DDoS 관련 로그를 저장하는 진단 설정을 추가합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "안전" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "service": "VM", + "text": " 이미 라이선스가 있는 경우 AHUB에 넣을 수도 https://learn.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux?tabs=rhelpayg%2Crhelbyos%2CrhelEnablebyos%2Crhelcompliance", + "waf": "비용" }, { - "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": "높다", - "text": "Virtual Machines에 직접 연결된 공용 IP 주소를 거부하는 정책 할당이 있는지 확인합니다. 특정 VM에서 공용 IP가 필요한 경우 제외를 사용합니다.", - "waf": "안전" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", + "service": "VM", + "text": "유연성 옵션을 사용하여 예약된 VM 제품군 통합(4-5개 이하의 제품군)", + "training": "https://learn.microsoft.com/azure/automation/automation-solution-vm-management", + "waf": "비용" }, { - "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": "보통", - "text": "ExpressRoute를 Azure에 대한 기본 연결로 사용합니다. VPN을 백업 연결의 소스로 사용합니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "공연" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "text": "Azure Reserved Instances 활용: 이 기능을 사용하면 1년 또는 3년 동안 VM을 예약할 수 있으므로 PAYG 가격에 비해 상당한 비용 절감 효과를 얻을 수 있습니다.", + "waf": "비용" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "Azure Landing Zone Review", - "description": "AS-path 접두사 및 연결 가중치를 사용하여 Azure에서 온-프레미스로의 트래픽에 영향을 주고, 자체 라우터의 전체 BGP 특성 범위를 사용하여 온-프레미스에서 Azure로의 트래픽에 영향을 줄 수 있습니다.", - "guid": "f29812b2-363c-4efe-879b-599de0d5973c", - "link": "https://learn.microsoft.com/azure/expressroute/expressroute-routing", - "service": "ExpressRoute", - "severity": "보통", - "text": "여러 ExpressRoute 회로 또는 여러 온-프레미스 위치를 사용하는 경우 BGP 특성을 사용하여 라우팅을 최적화합니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "신뢰도" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", + "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", + "service": "VM", + "text": "더 큰 디스크만 예약할 수 있습니다 => 1TiB -", + "waf": "비용" }, { - "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": "보통", - "text": "대역폭 및 성능 요구 사항에 따라 ExpressRoute/VPN 게이트웨이에 적합한 SKU를 선택합니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "공연" - }, - { - "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": "높다", - "text": "비용을 정당화하는 대역폭에 도달하는 경우에만 무제한 데이터 ExpressRoute 회로를 사용해야 합니다.", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", + "service": "VM", + "text": "적절한 크기 최적화 후", "waf": "비용" }, { - "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": "높다", - "text": "회로 피어링 위치가 로컬 SKU에 대한 Azure 지역을 지원하는 경우 ExpressRoute의 로컬 SKU를 활용하여 회로 비용을 줄입니다.", + "arm-service": "Microsoft.Sql/servers", + "checklist": "Cost Optimization Checklist", + "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", + "service": "Azure SQL", + "text": "적용 가능한 경우 확인 및 정책/변경 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": "비용" }, { - "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": "보통", - "text": "지원되는 Azure 지역에 영역 중복 ExpressRoute 게이트웨이를 배포합니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "신뢰도" - }, - { - "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": "보통", - "text": "10Gbps보다 높은 대역폭 또는 전용 10/100Gbps 포트가 필요한 시나리오의 경우 ExpressRoute Direct를 사용합니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "공연" - }, - { - "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": "보통", - "text": "짧은 대기 시간이 필요하거나 온-프레미스에서 Azure로의 처리량이 10Gbps보다 커야 하는 경우 FastPath를 사용하도록 설정하여 데이터 경로에서 ExpressRoute 게이트웨이를 우회합니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "공연" - }, - { - "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": "보통", - "text": "영역 중복 VPN 게이트웨이를 사용하여 분기 또는 원격 위치를 Azure(사용 가능한 경우)에 연결합니다.", - "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", - "waf": "신뢰도" - }, - { - "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": "보통", - "text": "온-프레미스에서 중복 VPN 어플라이언스(활성/활성 또는 활성/수동)를 사용합니다.", - "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", - "waf": "신뢰도" - }, - { - "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": "높다", - "text": "ExpressRoute Direct를 사용하는 경우 비용을 절감하기 위해 로컬 Azure 지역에 대한 ExpressRoute 로컬 회로를 사용하는 것이 좋습니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", + "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", + "service": "VM", + "text": "VM + 라이선스 부분 할인(ahub + 3YRI)은 약 70% 할인입니다.", "waf": "비용" }, { - "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": "보통", - "text": "트래픽 격리 또는 전용 대역폭이 필요한 경우(예: 프로덕션 환경과 비프로덕션 환경 분리) 다른 ExpressRoute 회로를 사용합니다. 이는 격리된 라우팅 도메인을 보장하고 시끄러운 이웃 위험을 완화하는 데 도움이 됩니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "안전" - }, - { - "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": "보통", - "text": "기본 제공 Express Route Insights를 사용하여 ExpressRoute 가용성 및 사용률을 모니터링합니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "작업" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "text": "플랫 사이징보다는 VMSS를 사용하여 수요에 맞추는 것이 좋습니다", + "waf": "비용" }, { - "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": "보통", - "text": "네트워크 전반, 특히 온-프레미스와 Azure 간의 연결을 모니터링하려면 연결 모니터를 사용합니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "작업" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Cost Optimization Checklist", + "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "service": "AKS", + "text": "AKS 자동 크기 조정기를 사용하여 클러스터 사용량과 일치시킵니다(Pod 요구 사항이 스케일러와 일치하는지 확인).", + "waf": "비용" }, { - "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": "보통", - "text": "중복성을 위해 서로 다른 피어링 위치의 ExpressRoute 회로를 사용합니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "신뢰도" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "text": "해당하는 경우 복구 지점을 자격 증명 모음 보관으로 이동(유효성 검사)Move recovery points to vault-archive where applicable (Validate)", + "training": "https://azure.microsoft.com/pricing/reservations/", + "waf": "비용" }, { - "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": "보통", - "text": "단일 ExpressRoute 회로만 사용하는 경우 사이트 간 VPN을 ExpressRoute의 장애 조치(failover)로 사용합니다.", - "waf": "신뢰도" + "arm-service": "Microsoft.Databricks/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", + "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", + "service": "Databricks", + "text": "가능한 경우 대체와 함께 스폿 VM을 사용하는 것이 좋습니다. 클러스터의 자동 종료를 고려합니다.", + "waf": "비용" }, { - "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": "높다", - "text": "GatewaySubnet에서 경로 테이블을 사용하는 경우 게이트웨이 경로가 전파되었는지 확인합니다.", - "waf": "신뢰도" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", + "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", + "service": "Azure Functions", + "text": "함수 - 연결 재사용", + "training": "https://learn.microsoft.com/azure/cost-management-billing/reservations/reservation-apis?toc=%2Fazure%2Fcost-management-billing%2Ftoc.json", + "waf": "비용" }, { - "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": "높다", - "text": "ExpressRoute를 사용하는 경우 온-프레미스 라우팅은 동적이어야 하며, 연결 오류가 발생할 경우 회로의 나머지 연결로 수렴해야 합니다. 로드는 두 연결 모두에서 이상적으로는 액티브/액티브로 공유해야 하지만 액티브/패시브도 지원됩니다.", - "waf": "신뢰도" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", + "link": "https://learn.microsoft.com/azure/automation/update-management/overview", + "service": "Azure Functions", + "text": "함수 - 로컬에 데이터 캐시", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", + "waf": "비용" }, { - "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": "보통", - "text": "ExpressRoute 회로의 두 물리적 링크가 네트워크에 있는 두 개의 고유한 에지 디바이스에 연결되어 있는지 확인합니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "신뢰도" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", + "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", + "service": "Azure Functions", + "text": "기능 - 콜드 스타트 - '패키지에서 실행' 기능을 사용합니다. 이렇게 하면 코드가 단일 zip 파일로 다운로드됩니다. 예를 들어, 이것은 많은 노드 모듈이 있는 Javascript 함수를 크게 개선할 수 있습니다. 언어별 도구를 사용하여 패키지 크기를 줄입니다(예: 트리 쉐이킹 Javascript 애플리케이션).", + "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", + "waf": "비용" }, { - "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": "보통", - "text": "BFD(Bidirectional Forwarding Detection)가 고객 또는 프로바이더 에지 라우팅 디바이스에서 활성화되고 구성되도록 보장합니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "신뢰도" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "Azure Functions", + "text": "기능 - 기능을 따뜻하게 유지", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "비용" }, { - "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": "높다", - "text": "복원력을 높이기 위해 ExpressRoute 게이트웨이를 서로 다른 피어링 위치에서 둘 이상의 회로에 연결합니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "신뢰도" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Azure Functions", + "text": "다른 함수와 함께 자동 크기 조정을 사용하는 경우 모든 리소스에 대한 모든 자동 크기 조정을 구동하는 것이 있을 수 있으므로 별도의 소비 계획으로 이동하는 것이 좋습니다(CPU에 대한 더 높은 계획 고려).", + "waf": "비용" }, { - "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": "보통", - "text": "ExpressRoute 가상 네트워크 게이트웨이에 대한 진단 로그 및 경고를 구성합니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "작업" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", + "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", + "service": "Azure Functions", + "text": "지정된 계획의 함수 앱은 모두 함께 크기가 조정되므로 크기 조정과 관련된 모든 문제는 계획의 모든 앱에 영향을 줄 수 있습니다.", + "waf": "비용" }, { - "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": "보통", - "text": "VNet 간 통신에 ExpressRoute 회로를 사용하지 마세요.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "공연" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", + "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", + "service": "Azure Functions", + "text": "'대기 시간'에 대한 요금이 청구되나요? 이 질문은 일반적으로 비동기 작업을 수행하고 결과를 기다리는 C # 함수 (예 : await Task.Delay(1000) 또는 await client )의 컨텍스트에서 묻습니다. GetAsync('http://google.com')입니다. 대답은 '예'입니다 - GB 초 계산은 함수의 시작 및 종료 시간과 해당 기간 동안의 메모리 사용량을 기반으로 합니다. CPU 작업 측면에서 해당 시간 동안 실제로 발생하는 일은 계산에 포함되지 않습니다. 이 규칙의 한 가지 예외는 지속성 함수를 사용하는 경우입니다. 오케스트레이터 함수에서 대기하는 데 소요된 시간에 대해서는 요금이 청구되지 않습니다.가능한 경우 수요 형성 기술을 적용합니다(개발 환경?) https://github.com/Azure-Samples/functions-csharp-premium-scaler", + "waf": "비용" }, { - "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": "낮다", - "text": "검사를 위해 Azure 트래픽을 하이브리드 위치로 보내지 마세요. 대신 'Azure의 트래픽이 Azure에 유지됨' 원칙을 따라 Azure의 리소스 간 통신이 Microsoft 백본 네트워크를 통해 발생하도록 합니다.", - "waf": "공연" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Cost Optimization Checklist", + "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Front Door", + "text": "Frontdoor - 기본 홈페이지 끄기앱의 애플리케이션 설정에서 AzureWebJobsDisableHomepage를 true로 설정합니다. 이렇게 하면 PoP에 204(콘텐츠 없음)가 반환되므로 헤더 데이터만 반환됩니다.", + "waf": "비용" }, { - "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": "높다", - "text": "Azure Firewall을 사용하여 인터넷에 대한 Azure 아웃바운드 트래픽, HTTP/S가 아닌 인바운드 연결 및 East/West 트래픽 필터링(조직에 필요한 경우)을 제어합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "안전" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Cost Optimization 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", + "text": "Frontdoor 프론트도어 - 아무것도 반환하지 않는 무언가로 라우팅합니다. 함수, 함수 프록시를 설정하거나 WebApp에서 200(정상)을 반환하고 콘텐츠를 보내지 않거나 최소한으로 보내는 경로를 추가합니다. 이것의 장점은 호출될 때 로그아웃할 수 있다는 것입니다.", + "waf": "비용" }, { - "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": "보통", - "text": "글로벌 Azure Firewall 정책을 만들어 글로벌 네트워크 환경에서 보안 태세를 제어하고 모든 Azure Firewall 인스턴스에 할당합니다. Azure 역할 기반 액세스 제어를 통해 증분 방화벽 정책을 로컬 보안 팀에 위임하여 특정 지역의 요구 사항을 충족하는 세분화된 정책을 허용합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "안전" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", + "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", + "service": "Storage", + "text": "덜 사용되는 데이터에 대한 보관 계층 고려", + "waf": "비용" }, { - "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": "낮다", - "text": "조직에서 아웃바운드 연결을 보호하기 위해 이러한 솔루션을 사용하려는 경우 Firewall Manager 내에서 지원되는 파트너 SaaS 보안 공급자를 구성합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "안전" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", + "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", + "service": "VM", + "text": "크기가 계층과 일치하지 않는 디스크 크기를 확인합니다(예: 513GiB 디스크는 P30(1TiB)를 지불하고 크기 조정을 고려합니다.", + "waf": "비용" }, { - "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": "높다", - "text": "응용 프로그램 규칙을 사용하여 지원되는 프로토콜에 대한 대상 호스트 이름에서 아웃바운드 트래픽을 필터링합니다. FQDN 기반 네트워크 규칙 및 DNS 프록시와 함께 Azure Firewall을 사용하여 다른 프로토콜을 통해 인터넷으로의 송신 트래픽을 필터링합니다.", - "waf": "안전" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", + "service": "Storage", + "text": "가능하면 프리미엄 또는 울트라 대신 표준 SSD를 사용하는 것이 좋습니다.", + "waf": "비용" }, { - "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": "높다", - "text": "Azure Firewall 프리미엄을 사용하여 추가 보안 기능을 사용하도록 설정합니다.", - "waf": "안전" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization 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", + "text": "스토리지 계정의 경우 선택한 계층이 트랜잭션 요금을 합산하지 않는지 확인합니다(다음 계층으로 이동하는 것이 더 저렴할 수 있음).", + "waf": "비용" }, { - "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": "높다", - "text": "추가 보호를 위해 Azure Firewall 위협 인텔리전스 모드를 경고 및 거부로 구성합니다.", - "waf": "안전" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization Checklist", + "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", + "service": "Site Recovery", + "text": "ASR의 경우 RPO/RTO 및 복제 처리량이 허용하는 경우 표준 SSD 디스크를 사용하는 것이 좋습니다", + "waf": "비용" }, { - "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": "높다", - "text": "추가 보호를 위해 Azure Firewall IDPS 모드를 거부로 구성합니다.", - "waf": "안전" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", + "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", + "service": "Storage", + "text": "스토리지 계정: 핫 계층 및/또는 GRS 필요 확인", + "waf": "비용" }, { - "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": "높다", - "text": "Virtual WAN에 연결되지 않은 VNet의 서브넷의 경우 인터넷 트래픽이 Azure Firewall 또는 네트워크 가상 어플라이언스로 리디렉션되도록 경로 테이블을 연결합니다.", - "waf": "안전" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", + "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", + "service": "VM", + "text": "디스크 - 모든 곳에서 프리미엄 SSD 디스크 사용의 유효성을 검사합니다. 예를 들어 비프로덕션은 표준 SSD 또는 주문형 프리미엄 SSD로 교환할 수 있습니다. ", + "waf": "비용" }, { - "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": "보통", - "text": "모든 Azure Firewall 배포에 대해 리소스별 대상 테이블을 사용하여 로그를 저장하는 진단 설정을 추가합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "작업" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", + "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", + "service": "Synapse", + "text": "예산을 만들어 비용을 관리하고 이해 관계자에게 지출 이상 및 초과 지출 위험을 자동으로 알리는 경고를 만듭니다.", + "waf": "비용" }, { - "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": "중요하다", - "text": "Azure Firewall 클래식 규칙(있는 경우)에서 방화벽 정책으로 마이그레이션합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "작업" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "Synapse", + "text": "추가 데이터 분석을 위해 비용 데이터를 스토리지 계정으로 내보냅니다.", + "waf": "비용" }, { - "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": "높다", - "text": "Azure Firewall 서브넷에 /26 접두사를 사용합니다.", - "waf": "안전" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "Synapse", + "text": "리소스를 사용하지 않을 때 일시 중지하여 전용 SQL 풀에 대한 비용을 제어합니다.", + "waf": "비용" }, { - "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": "보통", - "text": "방화벽 정책 내의 규칙을 Rule Collection Groups(규칙 컬렉션 그룹) 및 Rule Collections(규칙 컬렉션)로 정렬하고 사용 빈도에 따라 정렬합니다.", - "waf": "공연" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", + "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", + "service": "Synapse", + "text": "서버리스 Apache Spark 자동 일시 중지 기능을 활성화하고 그에 따라 제한 시간 값을 설정합니다.", + "waf": "비용" }, { - "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": "보통", - "text": "IP 그룹 또는 IP 접두사를 사용하여 IP 테이블 규칙의 수를 줄입니다.", - "waf": "공연" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization 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", + "text": "다양한 크기의 Apache Spark 풀 정의를 여러 개 만듭니다.", + "waf": "비용" }, { - "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": "보통", - "text": "와일드카드를 DNAT의 소스 IP로 사용하지 마십시오(예: * 또는 any). 들어오는 DNAT에 대한 소스 IP를 지정해야 합니다.", - "waf": "공연" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization 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", + "text": "사전 구매 플랜으로 1년 동안 Azure Synapse SCU(커밋 단위)를 구매하여 Azure Synapse Analytics 비용을 절감하세요.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "비용" }, { - "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": "보통", - "text": "SNAT 포트 사용량을 모니터링하고, NAT 게이트웨이 설정을 평가하고, 원활한 장애 조치(failover)를 보장하여 SNAT 포트 고갈을 방지합니다. 포트 수가 제한에 가까워지면 SNAT 고갈이 임박했을 수 있다는 신호입니다.", - "waf": "공연" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", + "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", + "service": "VM", + "text": "인터럽트 가능한 작업에 스폿 VM 사용: 할인된 가격으로 입찰 및 구매할 수 있는 VM으로, 중요하지 않은 워크로드에 비용 효율적인 솔루션을 제공합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "비용" }, { - "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": "높다", - "text": "Azure Firewall 프리미엄을 사용하는 경우 TLS 검사를 사용하도록 설정합니다.", - "waf": "공연" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "544451e1-92d3-4442-a3c7-628637a551c5", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "VM", + "text": "모든 VM의 적절한 크기 조정", + "waf": "비용" }, { - "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": "낮다", - "text": "웹 범주를 사용하여 특정 주제에 대한 아웃바운드 액세스를 허용하거나 거부할 수 있습니다.", - "waf": "공연" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", + "service": "VM", + "text": "VM 크기를 정규화된 최신 크기로 바꾸기", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "비용" }, { - "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": "보통", - "text": "TLS 검사의 일환으로 검사를 위해 Azure App Gateway에서 트래픽을 수신하도록 계획합니다.", - "waf": "공연" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", + "text": "적절한 크기 조정 VM - 사용량을 5% 미만으로 모니터링하는 것으로 시작한 다음 최대 40%까지 작업", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "비용" }, { - "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": "보통", - "text": "Azure Firewall DNS 프록시 구성을 사용하도록 설정합니다.", - "waf": "안전" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", + "text": "애플리케이션을 컨테이너화하면 VM 밀도를 개선하고 확장 비용을 절감할 수 있습니다", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "비용" }, { - "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": "높다", - "text": "Azure Firewall을 Azure Monitor와 통합하고 진단 로깅을 사용하도록 설정하여 방화벽 로그를 저장하고 분석합니다.", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", + "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", + "service": "APIM", + "severity": "보통", + "text": "전역 수준에서 오류 처리 정책 구현", "waf": "작업" }, { - "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": "낮다", - "text": "방화벽 규칙에 대한 백업 구현Implement backups for your firewall rules", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "보통", + "text": "모든 API 정책에 요소가 포함되어 있는지 확인합니다.", "waf": "작업" }, { - "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": "높다", - "text": "컨트롤 플레인 트래픽을 차단하는 0.0.0.0/0 경로 또는 NSG 규칙과 같이 가상 네트워크에 삽입된 Azure PaaS 서비스에 대한 컨트롤 플레인 통신을 중단하지 마세요.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", - "waf": "안전" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", + "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", + "service": "APIM", + "severity": "보통", + "text": "정책 조각을 사용하여 여러 API에서 동일한 정책 정의를 반복하지 않도록 합니다.", + "waf": "작업" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", + "link": "https://learn.microsoft.com/azure/api-management/monetization-support", + "service": "APIM", "severity": "보통", - "text": "프라이빗 엔드포인트 및 ExpressRoute 프라이빗 피어링을 통해 온-프레미스에서 Azure PaaS 서비스에 액세스하세요. 이 방법을 사용하면 공용 인터넷을 통해 전송되지 않습니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "안전" + "text": "API로 수익을 창출할 계획이라면 '수익 창출 지원' 도움말에서 권장사항을 확인하세요", + "waf": "작업" }, - { - "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", + { + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "a7d0840a-c8c4-4e83-adec-5ca578eb4049", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", + "service": "APIM", "severity": "높다", - "text": "모든 서브넷에서 기본적으로 가상 네트워크 서비스 엔드포인트를 사용하도록 설정하지 마세요.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", - "waf": "안전" + "text": "진단 설정을 사용하도록 설정하여 로그를 Azure Monitor로 내보내기", + "waf": "작업" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", + "service": "APIM", "severity": "보통", - "text": "Azure Firewall 또는 NVA의 IP 주소 대신 FQDN을 사용하여 Azure PaaS 서비스에 대한 송신 트래픽을 필터링하여 데이터 반출을 방지합니다. Private Link를 사용하는 경우 모든 FQDN을 차단할 수 있으며, 그렇지 않으면 필요한 PaaS 서비스만 허용할 수 있습니다.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", - "waf": "안전" + "text": "더 자세한 원격 분석을 위해 Application Insights 사용", + "waf": "작업" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", + "service": "APIM", "severity": "높다", - "text": "게이트웨이 서브넷에 /27 이상의 접두사를 사용합니다.", - "waf": "안전" + "text": "가장 중요한 메트릭에 대한 경고 구성", + "waf": "작업" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "높다", - "text": "VirtualNetwork 서비스 태그를 사용하여 연결을 제한하는 NSG 인바운드 기본 규칙에 의존하지 마세요.", + "text": "사용자 지정 SSL 인증서가 안전하게 액세스하고 업데이트할 수 있도록 Azure Key Vault에 저장되어 있는지 확인합니다", "waf": "안전" }, { - "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": "보통", - "text": "NSG를 사용하여 서브넷 간의 트래픽과 플랫폼 전체의 동쪽/서쪽 트래픽(랜딩 존 간 트래픽)을 보호할 수 있습니다.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "높다", + "text": "Azure AD를 사용하여 API(데이터 평면)에 들어오는 요청 보호", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", + "service": "APIM", "severity": "보통", - "text": "NSG 및 애플리케이션 보안 그룹을 사용하여 랜딩 존 내의 트래픽을 마이크로 세그먼트화하고 중앙 NVA를 사용하여 트래픽 흐름을 필터링하지 않도록 합니다.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "text": "Microsoft Entra ID를 사용하여 개발자 포털에서 사용자 인증", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", + "service": "APIM", "severity": "보통", - "text": "VNet 흐름 로그를 사용하도록 설정하고 트래픽 분석에 제공하여 내부 및 외부 트래픽 흐름에 대한 인사이트를 얻을 수 있습니다.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "text": "제품의 가시성을 제어하기 위해 적절한 그룹을 만듭니다", "waf": "안전" }, { - "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": "보통", - "text": "1,000개의 규칙 제한으로 인해 NSG당 900개 이상의 NSG 규칙을 구현하지 마세요.", - "training": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", - "waf": "신뢰도" - }, - { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "06862505-2d9a-4874-9491-2837b00a3475", + "link": "https://learn.microsoft.com/azure/api-management/backends", + "service": "APIM", "severity": "보통", - "text": "시나리오가 Virtual WAN 라우팅 디자인 목록에 명시적으로 설명된 경우 Virtual WAN을 사용합니다.", - "training": "https://learn.microsoft.com/learn/modules/introduction-azure-virtual-wan/", + "text": "백엔드 기능을 사용하여 중복 API 백엔드 구성 제거", "waf": "작업" }, { - "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": "보통", - "text": "Azure 지역당 Virtual WAN 허브를 사용하여 공통 글로벌 Azure Virtual WAN을 통해 Azure 지역 간에 여러 랜딩 존을 함께 연결합니다.", - "waf": "공연" - }, - { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", + "service": "APIM", "severity": "보통", - "text": "아웃바운드 인터넷 트래픽 보호 및 필터링을 위해 보안 허브에 Azure Firewall을 배포합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "안전" + "text": "명명된 값을 사용하여 정책에서 사용할 수 있는 공통 값 저장", + "waf": "작업" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", + "service": "APIM", "severity": "보통", - "text": "Virtual WAN 네트워크 아키텍처가 식별된 아키텍처 시나리오에 맞는지 확인합니다.", + "text": "DR의 경우 99.99% SLA를 위해 둘 이상의 지역에 걸쳐 확장된 배포와 함께 프리미엄 계층을 활용합니다", "waf": "신뢰도" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", + "link": "https://learn.microsoft.com/azure/api-management/high-availability", + "service": "APIM", "severity": "보통", - "text": "Virtual WAN용 Azure Monitor Insights를 사용하여 Virtual WAN의 엔드투엔드 토폴로지, 상태 및 주요 메트릭을 모니터링합니다.", - "waf": "작업" + "text": "99.99%의 SLA 증가를 위해 둘 이상의 가용성 영역에 하나 이상의 단위를 배포합니다.", + "waf": "신뢰도" }, { - "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": "보통", - "text": "이러한 흐름을 명시적으로 차단해야 하는 경우가 아니면 Virtual WAN에서 분기 간 트래픽을 사용하지 않도록 설정하지 마세요.", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "높다", + "text": "자동화된 백업 루틴이 있는지 확인", "waf": "신뢰도" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", + "link": "https://learn.microsoft.com/azure/api-management/retry-policy", + "service": "APIM", "severity": "보통", - "text": "AS-Path는 ExpressRoute 또는 VPN보다 유연하므로 허브 라우팅 기본 설정으로 사용합니다.", + "text": "정책을 사용하여 장애 조치 백엔드 URL 및 캐싱을 추가하여 실패한 호출을 줄입니다.", "waf": "신뢰도" }, { - "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": "보통", - "text": "Virtual WAN에서 레이블 기반 전파를 구성하지 않으면 가상 허브 간의 연결이 손상됩니다.", - "waf": "신뢰도" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", + "service": "APIM", + "severity": "낮다", + "text": "고성능 수준에서 기록해야 하는 경우 Event Hubs 정책을 고려합니다", + "waf": "작업" }, { - "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": "높다", - "text": "가상 허브에 /23 접두사 이상을 할당하여 충분한 IP 공간을 사용할 수 있도록 합니다.", - "waf": "신뢰도" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", + "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", + "service": "APIM", + "severity": "보통", + "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": "공연" }, { - "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": "높다", - "text": "Azure Policy를 전략적으로 활용하고, 정책 이니셔티브를 사용하여 관련 정책을 그룹화하여 환경에 대한 컨트롤을 정의합니다.", - "waf": "안전" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", + "service": "APIM", + "severity": "보통", + "text": "부하가 증가할 때 인스턴스 수를 확장하도록 자동 크기 조정 구성Configure autoscaling to scale out the number of instances when the load increases", + "waf": "공연" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", + "service": "APIM", "severity": "보통", - "text": "규정 및 규정 준수 요구 사항을 Azure Policy 정의 및 Azure 역할 할당에 매핑합니다.", - "waf": "안전" + "text": "Azure에 백 엔드 API에 가까운 지역이 없는 자체 호스팅 게이트웨이를 배포합니다.", + "waf": "공연" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", + "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", + "service": "APIM", "severity": "보통", - "text": "상속된 범위에서 할당할 수 있도록 중간 루트 관리 그룹에서 Azure Policy 정의를 설정합니다.", - "waf": "안전" - }, - { - "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": "높다", - "text": "필요한 경우 최하위 수준에서 제외를 사용하여 가장 적절한 수준에서 정책 할당을 관리합니다.", - "waf": "안전" + "text": "프로덕션 워크로드에 프리미엄 계층을 사용합니다.", + "waf": "신뢰도" }, { - "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": "낮다", - "text": "Azure Policy를 사용하여 사용자가 구독/관리 그룹 수준에서 프로비전할 수 있는 서비스를 제어합니다.", - "waf": "안전" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "보통", + "text": "다중 리전 모델에서는 Policies를 사용하여 가용성 또는 지연 시간에 따라 리전 백엔드로 요청을 라우팅합니다.", + "waf": "신뢰도" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "높다", - "text": "가능한 경우 기본 제공 정책을 사용하여 운영 오버헤드를 최소화합니다.", - "waf": "안전" + "text": "APIM의 제한에 유의해야 합니다.", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "Azure Landing Zone Review", - "description": "Resource Policy Contributor 역할을 특정 범위에 할당하면 정책 관리를 관련 팀에 위임할 수 있습니다. 예를 들어 중앙 IT 팀은 관리 그룹 수준 정책을 감독하고 응용 프로그램 팀은 구독에 대한 정책을 처리하여 조직 표준을 준수하는 분산 거버넌스를 가능하게 할 수 있습니다.", - "guid": "3f988795-25d6-4268-a6d7-0ba6c97be995", - "link": "https://learn.microsoft.com/azure/governance/policy/overview#azure-rbac-permissions-in-azure-policy", - "service": "Policy", - "severity": "보통", - "text": "특정 범위에서 기본 제공 Resource Policy Contributor 역할을 할당하여 응용 프로그램 수준 거버넌스를 사용하도록 설정합니다.", - "waf": "안전" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", + "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", + "service": "APIM", + "severity": "높다", + "text": "자체 호스팅 게이트웨이 배포가 복원력이 있는지 확인합니다.", + "waf": "신뢰도" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "7519e385-a88b-4d34-966b-6269d686e890", + "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", + "service": "APIM", "severity": "보통", - "text": "상속된 범위에서 제외를 통해 관리하지 않도록 루트 관리 그룹 범위에서 수행된 Azure Policy 할당 수를 제한합니다.", - "waf": "안전" + "text": "다중 지역 배포를 위해 APIM 앞에서 Azure Front Door 사용Use Azure Front Door in front of APIM for multi-region deployment", + "waf": "공연" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "보통", - "text": "데이터 주권 요구 사항이 있는 경우 이를 적용하기 위해 Azure 정책을 배포해야 합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "text": "VNet(Virtual Network) 내에 서비스 배포Deploy the service within a Virtual Network (VNet)", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "보통", - "text": "Sovereign Landing Zone의 경우 주권 정책 기준을 배포하고 올바른 관리 그룹 수준에서 할당합니다.", + "text": "서브넷에 NSG(네트워크 보안 그룹)를 배포하여 APIM에서 들어오고 나가는 트래픽을 제한하거나 모니터링합니다.", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "보통", - "text": "Sovereign Landing Zone의 경우 정책 매핑에 대한 Sovereign Control 목표를 문서화합니다.", + "text": "프라이빗 엔드포인트를 배포하여 APIM이 VNet에 배포되지 않은 경우 들어오는 트래픽을 필터링합니다.", "waf": "안전" }, { - "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": "보통", - "text": "Sovereign Landing Zone의 경우 '정책 매핑에 대한 Sovereign Control 목표'를 관리하기 위한 프로세스가 마련되어 있는지 확인합니다.", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "높다", + "text": "공용 네트워크 액세스 사용 안 함", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", + "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", + "service": "APIM", "severity": "보통", - "text": "Azure RBAC(Azure 역할 기반 액세스 제어), 데이터 주권 요구 사항 또는 데이터 보존 정책에 따라 별도의 작업 영역이 필요한 경우를 제외하고 단일 모니터 로그 작업 영역을 사용하여 플랫폼을 중앙에서 관리합니다.", - "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "waf": "작업" - }, - { - "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": "높다", - "text": "로그 보존 요구 사항이 12년을 초과하는 경우 로그를 Azure Storage로 내보냅니다. Write-once, Read-Many 정책과 함께 변경할 수 없는 스토리지를 사용하여 사용자가 지정한 간격 동안 데이터를 지우거나 수정할 수 없도록 합니다.", - "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "text": "PowerShell 자동화 스크립트로 관리 간소화", "waf": "작업" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "보통", - "text": "Azure Policy를 사용하여 OS 수준 VM(가상 머신) 구성 드리프트를 모니터링합니다. 정책을 통해 Azure Automanage Machine Configuration 감사 기능을 사용하도록 설정하면 애플리케이션 팀 워크로드가 적은 노력으로 기능 기능을 즉시 사용할 수 있습니다.", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "text": "Infrastructure-as-code를 통해 APIM을 구성합니다. Cloud Adaption Framework APIM 랜딩 존 가속기에서 DevOps 모범 사례 검토", "waf": "작업" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", + "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", + "service": "APIM", "severity": "보통", - "text": "Azure Update Manager를 Azure의 Windows 및 Linux VM에 대한 패치 메커니즘으로 사용합니다.", - "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "text": "더 빠른 API 개발을 위해 Visual Studio Code APIM 확장 사용 촉진", "waf": "작업" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "354f1c03-8112-4965-85ad-c0074bddf231", + "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", + "service": "APIM", "severity": "보통", - "text": "Azure Arc를 사용하여 Azure 외부의 Windows 및 Linux VM에 대한 패치 메커니즘으로 Azure Update Manager를 사용합니다.", - "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "text": "워크플로에서 DevOps 및 CI/CD 구현", "waf": "작업" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "b6439493-426a-45f3-9697-cf65baee208d", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", + "service": "APIM", "severity": "보통", - "text": "Network Watcher를 사용하여 트래픽 흐름을 사전에 모니터링합니다.", - "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", - "waf": "작업" + "text": "클라이언트 인증서 인증을 사용하여 API 보안", + "waf": "안전" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "2a67d143-1033-4c0a-8732-680896478f08", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", + "service": "APIM", "severity": "보통", - "text": "인사이트 및 보고를 위해 Azure Monitor 로그를 사용합니다.", - "waf": "작업" + "text": "클라이언트 인증서 인증을 사용한 보안 백엔드 서비스", + "waf": "안전" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", + "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", + "service": "APIM", "severity": "보통", - "text": "Azure Monitor 경고를 사용하여 운영 경고를 생성합니다.", - "waf": "작업" + "text": "'OWASP API 보안 상위 10개 위협을 완화하기 위한 권장 사항' 문서를 검토하고 API에 적용할 수 있는 항목을 확인합니다.", + "waf": "안전" }, { - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", + "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", + "service": "APIM", "severity": "보통", - "text": "Azure Automation 계정을 통해 변경 및 인벤토리 추적을 사용하는 경우 Log Analytics 작업 영역과 자동화 계정을 함께 연결하는 데 지원되는 지역을 선택했는지 확인합니다.", - "waf": "작업" + "text": "권한 부여 기능을 사용하여 백엔드 API에 대한 OAuth 2.0 토큰 관리 간소화", + "waf": "안전" }, { - "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": "낮다", - "text": "Azure Backup을 사용하는 경우 기본 설정은 GRS이므로 백업에 올바른 백업 유형(GRS, ZRS & LRS)을 사용합니다.", - "waf": "신뢰도" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", + "service": "APIM", + "severity": "높다", + "text": "전송 중인 정보를 암호화할 때 최신 TLS 버전을 사용합니다. 가능한 경우 오래되고 불필요한 프로토콜과 암호를 사용하지 않도록 설정합니다.", + "waf": "안전" }, { - "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": "보통", - "text": "Azure 게스트 정책을 사용하여 VM 확장을 통해 소프트웨어 구성을 자동으로 배포하고 규격 기준 VM 구성을 적용합니다.", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "높다", + "text": "비밀(명명된 값)이 안전하게 액세스하고 업데이트할 수 있도록 Azure Key Vault에 저장되었는지 확인합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Azure Landing Zone Review", - "description": "Azure Policy의 게스트 구성 기능을 사용하여 컴퓨터 설정(예: OS, 애플리케이션, 환경)을 감사하고 수정하여 리소스가 예상 구성에 맞게 조정되도록 하고, 업데이트 관리는 VM에 대한 패치 관리를 적용할 수 있습니다.", - "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", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "보통", - "text": "Azure Policy를 통해 VM 보안 구성 드리프트를 모니터링합니다.", + "text": "가능할 때마다 관리 ID를 사용하여 다른 Azure 리소스에 인증", "waf": "안전" }, { - "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": "보통", - "text": "Azure-to-Azure Virtual Machines 재해 복구 시나리오에는 Azure Site Recovery를 사용합니다. 이렇게 하면 지역 간에 워크로드를 복제할 수 있습니다.", - "waf": "작업" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "높다", + "text": "APIM 앞에 Application Gateway를 배포하여 WAF(웹 애플리케이션 방화벽) 사용Use Web Application Firewall (WAF) by deploying Application Gateway in of APIM", + "waf": "안전" }, { - "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": "보통", - "text": "Azure 네이티브 백업 기능 또는 Azure 호환 타사 백업 솔루션을 사용합니다.", - "waf": "작업" + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", + "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", + "service": "IoT Hub DPS", + "severity": "높다", + "text": "비즈니스 및 SLO 요구 사항에 따라 올바른 Logic App 호스팅 계획 선택Select the right Logic App hosting plan based on your business & SLO requirements", + "waf": "신뢰도" }, { - "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", + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "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", "severity": "높다", - "text": "Azure Front Door 및 Azure Application Gateway와 같은 애플리케이션 배달 서비스에서 WAF 로그를 저장하는 진단 설정을 추가합니다. 로그를 정기적으로 검토하여 공격 및 가양성 탐지를 확인합니다.", - "waf": "작업" + "text": "영역 중복 및 가용성 영역을 사용하여 지역 오류로부터 논리 앱 보호Protect logic apps from region failures with zone redundancy and availability zones", + "waf": "신뢰도" }, { - "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": "보통", - "text": "Azure Front Door 및 Azure Application Gateway와 같은 애플리케이션 배달 서비스에서 Microsoft Sentinel로 WAF 로그를 보냅니다. 공격을 탐지하고 WAF 텔레메트리를 전체 Azure 환경에 통합합니다.", - "waf": "작업" + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "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", + "severity": "높다", + "text": "중요한 워크로드에 대한 지역 간 DR 전략 고려", + "waf": "신뢰도" }, { - "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", + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "IoT Hub DPS", "severity": "높다", - "text": "Azure Key Vault를 사용하여 비밀과 자격 증명을 저장합니다.", - "waf": "안전" + "text": "격리된 환경에 배포하는 경우 ASE(App Service Environment) v3을 사용하거나 마이그레이션합니다", + "waf": "신뢰도" }, { - "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", + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "IoT Hub DPS", "severity": "보통", - "text": "서로 다른 애플리케이션 및 지역에 대해 서로 다른 Azure Key Vault를 사용하여 트랜잭션 규모 제한을 방지하고 비밀에 대한 액세스를 제한합니다.", - "waf": "안전" + "text": "Azure DevOps 또는 GitHub를 활용하여 CI/CD를 간소화하고 논리 앱 코드를 보호합니다.", + "waf": "작업" }, { - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "보통", - "text": "삭제된 개체에 대한 보존 보호를 허용하기 위해 일시 삭제 및 제거 정책을 사용하도록 설정된 Azure Key Vault를 프로비전합니다.", - "waf": "안전" + "text": "Azure Front Door에서 고객 관리형 TLS 인증서를 사용하는 경우 '최신' 인증서 버전을 사용합니다. 수동 인증서 갱신으로 인한 중단 위험 감소", + "waf": "작업" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "보통", - "text": "키, 비밀 및 인증서를 영구적으로 삭제할 수 있는 권한 부여를 특수 사용자 지정 Microsoft Entra ID 역할로 제한하여 최소 권한 모델을 따릅니다.", + "text": "Application Gateway v2 SKU를 사용하고 있는지 확인합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "보통", - "text": "공용 인증 기관을 통해 인증서 관리 및 갱신 프로세스를 자동화하여 관리를 용이하게 합니다.", + "text": "Azure Load Balancer에 표준 SKU를 사용하고 있는지 확인합니다.", "waf": "안전" }, { - "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", + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "guid": "9432621a-8397-4654-a882-5bc856b7ef83", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", + "service": "Load Balancer", "severity": "보통", - "text": "키 및 인증서 교체를 위한 자동화된 프로세스를 설정합니다.", + "text": "Load Balancer 프런트 엔드 IP 주소가 영역 중복인지 확인합니다(영역 프런트 엔드가 필요하지 않은 경우).", "waf": "안전" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "보통", - "text": "자격 증명 모음에서 방화벽 및 가상 네트워크 서비스 엔드포인트 또는 프라이빗 엔드포인트를 사용하도록 설정하여 키 자격 증명 모음에 대한 액세스를 제어합니다.", + "text": "Application Gateways v2는 IP 접두사가 /24보다 크거나 같은 서브넷에 배포해야 합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "안전" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "description": "일반적으로 역방향 프록시 및 특히 WAF의 관리는 네트워킹보다 애플리케이션에 더 가깝기 때문에 앱과 동일한 구독에 속합니다. 연결 구독에서 Application Gateway 및 WAF를 중앙 집중화하는 것은 단일 팀에서 관리하는 경우 괜찮을 수 있습니다.", + "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "App Gateway", "severity": "보통", - "text": "플랫폼 중앙 Azure Monitor Log Analytics 작업 영역을 사용하여 Key Vault의 각 인스턴스 내에서 키, 인증서 및 비밀 사용을 감사합니다.", + "text": "랜딩 존 가상 네트워크 내에서 그리고 보안 중인 앱을 사용하여 인바운드 HTTP(S) 연결을 프록시하는 데 사용되는 Azure Application Gateway v2 또는 파트너 NVA를 배포합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "안전" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "App Gateway", "severity": "보통", - "text": "Key Vault 인스턴스화 및 권한 있는 액세스를 위임하고 Azure Policy를 사용하여 일관된 규정 준수 구성을 적용합니다.", + "text": "애플리케이션 랜딩 존의 모든 공용 IP 주소에 대해 DDoS 네트워크 또는 IP 보호 계획을 사용합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "안전" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "보통", - "text": "애플리케이션별, 환경별, 지역별 Azure Key Vault를 사용합니다.", - "waf": "안전" + "text": "최소 2개의 인스턴스로 자동 크기 조정을 구성합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "신뢰도" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "보통", - "text": "사용자 고유의 키를 가져오려는 경우 고려되는 모든 서비스에서 지원되지 않을 수 있습니다. 불일치가 원하는 결과를 방해하지 않도록 관련 완화를 구현합니다. 대기 시간을 최소화하는 적절한 지역 쌍과 재해 복구 지역을 선택합니다.", - "waf": "안전" + "text": "가용성 영역에 Application Gateway 배포Deploy Application Gateway across Availability Zones", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "신뢰도" }, { - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Front Door", "severity": "보통", - "text": "Sovereign Landing Zone의 경우 Azure Key Vault 관리형 HSM을 사용하여 비밀과 자격 증명을 저장합니다.", + "text": "WAF 정책과 함께 Azure Front Door를 사용하여 여러 Azure 지역에 걸쳐 있는 글로벌 HTTP/S 앱을 제공하고 보호할 수 있습니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "안전" }, { - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "3f29812b-2363-4cef-b179-b599de0d5973", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "Front Door", "severity": "보통", - "text": "Microsoft Entra ID 보고 기능을 사용하여 액세스 제어 감사 보고서를 생성합니다.", + "text": "Front Door 및 Application Gateway를 사용하여 HTTP/S 앱을 보호하는 경우 Front Door에서 WAF 정책을 사용합니다. Front Door에서만 트래픽을 수신하도록 Application Gateway를 잠급니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "안전" }, { - "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", + "ammp": true, + "arm-service": "microsoft.network/trafficManagerProfiles", + "checklist": "Azure Application Delivery Networking", + "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Traffic Manager", "severity": "높다", - "text": "모든 구독에 대해 Defender 클라우드 보안 태세 관리를 사용하도록 설정합니다.", + "text": "Traffic Manager를 사용하여 HTTP/S 이외의 프로토콜에 걸쳐 있는 글로벌 앱을 제공합니다.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "신뢰도" + }, + { + "checklist": "Azure Application Delivery Networking", + "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "Entra", + "severity": "낮다", + "text": "사용자가 내부 애플리케이션에만 액세스해야 하는 경우 Microsoft Entra ID 애플리케이션 프록시를 AVD(Azure Virtual Desktop)의 대안으로 고려했나요?", + "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", "waf": "안전" }, { - "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": "높다", - "text": "모든 구독에서 서버에 대해 Defender 클라우드 워크로드 보호 계획을 사용하도록 설정합니다.", + "checklist": "Azure Application Delivery Networking", + "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "Entra", + "severity": "보통", + "text": "네트워크에서 들어오는 연결에 대해 열려 있는 방화벽 포트 수를 줄이려면 Microsoft Entra ID 애플리케이션 프록시를 사용하여 원격 사용자에게 내부 애플리케이션에 대한 안전하고 인증된 액세스를 제공하는 것이 좋습니다.", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", "waf": "안전" }, { - "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", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "높다", - "text": "모든 구독에서 Azure 리소스에 대한 Defender 클라우드 워크로드 보호 계획을 사용하도록 설정합니다.", + "text": "Web Application Firewall이 트래픽을 허용하거나 거부하기 위해 적절한 조치를 취하도록 Front Door에 대한 WAF 정책을 '방지' 모드'에 배포합니다.", "waf": "안전" }, { - "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", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "높다", - "text": "IaaS 서버에서 Endpoint Protection을 사용하도록 설정합니다.", + "text": "Azure Traffic Manager와 Azure Front Door를 결합하지 마세요.", "waf": "안전" }, { - "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": "보통", - "text": "Azure Monitor 로그 및 클라우드용 Defender를 통해 기본 운영 체제 패치 드리프트를 모니터링합니다.", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "높다", + "text": "Azure Front Door 및 원본에서 동일한 도메인 이름을 사용합니다. 일치하지 않는 호스트 이름은 미묘한 버그를 유발할 수 있습니다.", "waf": "안전" }, { - "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": "보통", - "text": "기본 리소스 구성을 중앙 집중식 Azure Monitor Log Analytics 작업 영역에 연결합니다.", - "waf": "안전" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "낮다", + "text": "Azure Front Door 원본 그룹에 원본이 하나만 있는 경우 상태 프로브를 사용하지 않도록 설정합니다.", + "waf": "공연" }, { - "checklist": "Azure Landing Zone Review", - "guid": "1761e147-f65e-4d09-bbc2-f464f23e2eba", - "link": "https://learn.microsoft.com/industry/sovereignty/transparency-logs", - "service": "Entra", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", + "service": "Front Door", "severity": "보통", - "text": "Sovereign Landing Zone의 경우 Entra ID 테넌트에서 투명 로그를 사용하도록 설정합니다.", - "waf": "안전" + "text": "Azure Front Door에 대한 양호한 상태 프로브 엔드포인트를 선택합니다. 애플리케이션의 모든 종속성을 확인하는 상태 엔드포인트를 구축하는 것이 좋습니다.", + "waf": "신뢰도" }, { - "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": "보통", - "text": "Sovereign Landing Zone의 경우 Entra ID 테넌트에서 고객 Lockbox를 사용하도록 설정합니다.", - "waf": "안전" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "낮다", + "text": "Azure Front Door와 함께 HEAD 상태 프로브를 사용하여 Front Door가 애플리케이션으로 보내는 트래픽을 줄입니다.", + "waf": "공연" }, { - "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", + "ammp": true, + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "높다", - "text": "스토리지 계정에 대한 보안 전송을 사용하도록 설정합니다.", - "waf": "안전" + "text": "SNAT 확장성 향상을 위해 Load Balancer 아웃바운드 규칙 대신 Azure NAT Gateway 사용", + "waf": "신뢰도" }, { - "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", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "높다", - "text": "스토리지 계정에 대해 컨테이너 일시 삭제를 사용하도록 설정하여 삭제된 컨테이너와 해당 콘텐츠를 복구합니다.", - "waf": "안전" + "text": "Azure Front Door에서 관리형 TLS 인증서를 사용합니다. 운영 비용을 줄이고 인증서 갱신으로 인한 중단 위험을 줄입니다.", + "waf": "작업" }, { - "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": "높다", - "text": "Key Vault 비밀을 사용하여 자격 증명(가상 머신 사용자 암호), 인증서 또는 키와 같은 중요한 정보를 하드 코딩하지 않도록 합니다.", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "보통", + "text": "Azure Front Door WAF 구성을 코드로 정의합니다. 코드를 사용하면 새 규칙 집합 버전을 보다 쉽게 채택하고 추가 보호를 얻을 수 있습니다.", "waf": "작업" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization Checklist", - "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", - "service": "Azure Monitor", - "text": "Azure Monitor -https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview 의 데이터 수집 규칙", - "training": "https://azure.microsoft.com/pricing/reservations/", - "waf": "비용" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", + "service": "Front Door", + "severity": "높다", + "text": "Azure Front Door에서 엔드투엔드 TLS를 사용합니다. 클라이언트에서 Front Door로, Front Door에서 원본으로 연결하는 데 TLS를 사용합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "text": "기본 데이터 원본을 찾을 수 없는 백업 인스턴스 확인", - "waf": "비용" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", + "service": "Front Door", + "severity": "보통", + "text": "Azure Front Door에서 HTTP를 HTTPS로 리디렉션을 사용합니다. 이전 클라이언트를 HTTPS 요청으로 자동으로 리디렉션하여 지원합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "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", - "text": "연결되지 않은 서비스(디스크, NIC, IP 주소 등) 삭제 또는 보관", - "waf": "비용" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", + "service": "Front Door", + "severity": "높다", + "text": "Azure Front Door WAF를 사용하도록 설정합니다. 다양한 공격으로부터 응용 프로그램을 보호합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "text": "중요 업무용 응용 프로그램에 대한 Site Recovery 저장소와 백업 간의 적절한 균형을 고려합니다.", - "waf": "비용" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "높다", + "text": "검색 모드에서 WAF를 구성하여 가양성 검색을 줄이고 수정하여 워크로드에 맞게 Azure Front Door WAF를 조정합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization 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", - "text": "40개의 서로 다른 로그 분석 작업 영역 간의 지출 및 절감 기회 확인 - 비프로덕션 작업 영역에 대해 서로 다른 보존 및 데이터 수집 사용-인식 및 계층 크기 조정을 위한 일일 한도 만들기 - 일일 한도를 설정하는 경우 한도에 도달할 때 경고를 만드는 것 외에도 특정 비율(예: 90%)에 도달했을 때 알림을 받을 경고 규칙도 만들어야 합니다. - 가능한 경우 작업 영역 변환 고려 - 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": "비용" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "높다", + "text": "Azure Front Door WAF 정책에서 요청 본문 검사 기능을 사용하도록 설정합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization 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", - "text": "제거 로그 정책 및 자동화 적용(필요한 경우 로그를 콜드 스토리지로 이동할 수 있음)", - "training": "https://www.youtube.com/watch?v=nHQYcYGKuyw", - "waf": "비용" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "높다", + "text": "Azure Front Door WAF 기본 규칙 집합을 사용하도록 설정합니다. 기본 규칙 집합은 일반적인 공격을 탐지하고 차단합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "text": "디스크가 실제로 필요한지 확인하고, 그렇지 않은 경우 삭제하십시오. 필요한 경우 더 낮은 스토리지 계층을 찾거나 백업을 사용합니다.", - "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/manage-automation", - "waf": "비용" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "높다", + "text": "Azure Front Door WAF 봇 보호 규칙 집합을 사용하도록 설정합니다. 봇 규칙은 좋은 봇과 나쁜 봇을 감지합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization 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", - "text": "사용자 지정 규칙을 사용하여 사용하지 않는 스토리지를 하위 계층으로 이동하는 것이 좋습니다 - 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": "비용" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "보통", + "text": "최신 Azure Front Door WAF 규칙 집합 버전을 사용합니다. 규칙 집합 업데이트는 현재 위협 환경을 고려하기 위해 정기적으로 업데이트됩니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "VM", - "text": "Advisor가 VM 올바른 크기 조정에 대해 구성되어 있는지 확인합니다. ", - "waf": "비용" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "보통", + "text": "Azure Front Door WAF에 속도 제한을 추가합니다. 속도 제한은 클라이언트가 실수로 또는 의도적으로 짧은 시간에 많은 양의 트래픽을 보내는 것을 차단합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "description": "Cost analysys에서 Meter Category Licenses를 검색하여 확인합니다.", - "guid": "59ae568b-a38d-4498-9e22-13dbd7bb012f", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/manage/centralize-operations", - "service": "VM", - "text": "모든 Windows VM에서 스크립트 실행 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- Windows VM을 자주 만드는 경우 정책 구현을 고려합니다.", - "waf": "비용" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "보통", + "text": "Azure Front Door WAF 속도 제한에 높은 임계값을 사용합니다. 높은 속도 제한 임계값은 합법적인 트래픽 차단을 방지하는 동시에 인프라를 압도할 수 있는 매우 많은 수의 요청에 대한 보호를 제공합니다. ", + "waf": "안전" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", - "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", - "service": "VM", - "text": " 이미 라이선스가 있는 경우 AHUB에 넣을 수도 https://learn.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux?tabs=rhelpayg%2Crhelbyos%2CrhelEnablebyos%2Crhelcompliance", - "waf": "비용" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "낮다", + "text": "모든 지역에서 트래픽이 발생할 것으로 예상되지 않는 경우 지역 필터를 사용하여 예상하지 못한 국가의 트래픽을 차단합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", - "service": "VM", - "text": "유연성 옵션을 사용하여 예약된 VM 제품군 통합(4-5개 이하의 제품군)", - "training": "https://learn.microsoft.com/azure/automation/automation-solution-vm-management", - "waf": "비용" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "보통", + "text": "Azure Front Door WAF를 사용하여 트래픽을 지리적으로 필터링할 때 알 수 없는(ZZ) 위치를 지정합니다. IP 주소를 지리적으로 일치시킬 수 없는 경우 합법적인 요청을 실수로 차단하지 마세요.", + "waf": "안전" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "text": "Azure Reserved Instances 활용: 이 기능을 사용하면 1년 또는 3년 동안 VM을 예약할 수 있으므로 PAYG 가격에 비해 상당한 비용 절감 효과를 얻을 수 있습니다.", - "waf": "비용" + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "높다", + "text": "Azure Application Gateway WAF 봇 보호 규칙 집합을 사용하도록 설정합니다. 봇 규칙은 좋은 봇과 나쁜 봇을 감지합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", - "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", - "service": "VM", - "text": "더 큰 디스크만 예약할 수 있습니다 => 1TiB -", - "waf": "비용" + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "높다", + "text": "Azure Application Gateway WAF 정책에서 요청 본문 검사 기능을 사용하도록 설정합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", - "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", - "service": "VM", - "text": "적절한 크기 최적화 후", - "waf": "비용" + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", + "service": "App Gateway", + "severity": "높다", + "text": "워크로드에 대한 검색 모드에서 Azure Application Gateway WAF를 조정합니다. 거짓 긍정 탐지를 줄입니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Sql/servers", - "checklist": "Cost Optimization Checklist", - "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", - "service": "Azure SQL", - "text": "적용 가능한 경우 확인 및 정책/변경 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": "비용" + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "높다", + "text": "'방지' 모드에서 Application Gateway에 대한 WAF 정책을 배포합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", - "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", - "service": "VM", - "text": "VM + 라이선스 부분 할인(ahub + 3YRI)은 약 70% 할인입니다.", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", + "service": "App Gateway", + "severity": "보통", + "text": "Azure Application Gateway WAF에 속도 제한을 추가합니다. 속도 제한은 클라이언트가 실수로 또는 의도적으로 짧은 시간에 많은 양의 트래픽을 보내는 것을 차단합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "text": "플랫 사이징보다는 VMSS를 사용하여 수요에 맞추는 것이 좋습니다", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "보통", + "text": "Azure Application Gateway WAF 속도 제한에 높은 임계값을 사용합니다. 높은 속도 제한 임계값은 합법적인 트래픽 차단을 방지하는 동시에 인프라를 압도할 수 있는 매우 많은 수의 요청에 대한 보호를 제공합니다. ", + "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Cost Optimization Checklist", - "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "AKS", - "text": "AKS 자동 크기 조정기를 사용하여 클러스터 사용량과 일치시킵니다(Pod 요구 사항이 스케일러와 일치하는지 확인).", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "낮다", + "text": "모든 지역에서 트래픽이 발생할 것으로 예상되지 않는 경우 지역 필터를 사용하여 예상하지 못한 국가의 트래픽을 차단합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "text": "해당하는 경우 복구 지점을 자격 증명 모음 보관으로 이동(유효성 검사)Move recovery points to vault-archive where applicable (Validate)", - "training": "https://azure.microsoft.com/pricing/reservations/", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", + "service": "App Gateway", + "severity": "보통", + "text": "Azure Application Gateway WAF를 사용하여 트래픽을 지리적으로 필터링할 때 알 수 없는(ZZ) 위치를 지정합니다. IP 주소를 지리적으로 일치시킬 수 없는 경우 합법적인 요청을 실수로 차단하지 마세요.", + "waf": "안전" }, { - "arm-service": "Microsoft.Databricks/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", - "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", - "service": "Databricks", - "text": "가능한 경우 대체와 함께 스폿 VM을 사용하는 것이 좋습니다. 클러스터의 자동 종료를 고려합니다.", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "보통", + "text": "최신 Azure Application Gateway WAF 규칙 집합 버전을 사용합니다. 규칙 집합 업데이트는 현재 위협 환경을 고려하기 위해 정기적으로 업데이트됩니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", - "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", - "service": "Azure Functions", - "text": "함수 - 연결 재사용", - "training": "https://learn.microsoft.com/azure/cost-management-billing/reservations/reservation-apis?toc=%2Fazure%2Fcost-management-billing%2Ftoc.json", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "보통", + "text": "진단 설정을 추가하여 Azure Application Gateway WAF 로그를 저장합니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", - "link": "https://learn.microsoft.com/azure/automation/update-management/overview", - "service": "Azure Functions", - "text": "함수 - 로컬에 데이터 캐시", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", - "waf": "비용" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "보통", + "text": "진단 설정을 추가하여 Azure Front Door WAF 로그를 저장합니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", - "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", - "service": "Azure Functions", - "text": "기능 - 콜드 스타트 - '패키지에서 실행' 기능을 사용합니다. 이렇게 하면 코드가 단일 zip 파일로 다운로드됩니다. 예를 들어, 이것은 많은 노드 모듈이 있는 Javascript 함수를 크게 개선할 수 있습니다. 언어별 도구를 사용하여 패키지 크기를 줄입니다(예: 트리 쉐이킹 Javascript 애플리케이션).", - "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "보통", + "text": "Azure Application Gateway WAF 로그를 Microsoft Sentinel로 보냅니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "Azure Functions", - "text": "기능 - 기능을 따뜻하게 유지", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "비용" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "보통", + "text": "Azure Front Door WAF 로그를 Microsoft Sentinel로 보냅니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "Azure Functions", - "text": "다른 함수와 함께 자동 크기 조정을 사용하는 경우 모든 리소스에 대한 모든 자동 크기 조정을 구동하는 것이 있을 수 있으므로 별도의 소비 계획으로 이동하는 것이 좋습니다(CPU에 대한 더 높은 계획 고려).", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "보통", + "text": "Azure Application Gateway WAF 구성을 코드로 정의합니다. 코드를 사용하면 새 규칙 집합 버전을 보다 쉽게 채택하고 추가 보호를 얻을 수 있습니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", - "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", - "service": "Azure Functions", - "text": "지정된 계획의 함수 앱은 모두 함께 크기가 조정되므로 크기 조정과 관련된 모든 문제는 계획의 모든 앱에 영향을 줄 수 있습니다.", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", + "service": "App Gateway", + "severity": "보통", + "text": "레거시 WAF 구성 대신 WAF 정책을 사용합니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", - "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", - "service": "Azure Functions", - "text": "'대기 시간'에 대한 요금이 청구되나요? 이 질문은 일반적으로 비동기 작업을 수행하고 결과를 기다리는 C # 함수 (예 : await Task.Delay(1000) 또는 await client )의 컨텍스트에서 묻습니다. GetAsync('http://google.com')입니다. 대답은 '예'입니다 - GB 초 계산은 함수의 시작 및 종료 시간과 해당 기간 동안의 메모리 사용량을 기반으로 합니다. CPU 작업 측면에서 해당 시간 동안 실제로 발생하는 일은 계산에 포함되지 않습니다. 이 규칙의 한 가지 예외는 지속성 함수를 사용하는 경우입니다. 오케스트레이터 함수에서 대기하는 데 소요된 시간에 대해서는 요금이 청구되지 않습니다.가능한 경우 수요 형성 기술을 적용합니다(개발 환경?) https://github.com/Azure-Samples/functions-csharp-premium-scaler", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", + "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", + "service": "App Gateway", + "severity": "보통", + "text": "예를 들어 NSG를 사용하여 Application Gateway 서브넷의 연결만 허용하도록 백 엔드에서 인바운드 트래픽을 필터링합니다.", + "waf": "안전" }, { "arm-service": "microsoft.network/frontdoors", - "checklist": "Cost Optimization Checklist", - "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "checklist": "Azure Application Delivery Networking", + "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", + "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", "service": "Front Door", - "text": "Frontdoor - 기본 홈페이지 끄기앱의 애플리케이션 설정에서 AzureWebJobsDisableHomepage를 true로 설정합니다. 이렇게 하면 PoP에 204(콘텐츠 없음)가 반환되므로 헤더 데이터만 반환됩니다.", - "waf": "비용" + "severity": "보통", + "text": "원본이 Azure Front Door 인스턴스의 트래픽만 가져와야 합니다.", + "waf": "안전" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Cost Optimization 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", - "text": "Frontdoor 프론트도어 - 아무것도 반환하지 않는 무언가로 라우팅합니다. 함수, 함수 프록시를 설정하거나 WebApp에서 200(정상)을 반환하고 콘텐츠를 보내지 않거나 최소한으로 보내는 경로를 추가합니다. 이것의 장점은 호출될 때 로그아웃할 수 있다는 것입니다.", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", + "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", + "service": "App Gateway", + "severity": "높다", + "text": "백엔드 서버에 대한 트래픽을 암호화해야 합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", - "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", - "service": "Storage", - "text": "덜 사용되는 데이터에 대한 보관 계층 고려", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", + "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", + "service": "App Gateway", + "severity": "높다", + "text": "웹 응용 프로그램 방화벽을 사용해야 합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", - "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", - "service": "VM", - "text": "크기가 계층과 일치하지 않는 디스크 크기를 확인합니다(예: 513GiB 디스크는 P30(1TiB)를 지불하고 크기 조정을 고려합니다.", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", + "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", + "service": "App Gateway", + "severity": "보통", + "text": "HTTP를 HTTPS로 리디렉션", + "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", - "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", - "service": "Storage", - "text": "가능하면 프리미엄 또는 울트라 대신 표준 SSD를 사용하는 것이 좋습니다.", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "보통", + "text": "게이트웨이 관리 쿠키를 사용하여 처리를 위해 사용자 세션에서 동일한 서버로 트래픽을 전달합니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization 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", - "text": "스토리지 계정의 경우 선택한 계층이 트랜잭션 요금을 합산하지 않는지 확인합니다(다음 계층으로 이동하는 것이 더 저렴할 수 있음).", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", + "service": "App Gateway", + "severity": "높다", + "text": "계획된 서비스 업데이트 중에 연결 드레이닝을 사용하도록 설정하여 백 엔드 풀의 기존 멤버에 대한 연결 손실을 방지합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization Checklist", - "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", - "service": "Site Recovery", - "text": "ASR의 경우 RPO/RTO 및 복제 처리량이 허용하는 경우 표준 SSD 디스크를 사용하는 것이 좋습니다", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", + "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", + "service": "App Gateway", + "severity": "낮다", + "text": "사용자 지정 오류 페이지를 만들어 개인화된 사용자 환경을 표시합니다.", + "waf": "작업" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", - "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", - "service": "Storage", - "text": "스토리지 계정: 핫 계층 및/또는 GRS 필요 확인", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", + "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", + "service": "App Gateway", + "severity": "보통", + "text": "클라이언트와 서버 간의 더 쉬운 라우팅 및 정보 교환을 위해 HTTP 요청 및 응답 헤더를 편집합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", - "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", - "service": "VM", - "text": "디스크 - 모든 곳에서 프리미엄 SSD 디스크 사용의 유효성을 검사합니다. 예를 들어 비프로덕션은 표준 SSD 또는 주문형 프리미엄 SSD로 교환할 수 있습니다. ", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "App Gateway", + "severity": "보통", + "text": "Front Door를 구성하여 글로벌 웹 트래픽 라우팅, 최상위 최종 사용자 성능 및 빠른 글로벌 장애 조치(failover)를 통해 안정성을 최적화합니다.", + "waf": "공연" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", - "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", - "service": "Synapse", - "text": "예산을 만들어 비용을 관리하고 이해 관계자에게 지출 이상 및 초과 지출 위험을 자동으로 알리는 경고를 만듭니다.", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "29dcc19f-a8fa-4c35-8281-290577538793", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "App Gateway", + "severity": "보통", + "text": "전송 계층 부하 분산 사용", + "waf": "공연" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "Synapse", - "text": "추가 데이터 분석을 위해 비용 데이터를 스토리지 계정으로 내보냅니다.", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", + "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", + "service": "App Gateway", + "severity": "보통", + "text": "단일 게이트웨이에서 여러 웹 응용 프로그램에 대한 호스트 또는 도메인 이름을 기반으로 라우팅을 구성합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "Synapse", - "text": "리소스를 사용하지 않을 때 일시 중지하여 전용 SQL 풀에 대한 비용을 제어합니다.", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", + "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", + "service": "App Gateway", + "severity": "보통", + "text": "SSL 인증서 관리를 중앙 집중화하여 백엔드 서버 팜의 암호화 및 암호 해독 오버헤드를 줄입니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", - "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", - "service": "Synapse", - "text": "서버리스 Apache Spark 자동 일시 중지 기능을 활성화하고 그에 따라 제한 시간 값을 설정합니다.", - "waf": "비용" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", + "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", + "service": "App Gateway", + "severity": "낮다", + "text": "WebSocket 및 HTTP/2 프로토콜에 대한 기본 지원을 위해 Application Gateway 사용", + "waf": "안전" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization 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", - "text": "다양한 크기의 Apache Spark 풀 정의를 여러 개 만듭니다.", - "waf": "비용" + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", + "severity": "높다", + "text": "읽기 작업에 대해 99.9%의 가용성을 갖도록 복제본 2개 사용", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization 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", - "text": "사전 구매 플랜으로 1년 동안 Azure Synapse SCU(커밋 단위)를 구매하여 Azure Synapse Analytics 비용을 절감하세요.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "비용" + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", + "severity": "보통", + "text": "읽기/쓰기 작업에 대해 99.9%의 가용성을 갖도록 복제본 3개 사용", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", - "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", - "service": "VM", - "text": "인터럽트 가능한 작업에 스폿 VM 사용: 할인된 가격으로 입찰 및 구매할 수 있는 VM으로, 중요하지 않은 워크로드에 비용 효율적인 솔루션을 제공합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "비용" + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", + "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", + "service": "Cognitive Search", + "severity": "높다", + "text": "읽기 및/또는 쓰기 복제본을 활성화하여 가용 영역 활용Leverage Availability Zones by enabling read and/or write replicas", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "544451e1-92d3-4442-a3c7-628637a551c5", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "VM", - "text": "모든 VM의 적절한 크기 조정", - "waf": "비용" + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review 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", + "severity": "보통", + "text": "지역 중복의 경우 Manually create services in 2 or more regions for Search는 지리적 지역 간에 검색 인덱스를 복제하는 자동화된 방법을 제공하지 않습니다", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", - "service": "VM", - "text": "VM 크기를 정규화된 최신 크기로 바꾸기", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "비용" + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", + "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", + "service": "Cognitive Search", + "severity": "보통", + "text": "여러 서비스에서 데이터를 동기화하려면 인덱서를 사용하여 여러 서비스의 콘텐츠를 업데이트하거나 REST API를 사용하여 여러 서비스에서 콘텐츠 업데이트를 푸시합니다.", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", - "text": "적절한 크기 조정 VM - 사용량을 5% 미만으로 모니터링하는 것으로 시작한 다음 최대 40%까지 작업", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "비용" + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review 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", + "severity": "보통", + "text": "Azure Traffic Manager를 사용하여 요청 조정", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", - "text": "애플리케이션을 컨테이너화하면 VM 밀도를 개선하고 확장 비용을 절감할 수 있습니다", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "비용" + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", + "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", + "service": "Cognitive Search", + "severity": "높다", + "text": "Azure Cognitive Search 인덱스를 백업 및 복원합니다. 이 샘플 코드를 사용하여 인덱스 정의 및 스냅샷을 일련의 Json 파일에 백업합니다", + "waf": "신뢰도" }, { "arm-service": "microsoft.cache/redis", @@ -4923,3969 +4849,3943 @@ "service": "AVS", "severity": "높다", "text": "확장된 클러스터를 사용하는 경우 두 ExpressRoute 회로 모두에서 GlobalReach를 사용하도록 설정되어 있는지 확인합니다.", - "waf": "신뢰도" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", - "service": "AVS", - "severity": "높다", - "text": "사이트 재해 허용 범위 설정을 적절하게 고려하고 필요한 경우 비즈니스에 맞게 변경하십시오.", - "waf": "신뢰도" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", - "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", - "service": "AKS", - "severity": "낮다", - "text": "AKS Windows 워크로드에 필요한 경우 HostProcess 컨테이너를 사용할 수 있습니다.", - "waf": "신뢰도" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", - "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", - "service": "AKS", - "severity": "낮다", - "text": "이벤트 기반 워크로드를 실행하는 경우 KEDA 사용Use KEDA if running event-driven workloads", - "waf": "공연" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", - "link": "https://dapr.io/", - "service": "AKS", - "severity": "낮다", - "text": "Dapr을 사용하여 마이크로 서비스 개발 용이", - "waf": "작업" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "높다", - "text": "SLA 지원 AKS 제품 사용", - "waf": "신뢰도" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", - "severity": "낮다", - "text": "Pod 및 배포 정의에서 중단 예산 사용Use Disruption Budgets in your pod and deployment definitions", - "waf": "신뢰도" - }, - { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure AKS Review", - "guid": "3c763963-7a55-42d5-a15e-401955387e5c", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", - "service": "ACR", - "severity": "높다", - "text": "개인 레지스트리를 사용하는 경우 여러 지역에 이미지를 저장하도록 지역 복제를 구성합니다", - "waf": "신뢰도" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", - "service": "AKS", - "severity": "낮다", - "text": "kubecost와 같은 외부 애플리케이션을 사용하여 다른 사용자에게 비용 할당", - "waf": "비용" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", - "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", - "service": "AKS", - "severity": "낮다", - "text": "축소 모드를 사용하여 노드 삭제/할당 취소", - "waf": "비용" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", - "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", - "service": "AKS", - "severity": "보통", - "text": "필요한 경우 AKS 클러스터에서 다중 인스턴스 분할 GPU 사용", - "waf": "비용" + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", - "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", - "service": "AKS", - "severity": "낮다", - "text": "개발/테스트 클러스터를 실행하는 경우 NodePool 시작/중지를 사용합니다.", - "waf": "비용" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", + "service": "AVS", + "severity": "높다", + "text": "사이트 재해 허용 범위 설정을 적절하게 고려하고 필요한 경우 비즈니스에 맞게 변경하십시오.", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "보통", - "text": "Kubernetes용 Azure Policy를 사용하여 클러스터 규정 준수 보장", - "waf": "안전" + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", + "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", + "service": "Logic Apps", + "severity": "높다", + "text": "비즈니스 및 SLO 요구 사항에 따라 올바른 Logic App 호스팅 계획 선택Select the right Logic App hosting plan based on your business & SLO requirements", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "보통", - "text": "사용자/시스템 노드 풀이 있는 컨트롤 플레인에서 응용 프로그램 분리", - "waf": "안전" + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps 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", + "severity": "높다", + "text": "영역 중복 및 가용성 영역을 사용하여 지역 오류로부터 논리 앱 보호Protect logic apps from region failures with zone redundancy and availability zones", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", - "link": "https://learn.microsoft.com/azure/aks/use-system-pools", - "service": "AKS", - "severity": "낮다", - "text": "시스템 nodepool에 taint를 추가하여 전용으로 만듭니다.", - "waf": "안전" + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps 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", + "severity": "높다", + "text": "중요한 워크로드에 대한 지역 간 DR 전략 고려", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", - "link": "https://learn.microsoft.com/azure/container-registry/", - "service": "AKS", - "severity": "보통", - "text": "이미지에 개인 레지스트리(예: ACR) 사용", - "waf": "안전" + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", + "link": "https://learn.microsoft.com/azure/app-service/environment/intro", + "service": "Logic Apps", + "severity": "높다", + "text": "격리된 환경에 배포하는 경우 ASE(App Service Environment) v3을 사용하거나 마이그레이션합니다", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure AKS Review", - "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", - "link": "https://learn.microsoft.com/azure/security-center/container-security", - "service": "ACR", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", + "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", + "service": "Logic Apps", "severity": "보통", - "text": "이미지에서 취약성 검사", - "waf": "안전" + "text": "Azure DevOps 또는 GitHub를 활용하여 CI/CD를 간소화하고 논리 앱 코드를 보호합니다.", + "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", - "service": "AKS", - "severity": "높다", - "text": "앱 분리 요구 사항 정의(네임스페이스/노드 풀/클러스터)", - "waf": "안전" + "checklist": "SAP Checklist", + "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", + "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", + "service": "SAP", + "severity": "보통", + "text": "ACSS(Azure Center for SAP solutions)는 SAP를 Azure의 최상위 워크로드로 만드는 Azure 제품입니다. ACSS는 Azure에서 SAP 시스템을 통합 워크로드로 만들고 실행할 수 있도록 하는 엔드투엔드 솔루션으로, 혁신을 위한 보다 원활한 기반을 제공합니다. 신규 및 기존 Azure 기반 SAP 시스템 모두에 대한 관리 기능을 활용할 수 있습니다.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-center-sap-solutions/?source=recommendations", + "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", - "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", - "service": "AKS", + "checklist": "SAP 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", "severity": "보통", - "text": "CSI 비밀 저장소 드라이버를 사용하여 Azure Key Vault에 비밀 저장", - "waf": "안전" + "text": "Azure는 Linux 및 Windows에서 SAP 배포 자동화를 지원합니다. SAP Deployment Automation Framework는 SAP 환경을 배포, 설치 및 유지 관리할 수 있는 오픈 소스 오케스트레이션 도구입니다.", + "training": "https://github.com/Azure/sap-automation", + "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", - "link": "https://learn.microsoft.com/azure/aks/update-credentials", - "service": "AKS", - "severity": "높다", - "text": "클러스터에 서비스 주체를 사용하는 경우 주기적으로(예: 분기별) 자격 증명을 새로 고칩니다", - "waf": "안전" + "checklist": "SAP Checklist", + "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", + "service": "SAP", + "severity": "보통", + "text": "RTO를 충족하는 시점과 시간 프레임에서 프로덕션 데이터베이스에 대한 특정 시점으로 복구를 수행합니다. 특정 시점 복구에는 일반적으로 DBMS 계층 또는 SAP를 통해 데이터를 삭제하는 운영자 오류가 포함됩니다", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", - "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", + "service": "SAP", "severity": "보통", - "text": "필요한 경우 키 관리 서비스 etcd 암호화를 추가합니다.", - "waf": "안전" + "text": "백업 및 복구 시간을 테스트하여 재해 발생 후 모든 시스템을 동시에 복원하기 위한 RTO 요구 사항을 충족하는지 확인합니다.", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", - "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", - "service": "AKS", - "severity": "낮다", - "text": "필요한 경우 AKS용 기밀 컴퓨팅을 사용하는 것이 좋습니다.", - "waf": "안전" + "checklist": "SAP Checklist", + "guid": "b651423c-8552-42db-a545-5cb50c05527a", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "service": "SAP", + "severity": "높다", + "text": "쌍을 이루는 지역 간에 표준 스토리지를 복제할 수 있지만 표준 스토리지를 사용하여 데이터베이스 또는 가상 하드 디스크를 저장할 수는 없습니다. 사용하는 쌍을 이루는 지역 간에만 백업을 복제할 수 있습니다. 다른 모든 데이터의 경우 SQL Server Always On 또는 SAP HANA 시스템 복제와 같은 네이티브 DBMS 기능을 사용하여 복제를 실행합니다. SAP 애플리케이션 계층에 Site Recovery, rsync 또는 robocopy 및 기타 타사 소프트웨어의 조합을 사용합니다.", + "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", "severity": "보통", - "text": "컨테이너용 Defender 사용 고려", - "waf": "안전" + "text": "Azure 가용성 영역을 사용하여 고가용성을 달성하는 경우 SAP 애플리케이션 서버와 데이터베이스 서버 간의 대기 시간을 고려해야 합니다. 대기 시간이 긴 영역의 경우 SAP 애플리케이션 서버와 데이터베이스 서버가 항상 동일한 영역에서 실행되도록 운영 절차를 마련해야 합니다.", + "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", + "service": "SAP", "severity": "높다", - "text": "서비스 주체 대신 관리 ID 사용", - "waf": "안전" + "text": "온-프레미스에서 기본 및 보조 Azure 재해 복구 지역으로의 ExpressRoute 연결을 설정합니다. 또한 ExpressRoute를 사용하는 대신 온-프레미스에서 주 및 보조 Azure 재해 복구 지역으로 VPN 연결을 설정하는 것이 좋습니다.", + "training": "https://learn.microsoft.com/azure/expressroute/use-s2s-vpn-as-backup-for-expressroute-privatepeering", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "보통", - "text": "AAD와 인증 통합(관리형 통합 사용)", - "waf": "안전" + "checklist": "SAP Checklist", + "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "SAP", + "severity": "낮다", + "text": "DR 지역에서 데이터의 암호를 해독할 수 있도록 지역 간에 인증서, 비밀 또는 키와 같은 키 자격 증명 모음 콘텐츠를 복제합니다.", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", - "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", + "service": "SAP", "severity": "보통", - "text": "관리자 kubeconfig에 대한 액세스 제한(get-credentials --admin)", - "waf": "안전" + "text": "기본 및 재해 복구 가상 네트워크를 피어링합니다. 예를 들어 HANA 시스템 복제의 경우 SAP HANA DB 가상 네트워크를 재해 복구 사이트의 SAP HANA DB 가상 네트워크에 피어링해야 합니다.", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", - "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", - "service": "AKS", - "severity": "보통", - "text": "AAD RBAC와 권한 부여 통합", - "waf": "안전" + "checklist": "SAP Checklist", + "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", + "service": "SAP", + "severity": "낮다", + "text": "SAP 배포에 Azure NetApp Files 스토리지를 사용하는 경우 최소한 두 지역의 프리미엄 계층에 두 개의 Azure NetApp Files 계정을 만듭니다.", + "training": "https://learn.microsoft.com/training/modules/choose-service-level-azure-netapp-files-hpc-applications/2-identify-decision-criteria", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", "severity": "높다", - "text": "쿠버네티스에서 RBAC 권한을 제한하기 위해 네임스페이스 사용", - "waf": "안전" + "text": "기본 데이터베이스 복제 기술을 사용하여 HA 쌍의 데이터베이스를 동기화해야 합니다.", + "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/?source=recommendations", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", - "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", - "service": "AKS", - "severity": "보통", - "text": "Pod ID 액세스 관리의 경우 Azure AD 워크로드 ID(미리 보기)를 사용합니다.", - "waf": "안전" + "checklist": "SAP Checklist", + "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", + "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", + "service": "SAP", + "severity": "높다", + "text": "기본 VNet(가상 네트워크)에 대한 CIDR은 DR 사이트 VNet의 CIDR과 충돌하거나 겹치지 않아야 합니다", + "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", - "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", - "service": "AKS", - "severity": "보통", - "text": "AKS 비대화형 로그인의 경우 kubelogin(미리 보기)을 사용합니다.", - "waf": "안전" + "checklist": "SAP Checklist", + "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", + "service": "SAP", + "severity": "높다", + "text": "Site Recovery를 사용하여 응용 프로그램 서버를 DR 사이트에 복제합니다. Site Recovery는 중앙 서비스 클러스터 VM을 DR 사이트에 복제하는 데도 도움이 될 수 있습니다. DR을 호출할 때 DR 사이트에서 Linux Pacemaker 클러스터를 다시 구성해야 합니다(예: VIP 또는 SBD 바꾸기, corosync.conf 실행 등).", + "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "보통", - "text": "AKS 로컬 계정 사용 안 함", - "waf": "안전" + "checklist": "SAP 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", + "severity": "높다", + "text": "단일 장애 지점에 대한 SAP 소프트웨어의 가용성을 고려합니다. 여기에는 SAP NetWeaver 및 SAP S/4HANA 아키텍처, SAP ABAP 및 ASCS + SCS에서 사용되는 DBMS와 같은 애플리케이션 내의 단일 실패 지점이 포함됩니다. 또한 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": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "낮다", - "text": "필요한 경우 Just-in-time 클러스터 액세스 구성", - "waf": "안전" + "checklist": "SAP Checklist", + "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", + "service": "SAP", + "severity": "높다", + "text": "SAP 및 SAP 데이터베이스의 경우 자동 장애 조치(failover) 클러스터를 구현하는 것이 좋습니다. Windows에서 Windows Server 장애 조치(failover) 클러스터링은 장애 조치(failover)를 지원합니다. Linux에서 Linux Pacemaker 또는 SIOS Protection Suite 및 Veritas InfoScale과 같은 타사 툴은 장애 조치를 지원합니다.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "낮다", - "text": "AKS에 필요한 경우 AAD 조건부 액세스 구성", - "waf": "안전" + "checklist": "SAP Checklist", + "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", + "severity": "높다", + "text": "Azure는 기본 및 보조 VM이 DBMS 데이터에 대한 스토리지를 공유하는 아키텍처를 지원하지 않습니다. DBMS 계층의 경우 일반적인 아키텍처 패턴은 기본 및 보조 VM에서 사용하는 것과 다른 스토리지 스택을 사용하여 동시에 데이터베이스를 복제하는 것입니다.", + "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": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", - "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", - "service": "AKS", - "severity": "낮다", - "text": "Windows AKS 워크로드에 필요한 경우 gMSA를 구성합니다. ", - "waf": "안전" + "checklist": "SAP Checklist", + "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", + "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", + "service": "SAP", + "severity": "높다", + "text": "DBMS 데이터 및 트랜잭션/다시 실행 로그 파일은 Azure 지원 블록 스토리지 또는 Azure NetApp Files에 저장됩니다. Azure Files 또는 Azure Premium Files는 DBMS 데이터 및/또는 SAP 워크로드가 있는 다시 실행 로그 파일에 대한 스토리지로 지원되지 않습니다.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-databases/2-explore-database-support-azure-for-sap-workloads", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "보통", - "text": "더 세밀하게 제어하려면 관리형 Kubelet ID를 사용하는 것이 좋습니다.", - "waf": "안전" + "checklist": "SAP Checklist", + "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", + "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", + "service": "SAP", + "severity": "높다", + "text": "ASCS + SCS 구성 요소 및 특정 고가용성 시나리오에 대해 Windows에서 Azure 공유 디스크를 사용할 수 있습니다. SAP 애플리케이션 계층 구성 요소 및 DBMS 계층에 대해 장애 조치(failover) 클러스터를 별도로 설정합니다. Azure는 현재 SAP 애플리케이션 계층 구성 요소와 DBMS 계층을 하나의 장애 조치(failover) 클러스터로 결합하는 고가용성 아키텍처를 지원하지 않습니다.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", - "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", - "service": "AKS", - "severity": "보통", - "text": "AGIC를 사용하는 경우 클러스터 간에 AppGW를 공유하지 마세요", + "checklist": "SAP 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", + "severity": "높다", + "text": "SAP ASCS(애플리케이션 계층 구성 요소) 및 DBMS 계층에 대한 대부분의 장애 조치(failover) 클러스터에는 장애 조치(failover) 클러스터에 대한 가상 IP 주소가 필요합니다. Azure Load Balancer는 다른 모든 경우에 대한 가상 IP 주소를 처리해야 합니다. 한 가지 설계 원칙은 클러스터 구성당 하나의 부하 분산 장치를 사용하는 것입니다. 부하 분산 장치의 표준 버전(표준 Load Balancer SKU)을 사용하는 것이 좋습니다.", + "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", + "service": "SAP", "severity": "높다", - "text": "AKS HTTP 라우팅 추가 기능을 사용하지 말고, 애플리케이션 라우팅 추가 기능과 함께 관리되는 NGINX 수신을 대신 사용합니다.", + "text": "로드 밸런서에서 유동 IP가 사용하도록 설정되어 있는지 확인합니다.", + "training": "https://learn.microsoft.com/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", - "service": "AKS", - "severity": "보통", - "text": "Windows 워크로드의 경우 가속화된 네트워킹을 사용합니다.", - "waf": "공연" + "checklist": "SAP Checklist", + "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "SAP", + "severity": "높다", + "text": "고가용성 인프라를 배포하기 전에 선택한 지역에 따라 Azure 가용성 집합 또는 가용성 영역을 사용하여 배포할지 여부를 결정합니다.", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP 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", "severity": "높다", - "text": "표준 ALB 사용(기본 ALB와 반대)", + "text": "SAP 구성 요소(중앙 서비스, 애플리케이션 서버 및 데이터베이스)용 애플리케이션에 대한 인프라 SLA를 충족하려면 모든 구성 요소에 대해 동일한 고가용성 옵션(VM, 가용성 집합, 가용성 영역)을 선택해야 합니다.", "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "보통", - "text": "Azure CNI를 사용하는 경우 NodePools에 다른 서브넷을 사용하는 것이 좋습니다.", - "waf": "안전" + "checklist": "SAP Checklist", + "guid": "cbe05bbe-209d-4490-ba47-778424d11678", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", + "severity": "높다", + "text": "동일한 가용성 집합에 서로 다른 역할의 서버를 혼합하지 마십시오. 중앙 서비스 VM, 데이터베이스 VM, 애플리케이션 VM을 자체 가용성 집합으로 유지", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", - "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", + "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", + "service": "SAP", "severity": "보통", - "text": "프라이빗 엔드포인트(기본 설정) 또는 Virtual Network 서비스 엔드포인트를 사용하여 클러스터에서 PaaS 서비스에 액세스", - "waf": "안전" + "text": "근접 배치 그룹을 사용하지 않는 한 Azure 가용성 영역 내에 Azure 가용성 집합을 배포할 수 없습니다.", + "training": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "9674e7c7-7796-4181-8920-09f4429543ba", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", "severity": "높다", - "text": "요구 사항에 가장 적합한 CNI 네트워크 플러그 인 선택(Azure CNI 권장)", + "text": "가용성 집합을 만들 때 사용 가능한 최대 장애 도메인 및 업데이트 도메인 수를 사용합니다. 예를 들어 하나의 가용성 집합에 두 개 이상의 VM을 배포하는 경우 Azure의 계획된 유지 관리 외에도 잠재적인 물리적 하드웨어 오류, 네트워크 중단 또는 전원 중단의 영향을 제한하기 위해 최대 장애 도메인 수(3개)와 충분한 업데이트 도메인을 사용합니다. 장애 도메인의 기본 수는 2개이며 나중에 온라인으로 변경할 수 없습니다.", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "severity": "높다", - "text": "Azure CNI를 사용하는 경우 노드당 최대 Pod 수를 고려하여 서브넷 크기를 적절하게 조정합니다", - "waf": "공연" + "text": "가용성 집합 배포에서 Azure 근접 배치 그룹을 사용하는 경우 세 가지 SAP 구성 요소(중앙 서비스, 애플리케이션 서버 및 데이터베이스)가 모두 동일한 근접 배치 그룹에 있어야 합니다.", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "severity": "높다", - "text": "Azure CNI를 사용하는 경우 최대 Pod/노드(기본값 30)를 확인합니다.", - "waf": "공연" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "내부 앱의 경우 조직은 방화벽에서 전체 AKS 서브넷을 여는 경우가 많습니다. 이렇게 하면 노드에 대한 네트워크 액세스도 열리고 잠재적으로 Pod에 대한 액세스도 열립니다(Azure CNI를 사용하는 경우). LoadBalancer IP가 다른 서브넷에 있는 경우 앱 클라이언트에서 이 IP만 사용할 수 있어야 합니다. 또 다른 이유는 AKS 서브넷의 IP 주소가 부족한 리소스인 경우 서비스에 해당 IP 주소를 사용하면 클러스터의 최대 확장성이 감소하기 때문입니다.", - "guid": "13c00567-4b1e-4945-a459-c373e7ed6162", - "link": "https://learn.microsoft.com/azure/aks/internal-lb", - "service": "AKS", - "severity": "낮다", - "text": "개인 IP LoadBalancer 서비스를 사용하는 경우 AKS 서브넷이 아닌 전용 서브넷을 사용합니다", - "waf": "안전" + "text": "SAP SID당 하나의 근접 배치 그룹을 사용합니다. 그룹은 가용성 영역 또는 Azure 지역에 걸쳐 있지 않습니다.", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "checklist": "SAP 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", "severity": "높다", - "text": "그에 따라 서비스 IP 주소 범위의 크기를 조정합니다(클러스터 확장성이 제한됨).", + "text": "운영 체제에 따라 다음 서비스 중 하나를 사용하여 SAP 중앙 서비스 클러스터를 실행합니다.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", - "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", - "service": "AKS", - "severity": "낮다", - "text": "필요한 경우 자체 CNI 플러그인을 추가합니다.", - "waf": "안전" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "낮다", - "text": "필요한 경우 AKS에서 노드당 공용 IP 구성", - "waf": "공연" + "checklist": "SAP Checklist", + "guid": "ed46b937-913e-4018-9c62-8393ab037e53", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", + "service": "SAP", + "severity": "보통", + "text": "Azure는 현재 동일한 Linux Pacemaker 클러스터에서 ASCS와 DB HA의 결합을 지원하지 않습니다. 개별 클러스터로 분리합니다. 그러나 최대 5개의 여러 중앙 서비스 클러스터를 한 쌍의 VM으로 결합할 수 있습니다.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", - "link": "https://learn.microsoft.com/azure/aks/concepts-network", - "service": "AKS", + "checklist": "SAP 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", "severity": "보통", - "text": "수신 컨트롤러를 사용하여 LoadBalancer 유형 서비스를 사용하여 노출하는 대신 웹 기반 앱을 노출합니다", + "text": "가용성 집합 또는 가용성 영역의 고가용성 쌍에 두 VM을 모두 배포합니다. 이러한 VM은 크기가 동일하고 스토리지 구성이 동일해야 합니다.", "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", - "link": "https://learn.microsoft.com/azure/aks/nat-gateway", - "service": "AKS", - "severity": "낮다", - "text": "송신 트래픽 크기 조정을 위해 Azure NAT Gateway를 outboundType으로 사용", + "checklist": "SAP 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", + "severity": "보통", + "text": "Azure는 RHEL(Red Hat Enterprise Linux)에서 실행되는 동일한 고가용성 클러스터에 SAP HANA, ASCS/SCS 및 ERS 인스턴스의 설치 및 구성을 지원합니다.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "보통", - "text": "Azure CNI IP 소모를 방지하기 위해 IP의 동적 할당 사용", + "checklist": "SAP Checklist", + "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", + "severity": "높다", + "text": "프리미엄 관리형 SSD에서 모든 프로덕션 시스템을 실행하고 Azure NetApp Files 또는 Ultra Disk Storage를 사용합니다. 적어도 OS 디스크는 프리미엄 계층에 있어야 더 나은 성능과 최상의 SLA를 달성할 수 있습니다.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", + "service": "SAP", "severity": "높다", - "text": "보안 요구 사항에 필요한 경우 AzFW/NVA를 사용하여 송신 트래픽 필터링", - "waf": "안전" + "text": "Azure의 SAP HANA는 SAP에서 인증한 스토리지 유형에서만 실행해야 합니다. 특정 볼륨은 해당되는 경우 특정 디스크 구성에서 실행되어야 합니다. 이러한 구성에는 Write Accelerator 사용 및 Premium Storage 사용이 포함됩니다. 또한 스토리지에서 실행되는 파일 시스템이 시스템에서 실행되는 DBMS와 호환되는지 확인해야 합니다.", + "training": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1?source=recommendations", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "보통", - "text": "퍼블릭 API 엔드포인트를 사용하는 경우 액세스할 수 있는 IP 주소를 제한합니다", - "waf": "안전" + "checklist": "SAP Checklist", + "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", + "service": "SAP", + "severity": "높다", + "text": "SAP 워크로드에 사용하는 스토리지 유형에 따라 고가용성을 구성하는 것이 좋습니다. Azure에서 사용할 수 있는 일부 스토리지 서비스는 Azure Site Recovery에서 지원되지 않으므로 고가용성 구성이 다를 수 있습니다.", + "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/2-explore-disaster-recovery-sap-workloads", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", + "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", + "service": "SAP", "severity": "높다", - "text": "요구 사항에 따라 개인 클러스터를 사용합니다", - "waf": "안전" + "text": "일부 지역에서는 다양한 네이티브 Azure Storage 서비스(예: Azure Files, Azure NetApp Files, Azure Shared Disk)를 사용하지 못할 수 있습니다. 따라서 장애 조치(failover) 후 DR 지역에서 유사한 SAP를 설정하려면 해당 스토리지 서비스가 DR 사이트에서 제공되는지 확인합니다.", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP 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", "severity": "보통", - "text": "Windows 2019 및 2022 AKS 노드의 경우 Calico 네트워크 정책을 사용할 수 있습니다. ", - "waf": "안전" + "text": "SAP System Start-Stop을 자동화하여 비용을 관리합니다.", + "waf": "비용" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "높다", - "text": "Kubernetes 네트워크 정책 옵션 사용(Calico/Azure)", - "waf": "안전" + "checklist": "SAP Checklist", + "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", + "severity": "낮다", + "text": "SAP HANA와 함께 Azure Premium Storage를 사용하는 경우 Azure 표준 SSD 스토리지를 사용하여 비용에 민감한 스토리지 솔루션을 선택할 수 있습니다. 그러나 표준 SSD 또는 표준 HDD Azure Storage를 선택하면 개별 VM의 SLA에 영향을 줍니다. 또한 비프로덕션 환경과 같이 I/O 처리량이 낮고 대기 시간이 짧은 시스템의 경우 더 낮은 시리즈 VM을 사용할 수 있습니다.", + "waf": "비용" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", - "severity": "높다", - "text": "쿠버네티스 네트워크 정책을 사용하여 클러스터 내 보안 강화", - "waf": "안전" + "checklist": "SAP Checklist", + "guid": "9877f353-2591-4e8b-8381-e9043fed1010", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", + "severity": "낮다", + "text": "저렴한 대체 구성(다목적)으로 비프로덕션 HANA 데이터베이스 서버 VM에 대해 저성능 SKU를 선택할 수 있습니다. 그러나 E 시리즈와 같은 일부 VM 유형은 HANA 인증(SAP HANA 하드웨어 디렉터리)되지 않았거나 1ms 미만의 스토리지 대기 시간을 달성할 수 없습니다.", + "waf": "비용" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", + "service": "SAP", "severity": "높다", - "text": "웹 워크로드(UI 또는 API)에 WAF 사용Use a WAF for web workloads (UIs or APIs)", + "text": "관리 그룹, 구독, 리소스 그룹 및 리소스에 대한 RBAC 모델 적용Enforce a RBAC model for management groups, subscriptions, resource groups and resources", + "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "45911475-e39e-4530-accc-d979366bcda2", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", "severity": "보통", - "text": "AKS Virtual Network에서 DDoS 표준 사용Use DDoS Standard in the AKS Virtual Network", + "text": "클라우드 커넥터를 통해 SAP 클라우드 애플리케이션에서 SAP 온-프레미스(IaaS 포함)로 ID를 전달하기 위한 보안 주체 전파 적용", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/2-explore-azure-virtual-machine-auth-access-control", "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "낮다", - "text": "필요한 경우 회사 HTTP 프록시를 추가합니다.", + "checklist": "SAP Checklist", + "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", + "severity": "보통", + "text": "SAML을 사용하여 Azure AD로 SAP Analytics Cloud, SAP Cloud Platform, Business by design, SAP Qualtrics 및 SAP C4C와 같은 SAP SaaS 애플리케이션에 대한 SSO를 구현합니다.", "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", - "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", "severity": "보통", - "text": "고급 마이크로서비스 통신 관리를 위해 서비스 메시를 사용하는 것이 좋습니다", + "text": "SAML을 사용하여 SAP Fiori 및 SAP Web GUI와 같은 SAP NetWeaver 기반 웹 애플리케이션에 대한 SSO를 구현합니다.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", - "service": "AKS", - "severity": "높다", - "text": "가장 중요한 메트릭에 대한 경고 구성(권장 사항은 Container Insights 참조)", - "waf": "작업" + "checklist": "SAP Checklist", + "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", + "service": "SAP", + "severity": "보통", + "text": "SAML을 사용하여 SAP Fiori 및 SAP Web GUI와 같은 SAP NetWeaver 기반 웹 애플리케이션에 대한 SSO를 구현합니다.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/6-exercise-integrate-azure-active-directory-sap-fiori", + "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "337453a3-cc63-4963-9a65-22ac19e80696", - "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", - "service": "AKS", - "severity": "낮다", - "text": "Azure Advisor에서 클러스터에 대한 권장 사항을 정기적으로 확인합니다.", - "waf": "작업" + "checklist": "SAP Checklist", + "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", + "severity": "보통", + "text": "SAP NetWeaver SSO 또는 파트너 솔루션을 사용하여 SAP GUI에 대한 SSO를 구현할 수 있습니다.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", + "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", - "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", - "service": "AKS", - "severity": "낮다", - "text": "AKS 자동 인증서 회전 사용", - "waf": "작업" + "checklist": "SAP Checklist", + "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", + "service": "SAP", + "severity": "보통", + "text": "SAP GUI 및 웹 브라우저 액세스를 위한 SSO의 경우 구성 및 유지 관리가 용이하여 SNC/Kerberos/SPNEGO(간단하고 보호된 GSSAPI 협상 메커니즘)를 구현합니다. X.509 클라이언트 인증서를 사용하는 SSO의 경우 SAP SSO 솔루션의 구성 요소인 SAP 보안 로그인 서버를 고려합니다.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/9-exercise-integrate-active-directory-sap-single-sign-on", + "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", - "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", - "service": "AKS", - "severity": "높다", - "text": "kubernetes 버전을 주기적으로(예: 분기별) 업그레이드하거나 AKS 자동 업그레이드 기능을 사용하는 정기적인 프로세스가 있습니다.", - "waf": "작업" + "checklist": "SAP 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", + "severity": "보통", + "text": "SAP GUI 및 웹 브라우저 액세스를 위한 SSO의 경우 구성 및 유지 관리가 용이하여 SNC/Kerberos/SPNEGO(간단하고 보호된 GSSAPI 협상 메커니즘)를 구현합니다. X.509 클라이언트 인증서를 사용하는 SSO의 경우 SAP SSO 솔루션의 구성 요소인 SAP 보안 로그인 서버를 고려합니다.", + "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", - "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", - "service": "AKS", - "severity": "높다", - "text": "node-image upgrade를 사용하지 않는 경우 Linux 노드 업그레이드에 kured를 사용합니다.", - "waf": "작업" + "checklist": "SAP 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", + "severity": "보통", + "text": "SAP NetWeaver용 OAuth를 사용하여 SSO를 구현하여 타사 또는 사용자 지정 애플리케이션이 SAP NetWeaver OData 서비스에 액세스할 수 있도록 합니다.", + "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", - "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", - "service": "AKS", - "severity": "높다", - "text": "클러스터 노드 이미지를 주기적으로(예: 매주) 업그레이드하는 정기적인 프로세스가 있습니다.", - "waf": "작업" + "checklist": "SAP Checklist", + "guid": "a747c350-8d4c-449c-93af-393dbca77c48", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", + "service": "SAP", + "severity": "보통", + "text": "SAP HANA에 대한 SSO 구현", + "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", - "service": "AKS", - "severity": "낮다", - "text": "gitops를 고려하여 애플리케이션 또는 클러스터 구성을 여러 클러스터에 배포합니다.", - "waf": "작업" + "checklist": "SAP Checklist", + "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", + "service": "SAP", + "severity": "보통", + "text": "Azure AD를 RISE에서 호스트되는 SAP 시스템의 ID 공급자로 간주합니다. 자세한 내용은 Azure AD와 서비스 통합을 참조하세요.", + "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d7672c26-7602-4482-85a4-14527fbe855c", - "link": "https://learn.microsoft.com/azure/aks/command-invoke", - "service": "AKS", - "severity": "낮다", - "text": "프라이빗 클러스터에서 AKS 명령 호출을 사용하는 것이 좋습니다.", - "waf": "작업" + "checklist": "SAP Checklist", + "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", + "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", + "service": "SAP", + "severity": "보통", + "text": "SAP에 액세스하는 애플리케이션의 경우 보안 주체 전파를 사용하여 SSO를 설정할 수 있습니다.", + "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", - "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", - "service": "AKS", - "severity": "낮다", - "text": "계획된 이벤트의 경우 노드 자동 드레인 사용을 고려하십시오.", - "waf": "작업" + "checklist": "SAP 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", + "severity": "보통", + "text": "SAP IAS(Identity Authentication Service)가 필요한 SAP BTP 서비스 또는 SaaS 솔루션을 사용하는 경우 SAP Cloud Identity Authentication Services와 Azure AD 간에 SSO를 구현하여 해당 SAP 서비스에 액세스하는 것이 좋습니다. 이 통합을 통해 SAP IAS는 프록시 ID 공급자 역할을 하고 중앙 사용자 저장소 및 ID 공급자인 Azure AD에 인증 요청을 전달할 수 있습니다.", + "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", - "link": "https://learn.microsoft.com/azure/aks/faq", - "service": "AKS", - "severity": "높다", - "text": "노드 RG(일명 '인프라 RG')의 운영자가 변경을 수행하지 않도록 자체 거버넌스 관행을 개발합니다.", - "waf": "작업" + "checklist": "SAP Checklist", + "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", + "service": "SAP", + "severity": "보통", + "text": "SAP BTP에 대한 SSO 구현", + "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "낮다", - "text": "사용자 정의 노드 RG (일명 '인프라 RG') 이름 사용", - "waf": "작업" + "checklist": "SAP 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", + "severity": "보통", + "text": "SAP SuccessFactors를 사용하는 경우 Azure AD 자동화된 사용자 프로비저닝을 사용하는 것이 좋습니다. 이 통합을 통해 SAP SuccessFactors에 새 직원을 추가할 때 Azure AD에서 해당 사용자 계정을 자동으로 만들 수 있습니다. 필요에 따라 Microsoft 365 또는 Azure AD 지원하는 기타 SaaS 애플리케이션에서 사용자 계정을 만들 수 있습니다. SAP SuccessFactors에 이메일 주소의 쓰기 저장을 사용합니다.", + "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", - "link": "https://kubernetes.io/docs/setup/release/notes/", - "service": "AKS", + "checklist": "SAP 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", "severity": "보통", - "text": "YAML 매니페스트에서 더 이상 사용되지 않는 Kubernetes API를 사용하지 마십시오.", + "text": "SAP 구독에 기존 관리 그룹 정책 적용", + "training": "https://learn.microsoft.com/training/modules/enterprise-scale-organization/4-management-group-subscription-organization", "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", - "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", - "service": "AKS", - "severity": "낮다", - "text": "테인트 Windows 노드", + "checklist": "SAP Checklist", + "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", + "severity": "높다", + "text": "긴밀하게 결합된 애플리케이션을 동일한 SAP 구독에 통합하여 추가적인 라우팅 및 관리 복잡성 방지", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-subscriptions", "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "낮다", - "text": "Windows 컨테이너 패치 수준을 호스트 패치 수준과 동기화된 상태로 유지", + "checklist": "SAP Checklist", + "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", + "severity": "높다", + "text": "구독을 배율 단위로 활용하고 리소스를 확장하려면 환경별로 구독을 배포하는 것이 좋습니다. 샌드박스, 비프로덕션, 프로덕션 ", + "training": "https://learn.microsoft.com/training/modules/configure-subscriptions/?source=recommendations", "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "낮다", - "text": "마스터 로그(즉, API 로그)를 Azure Monitor 또는 기본 로그 관리 솔루션으로 보냅니다", + "checklist": "SAP Checklist", + "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", + "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", + "service": "SAP", + "severity": "높다", + "text": "구독 프로비저닝의 일부로 할당량 증가 확인(예: 구독 내에서 사용 가능한 총 VM 코어)", + "training": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", - "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", + "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", + "service": "SAP", "severity": "낮다", - "text": "필요한 경우 nodePool 스냅샷을 사용합니다.", - "waf": "비용" + "text": "할당량 API는 Azure 서비스에 대한 할당량을 보고 관리하는 데 사용할 수 있는 REST API입니다. 필요한 경우 사용을 고려하십시오.", + "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", - "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", - "service": "AKS", - "severity": "낮다", - "text": "시간에 민감하지 않은 워크로드에 대한 스폿 노드 풀 고려", + "checklist": "SAP Checklist", + "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", + "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", + "service": "SAP", + "severity": "높다", + "text": "가용성 영역에 배포하는 경우 할당량이 승인되면 VM의 영역 배포를 사용할 수 있는지 확인합니다. 필요한 구독, VM 시리즈, CPU 수 및 가용성 영역을 사용하여 지원 요청을 제출합니다.", "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "낮다", - "text": "빠른 버스팅을 위해 AKS 가상 노드 고려", + "checklist": "SAP Checklist", + "guid": "e6e20617-3686-4af4-9791-f8935ada4332", + "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", + "service": "SAP", + "severity": "높다", + "text": "예를 들어 선택한 배포 지역 내에서 필요한 서비스 및 기능을 사용할 수 있는지 확인합니다. ANF, 지역 등.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/azure-best-practices/multiple-regions?source=recommendations", "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", - "service": "AKS", - "severity": "높다", - "text": "Container Insights(또는 Prometheus와 같은 다른 도구)를 사용하여 클러스터 지표 모니터링", + "checklist": "SAP Checklist", + "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", + "service": "SAP", + "severity": "보통", + "text": "비용 분류 및 리소스 그룹화를 위해 Azure 리소스 태그 활용(BillTo, 부서(또는 사업부), 환경(프로덕션, 스테이지, 개발), 계층(웹 계층, 애플리케이션 계층), 애플리케이션 소유자, 프로젝트 이름)", + "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", "severity": "높다", - "text": "Container Insights(또는 Telegraf/ElasticSearch와 같은 다른 도구)를 사용하여 클러스터 로그를 저장하고 분석합니다.", - "waf": "작업" + "text": "Azure Backup 서비스를 사용하여 HANA 데이터베이스를 보호할 수 있습니다.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-backup-sap-workloads-azure-virtual-machines/?source=recommendations", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", - "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", + "service": "SAP", "severity": "보통", - "text": "노드의 CPU 및 메모리 사용률 모니터링", - "waf": "작업" + "text": "HANA, Oracle 또는 DB2 데이터베이스용 Azure NetApp Files를 배포하는 경우 Azure 애플리케이션 일치 스냅샷 도구(AzAcSnap)를 사용하여 애플리케이션 일치 스냅샷을 만듭니다. AzAcSnap은 Oracle 데이터베이스도 지원합니다. 개별 VM이 아닌 중앙 VM에서 AzAcSnap을 사용하는 것이 좋습니다.", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "1a4835ac-9422-423e-ae80-b123081a5417", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", - "severity": "보통", - "text": "Azure CNI를 사용하는 경우 노드당 사용되는 Pod IP의 %를 모니터링합니다.", + "checklist": "SAP Checklist", + "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", + "severity": "높다", + "text": "운영 체제와 SAP 시스템 간의 표준 시간대 일치를 확인합니다.", "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "OS 디스크의 I/O는 중요한 리소스입니다. 노드의 OS가 I/O에서 제한되면 예측할 수 없는 동작이 발생할 수 있으며, 일반적으로 노드가 NotReady로 선언됩니다", - "guid": "415833ea-3ad3-4c2d-b733-165c3acbe04b", - "link": "https://learn.microsoft.com/azure/virtual-machines/premium-storage-performance", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "c3c7abc0-716c-4486-893c-40e181d65539", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", + "service": "SAP", "severity": "보통", - "text": "노드에서 OS 디스크 큐 크기 모니터링Monitor OS disk queue depth in nodes", - "waf": "작업" + "text": "동일한 클러스터에서 서로 다른 애플리케이션 서비스를 그룹화하지 마세요. 예를 들어 DRBD와 중앙 서비스 클러스터를 동일한 클러스터에 결합하지 마세요. 그러나 동일한 Pacemaker 클러스터를 사용하여 약 5개의 서로 다른 중앙 서비스(다중 SID 클러스터)를 관리할 수 있습니다.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "be209d39-fda4-4777-a424-d116785c2fa5", - "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "a491dfc4-9353-4213-9217-eef0949f9467", + "link": "https://azure.microsoft.com/pricing/offers/dev-test/", + "service": "SAP", + "severity": "낮다", + "text": "Azure 실행 비용을 절감하고 최적화하기 위해 다시 알림 모델에서 개발/테스트 시스템을 실행하는 것이 좋습니다.", + "waf": "비용" + }, + { + "checklist": "SAP Checklist", + "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", + "link": "https://learn.microsoft.com/azure/lighthouse/overview", + "service": "SAP", "severity": "보통", - "text": "AzFW/NVA에서 송신 필터링을 사용하지 않는 경우 표준 ALB 할당 SNAT 포트를 모니터링합니다", + "text": "SAP 자산을 관리하여 고객과 파트너 관계를 맺는 경우 Azure Lighthouse를 사용하는 것이 좋습니다. Azure Lighthouse를 사용하면 관리 서비스 공급자가 Azure 네이티브 ID 서비스를 사용하여 고객 환경에 인증할 수 있습니다. 고객은 언제든지 액세스 권한을 취소하고 서비스 제공업체의 조치를 감사할 수 있으므로 고객의 손에 제어 권한을 부여합니다.", "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", - "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", - "service": "AKS", + "checklist": "SAP 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", "severity": "보통", - "text": "AKS 클러스터에 대한 Resource Health 알림 구독Subscribe to resource health notifications for your AKS cluster", + "text": "Azure Update Manager를 사용하여 단일 VM 또는 여러 VM에 대해 사용 가능한 업데이트의 상태를 확인하고 정기적인 패치를 예약하는 것이 좋습니다.", + "training": "https://learn.microsoft.com/training/modules/keep-your-virtual-machines-updated/?source=recommendations", "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", - "severity": "높다", - "text": "Pod 규격에서 요청 및 제한 구성", + "checklist": "SAP Checklist", + "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", + "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", + "service": "SAP", + "severity": "낮다", + "text": "SAP Landscape Management(LaMa)를 사용하여 SAP Basis 운영을 최적화하고 관리합니다. Azure용 SAP LaMa 커넥터를 사용하여 SAP 시스템을 재배치, 복사, 복제 및 새로 고칩니다.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-remote-management/?source=recommendations", "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "769ef669-1a48-435a-a942-223ece80b123", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "14591147-5e39-4e53-89cc-cd979366bcda", + "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", + "service": "SAP", "severity": "보통", - "text": "네임스페이스에 대한 리소스 할당량 적용Enforce resource quotas for namespaces", + "text": "SAP용 Azure Monitor 솔루션을 사용하여 Azure에서 SAP 워크로드(SAP HANA, 고가용성 SUSE 클러스터 및 SQL 시스템)를 모니터링합니다. SAP Solution Manager를 사용하여 SAP용 Azure Monitor 솔루션을 보완하는 것이 좋습니다.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "081a5417-4158-433e-a3ad-3c2de733165c", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", + "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", + "service": "SAP", "severity": "높다", - "text": "구독에 노드 풀을 확장할 수 있는 충분한 할당량이 있는지 확인합니다.", + "text": "SAP용 VM 확장 검사를 실행합니다. SAP용 VM 확장은 VM(가상 머신)의 할당된 관리 ID를 사용하여 VM 모니터링 및 구성 데이터에 액세스합니다. 이 검사는 SAP 애플리케이션의 모든 성능 메트릭이 기본 SAP용 Azure 확장에서 제공되는지 확인합니다.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-enhanced-monitoring-extension-for-sap/?source=recommendations", "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "SAP", "severity": "보통", - "text": "Cluster Autoscaler 사용", - "waf": "공연" + "text": "액세스 제어 및 규정 준수 보고에 Azure Policy를 사용합니다. Azure Policy는 일관된 정책 준수와 빠른 위반 감지를 보장하기 위해 조직 전체 설정을 적용하는 기능을 제공합니다. ", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "낮다", - "text": "AKS 노드 풀에 대한 노드 구성 사용자 지정", - "waf": "공연" + "checklist": "SAP Checklist", + "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", + "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", + "service": "SAP", + "severity": "보통", + "text": "Azure Network Watcher의 연결 모니터를 사용하여 SAP 데이터베이스 및 애플리케이션 서버에 대한 대기 시간 메트릭을 모니터링합니다. 또는 Azure Monitor를 사용하여 네트워크 대기 시간 측정값을 수집하고 표시합니다.", + "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/collecting-and-displaying-niping-network-latency-measurements/ba-p/1833979", + "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", - "link": "https://learn.microsoft.com/azure/aks/concepts-scale", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "73686af4-6791-4f89-95ad-a43324e13811", + "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", + "service": "SAP", "severity": "보통", - "text": "필요한 경우 Horizontal Pod Autoscaler 사용", - "waf": "공연" + "text": "프로비저닝된 Azure 인프라에서 SAP HANA에 대한 품질 검사를 수행하여 프로비저닝된 VM이 Azure의 SAP HANA 모범 사례를 준수하는지 확인합니다.", + "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "노드가 클수록 임시 디스크 및 가속화된 네트워킹과 같은 더 높은 성능과 기능을 제공하지만 폭발 반경이 증가하고 크기 조정 세분성이 감소합니다", - "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", + "checklist": "SAP Checklist", + "guid": "616785d6-fa96-4c96-ad88-518f482734c8", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", "severity": "높다", - "text": "너무 크거나 너무 작지 않은 적절한 노드 크기를 고려합니다", + "text": "각 Azure 구독에 대해 영역 배포 전에 Azure 가용성 영역에서 대기 시간 테스트를 실행하여 Azure에서 SAP를 배포하기 위한 대기 시간이 짧은 영역을 선택합니다.", + "training": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/AvZone-Latency-Test", "waf": "공연" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", - "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", - "service": "AKS", - "severity": "낮다", - "text": "확장성을 위해 5,000개 이상의 노드가 필요한 경우 추가 AKS 클러스터를 사용하는 것이 좋습니다", - "waf": "공연" + "checklist": "SAP Checklist", + "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", + "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", + "service": "SAP", + "severity": "보통", + "text": "복원력 보고서를 실행하여 프로비저닝된 전체 Azure 인프라(컴퓨팅, 데이터베이스, 네트워킹, 스토리지, Site Recovery)의 구성이 Azure용 클라우드 적응 프레임워크에서 정의한 구성을 준수하는지 확인합니다.", + "training": "https://learn.microsoft.com/training/paths/azure-well-architected-framework/", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", - "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", - "service": "AKS", - "severity": "낮다", - "text": "AKS 자동화를 위해 EventGrid 이벤트를 구독하는 것이 좋습니다.", - "waf": "공연" + "checklist": "SAP Checklist", + "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", + "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", + "service": "SAP", + "severity": "보통", + "text": "SAP용 Microsoft Sentinel 솔루션을 사용하여 위협 방지를 구현합니다. 이 솔루션을 사용하여 SAP 시스템을 모니터링하고 비즈니스 로직 및 애플리케이션 계층 전체에서 정교한 위협을 탐지할 수 있습니다.", + "training": "https://learn.microsoft.com/training/modules/plan-microsoft-sentinel-deployment-sap/?source=recommendations", + "waf": "안전" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", - "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", - "service": "AKS", - "severity": "낮다", - "text": "AKS 클러스터에서 장기 실행 작업의 경우 이벤트 종료를 고려합니다.", - "waf": "공연" + "checklist": "SAP Checklist", + "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", + "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", + "service": "SAP", + "severity": "보통", + "text": "Azure 태그 지정을 활용하여 리소스를 논리적으로 그룹화 및 추적하고, 배포를 자동화하고, 가장 중요한 것은 발생한 비용에 대한 가시성을 제공할 수 있습니다.", + "training": "https://learn.microsoft.com/training/modules/analyze-costs-create-budgets-azure-cost-management/?source=recommendations", + "waf": "작업" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", - "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", + "service": "SAP", "severity": "낮다", - "text": "필요한 경우 AKS 노드에 Azure Dedicated Host를 사용하는 것이 좋습니다", - "waf": "공연" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "높다", - "text": "임시 OS 디스크 사용", + "text": "대기 시간에 민감한 애플리케이션에 대해 VM 간 대기 시간 모니터링을 사용합니다.", "waf": "공연" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", - "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", - "service": "AKS", - "severity": "높다", - "text": "임시 디스크가 아닌 디스크의 경우 여러 Pod를 실행하는 데 고성능이 필요하고 기본 AKS 로그 회전 임계값을 사용하여 대규모 로그를 생성하므로 많은 Pod/노드를 실행할 때 노드에 높은 IOPS 및 더 큰 OS 디스크를 사용합니다", - "waf": "공연" + "checklist": "SAP Checklist", + "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", + "severity": "보통", + "text": "Azure Site Recovery 모니터링을 사용하여 SAP 애플리케이션 서버에 대한 재해 복구 서비스의 상태를 유지 관리합니다.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", + "waf": "신뢰도" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", - "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", - "service": "AKS", - "severity": "낮다", - "text": "고성능 스토리지 옵션의 경우 AKS에서 Ultra Disks를 사용합니다.", + "checklist": "SAP Checklist", + "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", + "severity": "보통", + "text": "모든 데이터베이스 파일 시스템 및 실행 프로그램을 바이러스 백신 검사에서 제외합니다. 이를 포함하면 성능 문제가 발생할 수 있습니다. 제외 목록에 대한 규범적 세부 정보는 데이터베이스 공급업체에 문의하십시오. 예를 들어 Oracle은 바이러스 백신 검사에서 /oracle//sapdata를 제외할 것을 권장합니다.", "waf": "공연" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", - "service": "AKS", - "severity": "보통", - "text": "클러스터에서 상태를 유지하지 않고 외부(AzStorage, AzSQL, Cosmos 등)에 데이터를 저장합니다.", + "checklist": "SAP Checklist", + "guid": "c027f893-f404-41a9-b33d-39d625a14964", + "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", + "service": "SAP", + "severity": "낮다", + "text": "마이그레이션 후 비 HANA 데이터베이스에 대한 전체 데이터베이스 통계를 수집하는 것이 좋습니다. 예를 들어 SAP Note 1020260 - Oracle 통계 제공을 구현합니다.", "waf": "공연" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", + "service": "SAP", "severity": "보통", - "text": "AzFiles 표준을 사용하는 경우 성능상의 이유로 AzFiles 프리미엄 및/또는 ANF를 고려합니다", + "text": "Azure에서 SAP를 사용하는 모든 Oracle 배포에 Oracle ASM(Automatic Storage Management)을 사용하는 것이 좋습니다.", + "training": "https://learn.microsoft.com/training/paths/administer-infrastructure-resources-in-azure/?source=recommendations", "waf": "공연" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", - "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", - "service": "AKS", + "checklist": "SAP 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", "severity": "보통", - "text": "Azure 디스크 및 AZ를 사용하는 경우 올바른 영역에 스토리지를 프로비전하기 위해 VolumeBindingMode::WaitForFirstConsumer를 사용하여 LRS 디스크의 영역 내에 노드 풀을 사용하거나 여러 영역에 걸쳐 있는 노드 풀에 ZRS 디스크를 사용하는 것이 좋습니다", + "text": "Oracle을 실행하는 Azure의 SAP의 경우 SQL 스크립트 컬렉션은 성능 문제를 진단하는 데 도움이 될 수 있습니다. AWR(Automatic Workload Repository) 보고서에는 Oracle 시스템의 문제점을 진단하는 데 유용한 정보가 포함되어 있습니다. 여러 세션 동안 AWR 보고서를 실행하고 피크 시간을 선택하여 광범위한 분석 범위를 보장하는 것이 좋습니다.", + "training": "https://learn.microsoft.com/ja-jp/azure/well-architected/oracle-iaas/performance-efficiency", "waf": "공연" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Azure Functions", + "checklist": "SAP Checklist", + "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", "severity": "높다", - "text": "비즈니스 및 SLO 요구 사항에 따라 올바른 기능 호스팅 계획을 선택하십시오.", - "waf": "신뢰도" + "text": "Azure Site Recovery 모니터링을 사용하여 SAP 애플리케이션 서버에 대한 재해 복구 서비스의 상태를 유지 관리합니다.", + "training": "https://learn.microsoft.com/training/modules/protect-on-premises-infrastructure-with-azure-site-recovery/?source=recommendations", + "waf": "작업" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Azure Functions", - "severity": "높다", - "text": "지역적으로 적용 가능한 가용성 영역 활용(소비 계층에는 사용할 수 없음)", - "waf": "신뢰도" + "checklist": "SAP Checklist", + "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "SAP", + "severity": "보통", + "text": "HTTP/S 앱을 안전하게 배달하려면 Application Gateway v2를 사용하고 WAF 보호 및 정책이 사용하도록 설정되어 있는지 확인합니다.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/", + "waf": "안전" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "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", + "checklist": "SAP 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", "severity": "보통", - "text": "중요한 워크로드에 대한 지역 간 DR 전략 고려", - "waf": "신뢰도" + "text": "Azure로 마이그레이션하는 동안 가상 머신의 DNS 또는 가상 이름이 변경되지 않은 경우 백그라운드 DNS 및 가상 이름은 SAP 환경의 많은 시스템 인터페이스를 연결하며, 고객은 시간이 지남에 따라 개발자가 정의하는 인터페이스를 인식하는 경우에만 인식할 수 있습니다. 마이그레이션 후 가상 또는 DNS 이름이 변경될 때 다양한 시스템 간에 연결 문제가 발생하며, 이러한 유형의 문제를 방지하기 위해 DNS 별칭을 유지하는 것이 좋습니다.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", + "waf": "작업" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "Azure Functions", - "severity": "높다", - "text": "격리된 환경에 배포하는 경우 ASE(App Service Environment) v3을 사용하거나 마이그레이션합니다", + "checklist": "SAP 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", + "severity": "보통", + "text": "서로 다른 DNS 영역을 사용하여 각 환경(샌드박스, 개발, 사전 프로덕션 및 프로덕션)을 서로 구분합니다. 예외는 자체 VNet을 사용하는 SAP 배포의 경우입니다. 여기서는 프라이빗 DNS 영역이 필요하지 않을 수 있습니다.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", + "waf": "작업" + }, + { + "checklist": "SAP Checklist", + "guid": "a3592829-e6e2-4061-9368-6af46791f893", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", + "service": "SAP", + "severity": "보통", + "text": "로컬 및 글로벌 VNet 피어링은 연결을 제공하며, 여러 Azure 지역에서 SAP 배포를 위한 랜딩 존 간의 연결을 보장하기 위해 선호되는 접근 방식입니다", + "training": "https://learn.microsoft.com/training/modules/configure-vnet-peering/?source=recommendations", "waf": "신뢰도" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "Azure Functions", + "checklist": "SAP Checklist", + "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", + "service": "SAP", "severity": "높다", - "text": "App Service 계획에서 실행되는 모든 함수 앱에 대해 'Always On'이 사용하도록 설정되어 있는지 확인합니다.", - "waf": "신뢰도" + "text": "SAP 애플리케이션과 SAP 데이터베이스 서버 간에 NVA를 배포하는 것은 지원되지 않습니다", + "training": "https://me.sap.com/notes/2731110", + "waf": "공연" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "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", + "checklist": "SAP Checklist", + "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", + "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", + "service": "SAP", "severity": "보통", - "text": "함수 앱을 자체 스토리지 계정에 페어링합니다. 긴밀하게 결합되지 않는 한 함수 앱에 대한 스토리지 계정을 다시 사용하지 마세요", - "waf": "신뢰도" + "text": "Azure 지역 및 온-프레미스 위치 간에 글로벌 전송 연결이 필요한 신규, 대규모 또는 글로벌 네트워크에서 Azure 배포에 Virtual WAN을 사용합니다. 이 방법을 사용하면 Azure 네트워킹에 대한 전이적 라우팅을 수동으로 설정할 필요가 없으며 Azure의 SAP 배포에 대한 표준을 따를 수 있습니다.", + "training": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", + "waf": "작업" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "Azure Functions", + "checklist": "SAP Checklist", + "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", + "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", + "service": "SAP", "severity": "보통", - "text": "Azure DevOps 또는 GitHub를 활용하여 CI/CD를 간소화하고 함수 앱 코드를 보호합니다.", + "text": "파트너 NVA를 사용하는 경우에만 지역 간에 NVA(네트워크 가상 어플라이언스)를 배포하는 것이 좋습니다. 네이티브 NVA가 있는 경우 지역 또는 VNet 간의 NVA가 필요하지 않습니다. 파트너 네트워킹 기술 및 NVA를 배포하는 경우 공급업체의 지침에 따라 Azure 네트워킹과 충돌하는 구성을 확인합니다.", + "training": "https://learn.microsoft.com/training/modules/control-network-traffic-flow-with-routes/?source=recommendations", "waf": "작업" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", - "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", - "service": "Logic Apps", - "severity": "높다", - "text": "비즈니스 및 SLO 요구 사항에 따라 올바른 Logic App 호스팅 계획 선택Select the right Logic App hosting plan based on your business & SLO requirements", - "waf": "신뢰도" + "checklist": "SAP Checklist", + "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", + "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", + "service": "SAP", + "severity": "보통", + "text": "Virtual WAN은 가상 WAN 기반 토폴로지에 대한 스포크 VNet 간의 연결을 관리하며(UDR[사용자 정의 라우팅] 또는 NVA를 설정할 필요 없음) 동일한 가상 허브의 VNet 간 트래픽에 대한 최대 네트워크 처리량은 초당 50기가비트입니다. 필요한 경우 SAP 랜딩 존은 VNet 피어링을 사용하여 다른 랜딩 존에 연결하고 이 대역폭 제한을 극복할 수 있습니다.", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/?source=recommendations", + "waf": "작업" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps 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", + "checklist": "SAP 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", "severity": "높다", - "text": "영역 중복 및 가용성 영역을 사용하여 지역 오류로부터 논리 앱 보호Protect logic apps from region failures with zone redundancy and availability zones", - "waf": "신뢰도" + "text": "SAP 워크로드를 실행하는 VM에 대한 공용 IP 할당은 권장되지 않습니다.", + "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", + "waf": "안전" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps 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", + "checklist": "SAP 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", "severity": "높다", - "text": "중요한 워크로드에 대한 지역 간 DR 전략 고려", - "waf": "신뢰도" + "text": "ASR을 구성할 때 DR 쪽에서 IP 주소를 예약하는 것이 좋습니다.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "작업" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", - "link": "https://learn.microsoft.com/azure/app-service/environment/intro", - "service": "Logic Apps", + "checklist": "SAP 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", "severity": "높다", - "text": "격리된 환경에 배포하는 경우 ASE(App Service Environment) v3을 사용하거나 마이그레이션합니다", - "waf": "신뢰도" + "text": "프로덕션 및 DR 사이트에 겹치는 IP 주소 범위를 사용하지 마십시오.", + "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", + "waf": "작업" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", - "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", - "service": "Logic Apps", + "checklist": "SAP Checklist", + "guid": "6e154e3a-a359-4282-ae6e-206173686af4", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", + "service": "SAP", "severity": "보통", - "text": "Azure DevOps 또는 GitHub를 활용하여 CI/CD를 간소화하고 논리 앱 코드를 보호합니다.", + "text": "Azure는 VNet에서 여러 위임된 서브넷을 만드는 데 도움이 되지만 Azure NetApp Files용 VNet에는 위임된 서브넷이 하나만 존재할 수 있습니다. Azure NetApp Files에 대해 둘 이상의 위임된 서브넷을 사용하는 경우 새 볼륨을 만들려는 시도가 실패합니다.", + "training": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-network-topologies?source=recommendations", "waf": "작업" }, { "checklist": "SAP Checklist", - "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", - "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", + "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", "severity": "보통", - "text": "ACSS(Azure Center for SAP solutions)는 SAP를 Azure의 최상위 워크로드로 만드는 Azure 제품입니다. ACSS는 Azure에서 SAP 시스템을 통합 워크로드로 만들고 실행할 수 있도록 하는 엔드투엔드 솔루션으로, 혁신을 위한 보다 원활한 기반을 제공합니다. 신규 및 기존 Azure 기반 SAP 시스템 모두에 대한 관리 기능을 활용할 수 있습니다.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-center-sap-solutions/?source=recommendations", - "waf": "작업" + "text": "Azure Firewall을 사용하여 인터넷에 대한 Azure 아웃바운드 트래픽, 비 HTTP/S 인바운드 연결 및 East/West 트래픽 필터링(조직에 필요한 경우)을 제어합니다", + "training": "https://learn.microsoft.com/training/paths/secure-networking-infrastructure/", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "5d75e99d-624d-4afe-91d9-e17adc580790", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-platform-automation-and-devops", + "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", + "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", "service": "SAP", "severity": "보통", - "text": "Azure는 Linux 및 Windows에서 SAP 배포 자동화를 지원합니다. SAP Deployment Automation Framework는 SAP 환경을 배포, 설치 및 유지 관리할 수 있는 오픈 소스 오케스트레이션 도구입니다.", - "training": "https://github.com/Azure/sap-automation", - "waf": "작업" + "text": "Application Gateway, SAP Web Dispatcher 및 기타 타사 서비스 간의 비교에서 볼 수 있듯이 Application Gateway가 SAP 웹앱에 대한 역방향 프록시 역할을 하는 경우 Application Gateway 및 Web Application Firewall에 제한 사항이 있습니다.", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/si/3362959506.html", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", + "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "SAP", "severity": "보통", - "text": "RTO를 충족하는 시점과 시간 프레임에서 프로덕션 데이터베이스에 대한 특정 시점으로 복구를 수행합니다. 특정 시점 복구에는 일반적으로 DBMS 계층 또는 SAP를 통해 데이터를 삭제하는 운영자 오류가 포함됩니다", - "waf": "신뢰도" + "text": "Azure Front Door 및 WAF 정책을 사용하여 랜딩 존에 대한 인바운드 HTTP/S 연결을 위해 Azure 지역에서 전역 보호를 제공합니다.", + "training": "https://learn.microsoft.com/training/paths/secure-application-delivery/", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", + "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", "service": "SAP", "severity": "보통", - "text": "백업 및 복구 시간을 테스트하여 재해 발생 후 모든 시스템을 동시에 복원하기 위한 RTO 요구 사항을 충족하는지 확인합니다.", - "waf": "신뢰도" + "text": "Azure Front Door 및 Application Gateway를 사용하여 HTTP/S 애플리케이션을 보호하는 경우 Azure Front Door의 Web Application Firewall 정책을 활용합니다. Azure Front Door에서만 트래픽을 수신하도록 Application Gateway를 잠급니다.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "b651423c-8552-42db-a545-5cb50c05527a", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "guid": "5ada4332-4e13-4811-9231-81aa41742694", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", "service": "SAP", - "severity": "높다", - "text": "쌍을 이루는 지역 간에 표준 스토리지를 복제할 수 있지만 표준 스토리지를 사용하여 데이터베이스 또는 가상 하드 디스크를 저장할 수는 없습니다. 사용하는 쌍을 이루는 지역 간에만 백업을 복제할 수 있습니다. 다른 모든 데이터의 경우 SQL Server Always On 또는 SAP HANA 시스템 복제와 같은 네이티브 DBMS 기능을 사용하여 복제를 실행합니다. SAP 애플리케이션 계층에 Site Recovery, rsync 또는 robocopy 및 기타 타사 소프트웨어의 조합을 사용합니다.", - "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", - "waf": "신뢰도" + "severity": "보통", + "text": "웹 애플리케이션 방화벽을 사용하여 트래픽이 인터넷에 노출될 때 트래픽을 검사합니다. 또 다른 옵션은 부하 분산 장치 또는 Application Gateway 또는 타사 솔루션과 같은 기본 제공 방화벽 기능이 있는 리소스와 함께 사용하는 것입니다.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", "service": "SAP", "severity": "보통", - "text": "Azure 가용성 영역을 사용하여 고가용성을 달성하는 경우 SAP 애플리케이션 서버와 데이터베이스 서버 간의 대기 시간을 고려해야 합니다. 대기 시간이 긴 영역의 경우 SAP 애플리케이션 서버와 데이터베이스 서버가 항상 동일한 영역에서 실행되도록 운영 절차를 마련해야 합니다.", - "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", - "waf": "신뢰도" + "text": "Azure 지역 및 온-프레미스 위치 간에 글로벌 전송 연결이 필요한 신규, 대규모 또는 글로벌 네트워크에서 Azure 배포에 Virtual WAN을 사용합니다. 이 방법을 사용하면 Azure 네트워킹에 대한 전이적 라우팅을 수동으로 설정할 필요가 없으며 Azure의 SAP 배포에 대한 표준을 따를 수 있습니다.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/10-explore-azure-front-door", + "waf": "공연" }, { "checklist": "SAP Checklist", - "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", - "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", + "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", + "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", "service": "SAP", - "severity": "높다", - "text": "온-프레미스에서 기본 및 보조 Azure 재해 복구 지역으로의 ExpressRoute 연결을 설정합니다. 또한 ExpressRoute를 사용하는 대신 온-프레미스에서 주 및 보조 Azure 재해 복구 지역으로 VPN 연결을 설정하는 것이 좋습니다.", - "training": "https://learn.microsoft.com/azure/expressroute/use-s2s-vpn-as-backup-for-expressroute-privatepeering", - "waf": "신뢰도" + "severity": "보통", + "text": "데이터 유출을 방지하려면 Azure Private Link를 사용하여 Azure Blob Storage, Azure Files, Azure Data Lake Storage Gen2, Azure Data Factory 등과 같은 PaaS(Platform as a Service) 리소스에 안전하게 액세스합니다. Azure 프라이빗 엔드포인트는 VNet과 Azure Storage, Azure Backup 등과 같은 서비스 간의 트래픽을 보호하는 데도 도움이 될 수 있습니다. VNet과 프라이빗 엔드포인트 사용 서비스 간의 트래픽은 Microsoft 글로벌 네트워크를 통해 이동하므로 공용 인터넷에 노출되지 않습니다.", + "training": "https://learn.microsoft.com/training/modules/design-implement-private-access-to-azure-services/?source=recommendations", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", "service": "SAP", - "severity": "낮다", - "text": "DR 지역에서 데이터의 암호를 해독할 수 있도록 지역 간에 인증서, 비밀 또는 키와 같은 키 자격 증명 모음 콘텐츠를 복제합니다.", - "waf": "신뢰도" + "severity": "높다", + "text": "SAP 애플리케이션 및 DBMS 계층에 사용되는 VM에서 Azure 가속 네트워킹이 사용하도록 설정되어 있는지 확인합니다.", + "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", + "waf": "공연" }, { "checklist": "SAP Checklist", - "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", + "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", "service": "SAP", "severity": "보통", - "text": "기본 및 재해 복구 가상 네트워크를 피어링합니다. 예를 들어 HANA 시스템 복제의 경우 SAP HANA DB 가상 네트워크를 재해 복구 사이트의 SAP HANA DB 가상 네트워크에 피어링해야 합니다.", - "waf": "신뢰도" + "text": "Azure Load Balancer에 대한 내부 배포가 DSR(Direct Server Return)을 사용하도록 설정되어 있는지 확인합니다. 이 설정(유동 IP 사용)은 DBMS 계층의 고가용성 구성에 내부 부하 분산 장치 구성을 사용할 때 대기 시간을 줄입니다.", + "training": "https://learn.microsoft.com/ja-jp/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", + "guid": "6791f893-5ada-4433-84e1-3811523181aa", + "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", "service": "SAP", - "severity": "낮다", - "text": "SAP 배포에 Azure NetApp Files 스토리지를 사용하는 경우 최소한 두 지역의 프리미엄 계층에 두 개의 Azure NetApp Files 계정을 만듭니다.", - "training": "https://learn.microsoft.com/training/modules/choose-service-level-azure-netapp-files-hpc-applications/2-identify-decision-criteria", - "waf": "신뢰도" + "severity": "보통", + "text": "ASG(애플리케이션 보안 그룹) 및 NSG 규칙을 사용하여 SAP 애플리케이션과 DBMS 계층 간에 네트워크 보안 액세스 제어 목록을 정의할 수 있습니다. ASG는 보안을 관리하는 데 도움이 되도록 가상 머신을 그룹화합니다.", + "training": "https://learn.microsoft.com/training/modules/configure-network-security-groups/?source=recommendations", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", + "link": "https://me.sap.com/notes/2015553", "service": "SAP", "severity": "높다", - "text": "기본 데이터베이스 복제 기술을 사용하여 HA 쌍의 데이터베이스를 동기화해야 합니다.", - "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/?source=recommendations", - "waf": "신뢰도" + "text": "피어링되지 않은 다른 Azure VNet에 SAP 애플리케이션 계층 및 SAP DBMS를 배치하는 것은 지원되지 않습니다.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "공연" }, { "checklist": "SAP Checklist", - "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", - "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", + "guid": "fa96c96a-d885-418f-9827-34c886ba2802", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", "service": "SAP", - "severity": "높다", - "text": "기본 VNet(가상 네트워크)에 대한 CIDR은 DR 사이트 VNet의 CIDR과 충돌하거나 겹치지 않아야 합니다", - "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", - "waf": "신뢰도" + "severity": "보통", + "text": "SAP 애플리케이션에서 네트워크 대기 시간을 최적화하려면 Azure 근접 배치 그룹을 사용하는 것이 좋습니다.", + "training": "https://learn.microsoft.com/azure/virtual-machines/co-location#planned-maintenance-and-proximity-placement-groups", + "waf": "공연" }, { "checklist": "SAP Checklist", - "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", + "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", + "link": "https://me.sap.com/notes/2015553", "service": "SAP", "severity": "높다", - "text": "Site Recovery를 사용하여 응용 프로그램 서버를 DR 사이트에 복제합니다. Site Recovery는 중앙 서비스 클러스터 VM을 DR 사이트에 복제하는 데도 도움이 될 수 있습니다. DR을 호출할 때 DR 사이트에서 Linux Pacemaker 클러스터를 다시 구성해야 합니다(예: VIP 또는 SBD 바꾸기, corosync.conf 실행 등).", - "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", - "waf": "신뢰도" + "text": "온-프레미스와 Azure 간에 분할된 SAP 애플리케이션 서버 계층 및 DBMS 계층을 실행하는 것은 전혀 지원되지 않습니다. 두 계층 모두 온-프레미스 또는 Azure에 완전히 상주해야 합니다.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "공연" }, { "checklist": "SAP Checklist", - "guid": "8300cb30-766b-4084-b126-0dd8fb1269a1", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-business-continuity-and-disaster-recovery", + "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", + "link": "https://me.sap.com/notes/2015553", "service": "SAP", "severity": "높다", - "text": "단일 장애 지점에 대한 SAP 소프트웨어의 가용성을 고려합니다. 여기에는 SAP NetWeaver 및 SAP S/4HANA 아키텍처, SAP ABAP 및 ASCS + SCS에서 사용되는 DBMS와 같은 애플리케이션 내의 단일 실패 지점이 포함됩니다. 또한 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": "신뢰도" + "text": "계층 간의 과도한 네트워크 트래픽으로 인해 발생할 수 있는 상당한 비용 때문에 다른 VNet에서 SAP 시스템의 DBMS(데이터베이스 관리 시스템) 및 애플리케이션 계층을 호스트하고 VNet 피어링과 연결하는 것은 권장되지 않습니다. Azure 가상 네트워크 내에서 서브넷을 사용하여 SAP 애플리케이션 계층과 DBMS 계층을 분리하는 것이 좋습니다.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "비용" }, { "checklist": "SAP Checklist", - "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", + "guid": "402a9846-d515-4061-aff8-cd30088693fa", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", "service": "SAP", "severity": "높다", - "text": "SAP 및 SAP 데이터베이스의 경우 자동 장애 조치(failover) 클러스터를 구현하는 것이 좋습니다. Windows에서 Windows Server 장애 조치(failover) 클러스터링은 장애 조치(failover)를 지원합니다. Linux에서 Linux Pacemaker 또는 SIOS Protection Suite 및 Veritas InfoScale과 같은 타사 툴은 장애 조치를 지원합니다.", + "text": "Linux 게스트 운영 체제에서 Load Balancer를 사용하는 경우 Linux 네트워크 매개 변수 net.ipv4.tcp_timestamps가 0으로 설정되어 있는지 확인합니다.", "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "신뢰도" + "waf": "공연" }, { "checklist": "SAP Checklist", - "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "guid": "87585797-5551-4d53-bb7d-a94ee415734d", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", "service": "SAP", - "severity": "높다", - "text": "Azure는 기본 및 보조 VM이 DBMS 데이터에 대한 스토리지를 공유하는 아키텍처를 지원하지 않습니다. DBMS 계층의 경우 일반적인 아키텍처 패턴은 기본 및 보조 VM에서 사용하는 것과 다른 스토리지 스택을 사용하여 동시에 데이터베이스를 복제하는 것입니다.", - "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": "신뢰도" + "severity": "보통", + "text": "SAP RISE/ECS 배포의 경우 가상 피어링은 고객의 기존 Azure 환경과의 연결을 설정하는 기본 방법입니다. SAP vnet과 고객 vnet은 모두 NSG(네트워크 보안 그룹)로 보호되므로 vnet 피어링을 통해 SAP 및 데이터베이스 포트에서 통신할 수 있습니다", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", - "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", + "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", "service": "SAP", "severity": "높다", - "text": "DBMS 데이터 및 트랜잭션/다시 실행 로그 파일은 Azure 지원 블록 스토리지 또는 Azure NetApp Files에 저장됩니다. Azure Files 또는 Azure Premium Files는 DBMS 데이터 및/또는 SAP 워크로드가 있는 다시 실행 로그 파일에 대한 스토리지로 지원되지 않습니다.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-databases/2-explore-database-support-azure-for-sap-workloads", - "waf": "신뢰도" + "text": "Azure VM에 대한 SAP HANA 데이터베이스 백업을 검토합니다.", + "waf": "비용" }, { "checklist": "SAP Checklist", - "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", - "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", + "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", "service": "SAP", - "severity": "높다", - "text": "ASCS + SCS 구성 요소 및 특정 고가용성 시나리오에 대해 Windows에서 Azure 공유 디스크를 사용할 수 있습니다. SAP 애플리케이션 계층 구성 요소 및 DBMS 계층에 대해 장애 조치(failover) 클러스터를 별도로 설정합니다. Azure는 현재 SAP 애플리케이션 계층 구성 요소와 DBMS 계층을 하나의 장애 조치(failover) 클러스터로 결합하는 고가용성 아키텍처를 지원하지 않습니다.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "신뢰도" + "severity": "보통", + "text": "SAP에 사용되는 Site Recovery 기본 제공 모니터링을 검토합니다.", + "waf": "비용" }, { "checklist": "SAP Checklist", - "guid": "a78b3d31-3170-44f2-b5d7-651a29f4ccf5", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-standard-load-balancer-outbound-connections", + "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", + "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", "service": "SAP", "severity": "높다", - "text": "SAP ASCS(애플리케이션 계층 구성 요소) 및 DBMS 계층에 대한 대부분의 장애 조치(failover) 클러스터에는 장애 조치(failover) 클러스터에 대한 가상 IP 주소가 필요합니다. Azure Load Balancer는 다른 모든 경우에 대한 가상 IP 주소를 처리해야 합니다. 한 가지 설계 원칙은 클러스터 구성당 하나의 부하 분산 장치를 사용하는 것입니다. 부하 분산 장치의 표준 버전(표준 Load Balancer SKU)을 사용하는 것이 좋습니다.", - "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", - "waf": "신뢰도" + "text": "SAP HANA 시스템 환경 모니터링 지침을 검토합니다.", + "waf": "작업" }, { "checklist": "SAP Checklist", - "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", + "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", "service": "SAP", - "severity": "높다", - "text": "로드 밸런서에서 유동 IP가 사용하도록 설정되어 있는지 확인합니다.", - "training": "https://learn.microsoft.com/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", - "waf": "신뢰도" + "severity": "보통", + "text": "Azure Linux VM 백업 전략에서 Oracle Database를 검토합니다.", + "waf": "작업" }, { "checklist": "SAP Checklist", - "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "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", - "severity": "높다", - "text": "고가용성 인프라를 배포하기 전에 선택한 지역에 따라 Azure 가용성 집합 또는 가용성 영역을 사용하여 배포할지 여부를 결정합니다.", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "신뢰도" + "severity": "보통", + "text": "SQL Server 2016에서 Azure Blob Storage 사용을 검토합니다.", + "waf": "작업" }, { "checklist": "SAP Checklist", - "guid": "844f69c3-07e5-4ec1-bff7-4be27bcf5fea", - "link": "https://www.microsoft.com/licensing/docs/view/Service-Level-Agreements-SLA-for-Online-Services?lang=1", + "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", "service": "SAP", - "severity": "높다", - "text": "SAP 구성 요소(중앙 서비스, 애플리케이션 서버 및 데이터베이스)용 애플리케이션에 대한 인프라 SLA를 충족하려면 모든 구성 요소에 대해 동일한 고가용성 옵션(VM, 가용성 집합, 가용성 영역)을 선택해야 합니다.", - "waf": "신뢰도" + "severity": "보통", + "text": "Azure VM에 대한 자동화된 Backup v2 사용을 검토합니다.", + "waf": "작업" }, { "checklist": "SAP Checklist", - "guid": "cbe05bbe-209d-4490-ba47-778424d11678", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", "service": "SAP", "severity": "높다", - "text": "동일한 가용성 집합에 서로 다른 역할의 서버를 혼합하지 마십시오. 중앙 서비스 VM, 데이터베이스 VM, 애플리케이션 VM을 자체 가용성 집합으로 유지", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "신뢰도" + "text": "프리미엄 디스크(V1)를 사용할 때 M 시리즈에 쓰기 가속기 사용Enabling Write accelerator for M series when using premium disks(V1)", + "waf": "작업" }, { "checklist": "SAP Checklist", - "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", - "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", + "guid": "b96512cf-996f-4b17-b9b8-6b16db1a2a94", + "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/AvZone-Latency-Test", "service": "SAP", "severity": "보통", - "text": "근접 배치 그룹을 사용하지 않는 한 Azure 가용성 영역 내에 Azure 가용성 집합을 배포할 수 없습니다.", - "training": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "waf": "신뢰도" + "text": "가용성 영역 대기 시간을 테스트합니다.", + "waf": "공연" }, { "checklist": "SAP Checklist", - "guid": "9674e7c7-7796-4181-8920-09f4429543ba", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", + "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", "service": "SAP", - "severity": "높다", - "text": "가용성 집합을 만들 때 사용 가능한 최대 장애 도메인 및 업데이트 도메인 수를 사용합니다. 예를 들어 하나의 가용성 집합에 두 개 이상의 VM을 배포하는 경우 Azure의 계획된 유지 관리 외에도 잠재적인 물리적 하드웨어 오류, 네트워크 중단 또는 전원 중단의 영향을 제한하기 위해 최대 장애 도메인 수(3개)와 충분한 업데이트 도메인을 사용합니다. 장애 도메인의 기본 수는 2개이며 나중에 온라인으로 변경할 수 없습니다.", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "신뢰도" + "severity": "보통", + "text": "모든 SAP 구성 요소에 대해 SAP EarlyWatch Alert를 활성화합니다.", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", + "waf": "공연" }, { "checklist": "SAP Checklist", - "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "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", - "severity": "높다", - "text": "가용성 집합 배포에서 Azure 근접 배치 그룹을 사용하는 경우 세 가지 SAP 구성 요소(중앙 서비스, 애플리케이션 서버 및 데이터베이스)가 모두 동일한 근접 배치 그룹에 있어야 합니다.", - "waf": "신뢰도" + "severity": "보통", + "text": "SAP ABAPMeter 보고서 /SSA/CAT를 사용하여 SAP 애플리케이션 서버-데이터베이스 서버 대기 시간을 검토합니다.", + "training": "https://me.sap.com/notes/0002879613", + "waf": "공연" }, { "checklist": "SAP Checklist", - "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", "service": "SAP", - "severity": "높다", - "text": "SAP SID당 하나의 근접 배치 그룹을 사용합니다. 그룹은 가용성 영역 또는 Azure 지역에 걸쳐 있지 않습니다.", - "waf": "신뢰도" + "severity": "보통", + "text": "CCMS를 사용하여 SQL Server 성능 모니터링을 검토합니다.", + "waf": "공연" }, { "checklist": "SAP Checklist", - "guid": "bca3b10e-0ff5-4aec-ac16-4c4bd1a1c13f", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-business-continuity-and-disaster-recovery", + "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", + "link": "https://me.sap.com/notes/500235", "service": "SAP", - "severity": "높다", - "text": "운영 체제에 따라 다음 서비스 중 하나를 사용하여 SAP 중앙 서비스 클러스터를 실행합니다.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "신뢰도" + "severity": "보통", + "text": "SAP 애플리케이션 계층 VM과 DBMS VM(NIPING) 간의 네트워크 대기 시간을 테스트합니다.", + "training": "https://me.sap.com/notes/1100926/E", + "waf": "공연" }, { "checklist": "SAP Checklist", - "guid": "ed46b937-913e-4018-9c62-8393ab037e53", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", + "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", + "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", "service": "SAP", - "severity": "보통", - "text": "Azure는 현재 동일한 Linux Pacemaker 클러스터에서 ASCS와 DB HA의 결합을 지원하지 않습니다. 개별 클러스터로 분리합니다. 그러나 최대 5개의 여러 중앙 서비스 클러스터를 한 쌍의 VM으로 결합할 수 있습니다.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "신뢰도" + "severity": "보통", + "text": "SAP HANA Studio 경고를 검토합니다.", + "waf": "공연" }, { "checklist": "SAP Checklist", - "guid": "f656e745-0cfb-453e-8008-0528fa21c933", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-business-continuity-and-disaster-recovery", + "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", + "link": "https://me.sap.com/notes/1969700", "service": "SAP", "severity": "보통", - "text": "가용성 집합 또는 가용성 영역의 고가용성 쌍에 두 VM을 모두 배포합니다. 이러한 VM은 크기가 동일하고 스토리지 구성이 동일해야 합니다.", - "waf": "신뢰도" + "text": "HANA_Configuration_Minichecks를 사용하여 SAP HANA 상태 검사를 수행합니다.", + "waf": "공연" }, { "checklist": "SAP 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", + "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", "service": "SAP", "severity": "보통", - "text": "Azure는 RHEL(Red Hat Enterprise Linux)에서 실행되는 동일한 고가용성 클러스터에 SAP HANA, ASCS/SCS 및 ERS 인스턴스의 설치 및 구성을 지원합니다.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "신뢰도" + "text": "Azure, 온-프레미스 또는 기타 클라우드 환경에서 Windows 및 Linux VM을 실행하는 경우 Azure Automation의 업데이트 관리 센터를 사용하여 보안 패치를 포함한 운영 체제 업데이트를 관리할 수 있습니다.", + "training": "https://learn.microsoft.com/azure/automation/update-management/overview", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "guid": "08951710-79a2-492a-adbc-06d7a401545b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", "service": "SAP", - "severity": "높다", - "text": "프리미엄 관리형 SSD에서 모든 프로덕션 시스템을 실행하고 Azure NetApp Files 또는 Ultra Disk Storage를 사용합니다. 적어도 OS 디스크는 프리미엄 계층에 있어야 더 나은 성능과 최상의 SLA를 달성할 수 있습니다.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", - "waf": "신뢰도" + "severity": "보통", + "text": "SAP는 SAP 시스템을 보호하기 위해 즉각적인 조치가 필요한 매우 중요한 보안 패치 또는 핫픽스를 릴리스하므로 SAP 보안 OSS 노트를 정기적으로 검토합니다.", + "training": "https://support.sap.com/en/my-support/knowledge-base/security-notes-news.html", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", + "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", "service": "SAP", - "severity": "높다", - "text": "Azure의 SAP HANA는 SAP에서 인증한 스토리지 유형에서만 실행해야 합니다. 특정 볼륨은 해당되는 경우 특정 디스크 구성에서 실행되어야 합니다. 이러한 구성에는 Write Accelerator 사용 및 Premium Storage 사용이 포함됩니다. 또한 스토리지에서 실행되는 파일 시스템이 시스템에서 실행되는 DBMS와 호환되는지 확인해야 합니다.", - "training": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1?source=recommendations", - "waf": "신뢰도" + "severity": "낮다", + "text": "SQL Server SAP의 경우 SQL Server SAP 시스템에서 계정을 사용하지 않으므로 SQL Server 시스템 관리자 계정을 사용하지 않도록 설정할 수 있습니다. 원래 시스템 관리자 계정을 비활성화하기 전에 시스템 관리자 권한이 있는 다른 사용자가 서버에 액세스할 수 있는지 확인합니다.", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", + "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", "service": "SAP", "severity": "높다", - "text": "SAP 워크로드에 사용하는 스토리지 유형에 따라 고가용성을 구성하는 것이 좋습니다. Azure에서 사용할 수 있는 일부 스토리지 서비스는 Azure Site Recovery에서 지원되지 않으므로 고가용성 구성이 다를 수 있습니다.", - "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/2-explore-disaster-recovery-sap-workloads", - "waf": "신뢰도" + "text": "xp_cmdshell 비활성화합니다. SQL Server 기능 xp_cmdshell SQL Server 내부 운영 체제 명령 셸을 사용할 수 있습니다. 이는 보안 감사에서 발생할 수 있는 잠재적 위험입니다.", + "training": "https://me.sap.com/notes/3019299/E", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", - "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", + "guid": "cf65de8e-1309-4ccc-b579-266bcca275fa", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", "service": "SAP", "severity": "높다", - "text": "일부 지역에서는 다양한 네이티브 Azure Storage 서비스(예: Azure Files, Azure NetApp Files, Azure Shared Disk)를 사용하지 못할 수 있습니다. 따라서 장애 조치(failover) 후 DR 지역에서 유사한 SAP를 설정하려면 해당 스토리지 서비스가 DR 사이트에서 제공되는지 확인합니다.", - "waf": "신뢰도" + "text": "Azure에서 SAP HANA 데이터베이스 서버를 암호화하는 데는 SAP HANA 네이티브 암호화 기술이 사용됩니다. 또한 Azure에서 SQL Server를 사용하는 경우 TDE(투명한 데이터 암호화)를 사용하여 데이터 및 로그 파일을 보호하고 백업도 암호화되도록 합니다.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "waf": "안전" }, { "checklist": "SAP 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", + "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", "service": "SAP", "severity": "보통", - "text": "SAP System Start-Stop을 자동화하여 비용을 관리합니다.", - "waf": "비용" + "text": "Azure Storage 암호화는 모든 Azure Resource Manager 및 클래식 스토리지 계정에 대해 사용하도록 설정되며 사용하지 않도록 설정할 수 없습니다. 데이터는 기본적으로 암호화되므로 Azure Storage 암호화를 사용하기 위해 코드 또는 애플리케이션을 수정할 필요가 없습니다.", + "training": "https://learn.microsoft.com/training/modules/encrypt-sector-data/?source=recommendations", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview", "service": "SAP", - "severity": "낮다", - "text": "SAP HANA와 함께 Azure Premium Storage를 사용하는 경우 Azure 표준 SSD 스토리지를 사용하여 비용에 민감한 스토리지 솔루션을 선택할 수 있습니다. 그러나 표준 SSD 또는 표준 HDD Azure Storage를 선택하면 개별 VM의 SLA에 영향을 줍니다. 또한 비프로덕션 환경과 같이 I/O 처리량이 낮고 대기 시간이 짧은 시스템의 경우 더 낮은 시리즈 VM을 사용할 수 있습니다.", - "waf": "비용" + "severity": "높다", + "text": "Azure Key Vault를 사용하여 비밀 및 자격 증명 저장", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "9877f353-2591-4e8b-8381-e9043fed1010", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "guid": "829e2edb-2173-4676-aff6-691b4935ada4", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", "service": "SAP", - "severity": "낮다", - "text": "저렴한 대체 구성(다목적)으로 비프로덕션 HANA 데이터베이스 서버 VM에 대해 저성능 SKU를 선택할 수 있습니다. 그러나 E 시리즈와 같은 일부 VM 유형은 HANA 인증(SAP HANA 하드웨어 디렉터리)되지 않았거나 1ms 미만의 스토리지 대기 시간을 달성할 수 없습니다.", - "waf": "비용" + "severity": "보통", + "text": "무단 변경으로부터 보호하기 위해 성공적인 배포 후 Azure 리소스를 잠그는 것이 좋습니다. 사용자 지정된 Azure 정책(Custome 역할)을 사용하여 구독별로 LOCK 제약 조건 및 규칙을 적용할 수도 있습니다.", + "training": "https://learn.microsoft.com/training/modules/use-azure-resource-manager/?source=recommendations", + "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", + "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", "service": "SAP", - "severity": "높다", - "text": "관리 그룹, 구독, 리소스 그룹 및 리소스에 대한 RBAC 모델 적용Enforce a RBAC model for management groups, subscriptions, resource groups and resources", - "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", + "severity": "보통", + "text": "삭제된 개체에 대한 보존 보호를 허용하기 위해 일시 삭제 및 제거 정책을 사용하도록 설정된 Azure Key Vault를 프로비전합니다.", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "45911475-e39e-4530-accc-d979366bcda2", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", + "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", "service": "SAP", - "severity": "보통", - "text": "클라우드 커넥터를 통해 SAP 클라우드 애플리케이션에서 SAP 온-프레미스(IaaS 포함)로 ID를 전달하기 위한 보안 주체 전파 적용", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/2-explore-azure-virtual-machine-auth-access-control", + "severity": "높다", + "text": "기존 요구 사항에 따라 규정 및 규정 준수 제어(내부/외부) - 필요한 Azure 정책 및 Azure RBAC 역할 결정", + "training": "https://learn.microsoft.com/training/paths/describe-azure-management-governance/?source=recommendations", "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "guid": "a4777842-4d11-4678-9d2f-a56c56ad4840", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", "service": "SAP", - "severity": "보통", - "text": "SAML을 사용하여 Azure AD로 SAP Analytics Cloud, SAP Cloud Platform, Business by design, SAP Qualtrics 및 SAP C4C와 같은 SAP SaaS 애플리케이션에 대한 SSO를 구현합니다.", + "severity": "높다", + "text": "SAP 환경에서 엔드포인트용 Microsoft Defender 사용하도록 설정하는 경우 모든 서버를 대상으로 하는 대신 DBMS 서버에서 데이터 및 로그 파일을 제외하는 것이 좋습니다. 대상 파일을 제외할 때 DBMS 공급업체의 권장 사항을 따릅니다.", + "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/microsoft-defender-endpoint-mde-for-sap-applications-on-windows/ba-p/3912268", "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "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", - "severity": "보통", - "text": "SAML을 사용하여 SAP Fiori 및 SAP Web GUI와 같은 SAP NetWeaver 기반 웹 애플리케이션에 대한 SSO를 구현합니다.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", + "severity": "높다", + "text": "클라우드용 Microsoft Defender의 Just-In-Time 액세스 권한이 있는 SAP 관리자 사용자 지정 역할을 위임합니다.", + "training": "https://learn.microsoft.com/training/modules/secure-vms-with-azure-security-center/?source=recommendations", "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", + "guid": "1309cccd-5792-466b-aca2-75faa1abfe9d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", "service": "SAP", - "severity": "보통", - "text": "SAML을 사용하여 SAP Fiori 및 SAP Web GUI와 같은 SAP NetWeaver 기반 웹 애플리케이션에 대한 SSO를 구현합니다.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/6-exercise-integrate-azure-active-directory-sap-fiori", + "severity": "낮다", + "text": "타사 보안 제품을 DIAG(SAP GUI)용 SNC(Secure Network Communications), RFC 및 HTTPS용 SPNEGO와 통합하여 전송 중인 데이터를 암호화합니다.", + "training": "https://learn.microsoft.com/azure/security/fundamentals/encryption-overview#encryption-of-data-in-transit", "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", + "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", "service": "SAP", "severity": "보통", - "text": "SAP NetWeaver SSO 또는 파트너 솔루션을 사용하여 SAP GUI에 대한 SSO를 구현할 수 있습니다.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", + "text": "보안 주체 암호화 기능을 위해 기본적으로 Microsoft 관리형 키를 사용하고 필요한 경우 고객 관리형 키를 사용합니다.", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", + "guid": "4935ada4-2223-4ece-a1b1-23181a541741", + "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", "service": "SAP", - "severity": "보통", - "text": "SAP GUI 및 웹 브라우저 액세스를 위한 SSO의 경우 구성 및 유지 관리가 용이하여 SNC/Kerberos/SPNEGO(간단하고 보호된 GSSAPI 협상 메커니즘)를 구현합니다. X.509 클라이언트 인증서를 사용하는 SSO의 경우 SAP SSO 솔루션의 구성 요소인 SAP 보안 로그인 서버를 고려합니다.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/9-exercise-integrate-active-directory-sap-single-sign-on", + "severity": "높다", + "text": "애플리케이션, 환경, 지역당 Azure Key Vault를 사용합니다.", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", "waf": "안전" }, { "checklist": "SAP 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/", + "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", + "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", "service": "SAP", - "severity": "보통", - "text": "SAP GUI 및 웹 브라우저 액세스를 위한 SSO의 경우 구성 및 유지 관리가 용이하여 SNC/Kerberos/SPNEGO(간단하고 보호된 GSSAPI 협상 메커니즘)를 구현합니다. X.509 클라이언트 인증서를 사용하는 SSO의 경우 SAP SSO 솔루션의 구성 요소인 SAP 보안 로그인 서버를 고려합니다.", + "severity": "높다", + "text": "비 HANA Windows 및 비 Windows 운영 체제에 대한 디스크 암호화 키 및 비밀을 제어하고 관리하려면 Azure Key Vault를 사용합니다. SAP HANA는 Azure Key Vault에서 지원되지 않으므로 SAP ABAP 또는 SSH 키와 같은 대체 방법을 사용해야 합니다.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/?source=recommendations", "waf": "안전" }, { "checklist": "SAP 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", + "guid": "209d490d-a477-4784-84d1-16785d2fa56c", + "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", "service": "SAP", - "severity": "보통", - "text": "SAP NetWeaver용 OAuth를 사용하여 SSO를 구현하여 타사 또는 사용자 지정 애플리케이션이 SAP NetWeaver OData 서비스에 액세스할 수 있도록 합니다.", + "severity": "높다", + "text": "실수로 인한 네트워크 관련 변경을 방지하기 위해 Azure의 SAP 스포크 구독에 대한 RBAC(역할 기반 액세스 제어) 역할 사용자 지정", + "training": "https://learn.microsoft.com/training/modules/secure-azure-resources-with-rbac/?source=recommendations", "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "a747c350-8d4c-449c-93af-393dbca77c48", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", + "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", + "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", "service": "SAP", - "severity": "보통", - "text": "SAP HANA에 대한 SSO 구현", + "severity": "높다", + "text": "나머지 SAP 자산에서 DMZ 및 NVA를 격리하고, Azure Private Link를 구성하고, Azure의 SAP 리소스를 안전하게 관리 및 제어합니다", + "training": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/secure-vnet-dmz?tabs=portal", "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", + "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", - "severity": "보통", - "text": "Azure AD를 RISE에서 호스트되는 SAP 시스템의 ID 공급자로 간주합니다. 자세한 내용은 Azure AD와 서비스 통합을 참조하세요.", + "severity": "낮다", + "text": "Azure에서 Microsoft 맬웨어 방지 소프트웨어를 사용하여 악성 파일, 애드웨어 및 기타 위협으로부터 가상 머신을 보호하는 것이 좋습니다.", + "training": "https://azure.microsoft.com/blog/deploying-antimalware-solutions-on-azure-virtual-machines/", "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", - "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", + "guid": "5eb2ec14-eeaa-4359-8829-e2edb2173676", + "link": "https://learn.microsoft.com/microsoft-365/security/defender-endpoint/microsoft-defender-endpoint?view=o365-worldwide", "service": "SAP", - "severity": "보통", - "text": "SAP에 액세스하는 애플리케이션의 경우 보안 주체 전파를 사용하여 SSO를 설정할 수 있습니다.", + "severity": "낮다", + "text": "더욱 강력한 보호를 위해 엔드포인트용 Microsoft Defender 사용하는 것이 좋습니다.", + "training": "https://learn.microsoft.com/training/modules/implement-endpoint-protection-use-microsoft-defender/?source=recommendations", "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "59921095-4980-4fc1-a5b6-524a5a560c79", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-identity-authentication-tutorial", + "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", "service": "SAP", - "severity": "보통", - "text": "SAP IAS(Identity Authentication Service)가 필요한 SAP BTP 서비스 또는 SaaS 솔루션을 사용하는 경우 SAP Cloud Identity Authentication Services와 Azure AD 간에 SSO를 구현하여 해당 SAP 서비스에 액세스하는 것이 좋습니다. 이 통합을 통해 SAP IAS는 프록시 ID 공급자 역할을 하고 중앙 사용자 저장소 및 ID 공급자인 Azure AD에 인증 요청을 전달할 수 있습니다.", + "severity": "높다", + "text": "가상 네트워크 피어링을 통해 스포크 네트워크에 연결된 허브 가상 네트워크를 통해 모든 트래픽을 전달하여 SAP 애플리케이션 및 데이터베이스 서버를 인터넷 또는 온-프레미스 네트워크에서 격리합니다. 피어링된 가상 네트워크는 Azure의 SAP 솔루션이 공용 인터넷에서 격리되도록 보장합니다.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/?source=recommendations", "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", + "guid": "491ca1c4-3d40-42c0-9d85-b8933999590b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-security-governance-and-compliance", "service": "SAP", - "severity": "보통", - "text": "SAP BTP에 대한 SSO 구현", + "severity": "낮다", + "text": "SAP Fiori와 같은 인터넷 연결 애플리케이션의 경우 보안 수준을 유지하면서 애플리케이션 요구 사항에 따라 부하를 분산해야 합니다. 계층 7 보안의 경우 Azure Marketplace에서 사용할 수 있는 타사 WAF(Web Application Firewall)를 사용할 수 있습니다.", + "training": "https://learn.microsoft.com/training/modules/simplify-cloud-procurement-governance-azure-marketplace/?source=recommendations", "waf": "안전" }, { "checklist": "SAP Checklist", - "guid": "01f11b7f-38df-4251-9c76-4dec19abd3e8", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-successfactors-inbound-provisioning-cloud-only-tutorial", + "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", + "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", "service": "SAP", "severity": "보통", - "text": "SAP SuccessFactors를 사용하는 경우 Azure AD 자동화된 사용자 프로비저닝을 사용하는 것이 좋습니다. 이 통합을 통해 SAP SuccessFactors에 새 직원을 추가할 때 Azure AD에서 해당 사용자 계정을 자동으로 만들 수 있습니다. 필요에 따라 Microsoft 365 또는 Azure AD 지원하는 기타 SaaS 애플리케이션에서 사용자 계정을 만들 수 있습니다. SAP SuccessFactors에 이메일 주소의 쓰기 저장을 사용합니다.", + "text": "SAP용 Azure Monitor 솔루션에서 보안 통신을 사용하도록 설정하려면 루트 인증서 또는 서버 인증서를 사용하도록 선택할 수 있습니다. 루트 인증서를 사용하는 것이 좋습니다.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", "waf": "안전" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "ab91932c-9fc9-4d1b-a881-37f5e6c0cb9e", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ADF_v1.docx", + "service": "Azure Data Factory", "severity": "보통", - "text": "SAP 구독에 기존 관리 그룹 정책 적용", - "training": "https://learn.microsoft.com/training/modules/enterprise-scale-organization/4-management-group-subscription-organization", - "waf": "작업" + "text": "Azure Data Factory에 대한 FTA 복원력 플레이북 활용", + "waf": "신뢰도" }, { - "checklist": "SAP Checklist", - "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "e503547c-d447-4e82-9138-a7200f1cac6d", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", "severity": "높다", - "text": "긴밀하게 결합된 애플리케이션을 동일한 SAP 구독에 통합하여 추가적인 라우팅 및 관리 복잡성 방지", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-subscriptions", - "waf": "작업" + "text": "가용성 영역을 지원하는 지역에서 영역 중복 파이프라인 사용Use zone redundant pipelines in regions that support Availability Zones", + "waf": "신뢰도" }, { - "checklist": "SAP Checklist", - "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", - "severity": "높다", - "text": "구독을 배율 단위로 활용하고 리소스를 확장하려면 환경별로 구독을 배포하는 것이 좋습니다. 샌드박스, 비프로덕션, 프로덕션 ", - "training": "https://learn.microsoft.com/training/modules/configure-subscriptions/?source=recommendations", - "waf": "작업" + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "9ef1d6e8-32e5-42e3-911c-818b1a0bc511", + "link": "https://learn.microsoft.com/azure/data-factory/source-control", + "service": "Azure Data Factory", + "severity": "보통", + "text": "DevOps를 사용하여 Github/Azure DevOps 통합으로 ARM 템플릿 백업 ", + "waf": "신뢰도" }, { - "checklist": "SAP Checklist", - "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", - "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", - "service": "SAP", - "severity": "높다", - "text": "구독 프로비저닝의 일부로 할당량 증가 확인(예: 구독 내에서 사용 가능한 총 VM 코어)", - "training": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", - "waf": "작업" + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "e43a18a9-cd29-49cf-b7b1-7db8255562f2", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", + "severity": "보통", + "text": "다른 지역에서 자체 호스팅 통합 런타임 VM을 복제해야 합니다. ", + "waf": "신뢰도" }, { - "checklist": "SAP Checklist", - "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", - "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", - "service": "SAP", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "aee4563a-fd83-4393-98b2-62d6dc5f512a", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", + "severity": "보통", + "text": "자매 지역에서 네트워크를 복제하거나 복제해야 합니다. 다른 지역에서 Vnet의 복사본을 만들어야 합니다", + "waf": "신뢰도" + }, + { + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "description": "ADF 파이프라인에서 Key Vault를 사용하는 경우 Key Vault를 복제하기 위해 아무 작업도 수행할 필요가 없습니다. Key Vault는 관리되는 서비스이며 Microsoft에서 처리합니다", + "guid": "25498f6d-bad3-47da-a43b-c6ce1d7aa9b2", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "Azure Data Factory", "severity": "낮다", - "text": "할당량 API는 Azure 서비스에 대한 할당량을 보고 관리하는 데 사용할 수 있는 REST API입니다. 필요한 경우 사용을 고려하십시오.", - "waf": "작업" + "text": "Keyvault 통합을 사용하는 경우 Keyvault의 SLA를 사용하여 가용성을 파악합니다", + "waf": "신뢰도" }, { - "checklist": "SAP Checklist", - "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", - "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", - "service": "SAP", - "severity": "높다", - "text": "가용성 영역에 배포하는 경우 할당량이 승인되면 VM의 영역 배포를 사용할 수 있는지 확인합니다. 필요한 구독, VM 시리즈, CPU 수 및 가용성 영역을 사용하여 지원 요청을 제출합니다.", - "waf": "작업" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", + "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", + "service": "AKS", + "severity": "낮다", + "text": "AKS Windows 워크로드에 필요한 경우 HostProcess 컨테이너를 사용할 수 있습니다.", + "waf": "신뢰도" }, { - "checklist": "SAP Checklist", - "guid": "e6e20617-3686-4af4-9791-f8935ada4332", - "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", - "service": "SAP", - "severity": "높다", - "text": "예를 들어 선택한 배포 지역 내에서 필요한 서비스 및 기능을 사용할 수 있는지 확인합니다. ANF, 지역 등.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/azure-best-practices/multiple-regions?source=recommendations", - "waf": "작업" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", + "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", + "service": "AKS", + "severity": "낮다", + "text": "이벤트 기반 워크로드를 실행하는 경우 KEDA 사용Use KEDA if running event-driven workloads", + "waf": "공연" }, { - "checklist": "SAP Checklist", - "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", - "service": "SAP", - "severity": "보통", - "text": "비용 분류 및 리소스 그룹화를 위해 Azure 리소스 태그 활용(BillTo, 부서(또는 사업부), 환경(프로덕션, 스테이지, 개발), 계층(웹 계층, 애플리케이션 계층), 애플리케이션 소유자, 프로젝트 이름)", - "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", + "link": "https://dapr.io/", + "service": "AKS", + "severity": "낮다", + "text": "Dapr을 사용하여 마이크로 서비스 개발 용이", "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "높다", - "text": "Azure Backup 서비스를 사용하여 HANA 데이터베이스를 보호할 수 있습니다.", - "training": "https://learn.microsoft.com/training/modules/implement-azure-backup-sap-workloads-azure-virtual-machines/?source=recommendations", + "text": "SLA 지원 AKS 제품 사용", "waf": "신뢰도" }, { - "checklist": "SAP Checklist", - "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", - "service": "SAP", - "severity": "보통", - "text": "HANA, Oracle 또는 DB2 데이터베이스용 Azure NetApp Files를 배포하는 경우 Azure 애플리케이션 일치 스냅샷 도구(AzAcSnap)를 사용하여 애플리케이션 일치 스냅샷을 만듭니다. AzAcSnap은 Oracle 데이터베이스도 지원합니다. 개별 VM이 아닌 중앙 VM에서 AzAcSnap을 사용하는 것이 좋습니다.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", + "severity": "낮다", + "text": "Pod 및 배포 정의에서 중단 예산 사용Use Disruption Budgets in your pod and deployment definitions", "waf": "신뢰도" }, { - "checklist": "SAP Checklist", - "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure AKS Review", + "guid": "3c763963-7a55-42d5-a15e-401955387e5c", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", + "service": "ACR", "severity": "높다", - "text": "운영 체제와 SAP 시스템 간의 표준 시간대 일치를 확인합니다.", - "waf": "작업" - }, - { - "checklist": "SAP Checklist", - "guid": "c3c7abc0-716c-4486-893c-40e181d65539", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", - "service": "SAP", - "severity": "보통", - "text": "동일한 클러스터에서 서로 다른 애플리케이션 서비스를 그룹화하지 마세요. 예를 들어 DRBD와 중앙 서비스 클러스터를 동일한 클러스터에 결합하지 마세요. 그러나 동일한 Pacemaker 클러스터를 사용하여 약 5개의 서로 다른 중앙 서비스(다중 SID 클러스터)를 관리할 수 있습니다.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "text": "개인 레지스트리를 사용하는 경우 여러 지역에 이미지를 저장하도록 지역 복제를 구성합니다", "waf": "신뢰도" }, { - "checklist": "SAP Checklist", - "guid": "a491dfc4-9353-4213-9217-eef0949f9467", - "link": "https://azure.microsoft.com/pricing/offers/dev-test/", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", + "service": "AKS", "severity": "낮다", - "text": "Azure 실행 비용을 절감하고 최적화하기 위해 다시 알림 모델에서 개발/테스트 시스템을 실행하는 것이 좋습니다.", + "text": "kubecost와 같은 외부 애플리케이션을 사용하여 다른 사용자에게 비용 할당", "waf": "비용" }, { - "checklist": "SAP Checklist", - "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", - "link": "https://learn.microsoft.com/azure/lighthouse/overview", - "service": "SAP", - "severity": "보통", - "text": "SAP 자산을 관리하여 고객과 파트너 관계를 맺는 경우 Azure Lighthouse를 사용하는 것이 좋습니다. Azure Lighthouse를 사용하면 관리 서비스 공급자가 Azure 네이티브 ID 서비스를 사용하여 고객 환경에 인증할 수 있습니다. 고객은 언제든지 액세스 권한을 취소하고 서비스 제공업체의 조치를 감사할 수 있으므로 고객의 손에 제어 권한을 부여합니다.", - "waf": "작업" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", + "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", + "service": "AKS", + "severity": "낮다", + "text": "축소 모드를 사용하여 노드 삭제/할당 취소", + "waf": "비용" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", + "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", + "service": "AKS", "severity": "보통", - "text": "Azure Update Manager를 사용하여 단일 VM 또는 여러 VM에 대해 사용 가능한 업데이트의 상태를 확인하고 정기적인 패치를 예약하는 것이 좋습니다.", - "training": "https://learn.microsoft.com/training/modules/keep-your-virtual-machines-updated/?source=recommendations", - "waf": "작업" + "text": "필요한 경우 AKS 클러스터에서 다중 인스턴스 분할 GPU 사용", + "waf": "비용" }, { - "checklist": "SAP Checklist", - "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", - "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", + "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", + "service": "AKS", "severity": "낮다", - "text": "SAP Landscape Management(LaMa)를 사용하여 SAP Basis 운영을 최적화하고 관리합니다. Azure용 SAP LaMa 커넥터를 사용하여 SAP 시스템을 재배치, 복사, 복제 및 새로 고칩니다.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-remote-management/?source=recommendations", - "waf": "작업" + "text": "개발/테스트 클러스터를 실행하는 경우 NodePool 시작/중지를 사용합니다.", + "waf": "비용" }, { - "checklist": "SAP Checklist", - "guid": "14591147-5e39-4e53-89cc-cd979366bcda", - "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "보통", - "text": "SAP용 Azure Monitor 솔루션을 사용하여 Azure에서 SAP 워크로드(SAP HANA, 고가용성 SUSE 클러스터 및 SQL 시스템)를 모니터링합니다. SAP Solution Manager를 사용하여 SAP용 Azure Monitor 솔루션을 보완하는 것이 좋습니다.", - "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", - "waf": "작업" + "text": "Kubernetes용 Azure Policy를 사용하여 클러스터 규정 준수 보장", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", - "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", - "service": "SAP", - "severity": "높다", - "text": "SAP용 VM 확장 검사를 실행합니다. SAP용 VM 확장은 VM(가상 머신)의 할당된 관리 ID를 사용하여 VM 모니터링 및 구성 데이터에 액세스합니다. 이 검사는 SAP 애플리케이션의 모든 성능 메트릭이 기본 SAP용 Azure 확장에서 제공되는지 확인합니다.", - "training": "https://learn.microsoft.com/training/modules/configure-azure-enhanced-monitoring-extension-for-sap/?source=recommendations", - "waf": "작업" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "보통", + "text": "사용자/시스템 노드 풀이 있는 컨트롤 플레인에서 응용 프로그램 분리", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "SAP", - "severity": "보통", - "text": "액세스 제어 및 규정 준수 보고에 Azure Policy를 사용합니다. Azure Policy는 일관된 정책 준수와 빠른 위반 감지를 보장하기 위해 조직 전체 설정을 적용하는 기능을 제공합니다. ", - "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", - "waf": "작업" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", + "link": "https://learn.microsoft.com/azure/aks/use-system-pools", + "service": "AKS", + "severity": "낮다", + "text": "시스템 nodepool에 taint를 추가하여 전용으로 만듭니다.", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", - "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", + "link": "https://learn.microsoft.com/azure/container-registry/", + "service": "AKS", "severity": "보통", - "text": "Azure Network Watcher의 연결 모니터를 사용하여 SAP 데이터베이스 및 애플리케이션 서버에 대한 대기 시간 메트릭을 모니터링합니다. 또는 Azure Monitor를 사용하여 네트워크 대기 시간 측정값을 수집하고 표시합니다.", - "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/collecting-and-displaying-niping-network-latency-measurements/ba-p/1833979", - "waf": "작업" + "text": "이미지에 개인 레지스트리(예: ACR) 사용", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "73686af4-6791-4f89-95ad-a43324e13811", - "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", - "service": "SAP", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure AKS Review", + "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", + "link": "https://learn.microsoft.com/azure/security-center/container-security", + "service": "ACR", "severity": "보통", - "text": "프로비저닝된 Azure 인프라에서 SAP HANA에 대한 품질 검사를 수행하여 프로비저닝된 VM이 Azure의 SAP HANA 모범 사례를 준수하는지 확인합니다.", - "waf": "작업" + "text": "이미지에서 취약성 검사", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "616785d6-fa96-4c96-ad88-518f482734c8", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", + "service": "AKS", "severity": "높다", - "text": "각 Azure 구독에 대해 영역 배포 전에 Azure 가용성 영역에서 대기 시간 테스트를 실행하여 Azure에서 SAP를 배포하기 위한 대기 시간이 짧은 영역을 선택합니다.", - "training": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/AvZone-Latency-Test", - "waf": "공연" + "text": "앱 분리 요구 사항 정의(네임스페이스/노드 풀/클러스터)", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", - "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", + "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", + "service": "AKS", "severity": "보통", - "text": "복원력 보고서를 실행하여 프로비저닝된 전체 Azure 인프라(컴퓨팅, 데이터베이스, 네트워킹, 스토리지, Site Recovery)의 구성이 Azure용 클라우드 적응 프레임워크에서 정의한 구성을 준수하는지 확인합니다.", - "training": "https://learn.microsoft.com/training/paths/azure-well-architected-framework/", - "waf": "신뢰도" + "text": "CSI 비밀 저장소 드라이버를 사용하여 Azure Key Vault에 비밀 저장", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", - "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", - "service": "SAP", - "severity": "보통", - "text": "SAP용 Microsoft Sentinel 솔루션을 사용하여 위협 방지를 구현합니다. 이 솔루션을 사용하여 SAP 시스템을 모니터링하고 비즈니스 로직 및 애플리케이션 계층 전체에서 정교한 위협을 탐지할 수 있습니다.", - "training": "https://learn.microsoft.com/training/modules/plan-microsoft-sentinel-deployment-sap/?source=recommendations", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", + "link": "https://learn.microsoft.com/azure/aks/update-credentials", + "service": "AKS", + "severity": "높다", + "text": "클러스터에 서비스 주체를 사용하는 경우 주기적으로(예: 분기별) 자격 증명을 새로 고칩니다", "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", - "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", + "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", + "service": "AKS", "severity": "보통", - "text": "Azure 태그 지정을 활용하여 리소스를 논리적으로 그룹화 및 추적하고, 배포를 자동화하고, 가장 중요한 것은 발생한 비용에 대한 가시성을 제공할 수 있습니다.", - "training": "https://learn.microsoft.com/training/modules/analyze-costs-create-budgets-azure-cost-management/?source=recommendations", - "waf": "작업" + "text": "필요한 경우 키 관리 서비스 etcd 암호화를 추가합니다.", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", + "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", + "service": "AKS", "severity": "낮다", - "text": "대기 시간에 민감한 애플리케이션에 대해 VM 간 대기 시간 모니터링을 사용합니다.", - "waf": "공연" + "text": "필요한 경우 AKS용 기밀 컴퓨팅을 사용하는 것이 좋습니다.", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", + "service": "AKS", "severity": "보통", - "text": "Azure Site Recovery 모니터링을 사용하여 SAP 애플리케이션 서버에 대한 재해 복구 서비스의 상태를 유지 관리합니다.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", - "waf": "신뢰도" + "text": "컨테이너용 Defender 사용 고려", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", - "severity": "보통", - "text": "모든 데이터베이스 파일 시스템 및 실행 프로그램을 바이러스 백신 검사에서 제외합니다. 이를 포함하면 성능 문제가 발생할 수 있습니다. 제외 목록에 대한 규범적 세부 정보는 데이터베이스 공급업체에 문의하십시오. 예를 들어 Oracle은 바이러스 백신 검사에서 /oracle//sapdata를 제외할 것을 권장합니다.", - "waf": "공연" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "높다", + "text": "서비스 주체 대신 관리 ID 사용", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "c027f893-f404-41a9-b33d-39d625a14964", - "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", - "service": "SAP", - "severity": "낮다", - "text": "마이그레이션 후 비 HANA 데이터베이스에 대한 전체 데이터베이스 통계를 수집하는 것이 좋습니다. 예를 들어 SAP Note 1020260 - Oracle 통계 제공을 구현합니다.", - "waf": "공연" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "보통", + "text": "AAD와 인증 통합(관리형 통합 사용)", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", + "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", + "service": "AKS", "severity": "보통", - "text": "Azure에서 SAP를 사용하는 모든 Oracle 배포에 Oracle ASM(Automatic Storage Management)을 사용하는 것이 좋습니다.", - "training": "https://learn.microsoft.com/training/paths/administer-infrastructure-resources-in-azure/?source=recommendations", - "waf": "공연" + "text": "관리자 kubeconfig에 대한 액세스 제한(get-credentials --admin)", + "waf": "안전" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", + "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", + "service": "AKS", "severity": "보통", - "text": "Oracle을 실행하는 Azure의 SAP의 경우 SQL 스크립트 컬렉션은 성능 문제를 진단하는 데 도움이 될 수 있습니다. AWR(Automatic Workload Repository) 보고서에는 Oracle 시스템의 문제점을 진단하는 데 유용한 정보가 포함되어 있습니다. 여러 세션 동안 AWR 보고서를 실행하고 피크 시간을 선택하여 광범위한 분석 범위를 보장하는 것이 좋습니다.", - "training": "https://learn.microsoft.com/ja-jp/azure/well-architected/oracle-iaas/performance-efficiency", - "waf": "공연" + "text": "AAD RBAC와 권한 부여 통합", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", + "service": "AKS", "severity": "높다", - "text": "Azure Site Recovery 모니터링을 사용하여 SAP 애플리케이션 서버에 대한 재해 복구 서비스의 상태를 유지 관리합니다.", - "training": "https://learn.microsoft.com/training/modules/protect-on-premises-infrastructure-with-azure-site-recovery/?source=recommendations", - "waf": "작업" + "text": "쿠버네티스에서 RBAC 권한을 제한하기 위해 네임스페이스 사용", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", + "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", + "service": "AKS", "severity": "보통", - "text": "HTTP/S 앱을 안전하게 배달하려면 Application Gateway v2를 사용하고 WAF 보호 및 정책이 사용하도록 설정되어 있는지 확인합니다.", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/", + "text": "Pod ID 액세스 관리의 경우 Azure AD 워크로드 ID(미리 보기)를 사용합니다.", "waf": "안전" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", + "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", + "service": "AKS", "severity": "보통", - "text": "Azure로 마이그레이션하는 동안 가상 머신의 DNS 또는 가상 이름이 변경되지 않은 경우 백그라운드 DNS 및 가상 이름은 SAP 환경의 많은 시스템 인터페이스를 연결하며, 고객은 시간이 지남에 따라 개발자가 정의하는 인터페이스를 인식하는 경우에만 인식할 수 있습니다. 마이그레이션 후 가상 또는 DNS 이름이 변경될 때 다양한 시스템 간에 연결 문제가 발생하며, 이러한 유형의 문제를 방지하기 위해 DNS 별칭을 유지하는 것이 좋습니다.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", - "waf": "작업" + "text": "AKS 비대화형 로그인의 경우 kubelogin(미리 보기)을 사용합니다.", + "waf": "안전" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "보통", - "text": "서로 다른 DNS 영역을 사용하여 각 환경(샌드박스, 개발, 사전 프로덕션 및 프로덕션)을 서로 구분합니다. 예외는 자체 VNet을 사용하는 SAP 배포의 경우입니다. 여기서는 프라이빗 DNS 영역이 필요하지 않을 수 있습니다.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", - "waf": "작업" + "text": "AKS 로컬 계정 사용 안 함", + "waf": "안전" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "낮다", + "text": "필요한 경우 Just-in-time 클러스터 액세스 구성", + "waf": "안전" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "낮다", + "text": "AKS에 필요한 경우 AAD 조건부 액세스 구성", + "waf": "안전" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", + "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", + "service": "AKS", + "severity": "낮다", + "text": "Windows AKS 워크로드에 필요한 경우 gMSA를 구성합니다. ", + "waf": "안전" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "보통", + "text": "더 세밀하게 제어하려면 관리형 Kubelet ID를 사용하는 것이 좋습니다.", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "a3592829-e6e2-4061-9368-6af46791f893", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", + "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", + "service": "AKS", "severity": "보통", - "text": "로컬 및 글로벌 VNet 피어링은 연결을 제공하며, 여러 Azure 지역에서 SAP 배포를 위한 랜딩 존 간의 연결을 보장하기 위해 선호되는 접근 방식입니다", - "training": "https://learn.microsoft.com/training/modules/configure-vnet-peering/?source=recommendations", + "text": "AGIC를 사용하는 경우 클러스터 간에 AppGW를 공유하지 마세요", "waf": "신뢰도" }, { - "checklist": "SAP Checklist", - "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "높다", - "text": "SAP 애플리케이션과 SAP 데이터베이스 서버 간에 NVA를 배포하는 것은 지원되지 않습니다", - "training": "https://me.sap.com/notes/2731110", - "waf": "공연" + "text": "AKS HTTP 라우팅 추가 기능을 사용하지 말고, 애플리케이션 라우팅 추가 기능과 함께 관리되는 NGINX 수신을 대신 사용합니다.", + "waf": "신뢰도" }, { - "checklist": "SAP Checklist", - "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", - "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", + "service": "AKS", "severity": "보통", - "text": "Azure 지역 및 온-프레미스 위치 간에 글로벌 전송 연결이 필요한 신규, 대규모 또는 글로벌 네트워크에서 Azure 배포에 Virtual WAN을 사용합니다. 이 방법을 사용하면 Azure 네트워킹에 대한 전이적 라우팅을 수동으로 설정할 필요가 없으며 Azure의 SAP 배포에 대한 표준을 따를 수 있습니다.", - "training": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", - "waf": "작업" + "text": "Windows 워크로드의 경우 가속화된 네트워킹을 사용합니다.", + "waf": "공연" }, { - "checklist": "SAP Checklist", - "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", - "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", - "service": "SAP", - "severity": "보통", - "text": "파트너 NVA를 사용하는 경우에만 지역 간에 NVA(네트워크 가상 어플라이언스)를 배포하는 것이 좋습니다. 네이티브 NVA가 있는 경우 지역 또는 VNet 간의 NVA가 필요하지 않습니다. 파트너 네트워킹 기술 및 NVA를 배포하는 경우 공급업체의 지침에 따라 Azure 네트워킹과 충돌하는 구성을 확인합니다.", - "training": "https://learn.microsoft.com/training/modules/control-network-traffic-flow-with-routes/?source=recommendations", - "waf": "작업" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "높다", + "text": "표준 ALB 사용(기본 ALB와 반대)", + "waf": "신뢰도" }, { - "checklist": "SAP Checklist", - "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", - "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "보통", - "text": "Virtual WAN은 가상 WAN 기반 토폴로지에 대한 스포크 VNet 간의 연결을 관리하며(UDR[사용자 정의 라우팅] 또는 NVA를 설정할 필요 없음) 동일한 가상 허브의 VNet 간 트래픽에 대한 최대 네트워크 처리량은 초당 50기가비트입니다. 필요한 경우 SAP 랜딩 존은 VNet 피어링을 사용하여 다른 랜딩 존에 연결하고 이 대역폭 제한을 극복할 수 있습니다.", - "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/?source=recommendations", - "waf": "작업" + "text": "Azure CNI를 사용하는 경우 NodePools에 다른 서브넷을 사용하는 것이 좋습니다.", + "waf": "안전" }, { - "checklist": "SAP 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", - "severity": "높다", - "text": "SAP 워크로드를 실행하는 VM에 대한 공용 IP 할당은 권장되지 않습니다.", - "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", + "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", + "service": "AKS", + "severity": "보통", + "text": "프라이빗 엔드포인트(기본 설정) 또는 Virtual Network 서비스 엔드포인트를 사용하여 클러스터에서 PaaS 서비스에 액세스", "waf": "안전" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "높다", - "text": "ASR을 구성할 때 DR 쪽에서 IP 주소를 예약하는 것이 좋습니다.", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "작업" + "text": "요구 사항에 가장 적합한 CNI 네트워크 플러그 인 선택(Azure CNI 권장)", + "waf": "신뢰도" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "severity": "높다", - "text": "프로덕션 및 DR 사이트에 겹치는 IP 주소 범위를 사용하지 마십시오.", - "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", - "waf": "작업" - }, - { - "checklist": "SAP Checklist", - "guid": "6e154e3a-a359-4282-ae6e-206173686af4", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", - "service": "SAP", - "severity": "보통", - "text": "Azure는 VNet에서 여러 위임된 서브넷을 만드는 데 도움이 되지만 Azure NetApp Files용 VNet에는 위임된 서브넷이 하나만 존재할 수 있습니다. Azure NetApp Files에 대해 둘 이상의 위임된 서브넷을 사용하는 경우 새 볼륨을 만들려는 시도가 실패합니다.", - "training": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-network-topologies?source=recommendations", - "waf": "작업" - }, - { - "checklist": "SAP 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", - "severity": "보통", - "text": "Azure Firewall을 사용하여 인터넷에 대한 Azure 아웃바운드 트래픽, 비 HTTP/S 인바운드 연결 및 East/West 트래픽 필터링(조직에 필요한 경우)을 제어합니다", - "training": "https://learn.microsoft.com/training/paths/secure-networking-infrastructure/", - "waf": "안전" + "text": "Azure CNI를 사용하는 경우 노드당 최대 Pod 수를 고려하여 서브넷 크기를 적절하게 조정합니다", + "waf": "공연" }, { - "checklist": "SAP Checklist", - "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", - "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", - "service": "SAP", - "severity": "보통", - "text": "Application Gateway, SAP Web Dispatcher 및 기타 타사 서비스 간의 비교에서 볼 수 있듯이 Application Gateway가 SAP 웹앱에 대한 역방향 프록시 역할을 하는 경우 Application Gateway 및 Web Application Firewall에 제한 사항이 있습니다.", - "training": "https://help.sap.com/docs/SUPPORT_CONTENT/si/3362959506.html", - "waf": "안전" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", + "severity": "높다", + "text": "Azure CNI를 사용하는 경우 최대 Pod/노드(기본값 30)를 확인합니다.", + "waf": "공연" }, { - "checklist": "SAP Checklist", - "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", - "severity": "보통", - "text": "Azure Front Door 및 WAF 정책을 사용하여 랜딩 존에 대한 인바운드 HTTP/S 연결을 위해 Azure 지역에서 전역 보호를 제공합니다.", - "training": "https://learn.microsoft.com/training/paths/secure-application-delivery/", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "description": "내부 앱의 경우 조직은 방화벽에서 전체 AKS 서브넷을 여는 경우가 많습니다. 이렇게 하면 노드에 대한 네트워크 액세스도 열리고 잠재적으로 Pod에 대한 액세스도 열립니다(Azure CNI를 사용하는 경우). LoadBalancer IP가 다른 서브넷에 있는 경우 앱 클라이언트에서 이 IP만 사용할 수 있어야 합니다. 또 다른 이유는 AKS 서브넷의 IP 주소가 부족한 리소스인 경우 서비스에 해당 IP 주소를 사용하면 클러스터의 최대 확장성이 감소하기 때문입니다.", + "guid": "13c00567-4b1e-4945-a459-c373e7ed6162", + "link": "https://learn.microsoft.com/azure/aks/internal-lb", + "service": "AKS", + "severity": "낮다", + "text": "개인 IP LoadBalancer 서비스를 사용하는 경우 AKS 서브넷이 아닌 전용 서브넷을 사용합니다", "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", - "service": "SAP", - "severity": "보통", - "text": "Azure Front Door 및 Application Gateway를 사용하여 HTTP/S 애플리케이션을 보호하는 경우 Azure Front Door의 Web Application Firewall 정책을 활용합니다. Azure Front Door에서만 트래픽을 수신하도록 Application Gateway를 잠급니다.", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", - "waf": "안전" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", + "severity": "높다", + "text": "그에 따라 서비스 IP 주소 범위의 크기를 조정합니다(클러스터 확장성이 제한됨).", + "waf": "신뢰도" }, { - "checklist": "SAP Checklist", - "guid": "5ada4332-4e13-4811-9231-81aa41742694", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", - "severity": "보통", - "text": "웹 애플리케이션 방화벽을 사용하여 트래픽이 인터넷에 노출될 때 트래픽을 검사합니다. 또 다른 옵션은 부하 분산 장치 또는 Application Gateway 또는 타사 솔루션과 같은 기본 제공 방화벽 기능이 있는 리소스와 함께 사용하는 것입니다.", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", + "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", + "service": "AKS", + "severity": "낮다", + "text": "필요한 경우 자체 CNI 플러그인을 추가합니다.", "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "SAP", - "severity": "보통", - "text": "Azure 지역 및 온-프레미스 위치 간에 글로벌 전송 연결이 필요한 신규, 대규모 또는 글로벌 네트워크에서 Azure 배포에 Virtual WAN을 사용합니다. 이 방법을 사용하면 Azure 네트워킹에 대한 전이적 라우팅을 수동으로 설정할 필요가 없으며 Azure의 SAP 배포에 대한 표준을 따를 수 있습니다.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/10-explore-azure-front-door", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "낮다", + "text": "필요한 경우 AKS에서 노드당 공용 IP 구성", "waf": "공연" }, { - "checklist": "SAP Checklist", - "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", - "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", + "link": "https://learn.microsoft.com/azure/aks/concepts-network", + "service": "AKS", "severity": "보통", - "text": "데이터 유출을 방지하려면 Azure Private Link를 사용하여 Azure Blob Storage, Azure Files, Azure Data Lake Storage Gen2, Azure Data Factory 등과 같은 PaaS(Platform as a Service) 리소스에 안전하게 액세스합니다. Azure 프라이빗 엔드포인트는 VNet과 Azure Storage, Azure Backup 등과 같은 서비스 간의 트래픽을 보호하는 데도 도움이 될 수 있습니다. VNet과 프라이빗 엔드포인트 사용 서비스 간의 트래픽은 Microsoft 글로벌 네트워크를 통해 이동하므로 공용 인터넷에 노출되지 않습니다.", - "training": "https://learn.microsoft.com/training/modules/design-implement-private-access-to-azure-services/?source=recommendations", - "waf": "안전" + "text": "수신 컨트롤러를 사용하여 LoadBalancer 유형 서비스를 사용하여 노출하는 대신 웹 기반 앱을 노출합니다", + "waf": "신뢰도" }, { - "checklist": "SAP Checklist", - "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", - "service": "SAP", - "severity": "높다", - "text": "SAP 애플리케이션 및 DBMS 계층에 사용되는 VM에서 Azure 가속 네트워킹이 사용하도록 설정되어 있는지 확인합니다.", - "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", - "waf": "공연" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", + "link": "https://learn.microsoft.com/azure/aks/nat-gateway", + "service": "AKS", + "severity": "낮다", + "text": "송신 트래픽 크기 조정을 위해 Azure NAT Gateway를 outboundType으로 사용", + "waf": "신뢰도" }, { - "checklist": "SAP Checklist", - "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "보통", - "text": "Azure Load Balancer에 대한 내부 배포가 DSR(Direct Server Return)을 사용하도록 설정되어 있는지 확인합니다. 이 설정(유동 IP 사용)은 DBMS 계층의 고가용성 구성에 내부 부하 분산 장치 구성을 사용할 때 대기 시간을 줄입니다.", - "training": "https://learn.microsoft.com/ja-jp/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", + "text": "Azure CNI IP 소모를 방지하기 위해 IP의 동적 할당 사용", + "waf": "신뢰도" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "높다", + "text": "보안 요구 사항에 필요한 경우 AzFW/NVA를 사용하여 송신 트래픽 필터링", "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "6791f893-5ada-4433-84e1-3811523181aa", - "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "보통", - "text": "ASG(애플리케이션 보안 그룹) 및 NSG 규칙을 사용하여 SAP 애플리케이션과 DBMS 계층 간에 네트워크 보안 액세스 제어 목록을 정의할 수 있습니다. ASG는 보안을 관리하는 데 도움이 되도록 가상 머신을 그룹화합니다.", - "training": "https://learn.microsoft.com/training/modules/configure-network-security-groups/?source=recommendations", + "text": "퍼블릭 API 엔드포인트를 사용하는 경우 액세스할 수 있는 IP 주소를 제한합니다", "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "높다", - "text": "피어링되지 않은 다른 Azure VNet에 SAP 애플리케이션 계층 및 SAP DBMS를 배치하는 것은 지원되지 않습니다.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "공연" + "text": "요구 사항에 따라 개인 클러스터를 사용합니다", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "fa96c96a-d885-418f-9827-34c886ba2802", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "보통", - "text": "SAP 애플리케이션에서 네트워크 대기 시간을 최적화하려면 Azure 근접 배치 그룹을 사용하는 것이 좋습니다.", - "training": "https://learn.microsoft.com/azure/virtual-machines/co-location#planned-maintenance-and-proximity-placement-groups", - "waf": "공연" + "text": "Windows 2019 및 2022 AKS 노드의 경우 Calico 네트워크 정책을 사용할 수 있습니다. ", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "높다", - "text": "온-프레미스와 Azure 간에 분할된 SAP 애플리케이션 서버 계층 및 DBMS 계층을 실행하는 것은 전혀 지원되지 않습니다. 두 계층 모두 온-프레미스 또는 Azure에 완전히 상주해야 합니다.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "공연" + "text": "Kubernetes 네트워크 정책 옵션 사용(Calico/Azure)", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", "severity": "높다", - "text": "계층 간의 과도한 네트워크 트래픽으로 인해 발생할 수 있는 상당한 비용 때문에 다른 VNet에서 SAP 시스템의 DBMS(데이터베이스 관리 시스템) 및 애플리케이션 계층을 호스트하고 VNet 피어링과 연결하는 것은 권장되지 않습니다. Azure 가상 네트워크 내에서 서브넷을 사용하여 SAP 애플리케이션 계층과 DBMS 계층을 분리하는 것이 좋습니다.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "비용" + "text": "쿠버네티스 네트워크 정책을 사용하여 클러스터 내 보안 강화", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "402a9846-d515-4061-aff8-cd30088693fa", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", "severity": "높다", - "text": "Linux 게스트 운영 체제에서 Load Balancer를 사용하는 경우 Linux 네트워크 매개 변수 net.ipv4.tcp_timestamps가 0으로 설정되어 있는지 확인합니다.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "공연" + "text": "웹 워크로드(UI 또는 API)에 WAF 사용Use a WAF for web workloads (UIs or APIs)", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "87585797-5551-4d53-bb7d-a94ee415734d", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "보통", - "text": "SAP RISE/ECS 배포의 경우 가상 피어링은 고객의 기존 Azure 환경과의 연결을 설정하는 기본 방법입니다. SAP vnet과 고객 vnet은 모두 NSG(네트워크 보안 그룹)로 보호되므로 vnet 피어링을 통해 SAP 및 데이터베이스 포트에서 통신할 수 있습니다", + "text": "AKS Virtual Network에서 DDoS 표준 사용Use DDoS Standard in the AKS Virtual Network", "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", - "severity": "높다", - "text": "Azure VM에 대한 SAP HANA 데이터베이스 백업을 검토합니다.", - "waf": "비용" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "낮다", + "text": "필요한 경우 회사 HTTP 프록시를 추가합니다.", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", + "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", + "service": "AKS", "severity": "보통", - "text": "SAP에 사용되는 Site Recovery 기본 제공 모니터링을 검토합니다.", - "waf": "비용" + "text": "고급 마이크로서비스 통신 관리를 위해 서비스 메시를 사용하는 것이 좋습니다", + "waf": "안전" }, { - "checklist": "SAP Checklist", - "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", - "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", + "service": "AKS", "severity": "높다", - "text": "SAP HANA 시스템 환경 모니터링 지침을 검토합니다.", + "text": "가장 중요한 메트릭에 대한 경고 구성(권장 사항은 Container Insights 참조)", "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", - "service": "SAP", - "severity": "보통", - "text": "Azure Linux VM 백업 전략에서 Oracle Database를 검토합니다.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "337453a3-cc63-4963-9a65-22ac19e80696", + "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", + "service": "AKS", + "severity": "낮다", + "text": "Azure Advisor에서 클러스터에 대한 권장 사항을 정기적으로 확인합니다.", "waf": "작업" }, { - "checklist": "SAP 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", - "severity": "보통", - "text": "SQL Server 2016에서 Azure Blob Storage 사용을 검토합니다.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", + "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", + "service": "AKS", + "severity": "낮다", + "text": "AKS 자동 인증서 회전 사용", "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", - "service": "SAP", - "severity": "보통", - "text": "Azure VM에 대한 자동화된 Backup v2 사용을 검토합니다.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", + "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", + "service": "AKS", + "severity": "높다", + "text": "kubernetes 버전을 주기적으로(예: 분기별) 업그레이드하거나 AKS 자동 업그레이드 기능을 사용하는 정기적인 프로세스가 있습니다.", "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", + "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", + "service": "AKS", "severity": "높다", - "text": "프리미엄 디스크(V1)를 사용할 때 M 시리즈에 쓰기 가속기 사용Enabling Write accelerator for M series when using premium disks(V1)", + "text": "node-image upgrade를 사용하지 않는 경우 Linux 노드 업그레이드에 kured를 사용합니다.", "waf": "작업" }, { - "checklist": "SAP 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", - "severity": "보통", - "text": "가용성 영역 대기 시간을 테스트합니다.", - "waf": "공연" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", + "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", + "service": "AKS", + "severity": "높다", + "text": "클러스터 노드 이미지를 주기적으로(예: 매주) 업그레이드하는 정기적인 프로세스가 있습니다.", + "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", - "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", - "service": "SAP", - "severity": "보통", - "text": "모든 SAP 구성 요소에 대해 SAP EarlyWatch Alert를 활성화합니다.", - "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", - "waf": "공연" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", + "service": "AKS", + "severity": "낮다", + "text": "gitops를 고려하여 애플리케이션 또는 클러스터 구성을 여러 클러스터에 배포합니다.", + "waf": "작업" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d7672c26-7602-4482-85a4-14527fbe855c", + "link": "https://learn.microsoft.com/azure/aks/command-invoke", + "service": "AKS", + "severity": "낮다", + "text": "프라이빗 클러스터에서 AKS 명령 호출을 사용하는 것이 좋습니다.", + "waf": "작업" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", + "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", + "service": "AKS", + "severity": "낮다", + "text": "계획된 이벤트의 경우 노드 자동 드레인 사용을 고려하십시오.", + "waf": "작업" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", + "link": "https://learn.microsoft.com/azure/aks/faq", + "service": "AKS", + "severity": "높다", + "text": "노드 RG(일명 '인프라 RG')의 운영자가 변경을 수행하지 않도록 자체 거버넌스 관행을 개발합니다.", + "waf": "작업" }, { - "checklist": "SAP 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", - "severity": "보통", - "text": "SAP ABAPMeter 보고서 /SSA/CAT를 사용하여 SAP 애플리케이션 서버-데이터베이스 서버 대기 시간을 검토합니다.", - "training": "https://me.sap.com/notes/0002879613", - "waf": "공연" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "낮다", + "text": "사용자 정의 노드 RG (일명 '인프라 RG') 이름 사용", + "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", + "link": "https://kubernetes.io/docs/setup/release/notes/", + "service": "AKS", "severity": "보통", - "text": "CCMS를 사용하여 SQL Server 성능 모니터링을 검토합니다.", - "waf": "공연" + "text": "YAML 매니페스트에서 더 이상 사용되지 않는 Kubernetes API를 사용하지 마십시오.", + "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", - "link": "https://me.sap.com/notes/500235", - "service": "SAP", - "severity": "보통", - "text": "SAP 애플리케이션 계층 VM과 DBMS VM(NIPING) 간의 네트워크 대기 시간을 테스트합니다.", - "training": "https://me.sap.com/notes/1100926/E", - "waf": "공연" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", + "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", + "service": "AKS", + "severity": "낮다", + "text": "테인트 Windows 노드", + "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", - "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", - "service": "SAP", - "severity": "보통", - "text": "SAP HANA Studio 경고를 검토합니다.", - "waf": "공연" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "낮다", + "text": "Windows 컨테이너 패치 수준을 호스트 패치 수준과 동기화된 상태로 유지", + "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", - "link": "https://me.sap.com/notes/1969700", - "service": "SAP", - "severity": "보통", - "text": "HANA_Configuration_Minichecks를 사용하여 SAP HANA 상태 검사를 수행합니다.", - "waf": "공연" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "낮다", + "text": "마스터 로그(즉, API 로그)를 Azure Monitor 또는 기본 로그 관리 솔루션으로 보냅니다", + "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", - "severity": "보통", - "text": "Azure, 온-프레미스 또는 기타 클라우드 환경에서 Windows 및 Linux VM을 실행하는 경우 Azure Automation의 업데이트 관리 센터를 사용하여 보안 패치를 포함한 운영 체제 업데이트를 관리할 수 있습니다.", - "training": "https://learn.microsoft.com/azure/automation/update-management/overview", - "waf": "안전" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", + "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", + "service": "AKS", + "severity": "낮다", + "text": "필요한 경우 nodePool 스냅샷을 사용합니다.", + "waf": "비용" }, { - "checklist": "SAP Checklist", - "guid": "08951710-79a2-492a-adbc-06d7a401545b", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", - "severity": "보통", - "text": "SAP는 SAP 시스템을 보호하기 위해 즉각적인 조치가 필요한 매우 중요한 보안 패치 또는 핫픽스를 릴리스하므로 SAP 보안 OSS 노트를 정기적으로 검토합니다.", - "training": "https://support.sap.com/en/my-support/knowledge-base/security-notes-news.html", - "waf": "안전" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", + "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", + "service": "AKS", + "severity": "낮다", + "text": "시간에 민감하지 않은 워크로드에 대한 스폿 노드 풀 고려", + "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "낮다", - "text": "SQL Server SAP의 경우 SQL Server SAP 시스템에서 계정을 사용하지 않으므로 SQL Server 시스템 관리자 계정을 사용하지 않도록 설정할 수 있습니다. 원래 시스템 관리자 계정을 비활성화하기 전에 시스템 관리자 권한이 있는 다른 사용자가 서버에 액세스할 수 있는지 확인합니다.", - "waf": "안전" + "text": "빠른 버스팅을 위해 AKS 가상 노드 고려", + "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", + "service": "AKS", "severity": "높다", - "text": "xp_cmdshell 비활성화합니다. SQL Server 기능 xp_cmdshell SQL Server 내부 운영 체제 명령 셸을 사용할 수 있습니다. 이는 보안 감사에서 발생할 수 있는 잠재적 위험입니다.", - "training": "https://me.sap.com/notes/3019299/E", - "waf": "안전" + "text": "Container Insights(또는 Prometheus와 같은 다른 도구)를 사용하여 클러스터 지표 모니터링", + "waf": "작업" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "높다", - "text": "Azure에서 SAP HANA 데이터베이스 서버를 암호화하는 데는 SAP HANA 네이티브 암호화 기술이 사용됩니다. 또한 Azure에서 SQL Server를 사용하는 경우 TDE(투명한 데이터 암호화)를 사용하여 데이터 및 로그 파일을 보호하고 백업도 암호화되도록 합니다.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "waf": "안전" + "text": "Container Insights(또는 Telegraf/ElasticSearch와 같은 다른 도구)를 사용하여 클러스터 로그를 저장하고 분석합니다.", + "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", - "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", + "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", + "service": "AKS", "severity": "보통", - "text": "Azure Storage 암호화는 모든 Azure Resource Manager 및 클래식 스토리지 계정에 대해 사용하도록 설정되며 사용하지 않도록 설정할 수 없습니다. 데이터는 기본적으로 암호화되므로 Azure Storage 암호화를 사용하기 위해 코드 또는 애플리케이션을 수정할 필요가 없습니다.", - "training": "https://learn.microsoft.com/training/modules/encrypt-sector-data/?source=recommendations", - "waf": "안전" + "text": "노드의 CPU 및 메모리 사용률 모니터링", + "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", - "link": "https://learn.microsoft.com/azure/key-vault/general/overview", - "service": "SAP", - "severity": "높다", - "text": "Azure Key Vault를 사용하여 비밀 및 자격 증명 저장", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "안전" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "1a4835ac-9422-423e-ae80-b123081a5417", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", + "severity": "보통", + "text": "Azure CNI를 사용하는 경우 노드당 사용되는 Pod IP의 %를 모니터링합니다.", + "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "829e2edb-2173-4676-aff6-691b4935ada4", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "description": "OS 디스크의 I/O는 중요한 리소스입니다. 노드의 OS가 I/O에서 제한되면 예측할 수 없는 동작이 발생할 수 있으며, 일반적으로 노드가 NotReady로 선언됩니다", + "guid": "415833ea-3ad3-4c2d-b733-165c3acbe04b", + "link": "https://learn.microsoft.com/azure/virtual-machines/premium-storage-performance", + "service": "AKS", "severity": "보통", - "text": "무단 변경으로부터 보호하기 위해 성공적인 배포 후 Azure 리소스를 잠그는 것이 좋습니다. 사용자 지정된 Azure 정책(Custome 역할)을 사용하여 구독별로 LOCK 제약 조건 및 규칙을 적용할 수도 있습니다.", - "training": "https://learn.microsoft.com/training/modules/use-azure-resource-manager/?source=recommendations", - "waf": "안전" + "text": "노드에서 OS 디스크 큐 크기 모니터링Monitor OS disk queue depth in nodes", + "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "be209d39-fda4-4777-a424-d116785c2fa5", + "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", + "service": "AKS", "severity": "보통", - "text": "삭제된 개체에 대한 보존 보호를 허용하기 위해 일시 삭제 및 제거 정책을 사용하도록 설정된 Azure Key Vault를 프로비전합니다.", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "안전" + "text": "AzFW/NVA에서 송신 필터링을 사용하지 않는 경우 표준 ALB 할당 SNAT 포트를 모니터링합니다", + "waf": "작업" }, { - "checklist": "SAP Checklist", - "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", - "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", + "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", + "service": "AKS", + "severity": "보통", + "text": "AKS 클러스터에 대한 Resource Health 알림 구독Subscribe to resource health notifications for your AKS cluster", + "waf": "작업" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", "severity": "높다", - "text": "기존 요구 사항에 따라 규정 및 규정 준수 제어(내부/외부) - 필요한 Azure 정책 및 Azure RBAC 역할 결정", - "training": "https://learn.microsoft.com/training/paths/describe-azure-management-governance/?source=recommendations", - "waf": "안전" + "text": "Pod 규격에서 요청 및 제한 구성", + "waf": "작업" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "769ef669-1a48-435a-a942-223ece80b123", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", + "severity": "보통", + "text": "네임스페이스에 대한 리소스 할당량 적용Enforce resource quotas for namespaces", + "waf": "작업" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "081a5417-4158-433e-a3ad-3c2de733165c", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", + "service": "AKS", "severity": "높다", - "text": "SAP 환경에서 엔드포인트용 Microsoft Defender 사용하도록 설정하는 경우 모든 서버를 대상으로 하는 대신 DBMS 서버에서 데이터 및 로그 파일을 제외하는 것이 좋습니다. 대상 파일을 제외할 때 DBMS 공급업체의 권장 사항을 따릅니다.", - "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/microsoft-defender-endpoint-mde-for-sap-applications-on-windows/ba-p/3912268", - "waf": "안전" + "text": "구독에 노드 풀을 확장할 수 있는 충분한 할당량이 있는지 확인합니다.", + "waf": "작업" }, { - "checklist": "SAP 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", - "severity": "높다", - "text": "클라우드용 Microsoft Defender의 Just-In-Time 액세스 권한이 있는 SAP 관리자 사용자 지정 역할을 위임합니다.", - "training": "https://learn.microsoft.com/training/modules/secure-vms-with-azure-security-center/?source=recommendations", - "waf": "안전" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "보통", + "text": "Cluster Autoscaler 사용", + "waf": "공연" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "낮다", - "text": "타사 보안 제품을 DIAG(SAP GUI)용 SNC(Secure Network Communications), RFC 및 HTTPS용 SPNEGO와 통합하여 전송 중인 데이터를 암호화합니다.", - "training": "https://learn.microsoft.com/azure/security/fundamentals/encryption-overview#encryption-of-data-in-transit", - "waf": "안전" + "text": "AKS 노드 풀에 대한 노드 구성 사용자 지정", + "waf": "공연" }, { - "checklist": "SAP Checklist", - "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", - "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", + "link": "https://learn.microsoft.com/azure/aks/concepts-scale", + "service": "AKS", "severity": "보통", - "text": "보안 주체 암호화 기능을 위해 기본적으로 Microsoft 관리형 키를 사용하고 필요한 경우 고객 관리형 키를 사용합니다.", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "안전" + "text": "필요한 경우 Horizontal Pod Autoscaler 사용", + "waf": "공연" }, { - "checklist": "SAP Checklist", - "guid": "4935ada4-2223-4ece-a1b1-23181a541741", - "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "description": "노드가 클수록 임시 디스크 및 가속화된 네트워킹과 같은 더 높은 성능과 기능을 제공하지만 폭발 반경이 증가하고 크기 조정 세분성이 감소합니다", + "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", "severity": "높다", - "text": "애플리케이션, 환경, 지역당 Azure Key Vault를 사용합니다.", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "안전" + "text": "너무 크거나 너무 작지 않은 적절한 노드 크기를 고려합니다", + "waf": "공연" }, { - "checklist": "SAP Checklist", - "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", - "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", - "service": "SAP", - "severity": "높다", - "text": "비 HANA Windows 및 비 Windows 운영 체제에 대한 디스크 암호화 키 및 비밀을 제어하고 관리하려면 Azure Key Vault를 사용합니다. SAP HANA는 Azure Key Vault에서 지원되지 않으므로 SAP ABAP 또는 SSH 키와 같은 대체 방법을 사용해야 합니다.", - "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/?source=recommendations", - "waf": "안전" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", + "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", + "service": "AKS", + "severity": "낮다", + "text": "확장성을 위해 5,000개 이상의 노드가 필요한 경우 추가 AKS 클러스터를 사용하는 것이 좋습니다", + "waf": "공연" }, { - "checklist": "SAP Checklist", - "guid": "209d490d-a477-4784-84d1-16785d2fa56c", - "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", - "service": "SAP", - "severity": "높다", - "text": "실수로 인한 네트워크 관련 변경을 방지하기 위해 Azure의 SAP 스포크 구독에 대한 RBAC(역할 기반 액세스 제어) 역할 사용자 지정", - "training": "https://learn.microsoft.com/training/modules/secure-azure-resources-with-rbac/?source=recommendations", - "waf": "안전" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", + "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", + "service": "AKS", + "severity": "낮다", + "text": "AKS 자동화를 위해 EventGrid 이벤트를 구독하는 것이 좋습니다.", + "waf": "공연" }, { - "checklist": "SAP Checklist", - "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", - "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", - "service": "SAP", - "severity": "높다", - "text": "나머지 SAP 자산에서 DMZ 및 NVA를 격리하고, Azure Private Link를 구성하고, Azure의 SAP 리소스를 안전하게 관리 및 제어합니다", - "training": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/secure-vnet-dmz?tabs=portal", - "waf": "안전" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", + "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", + "service": "AKS", + "severity": "낮다", + "text": "AKS 클러스터에서 장기 실행 작업의 경우 이벤트 종료를 고려합니다.", + "waf": "공연" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", + "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", + "service": "AKS", "severity": "낮다", - "text": "Azure에서 Microsoft 맬웨어 방지 소프트웨어를 사용하여 악성 파일, 애드웨어 및 기타 위협으로부터 가상 머신을 보호하는 것이 좋습니다.", - "training": "https://azure.microsoft.com/blog/deploying-antimalware-solutions-on-azure-virtual-machines/", - "waf": "안전" + "text": "필요한 경우 AKS 노드에 Azure Dedicated Host를 사용하는 것이 좋습니다", + "waf": "공연" }, { - "checklist": "SAP 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", - "severity": "낮다", - "text": "더욱 강력한 보호를 위해 엔드포인트용 Microsoft Defender 사용하는 것이 좋습니다.", - "training": "https://learn.microsoft.com/training/modules/implement-endpoint-protection-use-microsoft-defender/?source=recommendations", - "waf": "안전" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "높다", + "text": "임시 OS 디스크 사용", + "waf": "공연" }, { - "checklist": "SAP Checklist", - "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", + "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", + "service": "AKS", "severity": "높다", - "text": "가상 네트워크 피어링을 통해 스포크 네트워크에 연결된 허브 가상 네트워크를 통해 모든 트래픽을 전달하여 SAP 애플리케이션 및 데이터베이스 서버를 인터넷 또는 온-프레미스 네트워크에서 격리합니다. 피어링된 가상 네트워크는 Azure의 SAP 솔루션이 공용 인터넷에서 격리되도록 보장합니다.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/?source=recommendations", - "waf": "안전" + "text": "임시 디스크가 아닌 디스크의 경우 여러 Pod를 실행하는 데 고성능이 필요하고 기본 AKS 로그 회전 임계값을 사용하여 대규모 로그를 생성하므로 많은 Pod/노드를 실행할 때 노드에 높은 IOPS 및 더 큰 OS 디스크를 사용합니다", + "waf": "공연" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", + "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", + "service": "AKS", "severity": "낮다", - "text": "SAP Fiori와 같은 인터넷 연결 애플리케이션의 경우 보안 수준을 유지하면서 애플리케이션 요구 사항에 따라 부하를 분산해야 합니다. 계층 7 보안의 경우 Azure Marketplace에서 사용할 수 있는 타사 WAF(Web Application Firewall)를 사용할 수 있습니다.", - "training": "https://learn.microsoft.com/training/modules/simplify-cloud-procurement-governance-azure-marketplace/?source=recommendations", - "waf": "안전" + "text": "고성능 스토리지 옵션의 경우 AKS에서 Ultra Disks를 사용합니다.", + "waf": "공연" }, { - "checklist": "SAP Checklist", - "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", - "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", - "service": "SAP", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", + "service": "AKS", "severity": "보통", - "text": "SAP용 Azure Monitor 솔루션에서 보안 통신을 사용하도록 설정하려면 루트 인증서 또는 서버 인증서를 사용하도록 선택할 수 있습니다. 루트 인증서를 사용하는 것이 좋습니다.", - "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", - "waf": "안전" + "text": "클러스터에서 상태를 유지하지 않고 외부(AzStorage, AzSQL, Cosmos 등)에 데이터를 저장합니다.", + "waf": "공연" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "스토리지와 관련된 Microsoft 클라우드 보안 벤치마크의 지침 적용", - "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", - "service": "Azure Storage", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", + "service": "AKS", "severity": "보통", - "text": "'스토리지에 대한 Azure 보안 기준' 고려", - "waf": "안전" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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": "안전" + "text": "AzFiles 표준을 사용하는 경우 성능상의 이유로 AzFiles 프리미엄 및/또는 ANF를 고려합니다", + "waf": "공연" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", + "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", + "service": "AKS", "severity": "보통", - "text": "이전 스토리지 계정이 '클래식 배포 모델'을 사용하지 않는지 확인", - "waf": "안전" + "text": "Azure 디스크 및 AZ를 사용하는 경우 올바른 영역에 스토리지를 프로비전하기 위해 VolumeBindingMode::WaitForFirstConsumer를 사용하여 LRS 디스크의 영역 내에 노드 풀을 사용하거나 여러 영역에 걸쳐 있는 노드 풀에 ZRS 디스크를 사용하는 것이 좋습니다", + "waf": "공연" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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 사용", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Azure Event Hub는 미사용 데이터의 암호화를 제공합니다. 사용자 고유의 키를 사용하는 경우 데이터는 여전히 Microsoft 관리형 키를 사용하여 암호화되지만 Microsoft 관리형 키는 고객 관리형 키를 사용하여 암호화됩니다. ", + "guid": "7aaf12e7-b94e-4f6e-847d-2d92981b1cd6", + "link": "https://learn.microsoft.com/azure/event-hubs/configure-customer-managed-key", + "service": "Event Hubs", + "severity": "낮다", + "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": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "일시 삭제 메커니즘을 사용하면 실수로 삭제된 Blob을 복구할 수 있습니다.", - "guid": "503547c1-447e-4c66-828a-7100f1ce16dd", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-overview", - "service": "Azure Storage", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Azure Event Hubs 네임스페이스를 사용하면 클라이언트가 TLS 1.0 이상을 사용하여 데이터를 보내고 받을 수 있습니다. 더 엄격한 보안 조치를 적용하기 위해 클라이언트가 최신 버전의 TLS를 사용하여 데이터를 보내고 받도록 Event Hubs 네임스페이스를 구성할 수 있습니다. Event Hubs 네임스페이스에 최소 버전의 TLS가 필요한 경우 이전 버전으로 수행된 모든 요청이 실패합니다. ", + "guid": "d2f54b29-769e-43a6-a0e7-828ac936657e", + "link": "https://learn.microsoft.com/azure/event-hubs/transport-layer-security-configure-minimum-version", + "service": "Event Hubs", "severity": "보통", - "text": "Blob에 대해 '일시 삭제' 사용Enable 'soft delete' for blobs", + "text": "요청에 필요한 최소 버전의 TLS(전송 계층 보안) 적용 ", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "예를 들어 애플리케이션이 기밀성, 개인 정보 보호 또는 규정 준수를 위해 삭제된 정보가 즉시 삭제되도록 해야 하는 경우와 같이 특정 Blob 컨테이너에 대해 '일시 삭제'를 선택적으로 사용하지 않도록 설정하는 것이 좋습니다. ", - "guid": "3f1d5e87-2e52-4e36-81cc-58b4a4b1510e", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-blob-enable", - "service": "Azure Storage", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Event Hubs 네임스페이스를 만들 때 네임스페이스에 대해 RootManageSharedAccessKey라는 정책 규칙이 자동으로 만들어집니다. 이 정책에는 전체 네임스페이스에 대한 관리 권한이 있습니다. 이 규칙을 관리 루트 계정처럼 취급하고 응용 프로그램에서 사용하지 않는 것이 좋습니다. RBAC에서 AAD를 인증 공급자로 사용하는 것이 좋습니다. ", + "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", "severity": "보통", - "text": "Blob에 대해 '일시 삭제' 사용 안 함", - "waf": "안전" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "text": "필요하지 않은 경우 루트 계정을 사용하지 마십시오.", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "예를 들어 애플리케이션이 기밀성, 개인 정보 보호 또는 규정 준수를 위해 삭제된 정보가 즉시 삭제되도록 해야 하는 경우와 같이 특정 Blob 컨테이너에 대해 '일시 삭제'를 선택적으로 사용하지 않도록 설정하는 것이 좋습니다. ", - "guid": "3e3453a3-c863-4964-ab65-2d6c15f51296", - "link": "https://learn.microsoft.com/azure/storage/blobs/soft-delete-container-enable", - "service": "Azure Storage", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Azure 리소스에 대한 관리 ID는 Azure VM(Virtual Machines), 함수 앱, Virtual Machine Scale Sets 및 기타 서비스에서 실행되는 애플리케이션에서 Azure AD 자격 증명을 사용하여 Event Hubs 리소스에 대한 액세스 권한을 부여할 수 있습니다. Azure AD 인증과 함께 Azure 리소스에 대한 관리 ID를 사용하면 클라우드에서 실행되는 애플리케이션에 자격 증명을 저장하지 않아도 됩니다. ", + "guid": "3a365a5c-7acb-4e48-abd5-4cd79f2e8776", + "link": "https://learn.microsoft.com/azure/event-hubs/authenticate-managed-identity?tabs=latest", + "service": "Event Hubs", "severity": "보통", - "text": "컨테이너에 대해 '일시 삭제' 사용 안 함", + "text": "가능한 경우 애플리케이션은 관리 ID를 사용하여 Azure Event Hub에 인증해야 합니다. 그렇지 않은 경우 Azure Key Vault 또는 동등한 서비스에 스토리지 자격 증명(SAS, 서비스 주체 자격 증명)을 사용하는 것이 좋습니다", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "사용자가 삭제하기 전에 먼저 삭제 잠금을 제거하도록 강제하여 저장소 계정이 실수로 삭제되는 것을 방지합니다.", - "guid": "5398e6de-d227-4dd1-92b0-6c21d7999a64", - "link": "https://learn.microsoft.com/azure/storage/common/lock-account-resource", - "service": "Azure Storage", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "권한을 만들 때 Azure Event Hub에 대한 클라이언트의 액세스를 세밀하게 제어할 수 있습니다. Azure Event Hub의 사용 권한은 개별 리소스 수준(예: 소비자 그룹, 이벤트 허브 엔터티, 이벤트 허브 네임스페이스 등)으로 범위를 지정할 수 있으며 범위가 지정되어야 합니다.", + "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", "severity": "높다", - "text": "스토리지 계정에 대한 리소스 잠금 사용Enable resource locks on storage accounts", + "text": "최소 권한 데이터 평면 RBAC 사용", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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 고려", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Azure Event Hub 리소스 로그에는 작업 로그, 가상 네트워크 및 Kafka 로그가 포함됩니다. 런타임 감사 로그는 Event Hubs의 모든 데이터 평면 액세스 작업(예: 이벤트 보내기 또는 받기)에 대해 집계된 진단 정보를 캡처합니다.", + "guid": "b38b875b-a1cf-4104-a900-3a4d3ce474db", + "link": "https://learn.microsoft.com/azure/event-hubs/monitor-event-hubs-reference", + "service": "Event Hubs", + "severity": "보통", + "text": "보안 조사를 위해 로깅을 사용하도록 설정합니다. Azure Monitor를 사용하여 리소스 로그, 런타임 감사 로그 및 Kafka 로그와 같은 메트릭 및 로그를 캡처합니다.", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Azure Event Hub는 기본적으로 공용 IP 주소를 가지며 인터넷에 연결할 수 있습니다. 프라이빗 엔드포인트를 사용하면 가상 네트워크와 Azure Event Hub 간의 트래픽이 Microsoft 백본 네트워크를 통해 트래버스할 수 있습니다. 또한 퍼블릭 엔드포인트를 사용하지 않는 경우 사용하지 않도록 설정해야 합니다. ", + "guid": "5abca2a4-eda1-4dae-8cc9-5d48c6b791dc", + "link": "https://learn.microsoft.com/azure/event-hubs/private-link-service", + "service": "Event Hubs", + "severity": "보통", + "text": "프라이빗 엔드포인트를 사용하여 Azure Event Hub에 액세스하고 해당하는 경우 공용 네트워크 액세스를 사용하지 않도록 설정하는 것이 좋습니다.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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)을 사용하지 않는지 확인합니다.", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "IP 방화벽을 사용하면 퍼블릭 엔드포인트를 CIDR(Classless Inter-Domain Routing) 표기법의 IPv4 주소 또는 IPv4 주소 범위 집합으로만 추가로 제한할 수 있습니다. ", + "guid": "a0e6c465-89e5-458b-a37d-3974d1112dbd", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-ip-filtering", + "service": "Event Hubs", + "severity": "보통", + "text": "특정 IP 주소 또는 범위에서 Azure Event Hub 네임스페이스에 대한 액세스만 허용하는 것이 좋습니다", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "클라이언트가 SAS 토큰을 사용하여 Blob 데이터에 액세스할 때 HTTPS를 요구하면 자격 증명 손실 위험을 최소화하는 데 도움이 됩니다.", - "guid": "6b4bed3d-5035-447c-8347-dc56028a71ff", - "link": "https://learn.microsoft.com/azure/storage/common/storage-sas-overview", - "service": "Azure Storage", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "31d41e36-11c8-417b-8afb-c410d4391898", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-AEH_v1.docx", + "service": "Event Hubs", "severity": "보통", - "text": "SAS(공유 액세스 서명) 토큰을 HTTPS 연결로만 제한", - "waf": "안전" + "text": "FTA 탄력성 핸드북 활용", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "AAD 토큰은 가능한 경우 공유 액세스 서명보다 우선해야 합니다", - "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", - "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", - "service": "Azure Storage", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": " 영역 사용 지역의 프리미엄, 전용 또는 표준 SKU를 사용하여 포털에서 만든 새 EH 네임스페이스에 대해 자동으로 설정됩니다. EH 메타데이터와 이벤트 데이터 자체는 모두 영역 간에 복제됩니다", + "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", "severity": "높다", - "text": "Blob 액세스에 Azure AD(Azure Active Directory) 토큰 사용Use Azure Active Directory (Azure AD) tokens for blob access", - "waf": "안전" + "text": "지역적으로 적용 가능한 경우 가용성 영역 활용Leverage Availability Zones if regionally applicable", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "사용자, 그룹 또는 응용 프로그램에 역할을 할당할 때 해당 보안 주체가 작업을 수행하는 데 필요한 권한만 부여합니다. 리소스에 대한 액세스를 제한하면 의도하지 않은 데이터 오용과 악의적인 데이터 오용을 모두 방지할 수 있습니다.", - "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", - "service": "Azure Storage", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "20b56c56-ad58-4519-8f82-735c586bb281", + "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", + "service": "Event Hubs", "severity": "보통", - "text": "IaM 권한의 최소 권한", - "waf": "안전" + "text": "예측 가능한 성능을 위해 프리미엄 또는 전용 SKU 사용", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "기본 제공 지역 재해 복구 기능을 사용하도록 설정하면 네임스페이스(Event Hubs, 소비자 그룹 및 설정)의 전체 구성이 기본 네임스페이스에서 보조 네임스페이스로 지속적으로 복제되며, 언제든지 한 번만 장애 조치(failover)를 주 네임스페이스에서 보조 네임스페이스로 이동할 수 있습니다. 활성/수동 기능은 애플리케이션 구성을 변경할 필요 없이 실패한 Azure 지역에서 더 쉽게 복구하고 중단할 수 있도록 설계되었습니다", + "guid": "dc15a1c0-75ee-49f1-90ac-ccd579376bcd", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-geo-dr?tabs=portal", + "service": "Event Hubs", "severity": "높다", - "text": "SAS를 사용하는 경우 스토리지 계정 키 기반 SAS보다 '사용자 위임 SAS'를 선호합니다.", - "waf": "안전" + "text": "Active Passive 구성을 사용하여 지역 재해 복구 계획Plan for Geo Disaster Recovery using Active Passive configuration", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "스토리지 계정 키('공유 키')에는 감사 기능이 거의 없습니다. 누가/언제 키 사본을 가져왔는지 모니터링할 수 있지만, 키가 여러 사람의 손에 들어가면 특정 사용자의 사용을 귀속시키는 것은 불가능합니다. AAD 인증에만 의존하면 스토리지 액세스를 사용자에게 더 쉽게 연결할 수 있습니다. ", - "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", - "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", - "service": "Azure Storage", - "severity": "높다", - "text": "AAD 액세스(및 사용자 위임 SAS)만 지원되도록 스토리지 계정 키를 사용하지 않도록 설정하는 것이 좋습니다.", - "waf": "안전" + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "다운된 지역에서 이벤트 데이터의 중단 또는 손실을 허용할 수 없는 DR 구성에 사용해야 합니다. 이러한 경우 복제 지침을 따르고 기본 제공 지역 재해 복구 기능(활성/수동)을 사용하지 마세요. 액티브/액티브를 사용하여 서로 다른 지역 및 네임스페이스에서 여러 Event Hubs를 유지 관리하면 허브 간에 이벤트가 복제됩니다", + "guid": "6e31b67d-67ba-4591-89c0-9e805d597c7e", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-federation-overview", + "service": "Event Hubs", + "severity": "보통", + "text": "Business Critical Applications의 경우 Active Active 구성을 사용합니다.", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", + "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", + "service": "Event Hubs", + "severity": "보통", + "text": "복원력 있는 Event Hubs 설계", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.web/sites", + "checklist": "Azure App Service Review", + "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", + "severity": "낮다", + "text": "모범 사례는 기준 고가용성 영역 중복 웹 애플리케이션 아키텍처를 참조하세요.", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", + "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", + "service": "App Services", "severity": "보통", - "text": "SAS 만료 정책 구성 고려", - "waf": "안전" + "text": "프리미엄 및 표준 계층을 사용합니다. 이러한 계층은 스테이징 슬롯 및 자동 백업을 지원합니다.", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.web/sites", + "checklist": "Azure App Service Review", + "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", + "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", + "service": "App Services", + "severity": "높다", + "text": "지역적으로 적용 가능한 경우 가용성 영역 활용(프리미엄 v2 또는 v3 계층 필요)", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Services", "severity": "보통", - "text": "체크 인된 연결 문자열 및 저장소 계정 키를 검색하도록 응용 프로그램의 소스 코드 리포지토리를 구성하는 것이 좋습니다.", - "waf": "안전" + "text": "상태 확인 구현", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", + "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", + "service": "App Services", "severity": "높다", - "text": "Azure KeyVault에 연결 문자열을 저장하는 것이 좋습니다(관리 ID를 사용할 수 없는 시나리오에서).", - "waf": "안전" + "text": "Azure App Service에 대한 백업 및 복원 모범 사례를 참조하세요.", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "임시 SAS 서비스 SAS 또는 계정 SAS에서 단기 만료 시간을 사용합니다. 이러한 방식으로 SAS가 손상되더라도 짧은 시간 동안만 유효합니다. 이 방법은 저장된 액세스 정책을 참조할 수 없는 경우에 특히 중요합니다. 또한 단기 만료 시간은 업로드에 사용할 수 있는 시간을 제한하여 Blob에 쓸 수 있는 데이터의 양을 제한합니다.", - "guid": "27138b82-1102-4cac-9eae-01e6e842e52f", - "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", - "service": "Azure Storage", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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", "severity": "높다", - "text": "임시 SAS의 유효 기간을 단축하기 위해 노력", - "waf": "안전" + "text": "Azure App Service 안정성 모범 사례 구현", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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", + "severity": "낮다", + "text": "App Service 앱을 다른 지역으로 이동하는 방법을 숙지합니다. 재해가 발생하는 동안", + "waf": "신뢰도" + }, + { + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", + "service": "App Services", + "severity": "높다", + "text": "Azure App Service의 안정성 지원 숙지", + "waf": "신뢰도" + }, + { + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "App Services", "severity": "보통", - "text": "SAS에 좁은 범위 적용", - "waf": "안전" + "text": "App Service 계획에서 실행되는 Function Apps에 대해 \"Always On\"이 사용하도록 설정되어 있는지 확인합니다.", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "SAS에는 SAS를 사용하여 리소스를 요청할 수 있는 권한이 있는 클라이언트 IP 주소 또는 주소 범위에 대한 매개 변수가 포함될 수 있습니다. ", - "guid": "fd7b28dc-9355-4562-82bf-e4564b0d834a", - "link": "https://learn.microsoft.com/rest/api/storageservices/create-account-sas", - "service": "Azure Storage", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Services", "severity": "보통", - "text": "가능한 경우 SAS의 범위를 특정 클라이언트 IP 주소로 지정하는 것이 좋습니다", - "waf": "안전" + "text": "상태 검사를 사용하여 App Service 인스턴스 모니터링Monitor App Service instances using Health checks", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "SAS는 클라이언트가 업로드하는 데이터의 양을 제한할 수 없습니다. 시간 경과에 따른 스토리지 양의 가격 책정 모델을 고려할 때 클라이언트가 악의적으로 큰 콘텐츠를 업로드했는지 여부를 확인하는 것이 합리적일 수 있습니다.", - "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", - "service": "Azure Storage", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", + "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", + "service": "App Services", + "severity": "보통", + "text": "Application Insights 가용성 테스트를 사용하여 웹앱 또는 웹 사이트의 가용성 및 응답성 모니터링", + "waf": "신뢰도" + }, + { + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "b4e3f2d5-a5c6-4d7e-8b2f-c5d9e7a8f0ea", + "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", + "service": "App Services", "severity": "낮다", - "text": "클라이언트가 SAS를 사용하여 파일을 업로드한 후 업로드된 데이터를 확인하는 것이 좋습니다. ", - "waf": "안전" + "text": "Application Insights 표준 테스트를 사용하여 웹앱 또는 웹 사이트의 가용성 및 응답성 모니터링", + "waf": "신뢰도" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Azure Key Vault를 사용하여 애플리케이션에 필요한 모든 비밀을 저장합니다. Key Vault는 비밀을 저장하기 위한 안전하고 감사된 환경을 제공하며 Key Vault SDK 또는 App Service Key Vault 참조를 통해 App Service와 잘 통합됩니다.", + "guid": "834ac932-223e-4ce8-8b12-3071a5416415", + "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", + "service": "App Services", "severity": "높다", - "text": "SFTP: SFTP 액세스에 대한 '로컬 사용자'의 수를 제한하고 시간이 지남에 따라 액세스가 필요한지 여부를 감사합니다.", + "text": "Key Vault를 사용하여 비밀 저장", "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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을 지원하지 않습니다.", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "관리 ID를 사용하여 Key Vault SDK를 사용하거나 App Service Key Vault 참조를 통해 Key Vault에 연결합니다.", + "guid": "833ea3ad-2c2d-4e73-8165-c3acbef4abe1", + "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", + "service": "App Services", + "severity": "높다", + "text": "관리 ID를 사용하여 Key Vault에 연결", "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "App Service TLS 인증서를 Key Vault에 저장합니다.", + "guid": "f8d39fda-4776-4831-9c11-5775c2ea55b4", + "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-certificate", + "service": "App Services", "severity": "높다", - "text": "지나치게 광범위한 CORS 정책 방지", + "text": "Key Vault를 사용하여 TLS 인증서를 저장합니다.", "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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": "미사용 데이터를 암호화하는 방법을 결정합니다. 데이터에 대한 스레드 모델을 이해합니다.", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "중요한 정보를 처리하는 시스템은 격리해야 합니다. 이렇게 하려면 별도의 App Service 계획 또는 App Service Environment를 사용하고 다른 구독 또는 관리 그룹을 사용하는 것이 좋습니다.", + "guid": "6ad48408-ee72-4734-a475-ba18fdbf590c", + "link": "https://learn.microsoft.com/azure/app-service/overview-hosting-plans", + "service": "App Services", + "severity": "보통", + "text": "민감한 정보를 처리하는 시스템 격리", "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "App Service의 로컬 디스크는 암호화되지 않으며 중요한 데이터를 저장해서는 안 됩니다. (예: 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", "severity": "보통", - "text": "사용해야 하는 플랫폼 암호화를 결정합니다.", + "text": "로컬 디스크에 중요한 데이터를 저장하지 마십시오.", "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", - "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", - "service": "Azure Storage", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "인증된 웹 애플리케이션의 경우 Azure AD 또는 Azure AD B2C와 같이 잘 설정된 ID 공급자를 사용합니다. 선택한 애플리케이션 프레임워크를 활용하여 이 공급자와 통합하거나 App Service 인증/권한 부여 기능을 사용합니다.", + "guid": "919ca0b2-c121-459e-814b-933df574eccc", + "link": "https://learn.microsoft.com/azure/app-service/overview-authentication-authorization", + "service": "App Services", "severity": "보통", - "text": "사용해야 하는 클라이언트 쪽 암호화를 결정합니다.", + "text": "인증에 설정된 ID 공급자 사용", "waf": "안전" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Resource Graph Explorer(resources | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true)를 활용하여 익명 Blob 액세스를 허용하는 스토리지 계정을 찾습니다.", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "잘 관리되고 안전한 DevOps 배포 파이프라인과 같이 제어되고 신뢰할 수 있는 환경에서 App Service에 코드를 배포합니다. 이렇게 하면 버전이 제어되지 않고 악성 호스트에서 배포되는 것으로 확인되지 않은 코드를 방지할 수 있습니다.", + "guid": "3f9bcbd4-6826-46ab-aa26-4f9a19aed9c5", + "link": "https://learn.microsoft.com/azure/app-service/deploy-best-practices", + "service": "App Services", "severity": "높다", - "text": "공용 Blob 액세스가 필요한지 또는 특정 스토리지 계정에 대해 사용하지 않도록 설정할 수 있는지 여부를 고려합니다. ", + "text": "신뢰할 수 있는 환경에서 배포", "waf": "안전" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", - "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", - "service": "Spring Apps", - "severity": "보통", - "text": "Azure Spring Apps는 모든 앱에 대해 두 개의 배포를 허용하며, 그 중 하나만 프로덕션 트래픽을 수신합니다. 블루-그린 배포 전략을 통해 가동 중지 시간 제로를 달성할 수 있습니다. 파란색 녹색 배포는 표준 및 엔터프라이즈 계층에서만 사용할 수 있습니다. ADO/GitHub 작업과 함께 CI/CD를 사용하여 배포를 자동화할 수 있습니다.", - "waf": "신뢰도" - }, - { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "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", - "severity": "보통", - "text": "Azure Spring Apps 인스턴스는 애플리케이션에 대해 여러 지역에서 만들 수 있으며 Traffic Manager/Front Door에서 트래픽을 라우팅할 수 있습니다.", - "waf": "신뢰도" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "FTP/FTPS 및 WebDeploy/SCM 모두에 대한 기본 인증을 사용 안함으로 설정합니다. 이렇게 하면 이러한 서비스에 대한 액세스가 비활성화되고 배포에 Azure AD 보안 엔드포인트가 사용됩니다. SCM 사이트는 Azure AD 자격 증명을 사용하여 열 수도 있습니다.", + "guid": "5d04c2c3-919c-4a0b-8c12-159e114b933d", + "link": "https://learn.microsoft.com/azure/app-service/deploy-configure-credentials#disable-basic-authentication", + "service": "App Services", + "severity": "높다", + "text": "기본 인증 사용 안 함", + "waf": "안전" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", - "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", - "service": "Spring Apps", - "severity": "보통", - "text": "지원되는 지역에서 Azure Spring Apps는 영역 중복으로 배포할 수 있으며, 이는 인스턴스가 가용성 영역에 자동으로 분산됨을 의미합니다. 이 기능은 Standard 및 Enterprise 계층에서만 사용할 수 있습니다.", - "waf": "신뢰도" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "가능한 경우 관리 ID를 사용하여 Azure AD 보안 리소스에 연결합니다. 이렇게 할 수 없는 경우 Key Vault에 비밀을 저장하고 대신 관리 ID를 사용하여 Key Vault에 연결합니다.", + "guid": "f574eccc-d9bd-43ba-bcda-3b54eb2eb03d", + "link": "https://learn.microsoft.com/azure/app-service/overview-managed-identity?tabs=portal%2Chttp", + "service": "App Services", + "severity": "높다", + "text": "관리 ID를 사용하여 리소스에 연결", + "waf": "안전" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", - "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", - "service": "Spring Apps", - "severity": "보통", - "text": "앱에 1개 이상의 앱 인스턴스 사용", - "waf": "신뢰도" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Azure Container Registry에 저장된 이미지를 사용하는 경우 관리 ID를 사용하여 끌어옵니다.", + "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", + "severity": "높다", + "text": "관리 ID를 사용하여 컨테이너 끌어오기", + "waf": "안전" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "7504c230-6035-4183-95a5-85762acc6075", - "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", - "service": "Spring Apps", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "App Service의 진단 설정을 구성하면 모든 원격 분석을 로깅 및 모니터링의 중앙 대상으로 Log Analytics에 보낼 수 있습니다. 이를 통해 HTTP 로그, 애플리케이션 로그, 플랫폼 로그 등과 같은 App Service의 런타임 활동을 모니터링할 수 있습니다.", + "guid": "47768314-c115-4775-a2ea-55b46ad48408", + "link": "https://learn.microsoft.com/azure/app-service/troubleshoot-diagnostic-logs", + "service": "App Services", "severity": "보통", - "text": "로그, 메트릭 및 추적을 사용하여 Azure Spring Apps를 모니터링합니다. ASA를 Application Insights와 통합하고, 오류를 추적하고, 통합 문서를 만듭니다.", - "waf": "신뢰도" + "text": "Log Analytics에 App Service 런타임 로그 보내기Send App Service runtime logs to Log Analytics", + "waf": "안전" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", - "service": "Spring Apps", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "활동 로그를 Log Analytics에 로깅 및 모니터링의 중앙 대상으로 보내도록 진단 설정을 지정합니다. 이렇게 하면 App Service 리소스 자체에서 컨트롤 플레인 작업을 모니터링할 수 있습니다.", + "guid": "ee72734b-475b-4a18-bdbf-590ce65de8e0", + "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", + "service": "App Services", "severity": "보통", - "text": "Spring Cloud Gateway에서 자동 크기 조정 설정", - "waf": "신뢰도" + "text": "Log Analytics에 App Service 활동 로그 보내기Send App Service activity logs to Log Analytics", + "waf": "안전" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "97411607-b6fd-4335-99d1-9885faf4e392", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", - "service": "Spring Apps", - "severity": "낮다", - "text": "표준 소비 및 전용 플랜이 있는 앱에 대해 자동 크기 조정을 사용하도록 설정합니다.", - "waf": "신뢰도" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "지역 VNet 통합, 네트워크 보안 그룹 및 UDR의 조합을 사용하여 아웃바운드 네트워크 액세스를 제어합니다. 트래픽은 Azure Firewall과 같은 NVA로 라우팅되어야 합니다. 방화벽의 로그를 모니터링해야 합니다.", + "guid": "c12159e1-14b9-433d-b574-ecccd9bd3baf", + "link": "https://learn.microsoft.com/azure/app-service/overview-vnet-integration", + "service": "App Services", + "severity": "보통", + "text": "아웃바운드 네트워크 액세스를 제어해야 함", + "waf": "안전" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", - "link": "https://learn.microsoft.com/azure/spring-apps/overview", - "service": "Spring Apps", - "severity": "보통", - "text": "중요 업무용 앱에 대한 Spring Boot의 상업적 지원을 위해 Enterprise 플랜을 사용합니다. 다른 계층에서는 OSS 지원을 받을 수 있습니다.", - "waf": "신뢰도" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "VNet 통합을 사용하고 VNet NAT Gateway 또는 NVA와 같은 Azure Firewall을 사용하여 안정적인 아웃바운드 IP를 제공할 수 있습니다. 이렇게 하면 필요한 경우 수신 당사자가 IP를 기반으로 허용 목록을 만들 수 있습니다. Azure 서비스에 대한 통신의 경우 IP 주소에 의존할 필요가 없는 경우가 많으며 서비스 엔드포인트와 같은 메커니즘을 대신 사용해야 합니다. (또한 수신 끝에서 프라이빗 엔드포인트를 사용하면 SNAT가 발생하지 않고 안정적인 아웃바운드 IP 범위를 제공합니다.)", + "guid": "cda3b54e-b2eb-403d-b9a2-582718d2ddb1", + "link": "https://learn.microsoft.com/azure/app-service/networking/nat-gateway-integration", + "service": "App Services", + "severity": "낮다", + "text": "인터넷 주소에 대한 아웃바운드 통신을 위한 안정적인 IP 보장", + "waf": "안전" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "ab91932c-9fc9-4d1b-a881-37f5e6c0cb9e", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ADF_v1.docx", - "service": "Azure Data Factory", - "severity": "보통", - "text": "Azure Data Factory에 대한 FTA 복원력 플레이북 활용", - "waf": "신뢰도" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "App Service 액세스 제한, 서비스 엔드포인트 또는 프라이빗 엔드포인트의 조합을 사용하여 인바운드 네트워크 액세스를 제어합니다. 웹앱 자체 및 SCM 사이트에 대해 서로 다른 액세스 제한이 필요하고 구성될 수 있습니다.", + "guid": "0725769e-e669-41a4-a34a-c932223ece80", + "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", + "service": "App Services", + "severity": "높다", + "text": "인바운드 네트워크 액세스를 제어해야 합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "e503547c-d447-4e82-9138-a7200f1cac6d", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Application Gateway 또는 Azure Front Door와 같은 Web Application Firewall을 사용하여 악의적인 인바운드 트래픽으로부터 보호합니다. WAF의 로그를 모니터링해야 합니다.", + "guid": "b123071a-5416-4415-a33e-a3ad2c2de732", + "link": "https://learn.microsoft.com/azure/app-service/networking/app-gateway-with-service-endpoints", + "service": "App Services", "severity": "높다", - "text": "가용성 영역을 지원하는 지역에서 영역 중복 파이프라인 사용Use zone redundant pipelines in regions that support Availability Zones", - "waf": "신뢰도" + "text": "App Service 앞에서 WAF 사용Use a WAF in front of App Service", + "waf": "안전" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "9ef1d6e8-32e5-42e3-911c-818b1a0bc511", - "link": "https://learn.microsoft.com/azure/data-factory/source-control", - "service": "Azure Data Factory", - "severity": "보통", - "text": "DevOps를 사용하여 Github/Azure DevOps 통합으로 ARM 템플릿 백업 ", - "waf": "신뢰도" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "WAF에 대한 액세스만 잠궈 WAF를 우회할 수 없는지 확인합니다. 액세스 제한, 서비스 엔드포인트 및 프라이빗 엔드포인트의 조합을 사용합니다.", + "guid": "165c3acb-ef4a-4be1-b8d3-9fda47768314", + "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", + "service": "App Services", + "severity": "높다", + "text": "WAF가 우회되지 않도록 방지", + "waf": "안전" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "e43a18a9-cd29-49cf-b7b1-7db8255562f2", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "App Service 구성에서 최소 TLS 정책을 1.2로 설정합니다.", + "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", "severity": "보통", - "text": "다른 지역에서 자체 호스팅 통합 런타임 VM을 복제해야 합니다. ", - "waf": "신뢰도" + "text": "최소 TLS 정책을 1.2로 설정합니다.", + "waf": "안전" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "aee4563a-fd83-4393-98b2-62d6dc5f512a", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", - "severity": "보통", - "text": "자매 지역에서 네트워크를 복제하거나 복제해야 합니다. 다른 지역에서 Vnet의 복사본을 만들어야 합니다", - "waf": "신뢰도" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "HTTPS만 사용하도록 App Service를 구성합니다. 이로 인해 App Service가 HTTP에서 HTTPS로 리디렉션됩니다. 코드 또는 WAF에서 HSTS(HTTP Strict Transport Security)를 사용하여 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", + "severity": "높다", + "text": "HTTPS만 사용", + "waf": "안전" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "description": "ADF 파이프라인에서 Key Vault를 사용하는 경우 Key Vault를 복제하기 위해 아무 작업도 수행할 필요가 없습니다. Key Vault는 관리되는 서비스이며 Microsoft에서 처리합니다", - "guid": "25498f6d-bad3-47da-a43b-c6ce1d7aa9b2", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "Azure Data Factory", - "severity": "낮다", - "text": "Keyvault 통합을 사용하는 경우 Keyvault의 SLA를 사용하여 가용성을 파악합니다", - "waf": "신뢰도" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "CORS 구성에서 와일드카드를 사용하면 모든 원본이 서비스에 액세스할 수 있으므로 CORS의 목적에 어긋나므로 사용하지 마세요. 특히 서비스에 액세스할 수 있을 것으로 예상되는 원본만 허용합니다.", + "guid": "68266abc-a264-4f9a-89ae-d9c55d04c2c3", + "link": "https://learn.microsoft.com/azure/app-service/app-service-web-tutorial-rest-api", + "service": "App Services", + "severity": "높다", + "text": "와일드카드는 CORS에 사용할 수 없습니다.", + "waf": "안전" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "보통", - "text": "Azure Front Door에서 고객 관리형 TLS 인증서를 사용하는 경우 '최신' 인증서 버전을 사용합니다. 수동 인증서 갱신으로 인한 중단 위험 감소", - "waf": "작업" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "원격 디버깅은 서비스에서 추가 포트를 열어 공격 노출 영역을 증가시키므로 프로덕션에서 켜면 안 됩니다. 서비스는 48시간 후에 자동으로 원격 디버깅을 설정합니다.", + "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", + "severity": "높다", + "text": "원격 디버깅 끄기", + "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "App Service용 Defender를 사용하도록 설정합니다. 이는 다른 위협 중에서도 알려진 악성 IP 주소에 대한 통신을 탐지합니다. 작업의 일부로 App Service용 Defender의 권장 사항을 검토합니다.", + "guid": "18d2ddb1-0725-4769-be66-91a4834ac932", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-app-service-introduction", + "service": "App Services", "severity": "보통", - "text": "Application Gateway v2 SKU를 사용하고 있는지 확인합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "text": "클라우드용 Defender 사용 - App Service용 Defender", "waf": "안전" }, { - "arm-service": "Microsoft.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Azure는 네트워크에서 DDoS 기본 보호를 제공하며, 정상적인 트래픽 패턴을 학습하고 비정상적인 동작을 감지할 수 있는 지능형 DDoS 표준 기능으로 개선할 수 있습니다. DDoS 표준은 Virtual Network에 적용되므로 Application Gateway 또는 NVA와 같은 앱 앞의 네트워크 리소스에 대해 구성해야 합니다.", + "guid": "223ece80-b123-4071-a541-6415833ea3ad", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "App Services", "severity": "보통", - "text": "Azure Load Balancer에 표준 SKU를 사용하고 있는지 확인합니다.", + "text": "WAF VNet에서 DDOS 보호 표준 사용Enable DDOS Protection Standard on the WAF VNet", "waf": "안전" }, { - "arm-service": "Microsoft.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "guid": "9432621a-8397-4654-a882-5bc856b7ef83", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", - "service": "Load Balancer", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Azure Container Registry에 저장된 이미지를 사용하는 경우 프라이빗 엔드포인트 및 앱 설정 'WEBSITE_PULL_IMAGE_OVER_VNET'를 사용하여 Azure Container Registry에서 가상 네트워크를 통해 끌어옵니다.", + "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", "severity": "보통", - "text": "Load Balancer 프런트 엔드 IP 주소가 영역 중복인지 확인합니다(영역 프런트 엔드가 필요하지 않은 경우).", + "text": "Virtual Network를 통해 컨테이너 끌어오기", "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "참여의 침투 테스트 규칙에 따라 웹 응용 프로그램에 대한 침투 테스트를 수행합니다.", + "guid": "eb2eb03d-d9a2-4582-918d-2ddb10725769", + "link": "https://learn.microsoft.com/azure/security/fundamentals/pen-testing", + "service": "App Services", "severity": "보통", - "text": "Application Gateway v2는 IP 접두사가 /24보다 크거나 같은 서브넷에 배포해야 합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "text": "침투 테스트 수행", "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "description": "일반적으로 역방향 프록시 및 특히 WAF의 관리는 네트워킹보다 애플리케이션에 더 가깝기 때문에 앱과 동일한 구독에 속합니다. 연결 구독에서 Application Gateway 및 WAF를 중앙 집중화하는 것은 단일 팀에서 관리하는 경우 괜찮을 수 있습니다.", - "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "App Gateway", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "DevSecOps 사례에 따라 취약성을 검증하고 검사한 신뢰할 수 있는 코드를 배포합니다.", + "guid": "19aed9c5-5d04-4c2c-9919-ca0b2c12159e", + "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/devsecops-in-azure", + "service": "App Services", "severity": "보통", - "text": "랜딩 영역 가상 네트워크 내에서 그리고 보안 중인 앱을 사용하여 인바운드 HTTP(S) 연결을 프록시하는 데 사용되는 Azure Application Gateway v2 또는 파트너 NVA를 배포합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "text": "유효성이 검사된 코드 배포", "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "App Gateway", - "severity": "보통", - "text": "애플리케이션 랜딩 존의 모든 공용 IP 주소에 대해 DDoS 네트워크 또는 IP 보호 계획을 사용합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "지원되는 플랫폼, 프로그래밍 언어, 프로토콜 및 프레임워크의 최신 버전을 사용합니다.", + "guid": "114b933d-f574-4ecc-ad9b-d3bafcda3b54", + "link": "https://learn.microsoft.com/azure/app-service/overview-patch-os-runtime", + "service": "App Services", + "severity": "높다", + "text": "최신 플랫폼, 언어, 프로토콜 및 프레임워크 사용", "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "보통", - "text": "최소 인스턴스 수를 2개로 자동 크기 조정을 구성합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "신뢰도" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "높다", + "text": "공명형 AI를 위한 Metaprompting 가드레일 따르기", + "waf": "운영 우수성" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "보통", - "text": "가용성 영역에 Application Gateway 배포", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "신뢰도" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", + "link": "https://github.com/Azure-Samples/AI-Gateway", + "service": "Azure OpenAI", + "severity": "높다", + "text": "더 나은 속도 제한, 부하 분산, 인증 및 로깅을 위해 APIM 또는 AI Central과 같은 솔루션을 사용하여 게이트웨이 패턴을 고려합니다.", + "waf": "운영 우수성" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "Front Door", - "severity": "보통", - "text": "WAF 정책과 함께 Azure Front Door를 사용하여 여러 Azure 지역에 걸쳐 있는 글로벌 HTTP/S 앱을 제공하고 보호할 수 있습니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "안전" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "높다", + "text": "AOAI 인스턴스에 대한 모니터링 활성화", + "waf": "운영 우수성" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "3f29812b-2363-4cef-b179-b599de0d5973", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "Front Door", - "severity": "보통", - "text": "Front Door 및 Application Gateway를 사용하여 HTTP/S 앱을 보호하는 경우 Front Door에서 WAF 정책을 사용합니다. Front Door에서만 트래픽을 수신하도록 Application Gateway를 잠급니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "안전" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "697cb391-ed16-4b2d-886f-0a0241addde6", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", + "service": "Azure OpenAI", + "severity": "높다", + "text": "리소스에 대해 수행된 작업(예: 구독 키 다시 생성) 또는 메트릭 임계값(예: 한 시간에 10을 초과하는 오류 수)에 의해 생성된 활동 로그의 항목과 같은 이벤트를 팀에 알리는 경고를 만듭니다", + "waf": "운영 우수성" }, { - "ammp": true, - "arm-service": "microsoft.network/trafficManagerProfiles", - "checklist": "Azure Application Delivery Networking", - "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "Traffic Manager", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "Azure OpenAI", "severity": "높다", - "text": "Traffic Manager를 사용하여 HTTP/S 이외의 프로토콜에 걸쳐 있는 글로벌 앱을 제공합니다.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "신뢰도" + "text": "용량으로 인한 서비스 중단을 방지하기 위해 토큰 사용량을 모니터링합니다.", + "waf": "운영 우수성" }, { - "checklist": "Azure Application Delivery Networking", - "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "Entra", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", + "service": "Azure OpenAI", + "severity": "보통", + "text": "처리된 추론 토큰, 생성된 완료 토큰, 속도 제한 모니터링과 같은 메트릭 관찰", + "waf": "운영 우수성" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "낮다", - "text": "사용자가 내부 애플리케이션에만 액세스해야 하는 경우 Microsoft Entra ID 애플리케이션 프록시가 AVD(Azure Virtual Desktop)의 대안으로 고려되었나요?", - "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", - "waf": "안전" + "text": "진단이 충분하지 않은 경우 Azure OpenAI 앞에 있는 Azure API Managements와 같은 게이트웨이를 사용하여 허용되는 경우 들어오는 프롬프트와 나가는 응답을 모두 기록하는 것이 좋습니다", + "waf": "운영 우수성" }, { - "checklist": "Azure Application Delivery Networking", - "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "Entra", - "severity": "보통", - "text": "네트워크에서 들어오는 연결에 대해 열려 있는 방화벽 포트 수를 줄이려면 Microsoft Entra ID 애플리케이션 프록시를 사용하여 원격 사용자에게 내부 애플리케이션에 대한 안전하고 인증된 액세스를 제공하는 것이 좋습니다.", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", - "waf": "안전" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", + "link": "https://github.com/Azure-Samples/openai-enterprise-iac", + "service": "Azure OpenAI", + "severity": "높다", + "text": "Infrastructure as code를 사용하여 Azure OpenAI Service, 모델 배포 및 모든 관련 리소스를 배포합니다", + "waf": "운영 우수성" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "4350d092-d234-4292-a752-8537a551c5bf", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", + "service": "Azure OpenAI", "severity": "높다", - "text": "'방지' 모드에서 Front Door에 대한 WAF 정책을 배포합니다.", + "text": "API 키 대신 관리 ID로 Microsoft Entra 인증 사용", "waf": "안전" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "높다", - "text": "Azure Traffic Manager와 Azure Front Door를 결합하지 마세요.", - "waf": "안전" + "text": "입력과 정답이 있는 알려진 골든 데이터 세트를 사용하여 시스템의 성능/정확도를 평가합니다. 평가를 위해 PromptFlow의 기능을 활용합니다.", + "waf": "운영 우수성" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "높다", - "text": "Azure Front Door 및 원본에서 동일한 도메인 이름을 사용합니다. 호스트 이름이 일치하지 않으면 미묘한 버그가 발생할 수 있습니다.", - "waf": "안전" + "text": "프로비저닝된 처리량 모델의 사용 평가 ", + "waf": "공연" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", + "service": "Azure OpenAI", + "severity": "높다", + "text": "Azure AI 콘텐츠 안전성 검토 및 구현", + "waf": "운영 우수성" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1193846d-697c-4b39-8ed1-6b2d186f0a02", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#system-level-throughput", + "service": "Azure OpenAI", + "severity": "높다", + "text": "분당 토큰 및 응답을 기반으로 시스템의 처리량을 정의 및 평가하고 요구 사항에 맞춥니다.", + "waf": "공연" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", + "service": "Azure OpenAI", + "severity": "보통", + "text": "토큰 크기, 스트리밍 옵션을 제한하여 시스템의 대기 시간을 개선합니다.", + "waf": "공연" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "service": "Azure OpenAI", + "severity": "보통", + "text": "탄력성 요구를 예측하여 우선 순위에 따라 동기 및 일괄 처리 요청 분리를 결정합니다. 우선 순위가 높은 경우 동기 접근 방식을 사용하고 낮은 우선 순위의 경우 큐를 사용한 비동기 일괄 처리가 선호됩니다", + "waf": "공연" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "5bda4332-4f24-4811-9331-82ba51752694", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "Azure OpenAI", + "severity": "높다", + "text": "소비자의 예상 수요를 기반으로 토큰 사용 요구 사항을 벤치마킹합니다. 프로비저닝된 처리량 단위 배포를 사용하는 경우 처리량의 유효성을 검사하는 데 도움이 되도록 Azure OpenAI 벤치마킹 도구를 사용하는 것이 좋습니다", + "waf": "공연" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "보통", + "text": "PTU(프로비저닝된 처리량 단위)를 사용하는 경우 오버플로 요청에 대한 TPM(분당 토큰) 배포를 배포하는 것이 좋습니다. 게이트웨이를 사용하여 PTU 제한에 도달할 때 TPM 배포로 요청을 라우팅합니다.", + "waf": "공연" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "낮다", - "text": "Azure Front Door 원본 그룹에 원본이 하나만 있는 경우 상태 프로브를 사용하지 않도록 설정합니다.", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", + "service": "Azure OpenAI", + "severity": "높다", + "text": "올바른 작업에 적합한 모델을 선택하십시오. 속도, 응답 품질 및 출력 복잡성 간에 적절한 절충점이 있는 모델 선택", "waf": "공연" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "Front Door", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e9951904-8384-45c9-a6cb-2912156a1147", + "link": "https://github.com/Azure/azure-openai-benchmark/", + "service": "Azure OpenAI", "severity": "보통", - "text": "Azure Front Door에 대한 양호한 상태 프로브 엔드포인트를 선택합니다. 애플리케이션의 모든 종속성을 확인하는 상태 엔드포인트를 빌드하는 것이 좋습니다.", - "waf": "신뢰도" + "text": "미세 조정으로 모델 성능이 향상되었는지 여부를 파악하기 위해 미세 조정 없이 성능에 대한 기준이 있습니다.", + "waf": "공연" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "낮다", - "text": "Azure Front Door와 함께 HEAD 상태 프로브를 사용하여 Front Door가 애플리케이션으로 보내는 트래픽을 줄입니다.", - "waf": "공연" + "text": "여러 지역에 여러 OAI 인스턴스 배포", + "waf": "신뢰도" }, { - "ammp": true, - "arm-service": "Microsoft.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "높다", - "text": "SNAT 확장성 향상을 위해 Load Balancer 아웃바운드 규칙 대신 Azure NAT Gateway 사용", + "text": "APIM과 같은 게이트웨이 패턴을 사용하여 재시도 및 상태 확인 구현Implement retry & healthchecks with gateway pattern like APIM", "waf": "신뢰도" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "높다", - "text": "Azure Front Door에서 관리형 TLS 인증서를 사용합니다. 운영 비용을 줄이고 인증서 갱신으로 인한 중단 위험을 줄입니다.", - "waf": "작업" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "보통", + "text": "워크로드에 대한 TPM 및 RPM의 적절한 할당량이 있는지 확인합니다.", + "waf": "신뢰도" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", + "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", + "service": "Azure OpenAI", "severity": "보통", - "text": "Azure Front Door WAF 구성을 코드로 정의합니다. 코드를 사용하면 새 규칙 집합 버전을 보다 쉽게 채택하고 추가 보호를 얻을 수 있습니다.", - "waf": "작업" + "text": "HAI 도구 키트 지침의 고려 사항을 검토하고 slution에 대한 이러한 상호 작용 방법을 적용합니다", + "waf": "운영 우수성" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", - "service": "Front Door", - "severity": "높다", - "text": "Azure Front Door에서 엔드투엔드 TLS를 사용합니다. 클라이언트에서 Front Door로, Front Door에서 원본으로 연결하는 데 TLS를 사용합니다.", - "waf": "안전" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7f154e3a-a369-4282-ae7e-316183687a04", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", + "service": "Azure OpenAI", + "severity": "보통", + "text": "미세 조정이 사용되는 경우 지역 간에 별도의 미세 조정된 모델을 배포합니다.", + "waf": "신뢰도" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", - "service": "Front Door", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "77a1f893-5bda-4433-84f2-4811633182ba", + "link": "https://learn.microsoft.com/azure/backup/backup-overview", + "service": "Azure OpenAI", "severity": "보통", - "text": "Azure Front Door에서 HTTP에서 HTTPS로 리디렉션을 사용합니다. 이전 클라이언트를 HTTPS 요청으로 자동 리디렉션하여 지원합니다.", - "waf": "안전" + "text": "중요한 데이터를 정기적으로 백업 및 복제하여 데이터 손실 또는 시스템 장애 발생 시 데이터 가용성과 복구 가능성을 보장합니다. Azure의 백업 및 재해 복구 서비스를 활용하여 데이터를 보호하세요.", + "waf": "신뢰도" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", - "service": "Front Door", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "높다", - "text": "Azure Front Door WAF를 사용하도록 설정합니다. 다양한 공격으로부터 애플리케이션을 보호합니다.", - "waf": "안전" + "text": "SLA를 갖도록 Azure AI 검색 서비스 계층을 선택해야 합니다. ", + "waf": "신뢰도" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "높다", - "text": "워크로드에 맞게 Azure Front Door WAF를 튜닝합니다. 가양성 탐지를 줄입니다.", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", + "link": "https://learn.microsoft.com/purview/purview", + "service": "Azure OpenAI", + "severity": "낮다", + "text": "임베딩을 생성하기 전에 데이터 및 민감도를 분류하고 Microsoft Purview를 사용하여 레이블을 지정하고 생성된 임베딩을 동일한 민감도 및 분류로 처리해야 합니다", "waf": "안전" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "4fda1dbf-3dd9-45d4-ac7c-891dca1f6d56", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/use-your-data-securely", + "service": "Azure OpenAI", "severity": "높다", - "text": "Azure Front Door WAF 정책에서 요청 본문 검사 기능을 사용하도록 설정합니다.", + "text": "BYOK(옵션)를 사용한 SSE/디스크 암호화로 RAG에 사용되는 데이터 암호화", "waf": "안전" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", + "link": "https://learn.microsoft.com/azure/search/search-security-overview", + "service": "Azure OpenAI", "severity": "높다", - "text": "Azure Front Door WAF 기본 규칙 집합을 사용하도록 설정합니다. 기본 규칙 집합은 일반적인 공격을 탐지하고 차단합니다.", + "text": "데이터 소스 간 전송 중인 데이터, RAG(Retrieval-Augmented Generation) 및 LLM 통신에 사용되는 AI 검색에 TLS가 적용되는지 확인합니다.", "waf": "안전" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7b94ef6e-047d-42ea-8992-b1cd6e2054b2", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", + "service": "Azure OpenAI", "severity": "높다", - "text": "Azure Front Door WAF 봇 보호 규칙 집합을 사용하도록 설정합니다. 봇 규칙은 좋은 봇과 나쁜 봇을 감지합니다.", - "waf": "안전" - }, - { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "보통", - "text": "최신 Azure Front Door WAF 규칙 집합 버전을 사용합니다. 규칙 집합 업데이트는 현재 위협 환경을 고려하기 위해 정기적으로 업데이트됩니다.", - "waf": "안전" - }, - { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "보통", - "text": "Azure Front Door WAF에 속도 제한을 추가합니다. 속도 제한은 클라이언트가 실수로 또는 의도적으로 짧은 시간에 많은 양의 트래픽을 보내는 것을 차단합니다.", + "text": "RBAC를 사용하여 Azure OpenAI 서비스에 대한 액세스를 관리합니다. 사용자에게 적절한 권한을 할당하고 사용자의 역할과 책임에 따라 액세스를 제한합니다.", "waf": "안전" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", + "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", + "service": "Azure OpenAI", "severity": "보통", - "text": "Azure Front Door WAF 속도 제한에 높은 임계값을 사용합니다. 높은 속도 제한 임계값은 합법적인 트래픽 차단을 방지하는 동시에 인프라를 압도할 수 있는 매우 많은 수의 요청에 대한 보호 기능을 제공합니다. ", + "text": "데이터 암호화, 마스킹 또는 수정 기술을 구현하여 비프로덕션 환경에서 또는 테스트 또는 문제 해결을 위해 데이터를 공유할 때 민감한 데이터를 숨기거나 난독화된 값으로 대체합니다.", "waf": "안전" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "낮다", - "text": "모든 지역에서 트래픽이 발생하지 않을 것으로 예상되는 경우 지역 필터를 사용하여 예상하지 못한 국가의 트래픽을 차단합니다.", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", + "service": "Azure OpenAI", + "severity": "높다", + "text": "Azure Defender를 활용하여 보안 위협을 탐지 및 대응하고 의심스러운 활동 또는 위반을 식별하기 위한 모니터링 및 경고 메커니즘을 설정합니다. 고급 위협 탐지 및 대응을 위해 Azure Sentinel 활용", "waf": "안전" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "보통", - "text": "Azure Front Door WAF를 사용하여 트래픽을 지리적으로 필터링할 때 알 수 없는(ZZ) 위치를 지정합니다. IP 주소를 지리적으로 일치시킬 수 없는 경우 합법적인 요청을 실수로 차단하지 않도록 합니다.", + "text": "규정 준수 규정을 준수하기 위해 데이터 보존 및 폐기 정책을 수립합니다. 더 이상 필요하지 않은 데이터에 대한 안전한 삭제 방법을 구현하고 데이터 보존 및 폐기 활동에 대한 감사 추적을 유지 관리합니다.", "waf": "안전" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", + "service": "Azure OpenAI", "severity": "높다", - "text": "Azure Application Gateway WAF 봇 보호 규칙 집합 사용Enable the Azure Application Gateway WAF bot protection rule set 봇 규칙은 좋은 봇과 나쁜 봇을 검색합니다.", - "waf": "안전" + "text": "Content Safety를 사용하여 Prompt shields 및 groundedness detection 구현 ", + "waf": "운영 우수성" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", + "link": "https://learn.microsoft.com/azure/compliance/", + "service": "Azure OpenAI", "severity": "높다", - "text": "Azure Application Gateway WAF 정책에서 요청 본문 검사 기능을 사용하도록 설정합니다.", + "text": "개인 정보 보호 제어를 구현하고 데이터 처리 활동에 필요한 동의 또는 권한을 얻어 GDPR 또는 HIPAA와 같은 관련 데이터 보호 규정을 준수하도록 합니다.", "waf": "안전" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", - "service": "App Gateway", - "severity": "높다", - "text": "워크로드에 대한 Azure Application Gateway WAF를 조정합니다. 가양성 탐지를 줄입니다.", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", + "service": "Azure OpenAI", + "severity": "보통", + "text": "데이터 보안 모범 사례, 데이터 안전한 처리의 중요성, 데이터 침해와 관련된 잠재적 위험에 대해 직원을 교육합니다. 데이터 보안 프로토콜을 성실히 따르도록 권장합니다.", "waf": "안전" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", + "service": "Azure OpenAI", "severity": "높다", - "text": "'방지' 모드에서 Application Gateway에 대한 WAF 정책을 배포합니다.", + "text": "생산 데이터를 개발 및 테스트 데이터와 분리합니다. 프로덕션에서는 실제 민감한 데이터만 사용하고 개발 및 테스트 환경에서는 익명 또는 합성 데이터를 활용합니다.", "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", - "service": "App Gateway", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", + "service": "Azure OpenAI", "severity": "보통", - "text": "Azure Application Gateway WAF에 속도 제한을 추가합니다. 속도 제한은 클라이언트가 실수로 또는 의도적으로 짧은 시간에 많은 양의 트래픽을 보내는 것을 차단합니다.", + "text": "데이터 민감도 수준이 다양하다면 각 수준에 대해 별도의 인덱스를 만드는 것이 좋습니다. 예를 들어, 일반 데이터에 대한 인덱스와 민감한 데이터에 대한 인덱스가 있을 수 있으며, 각각 다른 액세스 프로토콜에 의해 제어됩니다", "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", + "service": "Azure OpenAI", "severity": "보통", - "text": "Azure Application Gateway WAF 속도 제한에 높은 임계값을 사용합니다. 높은 속도 제한 임계값은 합법적인 트래픽 차단을 방지하는 동시에 인프라를 압도할 수 있는 매우 많은 수의 요청에 대한 보호 기능을 제공합니다. ", + "text": "한 단계 더 나아가 중요한 데이터 세트를 서비스의 다른 인스턴스에 배치합니다. 각 인스턴스는 고유한 특정 RBAC 정책 집합으로 제어할 수 있습니다", "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "낮다", - "text": "모든 지역에서 트래픽이 발생하지 않을 것으로 예상되는 경우 지역 필터를 사용하여 예상하지 못한 국가의 트래픽을 차단합니다.", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", + "service": "Azure OpenAI", + "severity": "높다", + "text": "민감한 정보에서 생성된 임베딩과 벡터는 그 자체로 민감하다는 점을 인식해야 합니다. 이 데이터에는 원본 자료와 동일한 보호 조치가 제공되어야 합니다", "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", - "service": "App Gateway", - "severity": "보통", - "text": "Azure Application Gateway WAF를 사용하여 트래픽을 지리적으로 필터링할 때 알 수 없는(ZZ) 위치를 지정합니다. IP 주소를 지리적으로 일치시킬 수 없는 경우 합법적인 요청을 실수로 차단하지 않도록 합니다.", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3571449a-b805-43d8-af89-dc7b33be2a1a", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", + "service": "Azure OpenAI", + "severity": "높다", + "text": "임베딩 및 벡터가 있는 데이터 저장소에 RBAC를 적용하고 역할의 액세스 요구 사항에 따라 액세스 범위를 지정합니다.", "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "보통", - "text": "최신 Azure Application Gateway WAF 규칙 집합 버전을 사용합니다. 규칙 집합 업데이트는 현재 위협 환경을 고려하기 위해 정기적으로 업데이트됩니다.", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "높다", + "text": "AI 서비스에 대한 프라이빗 엔드포인트를 구성하여 네트워크 내 서비스 액세스를 제한합니다.", "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "보통", - "text": "진단 설정을 추가하여 Azure Application Gateway WAF 로그를 저장합니다.", - "waf": "작업" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", + "service": "Azure OpenAI", + "severity": "높다", + "text": "Azure Firewall 및 UDR을 사용하여 엄격한 인바운드 및 아웃바운드 트래픽 제어를 적용하고 외부 통합 지점을 제한합니다.", + "waf": "안전" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "보통", - "text": "진단 설정을 추가하여 Azure Front Door WAF 로그를 저장합니다.", - "waf": "작업" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", + "service": "Azure OpenAI", + "severity": "높다", + "text": "네트워크 세분화 및 액세스 제어를 구현하여 LLM 애플리케이션에 대한 액세스를 인증된 사용자 및 시스템으로만 제한하고 측면 이동을 방지합니다.", + "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", + "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", + "service": "Azure OpenAI", "severity": "보통", - "text": "Azure Application Gateway WAF 로그를 Microsoft Sentinel로 보냅니다.", - "waf": "작업" + "text": "LLMLingua 또는 gprtrim과 같은 프롬프트 압축 도구 사용", + "waf": "비용 최적화" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "보통", - "text": "Azure Front Door WAF 로그를 Microsoft Sentinel로 보냅니다.", - "waf": "작업" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", + "service": "Azure OpenAI", + "severity": "높다", + "text": "LLM 애플리케이션에서 사용하는 API 및 엔드포인트가 관리 ID, API 키 또는 OAuth와 같은 인증 및 권한 부여 메커니즘으로 적절하게 보호되어 무단 액세스를 방지해야 합니다.", + "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "보통", - "text": "Azure Application Gateway WAF 구성을 코드로 정의합니다. 코드를 사용하면 새 규칙 집합 버전을 보다 쉽게 채택하고 추가 보호를 얻을 수 있습니다.", - "waf": "작업" + "text": "다단계 인증(multi-factor authentication)과 같은 강력한 최종 사용자 인증 메커니즘을 적용하여 LLM 애플리케이션 및 관련 네트워크 리소스에 대한 무단 액세스를 방지합니다.", + "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", - "service": "App Gateway", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "93555620-2bfe-4456-9b0d-834a348b263e", + "service": "Azure OpenAI", "severity": "보통", - "text": "레거시 WAF 구성 대신 WAF 정책을 사용합니다.", - "waf": "작업" + "text": "네트워크 모니터링 도구를 구현하여 의심스럽거나 악의적인 활동에 대한 네트워크 트래픽을 탐지하고 분석합니다. 로깅을 활성화하여 네트워크 이벤트를 캡처하고 보안 사고 발생 시 포렌식 분석을 용이하게 합니다.", + "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", - "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", - "service": "App Gateway", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", + "service": "Azure OpenAI", "severity": "보통", - "text": "Application Gateway 서브넷의 연결(예: NSG 사용)만 허용하도록 백 엔드에서 인바운드 트래픽을 필터링합니다.", + "text": "보안 감사 및 침투 테스트를 수행하여 LLM 애플리케이션의 네트워크 인프라에서 네트워크 보안 약점 또는 취약성을 식별하고 해결합니다.", "waf": "안전" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", - "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", - "service": "Front Door", - "severity": "보통", - "text": "원본이 Azure Front Door 인스턴스의 트래픽만 가져와야 합니다.", - "waf": "안전" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", + "service": "Azure OpenAI", + "severity": "낮다", + "text": "Azure AI 서비스는 더 나은 관리를 위해 적절하게 태그가 지정됩니다.", + "waf": "운영 우수성" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", - "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", - "service": "App Gateway", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", + "service": "Azure OpenAI", + "severity": "낮다", + "text": "Azure AI Service 계정은 조직의 명명 규칙을 따릅니다.", + "waf": "운영 우수성" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", + "service": "Azure OpenAI", + "severity": "높다", + "text": "Azure AI Services 리소스의 진단 로그를 사용하도록 설정해야 함", + "waf": "운영 우수성" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "link": "https://learn.microsoft.com/azure/ai-services/authentication", + "service": "Azure OpenAI", "severity": "높다", - "text": "백 엔드 서버에 대한 트래픽을 암호화해야 합니다.", + "text": "키 액세스(로컬 인증)는 보안을 위해 사용하지 않도록 설정하는 것이 좋습니다. 키 기반 액세스를 사용하지 않도록 설정하면 Microsoft Entra ID가 유일한 액세스 방법이 되어 최소 권한 원칙과 세분화된 제어를 유지할 수 있습니다. ", "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", - "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", - "service": "App Gateway", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", "severity": "높다", - "text": "웹 응용 프로그램 방화벽을 사용해야 합니다.", + "text": "Azure Key Vault를 사용하여 키를 안전하게 저장하고 관리하세요. LLM 애플리케이션의 코드 내에 중요한 키를 하드 코딩하거나 포함하지 않도록 하고 관리 ID를 사용하여 Azure Key Vault에서 안전하게 검색합니다.", "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", - "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", - "service": "App Gateway", - "severity": "보통", - "text": "HTTP를 HTTPS로 리디렉션", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", + "severity": "높다", + "text": "Azure Key Vault에 저장된 키를 정기적으로 회전하고 만료하여 무단 액세스의 위험을 최소화합니다.", "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "보통", - "text": "게이트웨이 관리 쿠키를 사용하여 처리를 위해 사용자 세션에서 동일한 서버로 트래픽을 전달합니다.", - "waf": "작업" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "adfe27be-e297-401a-a352-baaab79b088d", + "link": "https://github.com/openai/tiktoken", + "service": "Azure OpenAI", + "severity": "높다", + "text": "tiktoken을 사용하여 대화 모드에서 토큰 최적화를 위한 토큰 크기 이해", + "waf": "비용 최적화" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", - "service": "App Gateway", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", + "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", + "service": "Azure OpenAI", "severity": "높다", - "text": "계획된 서비스 업데이트 중에 연결 드레이닝을 사용하도록 설정하여 백 엔드 풀의 기존 멤버에 대한 연결 손실을 방지합니다.", + "text": "보안 코딩 관행에 따라 주입 공격, XSS(교차 사이트 스크립팅) 또는 보안 구성 오류와 같은 일반적인 취약성을 방지합니다", "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", - "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", - "service": "App Gateway", - "severity": "낮다", - "text": "사용자 지정 오류 페이지를 만들어 개인화된 사용자 환경 표시", - "waf": "작업" - }, - { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", - "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", - "service": "App Gateway", - "severity": "보통", - "text": "HTTP 요청 및 응답 헤더를 편집하여 클라이언트와 서버 간의 라우팅 및 정보 교환을 보다 쉽게 할 수 있습니다.", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "높다", + "text": "LLM 라이브러리와 다른 시스템 컴포넌트를 정기적으로 업데이트하고 패치하는 프로세스를 설정합니다.", "waf": "안전" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "App Gateway", - "severity": "보통", - "text": "빠른 글로벌 장애 조치(failover)를 통해 글로벌 웹 트래픽 라우팅 및 최상위 계층 최종 사용자 성능 및 안정성을 최적화하도록 Front Door 구성", - "waf": "공연" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e29711b1-352b-4eee-879b-588defc4972c", + "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", + "service": "Azure OpenAI", + "severity": "높다", + "text": "Azure OpenAI 또는 기타 LLM 사용 약관, 정책 및 지침, 허용되는 사용 사례 준수", + "waf": "운영 우수성" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "29dcc19f-a8fa-4c35-8281-290577538793", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "App Gateway", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "보통", - "text": "전송 계층 부하 분산 사용Use transport layer load balancing", - "waf": "공연" + "text": "기본 모델과 미세 조정된 모델 및 토큰 단계 크기의 비용 차이를 이해합니다.", + "waf": "비용 최적화" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", - "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", - "service": "App Gateway", - "severity": "보통", - "text": "단일 게이트웨이에서 여러 웹 응용 프로그램에 대한 호스트 또는 도메인 이름을 기반으로 라우팅 구성Configure routing based on host or domain name for multiple web applications on a single gateway", - "waf": "안전" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "service": "Azure OpenAI", + "severity": "높다", + "text": "가능한 경우 호출당 오버헤드를 최소화하여 전체 비용을 줄일 수 있는 일괄 처리 요청. 배치 크기를 최적화해야 합니다.", + "waf": "비용 최적화" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", - "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", - "service": "App Gateway", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", + "service": "Azure OpenAI", "severity": "보통", - "text": "SSL 인증서 관리를 중앙 집중화하여 백엔드 서버 팜의 암호화 및 암호 해독 오버헤드를 줄입니다.", - "waf": "안전" - }, - { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", - "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", - "service": "App Gateway", - "severity": "낮다", - "text": "WebSocket 및 HTTP/2 프로토콜에 대한 기본 지원을 위해 Application Gateway 사용", - "waf": "안전" + "text": "모델 사용을 모니터링하는 비용 추적 시스템을 설정하고 해당 정보를 사용하여 모델 선택 및 프롬프트 크기를 알립니다", + "waf": "비용 최적화" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Azure Event Hub는 미사용 데이터의 암호화를 제공합니다. 사용자 고유의 키를 사용하는 경우 데이터는 여전히 Microsoft 관리형 키를 사용하여 암호화되지만 Microsoft 관리형 키는 고객 관리형 키를 사용하여 암호화됩니다. ", - "guid": "7aaf12e7-b94e-4f6e-847d-2d92981b1cd6", - "link": "https://learn.microsoft.com/azure/event-hubs/configure-customer-managed-key", - "service": "Event Hubs", - "severity": "낮다", - "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": "안전" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "보통", + "text": "모델 응답당 토큰 수에 대한 최대 제한을 설정합니다. 유효한 응답에 사용할 수 있을 만큼 충분히 큰지 확인하기 위해 크기를 최적화합니다", + "waf": "비용 최적화" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Azure Event Hubs 네임스페이스를 사용하면 클라이언트가 TLS 1.0 이상을 사용하여 데이터를 보내고 받을 수 있습니다. 더 엄격한 보안 조치를 적용하기 위해 클라이언트가 최신 버전의 TLS를 사용하여 데이터를 보내고 받도록 Event Hubs 네임스페이스를 구성할 수 있습니다. Event Hubs 네임스페이스에 최소 버전의 TLS가 필요한 경우 이전 버전으로 수행된 모든 요청이 실패합니다. ", - "guid": "d2f54b29-769e-43a6-a0e7-828ac936657e", - "link": "https://learn.microsoft.com/azure/event-hubs/transport-layer-security-configure-minimum-version", - "service": "Event Hubs", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", + "link": "https://learn.microsoft.com/azure/search/search-reliability", + "service": "Azure OpenAI", "severity": "보통", - "text": "요청에 필요한 최소 버전의 TLS(전송 계층 보안) 적용 ", - "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", - "waf": "안전" + "text": "안정성을 위한 AI 검색 설정에 대해 제공된 지침을 검토합니다.", + "waf": "운영 우수성" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Event Hubs 네임스페이스를 만들 때 네임스페이스에 대해 RootManageSharedAccessKey라는 정책 규칙이 자동으로 만들어집니다. 이 정책에는 전체 네임스페이스에 대한 관리 권한이 있습니다. 이 규칙을 관리 루트 계정처럼 취급하고 응용 프로그램에서 사용하지 않는 것이 좋습니다. RBAC에서 AAD를 인증 공급자로 사용하는 것이 좋습니다. ", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3266b225-86f4-4a16-92bd-ddea8a487cde", + "link": "https://learn.microsoft.com/azure/search/vector-search-index-size?tabs=portal-vector-quota", + "service": "Azure OpenAI", "severity": "보통", - "text": "필요하지 않은 경우 루트 계정을 사용하지 마십시오.", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", - "waf": "안전" + "text": "AI Search Vector 스토리지 계획 및 관리", + "waf": "운영 우수성" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Azure 리소스에 대한 관리 ID는 Azure VM(Virtual Machines), 함수 앱, Virtual Machine Scale Sets 및 기타 서비스에서 실행되는 애플리케이션에서 Azure AD 자격 증명을 사용하여 Event Hubs 리소스에 대한 액세스 권한을 부여할 수 있습니다. Azure AD 인증과 함께 Azure 리소스에 대한 관리 ID를 사용하면 클라우드에서 실행되는 애플리케이션에 자격 증명을 저장하지 않아도 됩니다. ", - "guid": "3a365a5c-7acb-4e48-abd5-4cd79f2e8776", - "link": "https://learn.microsoft.com/azure/event-hubs/authenticate-managed-identity?tabs=latest", - "service": "Event Hubs", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "보통", - "text": "가능한 경우 애플리케이션은 관리 ID를 사용하여 Azure Event Hub에 인증해야 합니다. 그렇지 않은 경우 Azure Key Vault 또는 동등한 서비스에 스토리지 자격 증명(SAS, 서비스 주체 자격 증명)을 사용하는 것이 좋습니다", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", - "waf": "안전" + "text": "LLMOps 사례를 적용하여 GenAI 애플리케이션의 라이프사이클 관리를 자동화합니다.", + "waf": "운영 우수성" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "권한을 만들 때 Azure Event Hub에 대한 클라이언트의 액세스를 세밀하게 제어할 수 있습니다. Azure Event Hub의 사용 권한은 개별 리소스 수준(예: 소비자 그룹, 이벤트 허브 엔터티, 이벤트 허브 네임스페이스 등)으로 범위를 지정할 수 있으며 범위가 지정되어야 합니다.", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "높다", - "text": "최소 권한 데이터 평면 RBAC 사용", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", - "waf": "안전" + "text": "청구 모델 사용 평가 - PAYG 대 PTU", + "waf": "비용 최적화" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Azure Event Hub 리소스 로그에는 작업 로그, 가상 네트워크 및 Kafka 로그가 포함됩니다. 런타임 감사 로그는 Event Hubs의 모든 데이터 평면 액세스 작업(예: 이벤트 보내기 또는 받기)에 대해 집계된 진단 정보를 캡처합니다.", - "guid": "b38b875b-a1cf-4104-a900-3a4d3ce474db", - "link": "https://learn.microsoft.com/azure/event-hubs/monitor-event-hubs-reference", - "service": "Event Hubs", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "보통", - "text": "보안 조사를 위해 로깅을 사용하도록 설정합니다. Azure Monitor를 사용하여 리소스 로그, 런타임 감사 로그 및 Kafka 로그와 같은 메트릭 및 로그를 캡처합니다.", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", - "waf": "안전" + "text": "모델 버전 간에 전환할 때 프롬프트와 응용 프로그램의 품질을 평가합니다.", + "waf": "운영 우수성" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Azure Event Hub는 기본적으로 공용 IP 주소를 가지며 인터넷에 연결할 수 있습니다. 프라이빗 엔드포인트를 사용하면 가상 네트워크와 Azure Event Hub 간의 트래픽이 Microsoft 백본 네트워크를 통해 트래버스할 수 있습니다. 또한 퍼블릭 엔드포인트를 사용하지 않는 경우 사용하지 않도록 설정해야 합니다. ", - "guid": "5abca2a4-eda1-4dae-8cc9-5d48c6b791dc", - "link": "https://learn.microsoft.com/azure/event-hubs/private-link-service", - "service": "Event Hubs", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "보통", - "text": "프라이빗 엔드포인트를 사용하여 Azure Event Hub에 액세스하고 해당하는 경우 공용 네트워크 액세스를 사용하지 않도록 설정하는 것이 좋습니다.", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", - "waf": "안전" + "text": "GenAI 앱을 평가, 모니터링 및 개선하여 근거, 관련성, 정확성, 일관성, 유창성 등의 기능을 제공합니다.", + "waf": "운영 우수성" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "294798b1-578b-4219-a46c-eb5443513592", + "service": "Azure OpenAI", + "severity": "보통", + "text": "다양한 검색 매개 변수를 기반으로 Azure AI Search 결과를 평가합니다", + "waf": "운영 우수성" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "IP 방화벽을 사용하면 퍼블릭 엔드포인트를 CIDR(Classless Inter-Domain Routing) 표기법의 IPv4 주소 또는 IPv4 주소 범위 집합으로만 추가로 제한할 수 있습니다. ", - "guid": "a0e6c465-89e5-458b-a37d-3974d1112dbd", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-ip-filtering", - "service": "Event Hubs", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "2744293b-b628-4537-a551-19b08e8f5854", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", + "service": "Azure OpenAI", "severity": "보통", - "text": "특정 IP 주소 또는 범위에서 Azure Event Hub 네임스페이스에 대한 액세스만 허용하는 것이 좋습니다", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "안전" + "text": "데이터를 사용하여 프롬프트 엔지니어링 및 RAG와 같은 다른 기본 접근 방식을 시도한 경우에만 모델을 미세 조정하여 정확도를 높이는 방법으로 살펴보십시오", + "waf": "운영 우수성" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "31d41e36-11c8-417b-8afb-c410d4391898", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-AEH_v1.docx", - "service": "Event Hubs", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "보통", - "text": "FTA 탄력성 핸드북 활용", - "waf": "신뢰도" + "text": "프롬프트 엔지니어링 기법을 사용하여 LLM 응답의 정확도 향상", + "waf": "운영 우수성" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": " 영역 사용 지역의 프리미엄, 전용 또는 표준 SKU를 사용하여 포털에서 만든 새 EH 네임스페이스에 대해 자동으로 설정됩니다. EH 메타데이터와 이벤트 데이터 자체는 모두 영역 간에 복제됩니다", - "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", - "severity": "높다", - "text": "지역적으로 적용 가능한 경우 가용성 영역 활용Leverage Availability Zones if regionally applicable", - "waf": "신뢰도" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e737897e-71ca-47da-acfa-962a1594946d", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", + "service": "Azure OpenAI", + "severity": "보통", + "text": "GenAI 애플리케이션을 위한 레드 팀", + "waf": "안전" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "20b56c56-ad58-4519-8f82-735c586bb281", - "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", - "service": "Event Hubs", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", + "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", + "service": "Azure OpenAI", "severity": "보통", - "text": "예측 가능한 성능을 위해 프리미엄 또는 전용 SKU 사용", - "waf": "신뢰도" + "text": "최종 사용자에게 LLM 응답에 대한 점수 매기기 옵션을 제공하고 이러한 점수를 추적합니다. ", + "waf": "운영 우수성" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "기본 제공 지역 재해 복구 기능을 사용하도록 설정하면 네임스페이스(Event Hubs, 소비자 그룹 및 설정)의 전체 구성이 기본 네임스페이스에서 보조 네임스페이스로 지속적으로 복제되며, 언제든지 한 번만 장애 조치(failover)를 주 네임스페이스에서 보조 네임스페이스로 이동할 수 있습니다. 활성/수동 기능은 애플리케이션 구성을 변경할 필요 없이 실패한 Azure 지역에서 더 쉽게 복구하고 중단할 수 있도록 설계되었습니다", - "guid": "dc15a1c0-75ee-49f1-90ac-ccd579376bcd", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-geo-dr?tabs=portal", - "service": "Event Hubs", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "높다", - "text": "Active Passive 구성을 사용하여 지역 재해 복구 계획Plan for Geo Disaster Recovery using Active Passive configuration", - "waf": "신뢰도" - }, - { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "다운된 지역에서 이벤트 데이터의 중단 또는 손실을 허용할 수 없는 DR 구성에 사용해야 합니다. 이러한 경우 복제 지침을 따르고 기본 제공 지역 재해 복구 기능(활성/수동)을 사용하지 마세요. 액티브/액티브를 사용하여 서로 다른 지역 및 네임스페이스에서 여러 Event Hubs를 유지 관리하면 허브 간에 이벤트가 복제됩니다", - "guid": "6e31b67d-67ba-4591-89c0-9e805d597c7e", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-federation-overview", - "service": "Event Hubs", - "severity": "보통", - "text": "Business Critical Applications의 경우 Active Active 구성을 사용합니다.", - "waf": "신뢰도" + "text": "할당량 관리 방법 고려", + "waf": "비용 최적화" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", - "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", - "service": "Event Hubs", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", + "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", + "service": "Azure OpenAI", "severity": "보통", - "text": "복원력 있는 Event Hubs 설계", - "waf": "신뢰도" + "text": "APIM 기반 게이트웨이와 같은 Load Balancer 솔루션을 사용하여 서비스 및 지역 간에 부하와 용량을 분산합니다", + "waf": "운영 우수성" }, { "arm-service": "Microsoft.Devices/IotHubs", @@ -8938,59 +8838,159 @@ "waf": "신뢰도" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", - "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", - "service": "IoT Hub DPS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Azure Functions", "severity": "높다", - "text": "비즈니스 및 SLO 요구 사항에 따라 올바른 Logic App 호스팅 계획 선택Select the right Logic App hosting plan based on your business & SLO requirements", + "text": "비즈니스 및 SLO 요구 사항에 따라 올바른 기능 호스팅 계획을 선택하십시오.", "waf": "신뢰도" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Azure Functions", "severity": "높다", - "text": "영역 중복 및 가용성 영역을 사용하여 지역 오류로부터 논리 앱 보호Protect logic apps from region failures with zone redundancy and availability zones", + "text": "지역적으로 적용 가능한 가용성 영역 활용(소비 계층에는 사용할 수 없음)", "waf": "신뢰도" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "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", - "severity": "높다", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "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", + "severity": "보통", "text": "중요한 워크로드에 대한 지역 간 DR 전략 고려", "waf": "신뢰도" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "IoT Hub DPS", + "service": "Azure Functions", "severity": "높다", "text": "격리된 환경에 배포하는 경우 ASE(App Service Environment) v3을 사용하거나 마이그레이션합니다", "waf": "신뢰도" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "Azure Functions", + "severity": "높다", + "text": "App Service 계획에서 실행되는 모든 함수 앱에 대해 'Always On'이 사용하도록 설정되어 있는지 확인합니다.", + "waf": "신뢰도" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "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", + "severity": "보통", + "text": "함수 앱을 자체 스토리지 계정에 페어링합니다. 긴밀하게 결합되지 않는 한 함수 앱에 대한 스토리지 계정을 다시 사용하지 마세요", + "waf": "신뢰도" + }, + { + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "IoT Hub DPS", + "service": "Azure Functions", "severity": "보통", - "text": "Azure DevOps 또는 GitHub를 활용하여 CI/CD를 간소화하고 논리 앱 코드를 보호합니다.", + "text": "Azure DevOps 또는 GitHub를 활용하여 CI/CD를 간소화하고 함수 앱 코드를 보호합니다.", "waf": "작업" + }, + { + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", + "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", + "service": "Spring Apps", + "severity": "보통", + "text": "Azure Spring Apps는 모든 앱에 대해 두 개의 배포를 허용하며, 그 중 하나만 프로덕션 트래픽을 수신합니다. 블루-그린 배포 전략을 통해 가동 중지 시간 제로를 달성할 수 있습니다. 파란색 녹색 배포는 표준 및 엔터프라이즈 계층에서만 사용할 수 있습니다. ADO/GitHub 작업과 함께 CI/CD를 사용하여 배포를 자동화할 수 있습니다.", + "waf": "신뢰도" + }, + { + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "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", + "severity": "보통", + "text": "Azure Spring Apps 인스턴스는 애플리케이션에 대해 여러 지역에서 만들 수 있으며 Traffic Manager/Front Door에서 트래픽을 라우팅할 수 있습니다.", + "waf": "신뢰도" + }, + { + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", + "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", + "service": "Spring Apps", + "severity": "보통", + "text": "지원되는 지역에서 Azure Spring Apps는 영역 중복으로 배포할 수 있으며, 이는 인스턴스가 가용성 영역에 자동으로 분산됨을 의미합니다. 이 기능은 Standard 및 Enterprise 계층에서만 사용할 수 있습니다.", + "waf": "신뢰도" + }, + { + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", + "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", + "service": "Spring Apps", + "severity": "보통", + "text": "앱에 1개 이상의 앱 인스턴스 사용", + "waf": "신뢰도" + }, + { + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "7504c230-6035-4183-95a5-85762acc6075", + "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", + "service": "Spring Apps", + "severity": "보통", + "text": "로그, 메트릭 및 추적을 사용하여 Azure Spring Apps를 모니터링합니다. ASA를 Application Insights와 통합하고, 오류를 추적하고, 통합 문서를 만듭니다.", + "waf": "신뢰도" + }, + { + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", + "service": "Spring Apps", + "severity": "보통", + "text": "Spring Cloud Gateway에서 자동 크기 조정 설정", + "waf": "신뢰도" + }, + { + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "97411607-b6fd-4335-99d1-9885faf4e392", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", + "service": "Spring Apps", + "severity": "낮다", + "text": "표준 소비 및 전용 플랜이 있는 앱에 대해 자동 크기 조정을 사용하도록 설정합니다.", + "waf": "신뢰도" + }, + { + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", + "link": "https://learn.microsoft.com/azure/spring-apps/overview", + "service": "Spring Apps", + "severity": "보통", + "text": "중요 업무용 앱에 대한 Spring Boot의 상업적 지원을 위해 Enterprise 플랜을 사용합니다. 다른 계층에서는 OSS 지원을 받을 수 있습니다.", + "waf": "신뢰도" } ], "metadata": { "name": "WAF checklist", - "timestamp": "August 05, 2024" + "timestamp": "August 08, 2024" }, "severities": [ { diff --git a/checklists/waf_checklist.pt.json b/checklists/waf_checklist.pt.json index 66b8b93d5..1e41cb251 100644 --- a/checklists/waf_checklist.pt.json +++ b/checklists/waf_checklist.pt.json @@ -1,8996 +1,8996 @@ { "items": [ { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Aplicar as orientações do benchmark de segurança na nuvem da Microsoft relacionadas ao armazenamento", - "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", - "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", - "service": "Azure Storage", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", + "service": "Bot service", "severity": "Média", - "text": "Considere a 'linha de base de segurança do Azure para armazenamento'", - "waf": "Segurança" + "text": "Siga as recomendações de suporte de confiabilidade no Serviço de Bot do Azure", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "O Armazenamento do Azure, por padrão, 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 o uso de pontos de extremidade privados para o Armazenamento do Azure", - "waf": "Segurança" + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", + "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", + "service": "Bot service", + "severity": "Média", + "text": "Implantando bots com residência de dados local e conformidade regional", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "As contas de armazenamento recém-criadas são criadas usando o modelo de implantação ARM, para que o RBAC, a auditoria, etc., estejam todos habilitados. Verifique se não há contas de armazenamento antigas com 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", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "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", "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" + "text": "O Serviço de Bot do Azure é executado no modo ativo-ativo para serviços globais e regionais. Quando ocorre uma paralisação, você não precisa detectar erros ou gerenciar o serviço. O Serviço de Bot do Azure executa automaticamente o failover automático e a recuperação automática em uma arquitetura geográfica de várias regiões. Para o serviço regional de bot da UE, o Serviço de Bot do Azure fornece duas regiões completas dentro da Europa com replicação ativa/ativa para garantir redundância. Para o serviço de bot global, todas as regiões/geografias disponíveis podem ser servidas como a presença global.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", + "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", + "service": "Spring Apps", + "severity": "Média", + "text": "Os Aplicativos Spring do Azure permitem duas implantações para cada aplicativo, apenas um dos quais recebe tráfego de produção. Você pode obter tempo de inatividade zero com estratégias de implantação em verde azul. A implantação verde azul só está disponível nas camadas Standard e Enterprise. Você pode automatizar a implantação usando CI/CD com ações do ADO/GitHub", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "O mecanismo soft-delete 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", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "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", "severity": "Média", - "text": "Ativar 'exclusão suave' para blobs", - "waf": "Segurança" + "text": "As instâncias do Azure Spring Apps podem ser criadas em várias regiões para seus aplicativos e o tráfego pode ser roteado pelo Gerenciador de Tráfego/Front Door.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Considere desativar seletivamente a \"exclusão suave\" para determinados contêineres de blob, por exemplo, se o aplicativo tiver que garantir que as informações excluídas sejam imediatamente excluídas, 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", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", + "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", + "service": "Spring Apps", "severity": "Média", - "text": "Desativar 'exclusão suave' para blobs", - "waf": "Segurança" + "text": "Na região com suporte, os Aplicativos Spring do Azure podem ser implantados como zona redundante, o que significa que as instâncias são distribuídas automaticamente entre zonas de disponibilidade. Esse recurso só está disponível nas camadas Standard e Enterprise.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "A exclusão suave para contêineres permite que você recupere um contêiner depois que ele tenha sido 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": "Ativar 'exclusão suave' para contêineres", - "waf": "Segurança" + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", + "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", + "service": "Spring Apps", + "severity": "Média", + "text": "Usar mais de 1 instância de aplicativo para seus aplicativos", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Considere desativar seletivamente a \"exclusão suave\" para determinados contêineres de blob, por exemplo, se o aplicativo tiver que garantir que as informações excluídas sejam imediatamente excluídas, 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", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "7504c230-6035-4183-95a5-85762acc6075", + "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", + "service": "Spring Apps", "severity": "Média", - "text": "Desativar 'exclusão suave' para contêineres", - "waf": "Segurança" + "text": "Monitore os Aplicativos Spring do Azure com logs, métricas e rastreamento. Integre o ASA com insights de aplicativos e rastreie falhas e crie pastas de trabalho.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Evita 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.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", + "service": "Spring Apps", + "severity": "Média", + "text": "Configurar o dimensionamento automático no Spring Cloud Gateway", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Considere 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. Por favor, note que \"impossível\" significa na verdade \"impossível\"; uma vez 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.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "97411607-b6fd-4335-99d1-9885faf4e392", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", + "service": "Spring Apps", + "severity": "Baixo", + "text": "Habilite o dimensionamento automático para os aplicativos com o plano de consumo padrão e dedicado.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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, desativar a porta 80 na conta de armazenamento", - "waf": "Segurança" + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", + "link": "https://learn.microsoft.com/azure/spring-apps/overview", + "service": "Spring Apps", + "severity": "Média", + "text": "Use o plano Enterprise para suporte comercial de inicialização spring para aplicativos de missão crítica. Com outras camadas, você obtém suporte a OSS.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Ao configurar um domínio personalizado (nome do host) em uma conta de armazenamento, verifique se você precisa de TLS/HTTPS; em caso afirmativo, talvez seja necessário colocar a CDN do Azure na frente da 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", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "ac1d6380-f866-4bbd-a9b4-b1ee5d7908b8", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#availability-zones", + "service": "IoT", "severity": "Alto", - "text": "Ao impor HTTPS (desabilitando HTTP), verifique se você não usa domínios personalizados (CNAME) para a conta de armazenamento.", - "waf": "Segurança" + "text": "Aproveitar zonas de disponibilidade, se aplicável regionalmente (isso é habilitado automaticamente)", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "35f651e8-0124-4ef7-8c57-658e38609e6e", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", + "service": "IoT", "severity": "Média", - "text": "Limitar tokens de assinatura de acesso compartilhado (SAS) somente a conexões HTTPS", - "waf": "Segurança" + "text": "Esteja ciente dos failovers iniciados pela Microsoft. Eles são exercidos pela Microsoft em raras situações para fazer failover de todos os hubs IoT de uma região afetada para a região geo-emparelhada correspondente.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "Os tokens AAD 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", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "4ed3e490-dc06-4a1e-b467-5d0239d85540", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#cross-region-dr", + "service": "IoT", "severity": "Alto", - "text": "Usar tokens do Azure Active Directory (Azure AD) para acesso de blob", - "waf": "Segurança" + "text": "Considere uma estratégia de DR entre regiões para cargas de trabalho críticas", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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 eles executem 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égio mínimo nas permissões do IaM", - "waf": "Segurança" + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "a11ecab0-db47-46f7-9aa7-17764e7e45a1", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", + "service": "IoT", + "severity": "Alto", + "text": "Saiba como acionar um failover manual.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "f9db8dfb-1194-460b-aedd-34dd6a69db22", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#failback", + "service": "IoT", "severity": "Alto", - "text": "Ao usar o SAS, prefira o SAS de delegação de usuário ao SAS baseado em chave de conta de armazenamento.", - "waf": "Segurança" + "text": "Saiba como fazer failback após um failover.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "As chaves de conta de armazenamento ('chaves compartilhadas') têm pouquíssimos recursos de auditoria. Embora possa ser monitorado em quem/quando foi obtida 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. Depender exclusivamente da autenticação do AAD facilita a vinculação do acesso ao armazenamento a um usuário. ", - "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", - "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", - "service": "Azure Storage", + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", + "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", + "service": "IoT Hub DPS", "severity": "Alto", - "text": "Considere desabilitar as chaves de conta de armazenamento, para que somente o acesso ao AAD (e a delegação de usuários SAS) seja suportado.", - "waf": "Segurança" + "text": "Selecione o plano de hospedagem de aplicativo lógico certo com base em seus requisitos de negócios e SLO", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "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", + "severity": "Alto", + "text": "Proteja aplicativos lógicos contra falhas de região com redundância de zona e zonas de disponibilidade", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "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", + "severity": "Alto", + "text": "Considere uma estratégia de DR entre regiões para cargas de trabalho críticas", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "IoT Hub DPS", + "severity": "Alto", + "text": "Se estiver implantando em um ambiente isolado, use ou migre para o ASE (Ambiente do Serviço de Aplicativo) v3", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "IoT Hub DPS", + "severity": "Média", + "text": "Aproveite o Azure DevOps ou o GitHub para simplificar o CI/CD e proteger seu código de Aplicativo Lógico", + "waf": "Operações" + }, + { + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "ab91932c-9fc9-4d1b-a881-37f5e6c0cb9e", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ADF_v1.docx", + "service": "Azure Data Factory", + "severity": "Média", + "text": "Aproveite o Manual de Resiliência de FTA para o Azure Data Factory", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "e503547c-d447-4e82-9138-a7200f1cac6d", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", + "severity": "Alto", + "text": "Usar pipelines redundantes de zona em regiões que oferecem suporte a zonas de disponibilidade", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "9ef1d6e8-32e5-42e3-911c-818b1a0bc511", + "link": "https://learn.microsoft.com/azure/data-factory/source-control", + "service": "Azure Data Factory", + "severity": "Média", + "text": "Usar DevOps para fazer backup dos modelos ARM com a integração Github/Azure DevOps ", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "e43a18a9-cd29-49cf-b7b1-7db8255562f2", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", + "severity": "Média", + "text": "Certifique-se de replicar as VMs do Self-Hosted Integration Runtime em outra região ", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "aee4563a-fd83-4393-98b2-62d6dc5f512a", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", + "severity": "Média", + "text": "Certifique-se de replicar ou duplicar sua rede na região irmã. Você tem que fazer uma cópia do seu Vnet em outra região", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "description": "Se seus pipelines do ADF usarem o Cofre de Chaves, você não precisará fazer nada para replicar o Cofre de Chaves. O Cofre de Chaves é um serviço gerenciado e a Microsoft cuida dele para você", + "guid": "25498f6d-bad3-47da-a43b-c6ce1d7aa9b2", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "Azure Data Factory", + "severity": "Baixo", + "text": "Se estiver usando a integração do Keyvault, use o SLA do Keyvault para entender sua disponibilidade", + "waf": "Fiabilidade" }, { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Blob Storage Review", - "description": "Use os dados do Registro de atividades para identificar \"quando\", \"quem\", \"o que\" e \"como\" a segurança da sua conta de armazenamento está sendo visualizada ou alterada (ou seja, chaves de 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", + "description": "Aplicar as orientações do benchmark de segurança na nuvem da Microsoft relacionadas ao armazenamento", + "guid": "d237de14-3b16-4c21-b7aa-9b64604489a8", + "link": "https://learn.microsoft.com/security/benchmark/azure/baselines/storage-security-baseline", "service": "Azure Storage", - "severity": "Alto", - "text": "Considere usar o Azure Monitor para auditar as operações do plano de controle na conta de armazenamento", + "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 Blob Storage Review", - "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 será 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", + "description": "O Armazenamento do Azure, por padrão, 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": "Média", - "text": "Ao usar chaves de conta de armazenamento, considere habilitar uma 'política de expiração de chave'", + "severity": "Alto", + "text": "Considere o uso de pontos de extremidade privados para o Armazenamento do Azure", "waf": "Segurança" }, { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Blob Storage Review", - "description": "Uma diretiva de expiração SAS especifica um intervalo recomendado sobre o qual a SAS é válida. As políticas de expiração do SAS se aplicam a um SAS de serviço ou a um SAS de conta. Quando um usuário gera SAS de serviço ou SAS de conta com um intervalo de validade maior do 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", + "description": "As contas de armazenamento recém-criadas são criadas usando o modelo de implantação ARM, para que o RBAC, a auditoria, etc., estejam todos habilitados. Verifique se não há contas de armazenamento antigas com 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": "Considere configurar uma política de expiração SAS", + "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 Blob Storage Review", - "description": "As políticas de acesso armazenado oferecem a opção de revogar permissões para uma SAS de serviço sem precisar gerar novamente as chaves da conta de armazenamento. ", - "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", - "link": "https://learn.microsoft.com/rest/api/storageservices/define-stored-access-policy", + "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": "Média", - "text": "Considere vincular o SAS a uma política de acesso armazenado", + "severity": "Alto", + "text": "Habilitar o Microsoft Defender para todas as suas contas de armazenamento", "waf": "Segurança" }, { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Blob Storage Review", - "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/", + "description": "O mecanismo soft-delete 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": "Considere configurar o repositório de código-fonte do aplicativo para detectar cadeias de conexão com check-in e chaves de conta de armazenamento.", + "text": "Ativar 'exclusão suave' para blobs", "waf": "Segurança" }, { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Blob Storage Review", - "description": "Idealmente, seu aplicativo deve estar usando 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 de 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", + "description": "Considere desativar seletivamente a \"exclusão suave\" para determinados contêineres de blob, por exemplo, se o aplicativo tiver que garantir que as informações excluídas sejam imediatamente excluídas, 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": "Alto", - "text": "Considere armazenar cadeias de conexão no Cofre de Chaves do Azure (em cenários em que identidades gerenciadas não são possíveis)", + "severity": "Média", + "text": "Desativar 'exclusão suave' para blobs", "waf": "Segurança" }, { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Blob Storage Review", - "description": "Use tempos de expiração de curto prazo em um SAS de serviço SAS ad hoc ou SAS de conta. Dessa forma, mesmo que um SAS seja comprometido, ele é válido 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 armazenado. 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", + "description": "A exclusão suave para contêineres permite que você recupere um contêiner depois que ele tenha sido 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": "Esforce-se por curtos períodos de validade para SAS ad-hoc", + "text": "Ativar 'exclusão suave' para contêineres", "waf": "Segurança" }, { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Blob Storage Review", - "description": "Ao criar um SAS, seja o mais específico e restritivo possível. Prefira um SAS para um único recurso e operação em vez de um SAS que dá acesso muito mais amplo.", - "guid": "4721d928-c1b1-4cd5-81e5-4a29a9de399c", - "link": "https://learn.microsoft.com/rest/api/storageservices/delegate-access-with-shared-access-signature", + "description": "Considere desativar seletivamente a \"exclusão suave\" para determinados contêineres de blob, por exemplo, se o aplicativo tiver que garantir que as informações excluídas sejam imediatamente excluídas, 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": "Aplicar um escopo restrito a uma SAS", + "text": "Desativar 'exclusão suave' para contêineres", "waf": "Segurança" }, { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Blob Storage Review", - "description": "Uma SAS pode incluir parâmetros nos quais endereços IP de 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", + "description": "Evita 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": "Média", - "text": "Considere a definição do escopo do SAS para um endereço IP de cliente específico, sempre que possível", + "severity": "Alto", + "text": "Habilitar bloqueios de recursos em contas de armazenamento", "waf": "Segurança" }, { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Blob Storage Review", - "description": "Um SAS não pode restringir a quantidade de dados que um cliente carrega; Dado o modelo de precificação da quantidade de armazenamento ao longo do tempo, pode fazer sentido validar se os clientes carregaram conteúdo maliciosamente grande.", - "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "description": "Considere 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. Por favor, note que \"impossível\" significa na verdade \"impossível\"; uma vez 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": "Baixo", - "text": "Considere verificar os dados carregados, depois que os clientes usaram um SAS para carregar um arquivo. ", + "severity": "Alto", + "text": "Considere blobs imutáveis", "waf": "Segurança" }, { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Blob Storage Review", - "description": "Ao acessar o armazenamento de blob via SFTP usando uma 'conta de usuário local', os controles RBAC 'normais' não se aplicam. O acesso a blobs via NFS ou REST pode ser mais restritivo do que o acesso a SFTP. Infelizmente, no início de 2023, os usuários locais são a única forma de gerenciamento de identidade que atualmente é suportada para o ponto de extremidade SFTP", - "guid": "ad53cc7c-e1d7-4aaa-a357-1449ab8053d8", - "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-support#sftp-permission-model", + "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": "SFTP: Limite a quantidade de 'usuários locais' para acesso SFTP e audite se o acesso é necessário ao longo do tempo.", + "text": "Exigir HTTPS, ou seja, desativar a porta 80 na conta de armazenamento", "waf": "Segurança" }, { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Blob Storage Review", - "guid": "9f89dc7b-33be-42a1-a27f-7b9e91be1f38", - "link": "https://learn.microsoft.com/azure/storage/blobs/secure-file-transfer-protocol-known-issues#authentication-and-authorization", + "description": "Ao configurar um domínio personalizado (nome do host) em uma conta de armazenamento, verifique se você precisa de TLS/HTTPS; em caso afirmativo, talvez seja necessário colocar a CDN do Azure na frente da 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": "Média", - "text": "SFTP: O ponto de extremidade SFTP não oferece suporte a ACLs do tipo POSIX.", + "severity": "Alto", + "text": "Ao impor HTTPS (desabilitando 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 Blob Storage Review", - "description": "O armazenamento oferece suporte a 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 o 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", + "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": "Alto", - "text": "Evite políticas CORS excessivamente amplas", + "severity": "Média", + "text": "Limitar tokens de assinatura de acesso compartilhado (SAS) somente a conexões HTTPS", "waf": "Segurança" }, { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Blob Storage Review", - "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 acontecer usando uma chave gerenciada por 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 depende 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", + "description": "Os tokens AAD 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": "Determine como os dados em repouso devem ser criptografados. Entenda o modelo de thread para dados.", + "text": "Usar tokens do Azure Active Directory (Azure AD) para acesso de blob", "waf": "Segurança" }, { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Blob Storage Review", - "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", + "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 eles executem 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": "Determine qual/se a criptografia de plataforma deve ser usada.", + "text": "Privilégio mínimo nas permissões do IaM", "waf": "Segurança" }, { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Blob Storage Review", - "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", - "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", + "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": "Média", - "text": "Determine qual/se a criptografia do lado do cliente deve ser usada.", + "severity": "Alto", + "text": "Ao usar o SAS, prefira o SAS de delegação de usuário ao SAS baseado em chave de conta de armazenamento.", "waf": "Segurança" }, { "arm-service": "Microsoft.Storage/storageAccounts", "checklist": "Azure Blob Storage Review", - "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.", - "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", + "description": "As chaves de conta de armazenamento ('chaves compartilhadas') têm pouquíssimos recursos de auditoria. Embora possa ser monitorado em quem/quando foi obtida 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. Depender exclusivamente da autenticação do AAD facilita a vinculação do acesso ao armazenamento a um usuário. ", + "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 se o acesso de blob público é necessário ou se pode ser desabilitado para determinadas contas de armazenamento. ", + "text": "Considere desabilitar as chaves de conta de armazenamento, para que somente o acesso ao AAD (e a delegação de usuários SAS) seja suportado.", "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", - "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", - "service": "AKS", - "severity": "Baixo", - "text": "Se necessário para cargas de trabalho do AKS Windows, os contêineres HostProcess podem ser usados", - "waf": "Fiabilidade" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Use os dados do Registro de atividades para identificar \"quando\", \"quem\", \"o que\" e \"como\" a segurança da sua conta de armazenamento está sendo visualizada ou alterada (ou seja, chaves de 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 plano de controle na conta de armazenamento", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", - "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", - "service": "AKS", - "severity": "Baixo", - "text": "Usar o KEDA se estiver executando cargas de trabalho orientadas a eventos", - "waf": "Desempenho" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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 será 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.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", - "link": "https://dapr.io/", - "service": "AKS", - "severity": "Baixo", - "text": "Use o Dapr para facilitar o desenvolvimento de microsserviços", - "waf": "Operações" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Uma diretiva de expiração SAS especifica um intervalo recomendado sobre o qual a SAS é válida. As políticas de expiração do SAS se aplicam a um SAS de serviço ou a um SAS de conta. Quando um usuário gera SAS de serviço ou SAS de conta com um intervalo de validade maior do 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 SAS", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Alto", - "text": "Use a oferta AKS apoiada por SLA", - "waf": "Fiabilidade" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "As políticas de acesso armazenado oferecem a opção de revogar permissões para uma SAS de serviço sem precisar gerar novamente 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 o SAS a uma política de acesso armazenado", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", - "severity": "Baixo", - "text": "Usar orçamentos de interrupção em seu pod e definições de implantação", - "waf": "Fiabilidade" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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 com check-in e chaves de conta de armazenamento.", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure AKS Review", - "guid": "3c763963-7a55-42d5-a15e-401955387e5c", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", - "service": "ACR", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Idealmente, seu aplicativo deve estar usando 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 de 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": "Se estiver usando um registro privado, configure a replicação de região para armazenar imagens em várias regiões", - "waf": "Fiabilidade" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", - "service": "AKS", - "severity": "Baixo", - "text": "Use um aplicativo externo, como kubecost, para alocar custos para diferentes usuários", - "waf": "Custar" + "text": "Considere armazenar cadeias de conexão no Cofre de Chaves do Azure (em cenários em que identidades gerenciadas não são possíveis)", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", - "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", - "service": "AKS", - "severity": "Baixo", - "text": "Usar o modo de redução para excluir/desalocar nós", - "waf": "Custar" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Use tempos de expiração de curto prazo em um SAS de serviço SAS ad hoc ou SAS de conta. Dessa forma, mesmo que um SAS seja comprometido, ele é válido 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 armazenado. 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 curtos períodos de validade para SAS ad-hoc", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", - "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", - "service": "AKS", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Ao criar um SAS, seja o mais específico e restritivo possível. Prefira um SAS para um único recurso e operação em vez de um SAS que dá 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": "Quando necessário, use a GPU de partioning de várias instâncias em clusters AKS", - "waf": "Custar" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", - "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", - "service": "AKS", - "severity": "Baixo", - "text": "Se estiver executando um cluster de desenvolvimento/teste, use NodePool Start/Stop", - "waf": "Custar" + "text": "Aplicar um escopo restrito a uma SAS", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Uma SAS pode incluir parâmetros nos quais endereços IP de 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": "Usar a Política do Azure para Kubernetes para garantir a conformidade do cluster", + "text": "Considere a definição do escopo do SAS para um endereço IP de cliente específico, sempre que possível", "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Média", - "text": "Separe os aplicativos do plano de controle com pools de nós de usuário/sistema", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Um SAS não pode restringir a quantidade de dados que um cliente carrega; Dado o modelo de precificação da quantidade de armazenamento ao longo do tempo, pode fazer sentido validar se os clientes carregaram conteúdo maliciosamente grande.", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "service": "Azure Storage", + "severity": "Baixo", + "text": "Considere verificar os dados carregados, depois que os clientes usaram um SAS para carregar um arquivo. ", "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", - "link": "https://learn.microsoft.com/azure/aks/use-system-pools", - "service": "AKS", - "severity": "Baixo", - "text": "Adicione mancha ao seu nodepool do sistema para torná-lo dedicado", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "Ao acessar o armazenamento de blob via SFTP usando uma 'conta de usuário local', os controles RBAC 'normais' não se aplicam. O acesso a blobs via NFS ou REST pode ser mais restritivo do que o acesso a SFTP. Infelizmente, no início de 2023, os usuários locais são a única forma de gerenciamento de identidade que atualmente é suportada para o ponto de extremidade 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.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", - "link": "https://learn.microsoft.com/azure/container-registry/", - "service": "AKS", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "Usar um registro privado para suas imagens, como o ACR", + "text": "SFTP: O ponto de extremidade SFTP não oferece suporte a ACLs do tipo POSIX.", "waf": "Segurança" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure AKS Review", - "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", - "link": "https://learn.microsoft.com/azure/security-center/container-security", - "service": "ACR", - "severity": "Média", - "text": "Analise suas imagens em busca de vulnerabilidades", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "O armazenamento oferece suporte a 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 o 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 CORS excessivamente amplas", "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", - "service": "AKS", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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 acontecer usando uma chave gerenciada por 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 depende 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": "Definir requisitos de separação de aplicativos (namespace/nodepool/cluster)", + "text": "Determine como os dados em repouso devem ser criptografados. Entenda o modelo de thread para dados.", "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", - "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", - "service": "AKS", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "Armazene seus segredos no Cofre de Chaves do Azure com o driver do CSI Secrets Store", + "text": "Determine qual/se a criptografia de plataforma deve ser usada.", "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", - "link": "https://learn.microsoft.com/azure/aks/update-credentials", - "service": "AKS", - "severity": "Alto", - "text": "Se estiver usando entidades de serviço para o cluster, atualize as credenciais periodicamente (como trimestralmente)", - "waf": "Segurança" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", - "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", - "service": "AKS", - "severity": "Média", - "text": "Se necessário, adicione criptografia etcd do Serviço de Gerenciamento de Chaves", - "waf": "Segurança" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", - "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", - "service": "AKS", - "severity": "Baixo", - "text": "Se necessário, considere o uso de computação confidencial para AKS", - "waf": "Segurança" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", - "service": "AKS", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "Considere o uso do Defender for Containers", + "text": "Determine qual/se a criptografia do lado do cliente deve ser usada.", "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.", + "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": "Usar identidades gerenciadas em vez de entidades de serviço", + "text": "Considere se o acesso de blob público é necessário ou se pode ser desabilitado para determinadas contas de armazenamento. ", "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", + "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", + "service": "SAP", "severity": "Média", - "text": "Integrar autenticação com AAD (usando a integração gerenciada)", - "waf": "Segurança" + "text": "O Azure Center for SAP solutions (ACSS) é uma oferta do Azure que torna o SAP uma carga de trabalho de nível superior no Azure. O ACSS é uma solução de ponta a ponta que permite criar e executar sistemas SAP como uma carga de trabalho unificada no Azure e fornece uma base mais perfeita para a inovação. Você pode aproveitar os recursos de gerenciamento para sistemas SAP novos e existentes baseados no Azure.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-center-sap-solutions/?source=recommendations", + "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", - "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", - "service": "AKS", + "checklist": "SAP 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", "severity": "Média", - "text": "Limitar o acesso ao admin kubeconfig (get-credentials --admin)", - "waf": "Segurança" + "text": "O Azure dá suporte à automação de implantações SAP no Linux e no Windows. O SAP Deployment Automation Framework é uma ferramenta de orquestração de código aberto que pode implantar, instalar e manter ambientes SAP.", + "training": "https://github.com/Azure/sap-automation", + "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", - "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", + "service": "SAP", "severity": "Média", - "text": "Integrar autorização com AAD RBAC", - "waf": "Segurança" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", - "service": "AKS", - "severity": "Alto", - "text": "Usar namespaces para restringir o privilégio RBAC no Kubernetes", - "waf": "Segurança" + "text": "Executar uma recuperação point-in-time para seus bancos de dados de produção em qualquer ponto e em um período de tempo que atenda ao seu RTO; A recuperação point-in-time normalmente inclui erros do operador excluindo dados na camada DBMS ou por meio do SAP, incidentalmente", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", - "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", + "service": "SAP", "severity": "Média", - "text": "Para o Gerenciamento de Acesso à Identidade de Pod, use a Identidade de Carga de Trabalho do Azure AD (visualização)", - "waf": "Segurança" + "text": "Teste os tempos de backup e recuperação para verificar se eles atendem aos requisitos de RTO para restaurar todos os sistemas simultaneamente após um desastre.", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", - "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", - "service": "AKS", - "severity": "Média", - "text": "Para logins não interativos do AKS, use kubelogin (visualização)", - "waf": "Segurança" + "checklist": "SAP Checklist", + "guid": "b651423c-8552-42db-a545-5cb50c05527a", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "service": "SAP", + "severity": "Alto", + "text": "Você pode replicar o armazenamento padrão entre regiões emparelhadas, mas não pode usar o armazenamento padrão para armazenar seus bancos de dados ou discos rígidos virtuais. Você pode replicar backups somente entre regiões emparelhadas que você usa. Para todos os outros dados, execute sua replicação usando recursos nativos de DBMS, como SQL Server Always On ou SAP HANA System Replication. Use uma combinação de Site Recovery, rsync ou robocopy e outros softwares de terceiros para a camada de aplicativos SAP.", + "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", "severity": "Média", - "text": "Desativar contas locais do AKS", - "waf": "Segurança" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Baixo", - "text": "Configurar, se necessário, o acesso ao cluster just-in-time", - "waf": "Segurança" + "text": "Ao usar as Zonas de Disponibilidade do Azure para obter alta disponibilidade, você deve considerar a latência entre servidores de aplicativos SAP e servidores de banco de dados. Para zonas com altas latências, os procedimentos operacionais precisam estar em vigor para garantir que os servidores de aplicativos SAP e os servidores de banco de dados estejam sendo executados na mesma zona o tempo todo.", + "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Baixo", - "text": "Configurar, se necessário, o acesso condicional do AAD para AKS", - "waf": "Segurança" + "checklist": "SAP Checklist", + "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", + "service": "SAP", + "severity": "Alto", + "text": "Configure conexões de Rota Expressa do local para as regiões primária e secundária de recuperação de desastres do Azure. Além disso, como alternativa ao uso da Rota Expressa, considere configurar conexões VPN locais para as regiões primária e secundária de recuperação de desastres do Azure.", + "training": "https://learn.microsoft.com/azure/expressroute/use-s2s-vpn-as-backup-for-expressroute-privatepeering", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", - "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "SAP", "severity": "Baixo", - "text": "Se necessário para cargas de trabalho do Windows AKS, configure o gMSA ", - "waf": "Segurança" + "text": "Replique o conteúdo do cofre de chaves, como certificados, segredos ou chaves entre regiões, para que você possa descriptografar dados na região de recuperação de desastres.", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", + "service": "SAP", "severity": "Média", - "text": "Para um controle mais fino, considere usar uma Identidade Kubelet gerenciada", - "waf": "Segurança" + "text": "Emparelhar as redes virtuais primária e de recuperação de desastres. Por exemplo, para a replicação do sistema HANA, uma rede virtual SAP HANA DB precisa ser emparelhada para a rede virtual SAP HANA DB do site de recuperação de desastres.", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", - "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", - "service": "AKS", - "severity": "Média", - "text": "Se estiver usando AGIC, não compartilhe um AppGW entre clusters", + "checklist": "SAP Checklist", + "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", + "service": "SAP", + "severity": "Baixo", + "text": "Se você usar o armazenamento do Azure NetApp Files para suas implantações SAP, no mínimo, crie duas contas do Azure NetApp Files na camada Premium, em duas regiões.", + "training": "https://learn.microsoft.com/training/modules/choose-service-level-azure-netapp-files-hpc-applications/2-identify-decision-criteria", "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", "severity": "Alto", - "text": "Não use AKS HTTP Routing Add-On, use em vez disso a entrada NGINX gerenciada com o complemento de roteamento de aplicativo.", + "text": "A tecnologia de replicação de banco de dados nativo deve ser usada para sincronizar o banco de dados em um par de HA.", + "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/?source=recommendations", "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", - "service": "AKS", - "severity": "Média", - "text": "Para cargas de trabalho do Windows, use a Rede Acelerada", - "waf": "Desempenho" + "checklist": "SAP Checklist", + "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", + "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", + "service": "SAP", + "severity": "Alto", + "text": "O CIDR da rede virtual primária (VNet) não deve entrar em conflito ou se sobrepor ao CIDR da VNet do site de recuperação de desastres", + "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", + "service": "SAP", "severity": "Alto", - "text": "Use o ALB padrão (em oposição ao básico)", + "text": "Use a Recuperação de Site para replicar um servidor de aplicativos para um site de recuperação de desastres. A Recuperação de Site também pode ajudar na replicação de VMs de cluster de serviços centrais para o site de recuperação de desastres. Ao invocar o DR, você precisará reconfigurar o cluster do Linux Pacemaker no site de DR (por exemplo, substitua o VIP ou o SBD, execute o corosync.conf e muito mais).", + "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Média", - "text": "Se estiver usando o CNI do Azure, considere usar sub-redes diferentes para NodePools", - "waf": "Segurança" + "checklist": "SAP 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", + "severity": "Alto", + "text": "Considere a disponibilidade do software SAP em relação a pontos únicos de falha. Isso inclui pontos únicos de falha em aplicativos como SGBDs utilizados nas arquiteturas SAP NetWeaver e SAP S/4HANA, SAP ABAP e ASCS + SCS. Além disso, outras ferramentas, como o 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": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", - "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", - "service": "AKS", - "severity": "Média", - "text": "Usar Pontos de Extremidade Privados (preferencial) ou Pontos de Extremidade de Serviço de Rede Virtual para acessar serviços de PaaS do cluster", - "waf": "Segurança" + "checklist": "SAP Checklist", + "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", + "service": "SAP", + "severity": "Alto", + "text": "Para bancos de dados SAP e SAP, considere a implementação de clusters de failover automático. No Windows, o Clustering de Failover do Windows Server oferece suporte a failover. No Linux, Linux Pacemaker ou ferramentas de terceiros como SIOS Protection Suite e Veritas InfoScale suportam failover.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", "severity": "Alto", - "text": "Escolha o melhor plug-in de rede CNI para seus requisitos (Azure CNI recomendado)", + "text": "O Azure não oferece suporte a arquiteturas nas quais as VMs primária e secundária compartilham armazenamento para dados DBMS. Para a camada DBMS, o padrão de arquitetura comum é replicar bancos de dados ao mesmo tempo e com pilhas de armazenamento diferentes daquelas que as VMs primária e secundária usam.", + "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": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", + "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", + "service": "SAP", "severity": "Alto", - "text": "Se estiver usando o Azure CNI, dimensione sua sub-rede de acordo considerando o número máximo de pods por nó", - "waf": "Desempenho" + "text": "Os dados do DBMS e os arquivos de log de transação/refazer são armazenados no armazenamento em bloco com suporte do Azure ou nos Arquivos do Azure NetApp. Os Arquivos do Azure ou os Arquivos Premium do Azure não têm suporte como armazenamento para dados DBMS e/ou arquivos de log de refazer com a carga de trabalho SAP.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-databases/2-explore-database-support-azure-for-sap-workloads", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", + "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", + "service": "SAP", "severity": "Alto", - "text": "Se estiver usando o Azure CNI, verifique o máximo de pods/nó (padrão 30)", - "waf": "Desempenho" + "text": "Você pode usar discos compartilhados do Azure no Windows para componentes ASCS + SCS e cenários específicos de alta disponibilidade. Configure seus clusters de failover separadamente para componentes da camada de aplicativo SAP e a camada DBMS. No momento, o Azure não oferece suporte a arquiteturas de alta disponibilidade que combinam componentes da camada de aplicativo SAP e a camada DBMS em um cluster de failover.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "Para aplicativos internos, as organizações geralmente abrem toda a sub-rede AKS em seus firewalls. Isso abre o acesso de rede para os nós também e, potencialmente, para os pods também (se estiver usando o Azure CNI). Se os IPs do LoadBalancer estiverem em uma sub-rede diferente, somente este precisará estar disponível para os clientes do aplicativo. Outra razão é que, se os endereços IP na sub-rede AKS são um recurso escasso, consumir seus endereços IP para serviços reduzirá a escalabilidade máxima do cluster.", - "guid": "13c00567-4b1e-4945-a459-c373e7ed6162", - "link": "https://learn.microsoft.com/azure/aks/internal-lb", - "service": "AKS", - "severity": "Baixo", - "text": "Se estiver usando serviços LoadBalancer de IP privado, use uma sub-rede dedicada (não a sub-rede AKS)", - "waf": "Segurança" + "checklist": "SAP 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", + "severity": "Alto", + "text": "A maioria dos clusters de failover para ASCS (Application Layer Components, componentes da camada de aplicativo) SAP e a camada DBMS exigem um endereço IP virtual para um cluster de failover. O Balanceador de Carga do Azure deve manipular o endereço IP virtual para todos os outros casos. Um princípio de design é usar um balanceador de carga por configuração de cluster. Recomendamos que você use a versão padrão do balanceador de carga (SKU do Standard Load Balancer).", + "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", + "service": "SAP", "severity": "Alto", - "text": "Dimensione o intervalo de endereços IP do serviço de acordo (isso limitará a escalabilidade do cluster)", + "text": "Verifique se o IP flutuante está habilitado no balanceador de carga", + "training": "https://learn.microsoft.com/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", - "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", - "service": "AKS", - "severity": "Baixo", - "text": "Se necessário, adicione seu próprio plugin CNI", - "waf": "Segurança" + "checklist": "SAP Checklist", + "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "SAP", + "severity": "Alto", + "text": "Antes de implantar sua infraestrutura de alta disponibilidade, e dependendo da região escolhida, determine se deseja implantar com um conjunto de disponibilidade do Azure ou uma zona de disponibilidade.", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Baixo", - "text": "Se necessário, configure o IP público por nó no AKS", - "waf": "Desempenho" + "checklist": "SAP 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", + "severity": "Alto", + "text": "Se desejar atender aos SLAs de infraestrutura de seus aplicativos para componentes SAP (serviços centrais, servidores de aplicativos e bancos de dados), você deverá escolher as mesmas opções de alta disponibilidade (VMs, conjuntos de disponibilidade, zonas de disponibilidade) para todos os componentes.", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", - "link": "https://learn.microsoft.com/azure/aks/concepts-network", - "service": "AKS", - "severity": "Média", - "text": "Usar um controlador de entrada para expor aplicativos baseados na Web em vez de expô-los com serviços do tipo LoadBalancer", + "checklist": "SAP Checklist", + "guid": "cbe05bbe-209d-4490-ba47-778424d11678", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", + "severity": "Alto", + "text": "Não misture servidores de funções diferentes no mesmo conjunto de disponibilidade. Mantenha VMs de serviços centrais, VMs de banco de dados, VMs de aplicativos em seus próprios conjuntos de disponibilidade", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", - "link": "https://learn.microsoft.com/azure/aks/nat-gateway", - "service": "AKS", - "severity": "Baixo", - "text": "Usar o Gateway NAT do Azure como outboundType para dimensionar o tráfego de saída", + "checklist": "SAP Checklist", + "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", + "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", + "service": "SAP", + "severity": "Média", + "text": "Você não pode implantar conjuntos de disponibilidade do Azure em uma zona de disponibilidade do Azure, a menos que use grupos de posicionamento de proximidade.", + "training": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Média", - "text": "Usar alocações dinâmicas de IPs para evitar o esgotamento de IP do CNI do Azure", + "checklist": "SAP Checklist", + "guid": "9674e7c7-7796-4181-8920-09f4429543ba", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", + "severity": "Alto", + "text": "Ao criar conjuntos de disponibilidade, use o número máximo de domínios de falha e atualize domínios disponíveis. Por exemplo, se você implantar mais de duas VMs em um conjunto de disponibilidade, use o número máximo de domínios de falha (três) e domínios de atualização suficientes para limitar o efeito de possíveis falhas de hardware físico, interrupções de rede ou interrupções de energia, além da manutenção planejada do Azure. O número padrão de domínios de falha é dois e você não pode alterá-lo online mais tarde.", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "severity": "Alto", - "text": "Filtre o tráfego de saída com AzFW/NVA se seus requisitos de segurança exigirem", - "waf": "Segurança" + "text": "Quando você usa grupos de posicionamento de proximidade do Azure em uma implantação de conjunto de disponibilidade, todos os três componentes SAP (serviços centrais, servidor de aplicativos e banco de dados) devem estar no mesmo grupo de posicionamento de proximidade.", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Média", - "text": "Se estiver usando um ponto de extremidade de API público, restrinja os endereços IP que podem acessá-lo", - "waf": "Segurança" + "checklist": "SAP Checklist", + "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", + "severity": "Alto", + "text": "Use um grupo de posicionamento de proximidade por SAP SID. Os grupos não se estendem por zonas de disponibilidade ou regiões do Azure", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP 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", "severity": "Alto", - "text": "Use clusters privados se seus requisitos exigirem", - "waf": "Segurança" + "text": "Use um dos seguintes serviços para executar clusters de serviços centrais SAP, dependendo do sistema operacional.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "ed46b937-913e-4018-9c62-8393ab037e53", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", + "service": "SAP", "severity": "Média", - "text": "Para os nós AKS do Windows 2019 e 2022, as Diretivas de Rede Calico podem ser usadas ", - "waf": "Segurança" + "text": "No momento, o Azure não oferece suporte à combinação de ASCS e HA de banco de dados no mesmo cluster do Linux Pacemaker; Separe-os em agrupamentos individuais. No entanto, você pode combinar até cinco clusters de serviços centrais em um par de VMs.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Alto", - "text": "Habilitar uma opção de Política de Rede do Kubernetes (Calico/Azure)", - "waf": "Segurança" + "checklist": "SAP 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", + "severity": "Média", + "text": "Implante ambas as VMs no par de alta disponibilidade em um conjunto de disponibilidade ou em zonas de disponibilidade. Essas VMs devem ter o mesmo tamanho e a mesma configuração de armazenamento.", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", - "severity": "Alto", - "text": "Usar diretivas de rede do Kubernetes para aumentar a segurança intra-cluster", - "waf": "Segurança" + "checklist": "SAP 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", + "severity": "Média", + "text": "O Azure oferece suporte à instalação e configuração de instâncias SAP HANA e ASCS/SCS e ERS no mesmo cluster de alta disponibilidade em execução no Red Hat Enterprise Linux (RHEL).", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", "severity": "Alto", - "text": "Usar um WAF para cargas de trabalho da Web (UIs ou APIs)", - "waf": "Segurança" + "text": "Execute todos os sistemas de produção em SSDs gerenciados Premium e use o Azure NetApp Files ou o Ultra Disk Storage. Pelo menos o disco do sistema operacional deve estar na camada Premium para que você possa obter melhor desempenho e o melhor SLA.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Média", - "text": "Usar DDoS Standard na Rede Virtual AKS", - "waf": "Segurança" + "checklist": "SAP Checklist", + "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", + "service": "SAP", + "severity": "Alto", + "text": "Você deve executar o SAP HANA no Azure somente nos tipos de armazenamento certificados pela SAP. Observe que determinados volumes devem ser executados em determinadas configurações de disco, quando aplicável. Essas configurações incluem a habilitação do Acelerador de Gravação e o uso do armazenamento Premium. Você também precisa garantir que o sistema de arquivos executado no armazenamento seja compatível com o DBMS executado na máquina.", + "training": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1?source=recommendations", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Baixo", - "text": "Se necessário, adicione o proxy HTTP da empresa", - "waf": "Segurança" + "checklist": "SAP Checklist", + "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", + "service": "SAP", + "severity": "Alto", + "text": "Considere configurar a alta disponibilidade dependendo do tipo de armazenamento usado para suas cargas de trabalho SAP. Alguns serviços de armazenamento disponíveis no Azure não têm suporte no Azure Site Recovery, portanto, sua configuração de alta disponibilidade pode ser diferente.", + "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/2-explore-disaster-recovery-sap-workloads", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", - "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", - "service": "AKS", - "severity": "Média", - "text": "Considere o uso de uma malha de serviço para gerenciamento avançado de comunicação de microsserviços", - "waf": "Segurança" + "checklist": "SAP Checklist", + "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", + "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", + "service": "SAP", + "severity": "Alto", + "text": "Diferentes serviços de armazenamento nativos do Azure (como Arquivos do Azure, Arquivos do Azure NetApp, Disco Compartilhado do Azure) podem não estar disponíveis em todas as regiões. Portanto, para ter uma configuração SAP semelhante na região de DR após o failover, certifique-se de que o respectivo serviço de armazenamento seja oferecido no local de DR.", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", - "service": "AKS", - "severity": "Alto", - "text": "Configurar alertas nas métricas mais críticas (consulte Insights de contêiner para obter recomendações)", - "waf": "Operações" + "checklist": "SAP 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", + "severity": "Média", + "text": "Automatize o Start-Stop do sistema SAP para gerenciar custos.", + "waf": "Custar" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "337453a3-cc63-4963-9a65-22ac19e80696", - "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", "severity": "Baixo", - "text": "Verifique regularmente o Azure Advisor para obter recomendações sobre o seu cluster", - "waf": "Operações" + "text": "No caso de usar o Armazenamento Premium do Azure com o SAP HANA, o armazenamento SSD padrão do Azure pode ser usado para selecionar uma solução de armazenamento econômica. No entanto, observe que escolher o armazenamento padrão SSD ou HDD padrão do Azure afetará o SLA das VMs individuais. Além disso, para sistemas com menor taxa de transferência de E/S e baixa latência, como ambientes que não são de produção, VMs de série mais baixa podem ser usadas.", + "waf": "Custar" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", - "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "9877f353-2591-4e8b-8381-e9043fed1010", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", "severity": "Baixo", - "text": "Habilitar a rotação automática do certificado AKS", - "waf": "Operações" + "text": "Como uma configuração alternativa de baixo custo (multiuso), você pode escolher uma SKU de baixo desempenho para suas VMs de servidor de banco de dados HANA que não são de produção. No entanto, é importante observar que alguns tipos de VM, como a série E, não são certificados pelo HANA (SAP HANA Hardware Directory) ou não podem atingir latência de armazenamento inferior a 1ms.", + "waf": "Custar" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", - "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", + "service": "SAP", "severity": "Alto", - "text": "Tenha um processo regular para atualizar sua versão do kubernetes periodicamente (trimestralmente, por exemplo), ou use o recurso de atualização automática do AKS", - "waf": "Operações" + "text": "Impor um modelo RBAC para grupos de gerenciamento, assinaturas, grupos de recursos e recursos", + "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", - "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", - "service": "AKS", - "severity": "Alto", - "text": "Use kured para atualizações de nó do Linux caso você não esteja usando a atualização de imagem de nó", - "waf": "Operações" + "checklist": "SAP Checklist", + "guid": "45911475-e39e-4530-accc-d979366bcda2", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", + "severity": "Média", + "text": "Impor a propagação principal para encaminhar a identidade do aplicativo de nuvem SAP para o SAP local (incluindo IaaS) por meio do conector de nuvem", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/2-explore-azure-virtual-machine-auth-access-control", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", - "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", - "service": "AKS", - "severity": "Alto", - "text": "Tenha um processo regular para atualizar as imagens do nó do cluster periodicamente (semanalmente, por exemplo)", - "waf": "Operações" + "checklist": "SAP Checklist", + "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", + "severity": "Média", + "text": "Implemente SSO em aplicativos SAP SaaS como SAP Analytics Cloud, SAP Cloud Platform, Business by design, SAP Qualtrics e SAP C4C com o Azure AD usando SAML.", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", - "service": "AKS", - "severity": "Baixo", - "text": "Considere gitops para implantar aplicativos ou configuração de cluster em vários clusters", - "waf": "Operações" + "checklist": "SAP Checklist", + "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", + "severity": "Média", + "text": "Implemente SSO em aplicativos Web baseados no SAP NetWeaver, como SAP Fiori e SAP Web GUI, usando SAML.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d7672c26-7602-4482-85a4-14527fbe855c", - "link": "https://learn.microsoft.com/azure/aks/command-invoke", - "service": "AKS", - "severity": "Baixo", - "text": "Considere o uso do comando AKS invoke em clusters privados", - "waf": "Operações" + "checklist": "SAP Checklist", + "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", + "service": "SAP", + "severity": "Média", + "text": "Implemente SSO em aplicativos Web baseados no SAP NetWeaver, como SAP Fiori e SAP Web GUI, usando SAML.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/6-exercise-integrate-azure-active-directory-sap-fiori", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", - "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", - "service": "AKS", - "severity": "Baixo", - "text": "Para eventos planejados, considere o uso do Dreno Automático de Nó", - "waf": "Operações" + "checklist": "SAP Checklist", + "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", + "severity": "Média", + "text": "Você pode implementar o SSO no SAP GUI usando o SAP NetWeaver SSO ou uma solução de parceiro.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", - "link": "https://learn.microsoft.com/azure/aks/faq", - "service": "AKS", - "severity": "Alto", - "text": "Desenvolver práticas próprias de governança para garantir que nenhuma alteração seja realizada pelos operadores no nó RG (também conhecido como 'infra RG')", - "waf": "Operações" + "checklist": "SAP Checklist", + "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", + "service": "SAP", + "severity": "Média", + "text": "Para SSO para SAP GUI e acesso ao navegador web, implemente SNC / Kerberos / SPNEGO (mecanismo de negociação GSSAPI simples e protegido) devido a sua facilidade de configuração e manutenção. Para SSO com certificados de cliente X.509, considere o SAP Secure Login Server, que é um componente da solução SAP SSO.", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/9-exercise-integrate-active-directory-sap-single-sign-on", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Baixo", - "text": "Use o nome personalizado do Node RG (também conhecido como 'Infra RG')", - "waf": "Operações" + "checklist": "SAP 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", + "severity": "Média", + "text": "Para SSO para SAP GUI e acesso ao navegador web, implemente SNC / Kerberos / SPNEGO (mecanismo de negociação GSSAPI simples e protegido) devido a sua facilidade de configuração e manutenção. Para SSO com certificados de cliente X.509, considere o SAP Secure Login Server, que é um componente da solução SAP SSO.", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", - "link": "https://kubernetes.io/docs/setup/release/notes/", - "service": "AKS", + "checklist": "SAP 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", "severity": "Média", - "text": "Não use APIs do Kubernetes preteridas em seus manifestos do YAML", - "waf": "Operações" + "text": "Implemente o SSO usando o OAuth for SAP NetWeaver para permitir que aplicativos de terceiros ou personalizados acessem os serviços OData do SAP NetWeaver.", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", - "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", - "service": "AKS", - "severity": "Baixo", - "text": "Manchar os nós do Windows", - "waf": "Operações" + "checklist": "SAP Checklist", + "guid": "a747c350-8d4c-449c-93af-393dbca77c48", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", + "service": "SAP", + "severity": "Média", + "text": "Implementar SSO no SAP HANA", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Baixo", - "text": "Mantenha o nível de patch dos contêineres do Windows sincronizado com o nível do patch do host", - "waf": "Operações" + "checklist": "SAP Checklist", + "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", + "service": "SAP", + "severity": "Média", + "text": "Considere o Azure AD um provedor de identidade para sistemas SAP hospedados no RISE. Para obter mais informações, consulte Integrando o serviço ao Azure AD.", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "Por meio de Configurações de Diagnóstico no nível do cluster", - "guid": "5b56ad48-408f-4e72-934c-476ba280dcf5", - "link": "https://learn.microsoft.com/azure/aks/monitor-aks", - "service": "AKS", - "severity": "Baixo", - "text": "Envie logs mestre (também conhecidos como logs de API) para o Azure Monitor ou sua solução de gerenciamento de logs preferida", - "waf": "Operações" + "checklist": "SAP Checklist", + "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", + "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", + "service": "SAP", + "severity": "Média", + "text": "Para aplicativos que acessam o SAP, convém usar a propagação principal para estabelecer o SSO.", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", - "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", - "service": "AKS", - "severity": "Baixo", - "text": "Se necessário, use instantâneos do nodePool", - "waf": "Custar" + "checklist": "SAP 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", + "severity": "Média", + "text": "Se você estiver usando serviços SAP BTP ou soluções SaaS que exigem o SAP Identity Authentication Service (IAS), considere implementar SSO entre o SAP Cloud Identity Authentication Services e o Azure AD para acessar esses serviços SAP. Essa integração permite que o SAP IAS atue como um provedor de identidade de proxy e encaminhe solicitações de autenticação para o Azure AD como o repositório central do usuário e o provedor de identidade.", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", - "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", - "service": "AKS", - "severity": "Baixo", - "text": "Considere pools de nós spot para cargas de trabalho não sensíveis ao tempo", - "waf": "Operações" + "checklist": "SAP Checklist", + "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", + "service": "SAP", + "severity": "Média", + "text": "Implementar SSO no SAP BTP", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Baixo", - "text": "Considere o nó virtual AKS para intermitência rápida", + "checklist": "SAP 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", + "severity": "Média", + "text": "Se você estiver usando o SAP SuccessFactors, considere usar o provisionamento automatizado de usuários do Azure AD. Com essa integração, à medida que você adiciona novos funcionários ao SAP SuccessFactors, pode criar automaticamente suas contas de usuário no Azure AD. Opcionalmente, você pode criar contas de usuário no Microsoft 365 ou em outros aplicativos SaaS com suporte no Azure AD. Use write-back do endereço de e-mail para SAP SuccessFactors.", + "waf": "Segurança" + }, + { + "checklist": "SAP 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", + "severity": "Média", + "text": "impor políticas existentes do Grupo de Gerenciamento às assinaturas SAP", + "training": "https://learn.microsoft.com/training/modules/enterprise-scale-organization/4-management-group-subscription-organization", "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "severity": "Alto", - "text": "Monitore suas métricas de cluster com o Container Insights (ou outras ferramentas como o Prometheus)", + "text": "Integre aplicativos fortemente acoplados na mesma assinatura SAP para evitar complexidade adicional de roteamento e gerenciamento", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-subscriptions", "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "severity": "Alto", - "text": "Armazene e analise seus logs de cluster com o Container Insights (ou outras ferramentas como Telegraf/ElasticSearch)", + "text": "Aproveite a assinatura como unidade de escala e dimensione nossos recursos, considere implantar a assinatura por ambiente, por exemplo. Sandbox, não-prod, prod ", + "training": "https://learn.microsoft.com/training/modules/configure-subscriptions/?source=recommendations", "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", - "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", - "service": "AKS", - "severity": "Média", - "text": "Monitorar a utilização da CPU e da memória dos nós", + "checklist": "SAP Checklist", + "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", + "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", + "service": "SAP", + "severity": "Alto", + "text": "Garantir o aumento da cota como parte do provisionamento de assinatura (por exemplo, total de núcleos de VM disponíveis em uma assinatura)", + "training": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "1a4835ac-9422-423e-ae80-b123081a5417", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", - "severity": "Média", - "text": "Se estiver usando o Azure CNI, monitore a % de IPs de pod consumidos por nó", + "checklist": "SAP Checklist", + "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", + "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", + "service": "SAP", + "severity": "Baixo", + "text": "A API de Cota é uma API REST que você pode usar para exibir e gerenciar cotas para serviços do Azure. Considere usá-lo, se necessário.", "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "A E/S no disco do sistema operacional é um recurso crítico. Se o sistema operacional nos nós for limitado na E/S, isso pode levar a um comportamento imprevisível, geralmente terminando no nó sendo declarado NotReady", - "guid": "415833ea-3ad3-4c2d-b733-165c3acbe04b", - "link": "https://learn.microsoft.com/azure/virtual-machines/premium-storage-performance", - "service": "AKS", - "severity": "Média", - "text": "Monitorar a profundidade da fila de disco do sistema operacional nos nós", + "checklist": "SAP Checklist", + "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", + "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", + "service": "SAP", + "severity": "Alto", + "text": "Se estiver implantando em uma zona de disponibilidade, verifique se a implantação da zona da VM estará disponível depois que a cota for aprovada. Envie uma solicitação de suporte com a assinatura, a série VM, o número de CPUs e a zona de disponibilidade necessárias.", "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "be209d39-fda4-4777-a424-d116785c2fa5", - "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", - "service": "AKS", - "severity": "Média", - "text": "Se não estiver usando filtragem de saída com AzFW/NVA, monitore as portas SNAT ALB alocadas padrão", + "checklist": "SAP Checklist", + "guid": "e6e20617-3686-4af4-9791-f8935ada4332", + "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", + "service": "SAP", + "severity": "Alto", + "text": "Certifique-se de que os serviços e recursos necessários estejam disponíveis nas regiões de implantação escolhidas, por exemplo. ANF, Zona etc.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/azure-best-practices/multiple-regions?source=recommendations", "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", - "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", + "service": "SAP", "severity": "Média", - "text": "Assine as notificações de integridade de recursos para seu cluster AKS", + "text": "Aproveite a marca de recurso do Azure para categorização de custos e agrupamento de recursos (: BillTo, Departamento (ou Unidade de Negócios), Ambiente (Produção, Estágio, Desenvolvimento), Camada (Camada da Web, Camada de Aplicativo), Proprietário do Aplicativo, ProjectName)", + "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", "severity": "Alto", - "text": "Configurar solicitações e limites nas especificações do pod", - "waf": "Operações" + "text": "Ajude a proteger seu banco de dados HANA usando o serviço de Backup do Azure.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-backup-sap-workloads-azure-virtual-machines/?source=recommendations", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "769ef669-1a48-435a-a942-223ece80b123", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", + "service": "SAP", "severity": "Média", - "text": "Impor cotas de recursos para namespaces", - "waf": "Operações" + "text": "Se você implantar os Arquivos NetApp do Azure para seu banco de dados HANA, Oracle ou DB2, use a ferramenta Azure Application Consistent Snapshot (AzAcSnap) para tirar instantâneos consistentes com o aplicativo. O AzAcSnap também suporta bancos de dados Oracle. Considere usar o AzAcSnap em uma VM central em vez de em VMs individuais.", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "081a5417-4158-433e-a3ad-3c2de733165c", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", "severity": "Alto", - "text": "Verifique se sua assinatura tem cota suficiente para expandir seus nodepools", + "text": "Garanta as correspondências de fuso horário entre o sistema operacional e o sistema SAP.", "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "c3c7abc0-716c-4486-893c-40e181d65539", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", + "service": "SAP", "severity": "Média", - "text": "Usar o Autoscaler de Cluster", - "waf": "Desempenho" + "text": "Não agrupe serviços de aplicativos diferentes no mesmo cluster. Por exemplo, não combine clusters DRBD e de serviços centrais no mesmo cluster. No entanto, você pode usar o mesmo cluster do Pacemaker para gerenciar aproximadamente cinco serviços centrais diferentes (cluster multi-SID).", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "checklist": "SAP Checklist", + "guid": "a491dfc4-9353-4213-9217-eef0949f9467", + "link": "https://azure.microsoft.com/pricing/offers/dev-test/", + "service": "SAP", "severity": "Baixo", - "text": "Personalizar a configuração do nó para pools de nós AKS", - "waf": "Desempenho" + "text": "Considere executar sistemas de desenvolvimento/teste em um modelo de soneca para economizar e otimizar os custos de execução do Azure.", + "waf": "Custar" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", - "link": "https://learn.microsoft.com/azure/aks/concepts-scale", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", + "link": "https://learn.microsoft.com/azure/lighthouse/overview", + "service": "SAP", "severity": "Média", - "text": "Use o Autoscaler do Pod Horizontal quando necessário", - "waf": "Desempenho" + "text": "Se você faz parceria com clientes gerenciando suas propriedades SAP, considere o Farol do Azure. O Azure Lighthouse permite que os provedores de serviços gerenciados usem os serviços de identidade nativos do Azure para se autenticar no ambiente dos clientes. Ele coloca o controle nas mãos dos clientes, porque eles podem revogar o acesso a qualquer momento e auditar as ações dos prestadores de serviços.", + "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "Nós maiores trarão maior desempenho e recursos, como discos efêmeros e rede acelerada, mas aumentarão o raio de explosão e diminuirão a granularidade de dimensionamento", - "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", - "severity": "Alto", - "text": "Considere um tamanho de nó apropriado, não muito grande ou muito pequeno", - "waf": "Desempenho" + "checklist": "SAP 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", + "severity": "Média", + "text": "Use o Azure Update Manager para verificar o status das atualizações disponíveis para uma única VM ou várias VMs e considere agendar patches regulares.", + "training": "https://learn.microsoft.com/training/modules/keep-your-virtual-machines-updated/?source=recommendations", + "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", - "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", + "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", + "service": "SAP", "severity": "Baixo", - "text": "Se mais de 5000 nós forem necessários para escalabilidade, considere o uso de um cluster AKS adicional", - "waf": "Desempenho" + "text": "Otimize e gerencie as operações do SAP Basis usando o SAP Landscape Management (LaMa). Use o conector SAP LaMa para Azure para realocar, copiar, clonar e atualizar sistemas SAP.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-remote-management/?source=recommendations", + "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", - "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", - "service": "AKS", - "severity": "Baixo", - "text": "Considere assinar o EventGrid Events para automação AKS", - "waf": "Desempenho" + "checklist": "SAP Checklist", + "guid": "14591147-5e39-4e53-89cc-cd979366bcda", + "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", + "service": "SAP", + "severity": "Média", + "text": "Use as soluções do Azure Monitor for SAP para monitorar suas cargas de trabalho SAP (SAP HANA, clusters SUSE de alta disponibilidade e sistemas SQL) no Azure. Considere complementar o Azure Monitor para soluções SAP com o SAP Solution Manager.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", + "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", - "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", - "service": "AKS", - "severity": "Baixo", - "text": "Para operações de longa duração em um cluster AKS, considere o encerramento do evento", - "waf": "Desempenho" + "checklist": "SAP Checklist", + "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", + "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", + "service": "SAP", + "severity": "Alto", + "text": "Execute uma verificação de extensão de VM para SAP. A Extensão de VM para SAP usa a identidade gerenciada atribuída de uma máquina virtual (VM) para acessar dados de monitoramento e configuração de VM. A verificação garante que todas as métricas de desempenho em seu aplicativo SAP venham da Extensão do Azure para SAP subjacente.", + "training": "https://learn.microsoft.com/training/modules/configure-azure-enhanced-monitoring-extension-for-sap/?source=recommendations", + "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", - "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", - "service": "AKS", - "severity": "Baixo", - "text": "Se necessário, considere usar hosts dedicados do Azure para nós AKS", - "waf": "Desempenho" + "checklist": "SAP Checklist", + "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "SAP", + "severity": "Média", + "text": "Use a Política do Azure para controle de acesso e relatórios de conformidade. A Política do Azure fornece a capacidade de impor configurações em toda a organização para garantir a adesão consistente à política e a detecção rápida de violações. ", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "Alto", - "text": "Usar discos efêmeros do sistema operacional", - "waf": "Desempenho" + "checklist": "SAP Checklist", + "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", + "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", + "service": "SAP", + "severity": "Média", + "text": "Use o Monitor de Conexão no Inspetor de Rede do Azure para monitorar métricas de latência para bancos de dados SAP e servidores de aplicativos. Ou colete e exiba medições de latência de rede usando o Azure Monitor.", + "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/collecting-and-displaying-niping-network-latency-measurements/ba-p/1833979", + "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", - "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", - "service": "AKS", - "severity": "Alto", - "text": "Para discos não efêmeros, use IOPS altos e discos maiores do sistema operacional para os nós ao executar muitos pods/nó, pois requer alto desempenho para executar vários pods e gerará logs enormes com limites de rotação de log AKS padrão", - "waf": "Desempenho" + "checklist": "SAP Checklist", + "guid": "73686af4-6791-4f89-95ad-a43324e13811", + "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", + "service": "SAP", + "severity": "Média", + "text": "Execute uma verificação de qualidade para o SAP HANA na infraestrutura provisionada do Azure para verificar se as VMs provisionadas estão em conformidade com as práticas recomendadas do SAP HANA no Azure.", + "waf": "Operações" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", - "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", - "service": "AKS", - "severity": "Baixo", - "text": "Para a opção de armazenamento de hiperdesempenho, use Ultra Disks no AKS", + "checklist": "SAP Checklist", + "guid": "616785d6-fa96-4c96-ad88-518f482734c8", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", + "severity": "Alto", + "text": "Para cada assinatura do Azure, execute um teste de latência nas zonas de disponibilidade do Azure antes da implantação zonal para escolher zonas de baixa latência para implantação do SAP no Azure.", + "training": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/AvZone-Latency-Test", "waf": "Desempenho" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", + "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", + "service": "SAP", "severity": "Média", - "text": "Evite manter o estado no cluster e armazene dados fora (AzStorage, AzSQL, Cosmos, etc)", - "waf": "Desempenho" + "text": "Execute o Relatório de Resiliência para garantir que a configuração de toda a infraestrutura provisionada do Azure (Computação, Banco de Dados, Rede, Armazenamento, Recuperação de Site) esteja em conformidade com a configuração definida pelo Cloud Adaption Framework para Azure.", + "training": "https://learn.microsoft.com/training/paths/azure-well-architected-framework/", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", + "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", + "service": "SAP", "severity": "Média", - "text": "Se estiver usando o AzFiles Standard, considere o AzFiles Premium e/ou ANF por motivos de desempenho", - "waf": "Desempenho" + "text": "Implemente a proteção contra ameaças usando a solução Microsoft Sentinel para SAP. Use esta solução para monitorar seus sistemas SAP e detectar ameaças sofisticadas em toda a lógica de negócios e camadas de aplicativos.", + "training": "https://learn.microsoft.com/training/modules/plan-microsoft-sentinel-deployment-sap/?source=recommendations", + "waf": "Segurança" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", - "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", - "service": "AKS", + "checklist": "SAP Checklist", + "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", + "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", + "service": "SAP", "severity": "Média", - "text": "Se estiver usando Discos e AZs do Azure, considere ter nodepools dentro de uma zona para disco LRS com VolumeBindingMode:WaitForFirstConsumer para provisionar armazenamento na zona direita ou use o disco ZRS para nodepools abrangendo várias zonas", - "waf": "Desempenho" + "text": "A marcação do Azure pode ser aproveitada para agrupar e controlar recursos logicamente, automatizar suas implantações e, o mais importante, fornecer visibilidade sobre os custos incorridos.", + "training": "https://learn.microsoft.com/training/modules/analyze-costs-create-budgets-azure-cost-management/?source=recommendations", + "waf": "Operações" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "O Hub de Eventos do Azure fornece criptografia de dados em repouso. Se você usar sua própria chave, os dados ainda serão criptografados usando a chave gerenciada pela Microsoft, mas, além disso, a chave gerenciada pela Microsoft será criptografada usando a chave gerenciada pelo cliente. ", - "guid": "7aaf12e7-b94e-4f6e-847d-2d92981b1cd6", - "link": "https://learn.microsoft.com/azure/event-hubs/configure-customer-managed-key", - "service": "Event Hubs", + "checklist": "SAP Checklist", + "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", + "service": "SAP", "severity": "Baixo", - "text": "Usar a opção de chave gerenciada pelo cliente na criptografia de dados em repouso quando necessário", - "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", - "waf": "Segurança" + "text": "Use o monitoramento de latência entre VMs para aplicativos sensíveis à latência.", + "waf": "Desempenho" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Os namespaces dos Hubs de Eventos do Azure permitem que os clientes enviem e recebam dados com TLS 1.0 e superior. Para impor medidas de segurança mais rígidas, você pode configurar o namespace dos Hubs de Eventos para exigir que os clientes enviem e recebam dados com uma versão mais recente do TLS. Se um namespace de Hubs de Eventos exigir uma versão mínima do TLS, todas as solicitações feitas com uma versão mais antiga falharão. ", - "guid": "d2f54b29-769e-43a6-a0e7-828ac936657e", - "link": "https://learn.microsoft.com/azure/event-hubs/transport-layer-security-configure-minimum-version", - "service": "Event Hubs", + "checklist": "SAP Checklist", + "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", "severity": "Média", - "text": "Impor uma versão mínima necessária do TLS (Transport Layer Security) para solicitações ", - "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", - "waf": "Segurança" + "text": "Use o monitoramento do Azure Site Recovery para manter a integridade do serviço de recuperação de desastres para servidores de aplicativos SAP.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Quando você cria um namespace de Hubs de Eventos, uma regra de política chamada RootManageSharedAccessKey é criada automaticamente para o namespace. Essa política tem permissões de gerenciamento para todo o namespace. É recomendável que você trate essa regra como uma conta raiz administrativa e não a use em seu aplicativo. Recomenda-se o uso do AAD como um provedor de autenticação com RBAC. ", - "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", + "checklist": "SAP Checklist", + "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", "severity": "Média", - "text": "Evite usar conta root quando não for necessário", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", - "waf": "Segurança" + "text": "Exclua todos os sistemas de arquivos de banco de dados e programas executáveis das verificações antivírus. Incluí-los pode levar a problemas de desempenho. Verifique com os fornecedores do banco de dados para obter detalhes prescritivos na lista de exclusão. Por exemplo, a Oracle recomenda excluir /oracle//sapdata das verificações antivírus.", + "waf": "Desempenho" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "As identidades gerenciadas para recursos do Azure podem autorizar o acesso a recursos dos Hubs de Eventos usando credenciais do Azure AD de aplicativos em execução em VMs (Máquinas Virtuais) do Azure, aplicativos de Função, Conjuntos de Dimensionamento de Máquina Virtual e outros serviços. Usando identidades gerenciadas para recursos do Azure junto com a autenticação do Azure AD, você pode evitar o armazenamento de credenciais com seus aplicativos executados na nuvem. ", - "guid": "3a365a5c-7acb-4e48-abd5-4cd79f2e8776", - "link": "https://learn.microsoft.com/azure/event-hubs/authenticate-managed-identity?tabs=latest", - "service": "Event Hubs", + "checklist": "SAP Checklist", + "guid": "c027f893-f404-41a9-b33d-39d625a14964", + "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", + "service": "SAP", + "severity": "Baixo", + "text": "Considere a coleta de estatísticas completas de banco de dados para bancos de dados não-HANA após a migração. Por exemplo, implemente a nota SAP 1020260 - Entrega de estatísticas Oracle.", + "waf": "Desempenho" + }, + { + "checklist": "SAP Checklist", + "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", + "service": "SAP", "severity": "Média", - "text": "Quando possível, seu aplicativo deve estar usando uma identidade gerenciada para autenticar no Hub de Eventos do Azure. Caso contrário, considere ter a credencial de armazenamento (SAS, credencial da entidade de serviço) no Cofre de Chaves do Azure ou em um serviço equivalente", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", - "waf": "Segurança" + "text": "Considere o uso do Oracle Automatic Storage Management (ASM) para todas as implantações Oracle que usam SAP no Azure.", + "training": "https://learn.microsoft.com/training/paths/administer-infrastructure-resources-in-azure/?source=recommendations", + "waf": "Desempenho" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Ao criar permissões, forneça controle refinado sobre o acesso de um cliente ao Hub de Eventos do Azure. As permissões no Hub de Eventos do Azure podem e devem ter o escopo definido para o nível de recurso individual, por exemplo, grupo de consumidores, entidade de hub de eventos, namespaces de hub de eventos, 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", - "severity": "Alto", - "text": "Usar RBAC do plano de dados de privilégios mínimos", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", - "waf": "Segurança" - }, - { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Os logs de recursos do Hub de Eventos do Azure incluem logs operacionais, logs de rede virtual e logs de Kafka. Os logs de auditoria de tempo de execução capturam informações de diagnóstico agregadas para todas as operações de acesso ao plano de dados (como eventos de envio ou recebimento) nos Hubs de Eventos.", - "guid": "b38b875b-a1cf-4104-a900-3a4d3ce474db", - "link": "https://learn.microsoft.com/azure/event-hubs/monitor-event-hubs-reference", - "service": "Event Hubs", + "checklist": "SAP 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", "severity": "Média", - "text": "Habilite o registro em log para investigação de segurança. Use o Azure Monitor para capturar métricas e logs como logs de recursos, logs de auditoria de tempo de execução e logs Kafka", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", - "waf": "Segurança" + "text": "Para SAP no Azure executando Oracle, uma coleção de scripts SQL pode ajudá-lo a diagnosticar problemas de desempenho. Os relatórios do Automatic Workload Repository (AWR) contêm informações valiosas para diagnosticar problemas no sistema Oracle. Recomendamos que você execute um relatório AWR durante várias sessões e escolha horários de pico para ele, para garantir uma ampla cobertura para a análise.", + "training": "https://learn.microsoft.com/ja-jp/azure/well-architected/oracle-iaas/performance-efficiency", + "waf": "Desempenho" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Por padrão, o Hub de Eventos do Azure tem um endereço IP público e pode ser acessado pela Internet. Os pontos de extremidade privados permitem que o tráfego entre sua rede virtual e o Hub de Eventos do Azure percorra a rede de backbone da Microsoft. Além disso, você deve desabilitar os pontos de extremidade públicos se eles não forem usados. ", - "guid": "5abca2a4-eda1-4dae-8cc9-5d48c6b791dc", - "link": "https://learn.microsoft.com/azure/event-hubs/private-link-service", - "service": "Event Hubs", - "severity": "Média", - "text": "Considere o uso de pontos de extremidade privados para acessar o Hub de Eventos do Azure e desabilitar o acesso à rede pública quando aplicável.", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", - "waf": "Segurança" + "checklist": "SAP Checklist", + "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", + "severity": "Alto", + "text": "Use o monitoramento do Azure Site Recovery para manter a integridade do serviço de recuperação de desastres para servidores de aplicativos SAP.", + "training": "https://learn.microsoft.com/training/modules/protect-on-premises-infrastructure-with-azure-site-recovery/?source=recommendations", + "waf": "Operações" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Com o firewall IP, você pode restringir ainda mais o ponto de extremidade público a apenas um conjunto de endereços IPv4 ou intervalos de endereços IPv4 na notação CIDR (Roteamento entre Domínios Sem Classe). ", - "guid": "a0e6c465-89e5-458b-a37d-3974d1112dbd", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-ip-filtering", - "service": "Event Hubs", + "checklist": "SAP Checklist", + "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "SAP", "severity": "Média", - "text": "Considere permitir apenas o acesso ao namespace do Hub de Eventos do Azure a partir de endereços IP ou intervalos específicos", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "text": "Para a entrega segura de aplicativos HTTP/S, use o Application Gateway v2 e verifique se a proteção e as políticas do WAF estão habilitadas.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/", "waf": "Segurança" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "31d41e36-11c8-417b-8afb-c410d4391898", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-AEH_v1.docx", - "service": "Event Hubs", + "checklist": "SAP 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", "severity": "Média", - "text": "Aproveite o Manual de Resilência do FTA", - "waf": "Fiabilidade" + "text": "Se o DNS ou o nome virtual da máquina virtual não for alterado durante a migração para o Azure, o DNS em segundo plano e os nomes virtuais conectam muitas interfaces do sistema no cenário SAP, e os clientes só às vezes estão cientes das interfaces que os desenvolvedores definem ao longo do tempo. Surgem desafios de conexão entre vários sistemas quando os nomes virtuais ou DNS mudam após as migrações, e é recomendável manter os aliases DNS para evitar esses tipos de dificuldades.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", + "waf": "Operações" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": " Isso será ativado automaticamente para um novo namespace de EH criado a partir do portal com SKUs Premium, Dedicado ou Standard em uma região habilitada para região. Os metadados do EH e os próprios dados do evento são replicados entre zonas", - "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", - "severity": "Alto", - "text": "Aproveite as zonas de disponibilidade, se aplicável regionalmente", - "waf": "Fiabilidade" + "checklist": "SAP 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", + "severity": "Média", + "text": "Use zonas DNS diferentes para distinguir cada ambiente (sandbox, desenvolvimento, pré-produção e produção) um do outro. A exceção é para implantações SAP com sua própria VNet; aqui, zonas DNS privadas podem não ser necessárias.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", + "waf": "Operações" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "20b56c56-ad58-4519-8f82-735c586bb281", - "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", - "service": "Event Hubs", + "checklist": "SAP Checklist", + "guid": "a3592829-e6e2-4061-9368-6af46791f893", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", + "service": "SAP", "severity": "Média", - "text": "Use os SKUs Premium ou Dedicado para desempenho previsível", + "text": "Emparelhamento de rede virtual local e global fornecem conectividade e são as abordagens preferidas para garantir a conectividade entre zonas de aterrissagem para implantações SAP em várias regiões do Azure", + "training": "https://learn.microsoft.com/training/modules/configure-vnet-peering/?source=recommendations", "waf": "Fiabilidade" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "O recurso interno de recuperação de desastres geográficos, quando habilitado, garante que toda a configuração de um namespace (Hubs de Eventos, Grupos de Consumidores e configurações) seja replicada continuamente de um namespace primário para um namespace secundário e permite uma movimentação de failover única do primário para o secundário a qualquer momento. O recurso Ativo/Passivo foi projetado para facilitar a recuperação e o abandono de uma região do Azure com falha sem precisar alterar as configurações do aplicativo", - "guid": "dc15a1c0-75ee-49f1-90ac-ccd579376bcd", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-geo-dr?tabs=portal", - "service": "Event Hubs", + "checklist": "SAP Checklist", + "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", + "service": "SAP", "severity": "Alto", - "text": "Planejar a recuperação de desastres geográficos usando a configuração passiva ativa", - "waf": "Fiabilidade" - }, - { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Deve ser usado para configurações de DR em que uma interrupção ou perda de dados de eventos na região derrubada não pode ser tolerada. Para esses casos, siga as diretrizes de replicação e não use o recurso interno de recuperação de desastres geográficos (ativo/passivo). Com Ativo/Ativo, mantenha vários Hubs de Eventos em diferentes regiões e namespaces, e os eventos serão replicados entre os hubs", - "guid": "6e31b67d-67ba-4591-89c0-9e805d597c7e", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-federation-overview", - "service": "Event Hubs", - "severity": "Média", - "text": "Para aplicativos críticos para os negócios, use a configuração ativa", - "waf": "Fiabilidade" + "text": "Não há suporte para implantar qualquer NVA entre o aplicativo SAP e o servidor de banco de dados SAP", + "training": "https://me.sap.com/notes/2731110", + "waf": "Desempenho" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", - "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", - "service": "Event Hubs", + "checklist": "SAP Checklist", + "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", + "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", + "service": "SAP", "severity": "Média", - "text": "Projetar Hubs de Eventos Resilientes", - "waf": "Fiabilidade" + "text": "Use a WAN Virtual para implantações do Azure em redes novas, grandes ou globais onde você precisa de conectividade de trânsito global entre regiões do Azure e locais locais. Com essa abordagem, você não precisará configurar manualmente o roteamento transitivo para a rede do Azure e poderá seguir um padrão para implantações do SAP no Azure.", + "training": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", + "waf": "Operações" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", - "service": "Bot service", + "checklist": "SAP Checklist", + "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", + "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", + "service": "SAP", "severity": "Média", - "text": "Siga as recomendações de suporte de confiabilidade no Serviço de Bot do Azure", - "waf": "Fiabilidade" + "text": "Considere a implantação de dispositivos virtuais de rede (NVAs) entre regiões somente se NVAs de parceiros forem usados. NVAs entre regiões ou VNets não são necessários se NVAs nativos estiverem presentes. Ao implantar tecnologias de rede de parceiros e NVAs, siga as orientações do fornecedor para verificar configurações conflitantes com a rede do Azure.", + "training": "https://learn.microsoft.com/training/modules/control-network-traffic-flow-with-routes/?source=recommendations", + "waf": "Operações" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", - "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", - "service": "Bot service", + "checklist": "SAP Checklist", + "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", + "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", + "service": "SAP", "severity": "Média", - "text": "Implantando bots com residência de dados local e conformidade regional", - "waf": "Fiabilidade" + "text": "A WAN virtual gerencia a conectividade entre VNets spoke para topologias baseadas em WAN virtual (não há necessidade de configurar o roteamento definido pelo usuário [UDR] ou NVAs), e a taxa de transferência máxima de rede para o tráfego de VNet-to-VNet no mesmo hub virtual é de 50 gigabits por segundo. Se necessário, as zonas de aterrissagem SAP podem usar o emparelhamento de VNet para se conectar a outras zonas de aterrissagem e superar essa limitação de largura de banda.", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/?source=recommendations", + "waf": "Operações" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "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", - "severity": "Média", - "text": "O Serviço de Bot do Azure é executado no modo ativo-ativo para serviços globais e regionais. Quando ocorre uma paralisação, você não precisa detectar erros ou gerenciar o serviço. O Serviço de Bot do Azure executa automaticamente o failover automático e a recuperação automática em uma arquitetura geográfica de várias regiões. Para o serviço regional de bot da UE, o Serviço de Bot do Azure fornece duas regiões completas dentro da Europa com replicação ativa/ativa para garantir redundância. Para o serviço de bot global, todas as regiões/geografias disponíveis podem ser servidas como a presença global.", - "waf": "Fiabilidade" + "checklist": "SAP 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", + "severity": "Alto", + "text": "A atribuição de IP público à VM que executa o SAP Workload não é recomendada.", + "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Azure Functions", + "checklist": "SAP 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", "severity": "Alto", - "text": "Selecione o plano de hospedagem de função certo com base em seus requisitos de negócios e SLO", - "waf": "Fiabilidade" + "text": "Considere reservar o endereço IP no lado do DR ao configurar o ASR", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Operações" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Azure Functions", + "checklist": "SAP 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", "severity": "Alto", - "text": "Aproveitar zonas de disponibilidade quando aplicável regionalmente (não disponível para a camada de consumo)", - "waf": "Fiabilidade" + "text": "Evite usar intervalos de endereços IP sobrepostos para sites de produção e DR.", + "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", + "waf": "Operações" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "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", + "checklist": "SAP Checklist", + "guid": "6e154e3a-a359-4282-ae6e-206173686af4", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", + "service": "SAP", "severity": "Média", - "text": "Considere uma estratégia de DR entre regiões para cargas de trabalho críticas", - "waf": "Fiabilidade" + "text": "Embora o Azure ajude você a criar várias sub-redes delegadas em uma rede virtual, apenas uma sub-rede delegada pode existir em uma rede virtual para arquivos do Azure NetApp. As tentativas de criar um novo volume falharão se você usar mais de uma sub-rede delegada para Arquivos do Azure NetApp.", + "training": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-network-topologies?source=recommendations", + "waf": "Operações" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "Azure Functions", - "severity": "Alto", - "text": "Se estiver implantando em um ambiente isolado, use ou migre para o ASE (Ambiente do Serviço de Aplicativo) v3", - "waf": "Fiabilidade" + "checklist": "SAP 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", + "severity": "Média", + "text": "Usar o Firewall do Azure para controlar o tráfego de saída do Azure para a Internet, conexões de entrada não HTTP/S e filtragem de tráfego Leste/Oeste (se a organização exigir)", + "training": "https://learn.microsoft.com/training/paths/secure-networking-infrastructure/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "Azure Functions", - "severity": "Alto", - "text": "Verifique se 'Sempre Ativado' está habilitado para todos os Aplicativos de Função em execução no Plano do Serviço de Aplicativo", - "waf": "Fiabilidade" + "checklist": "SAP Checklist", + "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", + "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", + "service": "SAP", + "severity": "Média", + "text": "O Application Gateway e o Web Application Firewall têm limitações quando o Application Gateway serve como um proxy reverso para aplicativos Web SAP, conforme mostrado na comparação entre o Application Gateway, o SAP Web Dispatcher e outros serviços de terceiros.", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/si/3362959506.html", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "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", + "checklist": "SAP Checklist", + "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "SAP", "severity": "Média", - "text": "Emparelhe um aplicativo de função com sua própria conta de armazenamento. Tente não reutilizar contas de armazenamento para aplicativos de função, a menos que eles estejam firmemente acoplados", - "waf": "Fiabilidade" + "text": "Use as políticas do Azure Front Door e do WAF para fornecer proteção global entre as regiões do Azure para conexões HTTP/S de entrada para uma zona de aterrissagem.", + "training": "https://learn.microsoft.com/training/paths/secure-application-delivery/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "Azure Functions", + "checklist": "SAP Checklist", + "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", + "service": "SAP", "severity": "Média", - "text": "Aproveite o Azure DevOps ou o GitHub para simplificar o CI/CD e proteger seu código do Aplicativo de Função", - "waf": "Operações" + "text": "Aproveite as políticas do Web Application Firewall no Azure Front Door quando estiver usando o Azure Front Door e o Application Gateway para proteger aplicativos HTTP/S. Bloqueie o Gateway de Aplicativo para receber tráfego somente do Azure Front Door.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", - "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", - "service": "Logic Apps", - "severity": "Alto", - "text": "Selecione o plano de hospedagem de aplicativo lógico certo com base em seus requisitos de negócios e SLO", - "waf": "Fiabilidade" + "checklist": "SAP Checklist", + "guid": "5ada4332-4e13-4811-9231-81aa41742694", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "SAP", + "severity": "Média", + "text": "Use um firewall de aplicativo Web para verificar seu tráfego quando ele estiver exposto à Internet. Outra opção é usá-lo com seu balanceador de carga ou com recursos que tenham recursos internos de firewall, como o Application Gateway ou soluções de terceiros.", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps 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", - "severity": "Alto", - "text": "Proteja aplicativos lógicos contra falhas de região com redundância de zona e zonas de disponibilidade", - "waf": "Fiabilidade" + "checklist": "SAP Checklist", + "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "SAP", + "severity": "Média", + "text": "Use a WAN Virtual para implantações do Azure em redes novas, grandes ou globais onde você precisa de conectividade de trânsito global entre regiões do Azure e locais locais. Com essa abordagem, você não precisará configurar manualmente o roteamento transitivo para a rede do Azure e poderá seguir um padrão para implantações do SAP no Azure.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/10-explore-azure-front-door", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps 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", - "severity": "Alto", - "text": "Considere uma estratégia de DR entre regiões para cargas de trabalho críticas", - "waf": "Fiabilidade" + "checklist": "SAP Checklist", + "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", + "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", + "service": "SAP", + "severity": "Média", + "text": "Para evitar o vazamento de dados, use o Link Privado do Azure para acessar com segurança recursos de plataforma como serviço, como Armazenamento de Blobs do Azure, Arquivos do Azure, Azure Data Lake Storage Gen2, Azure Data Factory e muito mais. O Ponto de Extremidade Privado do Azure também pode ajudar a proteger o tráfego entre VNets e serviços como o Armazenamento do Azure, o Backup do Azure e muito mais. O tráfego entre sua rede virtual e o serviço habilitado para ponto de extremidade privado viaja pela rede global da Microsoft, o que impede sua exposição à Internet pública.", + "training": "https://learn.microsoft.com/training/modules/design-implement-private-access-to-azure-services/?source=recommendations", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", - "link": "https://learn.microsoft.com/azure/app-service/environment/intro", - "service": "Logic Apps", + "checklist": "SAP Checklist", + "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", + "service": "SAP", "severity": "Alto", - "text": "Se estiver implantando em um ambiente isolado, use ou migre para o ASE (Ambiente do Serviço de Aplicativo) v3", - "waf": "Fiabilidade" + "text": "Verifique se a rede acelerada do Azure está habilitada nas VMs usadas nas camadas de aplicativo SAP e DBMS.", + "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", - "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", - "service": "Logic Apps", + "checklist": "SAP Checklist", + "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", + "service": "SAP", "severity": "Média", - "text": "Aproveite o Azure DevOps ou o GitHub para simplificar o CI/CD e proteger seu código de Aplicativo Lógico", - "waf": "Operações" + "text": "Verifique se as implantações internas do Azure Load Balancer estão configuradas para usar DSR (Direct Server Return). Essa configuração (Habilitando IP flutuante) reduzirá a latência quando as configurações internas do balanceador de carga forem usadas para configurações de alta disponibilidade na camada DBMS.", + "training": "https://learn.microsoft.com/ja-jp/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", + "waf": "Segurança" }, { - "checklist": "Identity Review Checklist", - "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", - "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", - "service": "Entra", + "checklist": "SAP Checklist", + "guid": "6791f893-5ada-4433-84e1-3811523181aa", + "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "service": "SAP", "severity": "Média", - "text": "Use o token revogável de longa duração, armazene seu token em cache e adquira o token silenciosamente usando a Microsoft Identity Library", - "waf": "Fiabilidade" + "text": "Você pode usar as regras ASG (grupo de segurança de aplicativo) e NSG para definir listas de controle de acesso de segurança de rede entre o aplicativo SAP e as camadas DBMS. Os ASGs agrupam máquinas virtuais para ajudar a gerenciar sua segurança.", + "training": "https://learn.microsoft.com/training/modules/configure-network-security-groups/?source=recommendations", + "waf": "Segurança" }, { - "checklist": "Identity Review Checklist", - "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", - "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", - "service": "AAD B2C", - "severity": "Média", - "text": "Certifique-se de que os fluxos de usuário de entrada sejam armazenados em backup e resilientes. Certifique-se de que o código que você usa para entrar em seus usuários é de backup e recuperável. Interfaces resilientes com processos externos", - "waf": "Fiabilidade" + "checklist": "SAP Checklist", + "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", + "severity": "Alto", + "text": "Não há suporte para a colocação da camada de aplicativo SAP e do SGBD SAP em diferentes VNets do Azure que não são emparelhadas.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "Desempenho" }, { - "checklist": "Identity Review 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", + "checklist": "SAP Checklist", + "guid": "fa96c96a-d885-418f-9827-34c886ba2802", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "severity": "Média", - "text": "Os ativos de marca personalizados devem ser hospedados em uma CDN", + "text": "Para obter a latência de rede ideal com aplicativos SAP, considere o uso de grupos de posicionamento de proximidade do Azure.", + "training": "https://learn.microsoft.com/azure/virtual-machines/co-location#planned-maintenance-and-proximity-placement-groups", "waf": "Desempenho" }, { - "checklist": "Identity Review Checklist", - "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", - "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", - "service": "AAD B2C", - "severity": "Baixo", - "text": "Ter vários provedores de identidade (ou seja, fazer login com suas contas da Microsoft, Google, Facebook)", - "waf": "Fiabilidade" - }, - { - "checklist": "Identity Review 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", - "severity": "Média", - "text": "Siga as regras de VM para alta disponibilidade no nível da VM (discos premium, dois ou mais em uma região, em zonas de disponibilidade diferentes)", - "waf": "Fiabilidade" + "checklist": "SAP Checklist", + "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", + "severity": "Alto", + "text": "NÃO há suporte para executar uma camada do SAP Application Server e uma camada de DBMS dividida entre o local e o Azure. Ambas as camadas precisam residir completamente no local ou no Azure.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "Desempenho" }, { - "checklist": "Identity Review 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", - "severity": "Média", - "text": "Não replique! A replicação pode criar problemas com a sincronização de diretórios", - "waf": "Fiabilidade" + "checklist": "SAP Checklist", + "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", + "severity": "Alto", + "text": "Não é recomendado hospedar o sistema de gerenciamento de banco de dados (DBMS) e as camadas de aplicativos dos sistemas SAP em diferentes VNets e conectá-los ao emparelhamento de VNet devido aos custos substanciais que o tráfego de rede excessivo entre as camadas pode produzir. Recomende o uso de sub-redes na rede virtual do Azure para separar a camada de aplicativo SAP e a camada DBMS.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "Custar" }, { - "checklist": "Identity Review 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", - "severity": "Média", - "text": "Ter ativo-ativo para várias regiões", - "waf": "Fiabilidade" + "checklist": "SAP Checklist", + "guid": "402a9846-d515-4061-aff8-cd30088693fa", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", + "service": "SAP", + "severity": "Alto", + "text": "Se estiver usando o Load Balancer com sistemas operacionais convidados Linux, verifique se o parâmetro de rede Linux net.ipv4.tcp_timestamps está definido como 0.", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "Desempenho" }, { - "checklist": "Identity Review Checklist", - "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", + "checklist": "SAP Checklist", + "guid": "87585797-5551-4d53-bb7d-a94ee415734d", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", + "service": "SAP", "severity": "Média", - "text": "Adicionar carimbos de serviço de Domínio do Azure AD a regiões e locais adicionais", - "waf": "Fiabilidade" + "text": "Para implantações SAP RISE/ECS, o emparelhamento virtual é a maneira preferida de estabelecer conectividade com o ambiente existente do Azure do cliente. Tanto a vnet do SAP quanto a(s) vnet(s) do cliente são protegidas com grupos de segurança de rede (NSG), permitindo a comunicação nas portas SAP e de banco de dados por meio do emparelhamento vnet", + "waf": "Segurança" }, { - "checklist": "Identity Review Checklist", - "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", - "severity": "Média", - "text": "Usar conjuntos de réplicas para DR", - "waf": "Fiabilidade" + "checklist": "SAP Checklist", + "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", + "severity": "Alto", + "text": "Revise os backups de banco de dados do SAP HANA para VMs do Azure.", + "waf": "Custar" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "ab91932c-9fc9-4d1b-a881-37f5e6c0cb9e", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ADF_v1.docx", - "service": "Azure Data Factory", + "checklist": "SAP Checklist", + "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", "severity": "Média", - "text": "Aproveite o Manual de Resiliência de FTA para o Azure Data Factory", - "waf": "Fiabilidade" + "text": "Revise o monitoramento interno do Site Recovery, quando usado para SAP.", + "waf": "Custar" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "e503547c-d447-4e82-9138-a7200f1cac6d", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", + "checklist": "SAP Checklist", + "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", + "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", + "service": "SAP", "severity": "Alto", - "text": "Usar pipelines redundantes de zona em regiões que oferecem suporte a zonas de disponibilidade", - "waf": "Fiabilidade" + "text": "Revise as diretrizes de monitoramento do cenário do sistema SAP HANA.", + "waf": "Operações" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "9ef1d6e8-32e5-42e3-911c-818b1a0bc511", - "link": "https://learn.microsoft.com/azure/data-factory/source-control", - "service": "Azure Data Factory", + "checklist": "SAP Checklist", + "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", + "service": "SAP", "severity": "Média", - "text": "Usar DevOps para fazer backup dos modelos ARM com a integração Github/Azure DevOps ", - "waf": "Fiabilidade" + "text": "Revise o Banco de Dados Oracle nas estratégias de backup de VM do Linux do Azure.", + "waf": "Operações" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "e43a18a9-cd29-49cf-b7b1-7db8255562f2", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", + "checklist": "SAP 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", "severity": "Média", - "text": "Certifique-se de replicar as VMs do Self-Hosted Integration Runtime em outra região ", - "waf": "Fiabilidade" + "text": "Analise o uso do Armazenamento de Blobs do Azure com o SQL Server 2016.", + "waf": "Operações" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "aee4563a-fd83-4393-98b2-62d6dc5f512a", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", + "checklist": "SAP Checklist", + "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", + "service": "SAP", "severity": "Média", - "text": "Certifique-se de replicar ou duplicar sua rede na região irmã. Você tem que fazer uma cópia do seu Vnet em outra região", - "waf": "Fiabilidade" - }, - { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "description": "Se seus pipelines do ADF usarem o Cofre de Chaves, você não precisará fazer nada para replicar o Cofre de Chaves. O Cofre de Chaves é um serviço gerenciado e a Microsoft cuida dele para você", - "guid": "25498f6d-bad3-47da-a43b-c6ce1d7aa9b2", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "Azure Data Factory", - "severity": "Baixo", - "text": "Se estiver usando a integração do Keyvault, use o SLA do Keyvault para entender sua disponibilidade", - "waf": "Fiabilidade" + "text": "Analise o uso do Backup Automatizado v2 para VMs do Azure.", + "waf": "Operações" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Média", - "text": "Se você usar certificados TLS gerenciados pelo cliente com o Azure Front Door, use a versão de certificado 'Mais recente'. Reduzir o risco de paralisações causadas pela renovação manual de certificados", + "checklist": "SAP Checklist", + "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", + "service": "SAP", + "severity": "Alto", + "text": "Ativando o acelerador de gravação para a série M ao usar discos premium (V1)", "waf": "Operações" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP 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", "severity": "Média", - "text": "Verifique se você está usando o SKU do Application Gateway v2", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Segurança" + "text": "Testar a latência da zona de disponibilidade.", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", + "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", + "service": "SAP", "severity": "Média", - "text": "Verifique se você está usando a SKU padrão para seus Balanceadores de Carga do Azure", - "waf": "Segurança" + "text": "Ative o SAP EarlyWatch Alert para todos os componentes SAP.", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "guid": "9432621a-8397-4654-a882-5bc856b7ef83", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", - "service": "Load Balancer", + "checklist": "SAP 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", "severity": "Média", - "text": "Verifique se os endereços IP de front-end dos Load Balancers são redundantes por zona (a menos que você precise de frontends zonais).", - "waf": "Segurança" + "text": "Revise a latência do servidor de aplicativos SAP para o servidor de banco de dados usando o relatório SAP ABAPMeter /SSA/CAT.", + "training": "https://me.sap.com/notes/0002879613", + "waf": "Desempenho" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", + "service": "SAP", "severity": "Média", - "text": "Seus Application Gateways v2 devem ser implantados em sub-redes com prefixos IP iguais ou maiores que /24", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Segurança" + "text": "Revise o monitoramento de desempenho do SQL Server usando o CCMS.", + "waf": "Desempenho" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "description": "A administração de proxies reversos em geral e do WAF em particular está mais próxima do aplicativo do que da rede, portanto, eles pertencem à mesma assinatura que o aplicativo. Centralizar o Application Gateway e o WAF na assinatura de conectividade pode ser OK se for gerenciado por uma única equipe.", - "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "App Gateway", + "checklist": "SAP Checklist", + "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", + "link": "https://me.sap.com/notes/500235", + "service": "SAP", "severity": "Média", - "text": "Implante o Gateway de Aplicativo do Azure v2 ou NVAs de parceiros usados para fazer proxy de conexões HTTP(S) de entrada na rede virtual da zona de aterrissagem e com os aplicativos que eles estão protegendo.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Segurança" + "text": "Teste a latência de rede entre VMs de camada de aplicativo SAP e VMs DBMS (NIPING).", + "training": "https://me.sap.com/notes/1100926/E", + "waf": "Desempenho" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "App Gateway", + "checklist": "SAP Checklist", + "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", + "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", + "service": "SAP", "severity": "Média", - "text": "Use uma rede DDoS ou planos de proteção IP para todos os endereços IP públicos nas zonas de aterrissagem do aplicativo.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Segurança" + "text": "Revise os alertas do SAP HANA Studio.", + "waf": "Desempenho" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", + "link": "https://me.sap.com/notes/1969700", + "service": "SAP", "severity": "Média", - "text": "Configure o dimensionamento automático com uma quantidade mínima de duas instâncias.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Fiabilidade" + "text": "Execute verificações de integridade do SAP HANA usando HANA_Configuration_Minichecks.", + "waf": "Desempenho" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "service": "SAP", "severity": "Média", - "text": "Implantar o Application Gateway em zonas de disponibilidade", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Fiabilidade" + "text": "Se você executar VMs do Windows e Linux no Azure, no local ou em outros ambientes de nuvem, poderá usar o Centro de gerenciamento de atualizações na Automação do Azure para gerenciar atualizações do sistema operacional, incluindo patches de segurança.", + "training": "https://learn.microsoft.com/azure/automation/update-management/overview", + "waf": "Segurança" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "Front Door", + "checklist": "SAP Checklist", + "guid": "08951710-79a2-492a-adbc-06d7a401545b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "service": "SAP", "severity": "Média", - "text": "Use o Azure Front Door com políticas WAF para fornecer e ajudar a proteger aplicativos HTTP/S globais que abrangem várias regiões do Azure.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "Analise rotineiramente as notas de OSS de segurança do SAP porque o SAP lança patches de segurança altamente críticos, ou hot fixes, que exigem ação imediata para proteger seus sistemas SAP.", + "training": "https://support.sap.com/en/my-support/knowledge-base/security-notes-news.html", "waf": "Segurança" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "3f29812b-2363-4cef-b179-b599de0d5973", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "Front Door", - "severity": "Média", - "text": "Ao usar o Front Door e o Application Gateway para ajudar a proteger aplicativos HTTP/S, use políticas WAF no Front Door. Bloqueie o Application Gateway para receber tráfego somente do Front Door.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "checklist": "SAP Checklist", + "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", + "severity": "Baixo", + "text": "Para SAP no SQL Server, você pode desabilitar a conta de administrador do sistema do SQL Server porque os sistemas SAP no SQL Server não usam a conta. Certifique-se de que outro usuário com direitos de administrador do sistema possa acessar o servidor antes de desabilitar a conta de administrador do sistema original.", "waf": "Segurança" }, { - "ammp": true, - "arm-service": "microsoft.network/trafficManagerProfiles", - "checklist": "Azure Application Delivery Networking", - "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "Traffic Manager", + "checklist": "SAP Checklist", + "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", "severity": "Alto", - "text": "Use o Gerenciador de Tráfego para fornecer aplicativos globais que abrangem protocolos diferentes de HTTP/S.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Fiabilidade" + "text": "Desative xp_cmdshell. O recurso do SQL Server xp_cmdshell habilita um shell de comando do sistema operacional interno do SQL Server. É um risco potencial em auditorias de segurança.", + "training": "https://me.sap.com/notes/3019299/E", + "waf": "Segurança" }, { - "checklist": "Azure Application Delivery Networking", - "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "Entra", - "severity": "Baixo", - "text": "Se os usuários precisarem apenas de acesso a aplicativos internos, o Proxy de Aplicativo de ID do Microsoft Entra foi considerado uma alternativa à Área de Trabalho Virtual (AVD) do Azure?", - "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", + "checklist": "SAP 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", + "severity": "Alto", + "text": "A criptografia de servidores de banco de dados SAP HANA no Azure usa a tecnologia de criptografia nativa do SAP HANA. Além disso, se você estiver usando o SQL Server no Azure, use a TDE (Criptografia de Dados Transparente) para proteger seus dados e arquivos de log e garantir que seus backups também sejam criptografados.", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", "waf": "Segurança" }, { - "checklist": "Azure Application Delivery Networking", - "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "Entra", + "checklist": "SAP Checklist", + "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "SAP", "severity": "Média", - "text": "Para reduzir o número de portas de firewall abertas para conexões de entrada em sua rede, considere o uso do Microsoft Entra ID Application Proxy para dar aos usuários remotos acesso seguro e autenticado a aplicativos internos.", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "text": "A criptografia de Armazenamento do Azure está habilitada para todas as contas clássicas e do Gerenciador de Recursos do Azure e não pode ser desabilitada. Como seus dados são criptografados por padrão, você não precisa modificar seu código ou aplicativos para usar a criptografia do Armazenamento do Azure.", + "training": "https://learn.microsoft.com/training/modules/encrypt-sector-data/?source=recommendations", "waf": "Segurança" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview", + "service": "SAP", "severity": "Alto", - "text": "Implante sua política de WAF para Front Door no modo 'Prevenção'.", + "text": "Usar o Cofre de Chaves do Azure para armazenar seus segredos e credenciais", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", "waf": "Segurança" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Alto", - "text": "Evite combinar o Gerenciador de Tráfego do Azure e o Azure Front Door.", + "checklist": "SAP Checklist", + "guid": "829e2edb-2173-4676-aff6-691b4935ada4", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "SAP", + "severity": "Média", + "text": "É recomendável BLOQUEAR os Recursos do Azure após a implantação bem-sucedida para proteger contra alterações não autorizadas. Você também pode impor restrições e regras LOCK em sua base por assinatura usando políticas personalizadas do Azure (função Personalizada).", + "training": "https://learn.microsoft.com/training/modules/use-azure-resource-manager/?source=recommendations", "waf": "Segurança" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Alto", - "text": "Use o mesmo nome de domínio no Azure Front Door e sua origem. Nomes de host incompatíveis podem causar bugs sutis.", + "checklist": "SAP Checklist", + "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "SAP", + "severity": "Média", + "text": "Provisione o Cofre de Chaves do Azure com as políticas de exclusão e limpeza suaves habilitadas para permitir a proteção de retenção para objetos excluídos.", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", "waf": "Segurança" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Baixo", - "text": "Desabilite os testes de integridade quando houver apenas uma origem em um grupo de origem do Azure Front Door.", - "waf": "Desempenho" - }, - { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "Front Door", - "severity": "Média", - "text": "Selecione bons pontos de extremidade de teste de integridade para o Azure Front Door. Considere a criação de pontos de extremidade de integridade que verifiquem todas as dependências do seu aplicativo.", - "waf": "Fiabilidade" + "checklist": "SAP Checklist", + "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", + "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", + "service": "SAP", + "severity": "Alto", + "text": "Com base nos requisitos existentes, controles normativos e de conformidade (internos/externos) - Determine quais Políticas do Azure e a função RBAC do Azure são necessárias", + "training": "https://learn.microsoft.com/training/paths/describe-azure-management-governance/?source=recommendations", + "waf": "Segurança" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Baixo", - "text": "Use testes de integridade do HEAD com o Azure Front Door para reduzir o tráfego que o Front Door envia para seu aplicativo.", - "waf": "Desempenho" + "checklist": "SAP 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", + "severity": "Alto", + "text": "Ao habilitar o Microsoft Defender for Endpoint no ambiente SAP, recomende excluir arquivos de dados e de log em servidores DBMS em vez de direcionar todos os servidores. Siga as recomendações do fornecedor do DBMS ao excluir arquivos de destino.", + "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/microsoft-defender-endpoint-mde-for-sap-applications-on-windows/ba-p/3912268", + "waf": "Segurança" }, { - "ammp": true, - "arm-service": "Microsoft.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP 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", "severity": "Alto", - "text": "Usar o Gateway NAT do Azure em vez das regras de saída do Load Balancer para melhor escalabilidade do SNAT", - "waf": "Fiabilidade" + "text": "Delegue uma função personalizada de administrador SAP com acesso just-in-time do Microsoft Defender for Cloud.", + "training": "https://learn.microsoft.com/training/modules/secure-vms-with-azure-security-center/?source=recommendations", + "waf": "Segurança" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Alto", - "text": "Use certificados TLS gerenciados com o Azure Front Door. Reduza o custo operacional e o risco de paralisações devido a renovações de certificados.", - "waf": "Operações" + "checklist": "SAP 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", + "severity": "Baixo", + "text": "criptografar dados em trânsito integrando o produto de segurança de terceiros com comunicações de rede seguras (SNC) para DIAG (SAP GUI), RFC e SPNEGO para HTTPS", + "training": "https://learn.microsoft.com/azure/security/fundamentals/encryption-overview#encryption-of-data-in-transit", + "waf": "Segurança" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", + "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", + "service": "SAP", "severity": "Média", - "text": "Defina sua configuração do WAF do Azure Front Door como código. Usando o código, você pode adotar mais facilmente a nova versão do conjunto de regras e obter proteção adicional.", - "waf": "Operações" + "text": "O padrão é chaves gerenciadas pela Microsoft para a funcionalidade de criptografia principal e use chaves gerenciadas pelo cliente quando necessário.", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "waf": "Segurança" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", - "service": "Front Door", + "checklist": "SAP Checklist", + "guid": "4935ada4-2223-4ece-a1b1-23181a541741", + "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", + "service": "SAP", "severity": "Alto", - "text": "Use o TLS de ponta a ponta com o Azure Front Door. Use o TLS para conexões de seus clientes com o Front Door e do Front Door com sua origem.", + "text": "Use um Cofre de Chaves do Azure por aplicativo, por ambiente, por região.", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", "waf": "Segurança" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", - "service": "Front Door", - "severity": "Média", - "text": "Use o redirecionamento HTTP para HTTPS com o Azure Front Door. Ofereça suporte a clientes mais antigos redirecionando-os para uma solicitação HTTPS automaticamente.", + "checklist": "SAP Checklist", + "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", + "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", + "service": "SAP", + "severity": "Alto", + "text": "Para controlar e gerenciar chaves de criptografia de disco e segredos para sistemas operacionais Windows e não Windows HANA, use o Cofre de Chaves do Azure. O SAP HANA não tem suporte com o Cofre de Chaves do Azure, portanto, você deve usar métodos alternativos, como chaves SAP ABAP ou SSH.", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/?source=recommendations", "waf": "Segurança" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", - "service": "Front Door", + "checklist": "SAP Checklist", + "guid": "209d490d-a477-4784-84d1-16785d2fa56c", + "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", + "service": "SAP", "severity": "Alto", - "text": "Habilite o WAF do Azure Front Door. Proteja seu aplicativo contra uma série de ataques.", + "text": "Personalizar funções RBAC (controle de acesso baseado em função) para SAP em assinaturas spoke do Azure para evitar alterações acidentais relacionadas à rede", + "training": "https://learn.microsoft.com/training/modules/secure-azure-resources-with-rbac/?source=recommendations", "waf": "Segurança" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", + "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", + "service": "SAP", "severity": "Alto", - "text": "Ajuste o WAF do Azure Front Door para sua carga de trabalho. Reduza as detecções de falsos positivos.", + "text": "Isole DMZs e NVAs do restante do estado SAP, configure o Azure Private Link e gerencie e controle com segurança os recursos do SAP no Azure", + "training": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/secure-vnet-dmz?tabs=portal", "waf": "Segurança" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Alto", - "text": "Habilite o recurso de inspeção do corpo de solicitação habilitado na política WAF do Azure Front Door.", + "checklist": "SAP 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", + "severity": "Baixo", + "text": "Considere usar o software antimalware da Microsoft no Azure para proteger suas máquinas virtuais contra arquivos mal-intencionados, adware e outras ameaças.", + "training": "https://azure.microsoft.com/blog/deploying-antimalware-solutions-on-azure-virtual-machines/", "waf": "Segurança" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Alto", - "text": "Habilite os conjuntos de regras padrão do WAF do Azure Front Door. Os conjuntos de regras padrão detectam e bloqueiam ataques comuns.", + "checklist": "SAP 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", + "severity": "Baixo", + "text": "Para obter uma proteção ainda mais poderosa, considere usar o Microsoft Defender for Endpoint.", + "training": "https://learn.microsoft.com/training/modules/implement-endpoint-protection-use-microsoft-defender/?source=recommendations", "waf": "Segurança" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "severity": "Alto", - "text": "Habilite o conjunto de regras de proteção de bot do WAF do Azure Front Door. As regras de bot detectam bots bons e ruins.", + "text": "Isole os servidores de aplicativo e banco de dados SAP da Internet ou da rede local passando todo o tráfego pela rede virtual de hub, que está conectada à rede spoke por emparelhamento de rede virtual. As redes virtuais emparelhadas garantem que a solução SAP no Azure seja isolada da Internet pública.", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/?source=recommendations", "waf": "Segurança" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Média", - "text": "Use a versão mais recente do conjunto de regras do WAF do Azure Front Door. As atualizações do conjunto de regras são atualizadas regularmente para levar em conta o cenário atual de ameaças.", + "checklist": "SAP 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", + "severity": "Baixo", + "text": "Para aplicativos voltados para a Internet, como o SAP Fiori, certifique-se de distribuir a carga por requisitos de aplicativo, mantendo os níveis de segurança. Para segurança de Camada 7, você pode usar um WAF (Web Application Firewall) de terceiros disponível no Azure Marketplace.", + "training": "https://learn.microsoft.com/training/modules/simplify-cloud-procurement-governance-azure-marketplace/?source=recommendations", "waf": "Segurança" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "SAP Checklist", + "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", + "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", + "service": "SAP", "severity": "Média", - "text": "Adicione o limite de taxa ao WAF do Azure Front Door. A limitação de taxa bloqueia clientes que enviam acidentalmente ou intencionalmente grandes quantidades de tráfego em um curto período de tempo.", + "text": "Para habilitar a comunicação segura no Azure Monitor para soluções SAP, você pode optar por usar um certificado raiz ou um certificado de servidor. É altamente recomendável que você use certificados raiz.", + "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", "waf": "Segurança" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "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": "Média", - "text": "Use um limite alto para os limites de taxa do WAF do Azure Front Door. Limites de limite de taxa alta evitam o bloqueio de tráfego legítimo, ao mesmo tempo em que fornecem proteção contra um número extremamente alto de solicitações que podem sobrecarregar sua infraestrutura. ", - "waf": "Segurança" + "text": "Use um locatário do Entra para gerenciar seus recursos do Azure, a menos que você tenha um requisito regulatório ou comercial claro para multilocatários.", + "waf": "Operações" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "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": "Baixo", - "text": "Se você não está esperando tráfego de todas as regiões geográficas, use filtros geográficos para bloquear o tráfego de países não esperados.", - "waf": "Segurança" + "text": "Use a abordagem de Automação Multilocatário para gerenciar seus locatários de ID do Microsoft Entra.", + "waf": "Operações" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Média", - "text": "Especifique o local desconhecido (ZZ) ao filtrar geograficamente o tráfego com o WAF do Azure Front Door. Evite bloquear acidentalmente solicitações legítimas quando os endereços IP não puderem ser correspondidos geograficamente.", - "waf": "Segurança" + "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": "Alto", + "text": "Use o Azure Lighthouse para gerenciamento de vários locatários com as mesmas IDs.", + "training": "https://learn.microsoft.com/azure/lighthouse/concepts/cross-tenant-management-experience", + "waf": "Operações" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Alto", - "text": "Habilitar o conjunto de regras de proteção de bot WAF do Gateway de Aplicativo do Azure As regras de bot detectam bots bons e ruins.", - "waf": "Segurança" - }, - { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "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": "Alto", - "text": "Habilite o recurso de inspeção do corpo de solicitação habilitado na política WAF do Gateway de Aplicativo do Azure.", - "waf": "Segurança" + "text": "Se você conceder a um parceiro acesso para administrar seu locatário, use o Azure Lighthouse.", + "waf": "Custar" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", - "service": "App Gateway", + "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": "Alto", - "text": "Ajuste o WAF do Gateway de Aplicativo do Azure para sua carga de trabalho. Reduza as detecções de falsos positivos.", + "text": "Aplique um modelo RBAC que se alinhe ao seu modelo operacional de nuvem. Escopo e Atribuição entre Grupos de Gerenciamento e Assinaturas.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", "waf": "Segurança" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "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": "Alto", - "text": "Implante sua política de WAF para o Application Gateway no modo 'Prevenção'.", + "text": "Use apenas o tipo de autenticação Conta corporativa ou de estudante para todos os tipos de conta. Evite usar a conta da Microsoft", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", "waf": "Segurança" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", - "service": "App Gateway", + "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": "Média", - "text": "Adicione o limite de taxa ao WAF do Gateway de Aplicativo do Azure. A limitação de taxa bloqueia clientes que enviam acidentalmente ou intencionalmente grandes quantidades de tráfego em um curto período de tempo.", + "text": "Use apenas grupos para atribuir permissões. Adicione grupos locais ao grupo Somente ID do Entra se um sistema de gerenciamento de grupo já estiver em vigor.", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", "waf": "Segurança" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Média", - "text": "Use um limite alto para os limites de taxa do WAF do Gateway de Aplicativo do Azure. Limites de limite de taxa alta evitam o bloqueio de tráfego legítimo, ao mesmo tempo em que fornecem proteção contra um número extremamente alto de solicitações que podem sobrecarregar sua infraestrutura. ", + "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": "Alto", + "text": "Imponha políticas de Acesso Condicional da ID do Microsoft Entra para qualquer usuário com direitos a ambientes do Azure.", + "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", "waf": "Segurança" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Baixo", - "text": "Se você não está esperando tráfego de todas as regiões geográficas, use filtros geográficos para bloquear o tráfego de países não esperados.", + "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": "Alto", + "text": "Imponha a autenticação multifator para qualquer usuário com direitos aos ambientes do Azure.", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", "waf": "Segurança" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", - "service": "App Gateway", + "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": "Média", - "text": "Especifique o local desconhecido (ZZ) ao filtrar geograficamente o tráfego com o WAF do Gateway de Aplicativo do Azure. Evite bloquear acidentalmente solicitações legítimas quando os endereços IP não puderem ser correspondidos geograficamente.", + "text": "Imponha o Microsoft Entra ID Privileged Identity Management (PIM) para estabelecer acesso permanente zero e privilégios mínimos.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", "waf": "Segurança" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "checklist": "Azure Landing Zone Review", + "guid": "8b9fe5c4-1049-4d40-9a92-3c3474d00018", + "link": "https://learn.microsoft.com/en-us/entra/identity/domain-services/overview", + "service": "Entra", "severity": "Média", - "text": "Use a versão mais recente do conjunto de regras do WAF do Gateway de Aplicativo do Azure. As atualizações do conjunto de regras são atualizadas regularmente para levar em conta o cenário atual de ameaças.", + "text": "Se estiver planejando alternar dos Serviços de Domínio Active Directory para os serviços de domínio Entra, avalie a compatibilidade de todas as cargas de trabalho.", + "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", "waf": "Segurança" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Média", - "text": "Adicione configurações de diagnóstico para salvar seus logs WAF do Gateway de Aplicativo do Azure.", - "waf": "Operações" - }, - { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Média", - "text": "Adicione configurações de diagnóstico para salvar seus logs do WAF do Azure Front Door.", - "waf": "Operações" - }, - { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Média", - "text": "Envie logs do WAF do Gateway de Aplicativo do Azure para o Microsoft Sentinel.", - "waf": "Operações" - }, - { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "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": "Média", - "text": "Envie logs do WAF do Azure Front Door para o Microsoft Sentinel.", - "waf": "Operações" + "text": "Integre os logs de ID do Microsoft Entra com o Azure Monitor central da plataforma. O Azure Monitor permite uma única fonte de verdade sobre dados de log e monitoramento no Azure, oferecendo às organizações opções nativas de nuvem para atender aos requisitos de coleta e retenção de logs.", + "waf": "Segurança" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Média", - "text": "Defina sua configuração do WAF do Gateway de Aplicativo do Azure como código. Usando o código, você pode adotar mais facilmente a nova versão do conjunto de regras e obter proteção adicional.", - "waf": "Operações" + "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": "Alto", + "text": "Implemente um acesso de emergência ou contas de emergência para evitar o bloqueio de conta em todo o locatário.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Segurança" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", - "service": "App Gateway", + "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": "Média", - "text": "Use políticas de WAF em vez da configuração de WAF herdada.", - "waf": "Operações" + "text": "Não use contas sincronizadas locais para atribuições de função de ID do Microsoft Entra, a menos que você tenha um cenário que exija isso especificamente.", + "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", + "waf": "Segurança" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", - "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", - "service": "App Gateway", + "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": "Média", - "text": "Filtre o tráfego de entrada nos back-ends para que eles só aceitem conexões da sub-rede do Application Gateway, por exemplo, com NSGs.", + "text": "Ao usar o Proxy de Aplicativo de ID do Microsoft Entra para fornecer acesso de usuários remotos a aplicativos, gerencie-o como um recurso da plataforma, pois você só pode ter uma instância por locatário.", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", "waf": "Segurança" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", - "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", - "service": "Front Door", + "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": "Média", - "text": "Certifique-se de que suas origens recebam apenas o tráfego de sua instância do Azure Front Door.", + "text": "Use uma topologia de rede hub-and-spoke para cenários de rede que exigem flexibilidade máxima.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", "waf": "Segurança" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", - "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", - "service": "App Gateway", + "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": "Alto", - "text": "Você deve criptografar o tráfego para os servidores de back-end.", - "waf": "Segurança" + "text": "Implante serviços de rede compartilhados, incluindo gateways do ExpressRoute, gateways de VPN e Firewall do Azure ou NVAs de parceiros na rede virtual do hub central. Se necessário, implante também serviços DNS.", + "waf": "Custar" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", - "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", - "service": "App Gateway", + "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": "Alto", - "text": "Você deve usar um Web Application Firewall.", + "text": "Use um plano de proteção de IP ou rede DDoS para todos os endereços IP públicos nas zonas de destino do aplicativo.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "Segurança" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", - "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", - "service": "App Gateway", + "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": "Média", - "text": "Redirecionar HTTP para HTTPS", - "waf": "Segurança" + "text": "Ao implantar tecnologias de rede de parceiros ou NVAs, siga as diretrizes do fornecedor do parceiro.", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "Média", - "text": "Usar cookies gerenciados por gateway para direcionar o tráfego de uma sessão de usuário para o mesmo servidor para processamento", - "waf": "Operações" + "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": "Baixo", + "text": "Se você precisar de trânsito entre o ExpressRoute e os gateways de VPN em cenários hub e spoke, use o Servidor de Rota do Azure.", + "waf": "Segurança" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", - "service": "App Gateway", - "severity": "Alto", - "text": "Habilite a drenagem de conexão durante as atualizações de serviço planejadas para evitar a perda de conexão com membrs existentes do pool de back-end", + "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": "Baixo", + "text": "Se estiver usando o Servidor de Roteamento, use um prefixo /27 para a sub-rede do Servidor de Roteamento.", "waf": "Segurança" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", - "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", - "service": "App Gateway", - "severity": "Baixo", - "text": "Criar páginas de erro personalizadas para exibir uma experiência de usuário personalizada", - "waf": "Operações" + "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": "Média", + "text": "Para arquiteturas de rede com várias topologias hub-and-spoke em regiões do Azure, use emparelhamentos de rede virtual global entre as VNets do hub para conectar as regiões entre si.", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-virtual-networks/", + "waf": "Desempenho" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", - "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", - "service": "App Gateway", + "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": "Média", - "text": "Edite solicitações HTTP e cabeçalhos de resposta para facilitar o roteamento e a troca de informações entre o cliente e o servidor", - "waf": "Segurança" + "text": "Use o Azure Monitor para Redes para monitorar o estado de ponta a ponta das redes no Azure.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "waf": "Operações" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "App Gateway", + "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": "Média", - "text": "Configure o Front Door para otimizar o roteamento de tráfego global da Web e o desempenho do usuário final de nível superior e a confiabilidade por meio de failover global rápido", - "waf": "Desempenho" + "text": "Se você tiver mais de 400 redes spoke em uma região, implante um hub adicional para ignorar os limites de emparelhamento VNet (500) e o número máximo de prefixos que podem ser anunciados por meio do ExpressRoute (1000).", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "29dcc19f-a8fa-4c35-8281-290577538793", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "App Gateway", + "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": "Média", - "text": "Usar balanceamento de carga da camada de transporte", - "waf": "Desempenho" + "text": "Limite o número de rotas por tabela de rotas a 400.", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", - "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", - "service": "App Gateway", + "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": "Alto", + "text": "Use a configuração 'Permitir tráfego para rede virtual remota' ao configurar emparelhamentos VNet.", + "waf": "Fiabilidade" + }, + { + "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": "Média", - "text": "Configurar o roteamento com base no host ou nome de domínio para vários aplicativos Web em um único gateway", + "text": "Quando você estiver usando o ExpressRoute Direct, configure o MACsec para criptografar o tráfego no nível da camada dois entre os roteadores da organização e o MSEE. O diagrama mostra essa criptografia no fluxo.", "waf": "Segurança" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", - "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", - "service": "App Gateway", + "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": "Média", - "text": "Centralize o gerenciamento de certificados SSL para reduzir a sobrecarga de criptografia e descriptografia de um farm de servidores back-end", + "text": "Para cenários em que o MACsec não é uma opção (por exemplo, não usando o ExpressRoute Direct), use um gateway de VPN para estabelecer túneis IPsec no emparelhamento privado do ExpressRoute.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", "waf": "Segurança" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", - "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", - "service": "App Gateway", - "severity": "Baixo", - "text": "Usar o Application Gateway para suporte nativo para protocolos WebSocket e HTTP/2", + "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": "Alto", + "text": "Verifique se nenhum espaço de endereço IP sobreposto entre regiões do Azure e locais é usado.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", "waf": "Segurança" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", - "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", - "service": "APIM", + "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": "Média", - "text": "Implementar uma política de tratamento de erros em nível global", - "waf": "Operações" + "text": "Use endereços IP dos intervalos de alocação de endereços para Internets privadas (RFC 1918).", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Média", - "text": "Certifique-se de que todas as políticas de APIs incluam um elemento .", - "waf": "Operações" + "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": "Alto", + "text": "Certifique-se de que o espaço de endereço IP não seja desperdiçado, não crie redes virtuais desnecessariamente grandes (por exemplo, /16).", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", - "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", - "service": "APIM", - "severity": "Média", - "text": "Usar fragmentos de política para evitar a repetição das mesmas definições de políticas em várias APIs", - "waf": "Operações" + "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": "Alto", + "text": "Não use intervalos de endereços IP sobrepostos para sites de produção e recuperação de desastres.", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", - "link": "https://learn.microsoft.com/azure/api-management/monetization-support", - "service": "APIM", + "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": "Média", - "text": "Se você estiver planejando monetizar suas APIs, consulte o artigo 'suporte à monetização' para obter as práticas recomendadas", - "waf": "Operações" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "a7d0840a-c8c4-4e83-adec-5ca578eb4049", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", - "service": "APIM", - "severity": "Alto", - "text": "Habilitar Configurações de Diagnóstico para exportar logs para o Azure Monitor", + "text": "Para ambientes em que a resolução de nomes no Azure é tudo o que é necessário, use o DNS Privado do Azure para resolução com uma zona delegada para resolução de nomes (como 'azure.contoso.com').", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", "waf": "Operações" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", - "service": "APIM", + "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": "Média", - "text": "Habilite o Application Insights para telemetria mais detalhada", - "waf": "Operações" + "text": "Para ambientes em que a resolução de nomes no Azure e no local é necessária e não há nenhum serviço DNS corporativo existente, como o Active Directory, use o Resolvedor Privado de DNS do Azure para rotear solicitações de DNS para o Azure ou para servidores DNS locais.", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-dns-private-resolver/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", - "service": "APIM", - "severity": "Alto", - "text": "Configurar alertas sobre as métricas mais críticas", + "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": "Baixo", + "text": "Cargas de trabalho especiais que exigem e implantam seu próprio DNS (como o Red Hat OpenShift) devem usar sua solução de DNS preferida.", "waf": "Operações" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "Alto", - "text": "Certifique-se de que os certificados SSL personalizados sejam armazenados em um Cofre de Chaves do Azure para que possam ser acessados e atualizados com segurança", - "waf": "Segurança" + "text": "Habilite o registro automático para o DNS do Azure para gerenciar automaticamente o ciclo de vida dos registros DNS para as máquinas virtuais implantadas em uma rede virtual.", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "Operações" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Alto", - "text": "Proteger solicitações de entrada para APIs (plano de dados) com o Azure AD", + "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": "Média", + "text": "Use o Azure Bastion para se conectar com segurança à sua rede.", "waf": "Segurança" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", - "service": "APIM", + "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": "Média", - "text": "Usar o Microsoft Entra ID para autenticar usuários no Portal do Desenvolvedor", + "text": "Use o Azure Bastion em uma sub-rede /26 ou maior.", "waf": "Segurança" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", - "service": "APIM", + "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": "Média", - "text": "Criar grupos apropriados para controlar a visibilidade dos produtos", + "text": "Use as políticas do Azure Front Door e do WAF para fornecer proteção global entre regiões do Azure para conexões HTTP/S de entrada para uma zona de destino.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Segurança" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "06862505-2d9a-4874-9491-2837b00a3475", - "link": "https://learn.microsoft.com/azure/api-management/backends", - "service": "APIM", - "severity": "Média", - "text": "Use o recurso Back-ends para eliminar configurações redundantes de back-end de API", - "waf": "Operações" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", - "service": "APIM", - "severity": "Média", - "text": "Usar Valores Nomeados para armazenar valores comuns que podem ser usados em políticas", - "waf": "Operações" + "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": "Baixo", + "text": "Ao usar o Azure Front Door e o Gateway de Aplicativo do Azure para ajudar a proteger aplicativos HTTP/S, use políticas WAF no Azure Front Door. Bloqueie o Gateway de Aplicativo do Azure para receber tráfego somente do Azure Front Door.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", - "service": "APIM", - "severity": "Média", - "text": "Para DR, aproveite o nível premium com implantações dimensionadas em duas ou mais regiões para um SLA de 99,99%", - "waf": "Fiabilidade" + "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": "Alto", + "text": "Quando WAFs e outros proxies reversos forem necessários para conexões HTTP/S de entrada, implante-os em uma rede virtual de zona de destino e junto com os aplicativos que eles estão protegendo e expondo à Internet.", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", - "link": "https://learn.microsoft.com/azure/api-management/high-availability", - "service": "APIM", - "severity": "Média", - "text": "Implante pelo menos uma unidade em duas ou mais zonas de disponibilidade para um SLA aumentado de 99,99%", - "waf": "Fiabilidade" + "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": "Alto", + "text": "Use os planos de Rede ou Proteção de IP do Azure contra DDoS para ajudar a proteger os pontos de extremidade de endereços IP públicos nas redes virtuais.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "Alto", - "text": "Verifique se há uma rotina de backup automatizada", + "text": "Planeje como gerenciar a configuração e a estratégia de tráfego de saída da rede antes da próxima alteração significativa. Em 30 de setembro de 2025, o acesso de saída padrão para novas implantações será desativado e somente configurações de acesso explícito serão permitidas.", "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", - "link": "https://learn.microsoft.com/azure/api-management/retry-policy", - "service": "APIM", - "severity": "Média", - "text": "Use Políticas para adicionar uma URL de back-end de failover e cache para reduzir chamadas com falha.", - "waf": "Fiabilidade" + "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": "Alto", + "text": "Adicione configurações de diagnóstico para salvar logs relacionados a DDoS para todos os endereços IP públicos protegidos (IP DDoS ou Proteção de Rede).", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", - "service": "APIM", - "severity": "Baixo", - "text": "Se você precisar registrar em níveis de alto desempenho, considere a política de Hubs de Eventos", - "waf": "Operações" + "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": "Alto", + "text": "Verifique se há uma atribuição de política para negar endereços IP públicos diretamente vinculados a máquinas virtuais. Use exclusões se IPs públicos forem necessários em VMs específicas.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", - "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", - "service": "APIM", + "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": "Média", - "text": "Aplicar políticas de limitação para controlar o número de solicitações por segundo", - "training": "https://learn.microsoft.com/training/modules/protect-apis-on-api-management/", + "text": "Use o ExpressRoute como a conexão principal com o Azure. Use VPNs como fonte de conectividade de backup.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "Desempenho" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", - "service": "APIM", + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "description": "Você pode usar o prefixo AS-path e pesos de conexão para influenciar o tráfego do Azure para o local e toda a gama de atributos BGP em seus próprios roteadores para influenciar o tráfego do local para o Azure.", + "guid": "f29812b2-363c-4efe-879b-599de0d5973c", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-routing", + "service": "ExpressRoute", "severity": "Média", - "text": "Configurar o dimensionamento automático para dimensionar o número de instâncias quando a carga aumenta", - "waf": "Desempenho" + "text": "Ao usar vários circuitos do ExpressRoute ou vários locais locais, use atributos BGP para otimizar o roteamento.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", - "service": "APIM", + "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": "Média", - "text": "Implante gateways auto-hospedados onde o Azure não tem uma região próxima às APIs de back-end.", + "text": "Selecione o SKU correto para os gateways ExpressRoute/VPN com base nos requisitos de largura de banda e desempenho.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "Desempenho" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", - "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", - "service": "APIM", - "severity": "Média", - "text": "Use a camada premium para cargas de trabalho de produção.", - "waf": "Fiabilidade" - }, - { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Média", - "text": "No modelo de várias regiões, use Políticas para rotear as solicitações para back-ends regionais com base na disponibilidade ou latência.", - "waf": "Fiabilidade" + "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": "Alto", + "text": "Verifique se você está usando circuitos do ExpressRoute de dados ilimitados somente se atingir a largura de banda que justifica seu custo.", + "waf": "Custar" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "Alto", - "text": "Esteja atento aos limites da APIM", - "waf": "Fiabilidade" + "text": "Aproveite o SKU local do ExpressRoute para reduzir o custo de seus circuitos, se o local de emparelhamento de circuito der suporte às regiões do Azure para o SKU Local.", + "waf": "Custar" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", - "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", - "service": "APIM", - "severity": "Alto", - "text": "Certifique-se de que as implantações de gateway auto-hospedado sejam resilientes.", + "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": "Média", + "text": "Implante um gateway do ExpressRoute com redundância de zona nas regiões do Azure com suporte.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "7519e385-a88b-4d34-966b-6269d686e890", - "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", - "service": "APIM", + "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": "Média", - "text": "Usar o Azure Front Door na frente do APIM para implantação em várias regiões", + "text": "Para cenários que exigem largura de banda superior a 10 Gbps ou portas dedicadas de 10/100 Gbps, use o ExpressRoute Direct.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "Desempenho" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "Média", - "text": "Implantar o serviço em uma rede virtual (VNet)", - "waf": "Segurança" + "text": "Quando a baixa latência for necessária ou a taxa de transferência do local para o Azure precisar ser maior que 10 Gbps, habilite o FastPath para ignorar o gateway do ExpressRoute do caminho de dados.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "Média", - "text": "Implante NSG (grupos de segurança de rede) em suas sub-redes para restringir ou monitorar o tráfego de/para APIM.", - "waf": "Segurança" + "text": "Use gateways de VPN com redundância de zona para conectar branches ou locais remotos ao Azure (quando disponível).", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "Média", - "text": "Implante pontos de extremidade privados para filtrar o tráfego de entrada quando o APIM não for implantado em uma rede virtual.", - "waf": "Segurança" + "text": "Use dispositivos VPN redundantes locais (ativo/ativo ou ativo/passivo).", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "Alto", - "text": "Desabilitar o acesso à rede pública", - "waf": "Segurança" + "text": "Se estiver usando o ExpressRoute Direct, considere usar circuitos locais do ExpressRoute para as regiões locais do Azure para economizar custos.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Custar" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", - "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", - "service": "APIM", + "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": "Média", - "text": "Simplifique o gerenciamento com scripts de automação do PowerShell", - "waf": "Operações" + "text": "Quando o isolamento de tráfego ou a largura de banda dedicada for necessária, como para separar ambientes de produção e não produção, use circuitos diferentes do ExpressRoute. Ele ajudará você a garantir domínios de roteamento isolados e aliviar os riscos de vizinhos barulhentos.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "Média", - "text": "Configure APIM via Infrastructure-as-code. Analise as práticas recomendadas de DevOps do Cloud Adaption Framework APIM Landing Zone Accelerator", + "text": "Monitore a disponibilidade e a utilização do ExpressRoute usando o Express Route Insights interno.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "Operações" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", - "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", - "service": "APIM", + "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": "Média", - "text": "Promover o uso da extensão API do Visual Studio Code para um desenvolvimento de API mais rápido", + "text": "Use o Monitor da Conexão para monitoramento de conectividade em toda a rede, especialmente entre o local e o Azure.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "Operações" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "354f1c03-8112-4965-85ad-c0074bddf231", - "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", - "service": "APIM", + "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": "Média", - "text": "Implemente DevOps e CI/CD em seu fluxo de trabalho", - "waf": "Operações" + "text": "Use circuitos do ExpressRoute de diferentes locais de emparelhamento para redundância.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "b6439493-426a-45f3-9697-cf65baee208d", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", - "service": "APIM", + "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": "Média", - "text": "APIs seguras usando autenticação de certificado de cliente", - "waf": "Segurança" + "text": "Use a VPN site a site como failover do ExpressRoute, se estiver usando apenas um único circuito do ExpressRoute.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "2a67d143-1033-4c0a-8732-680896478f08", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", - "service": "APIM", - "severity": "Média", - "text": "Serviços de back-end seguros usando autenticação de certificado de cliente", - "waf": "Segurança" + "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": "Alto", + "text": "Se você estiver usando uma tabela de rotas no GatewaySubnet, certifique-se de que as rotas de gateway sejam propagadas.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", - "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", - "service": "APIM", + "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": "Alto", + "text": "Se estiver usando o ExpressRoute, o roteamento local deverá ser dinâmico: no caso de uma falha de conexão, ele deverá convergir para a conexão restante do circuito. A carga deve ser compartilhada entre ambas as conexões, idealmente como ativa/ativa, embora ativa/passiva também seja suportada.", + "waf": "Fiabilidade" + }, + { + "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": "Média", - "text": "Consulte o artigo \"Recomendações para mitigar as 10 principais ameaças da segurança da API OWASP\" e verifique o que é aplicável às suas APIs", - "waf": "Segurança" + "text": "Verifique se os dois links físicos do circuito do ExpressRoute estão conectados a dois dispositivos de borda distintos em sua rede.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", - "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", - "service": "APIM", + "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": "Média", - "text": "Usar o recurso Autorizações para simplificar o gerenciamento do token OAuth 2.0 para suas APIs de back-end", - "waf": "Segurança" + "text": "Certifique-se de que a Detecção de Encaminhamento Bidirecional (BFD) esteja habilitada e configurada em dispositivos de roteamento de borda do cliente ou provedor.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", - "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", - "service": "APIM", + "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": "Alto", - "text": "Use a versão mais recente do TLS ao criptografar informações em trânsito. Desative protocolos e cifras desatualizados e desnecessários quando possível.", - "waf": "Segurança" + "text": "Conecte o Gateway do ExpressRoute a dois ou mais circuitos de diferentes locais de emparelhamento para maior resiliência.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Alto", - "text": "Certifique-se de que os segredos (valores nomeados) sejam armazenados em um Cofre de Chaves do Azure para que possam ser acessados e atualizados com segurança", - "waf": "Segurança" + "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": "Média", + "text": "Configure logs de diagnóstico e alertas para o gateway de rede virtual do ExpressRoute.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Operações" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", + "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": "Média", - "text": "Use identidades gerenciadas para autenticar em outros recursos do Azure sempre que possível", - "waf": "Segurança" + "text": "Não use circuitos do ExpressRoute para comunicação VNet para VNet.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.ApiManagement/service", - "checklist": "Azure API Management Review", - "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", - "severity": "Alto", - "text": "Usar o WAF (Web Application Firewall) implantando o Application Gateway na frente do APIM", - "waf": "Segurança" + "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": "Baixo", + "text": "Não envie o tráfego do Azure para locais híbridos para inspeção. Em vez disso, siga o princípio \"o tráfego no Azure permanece no Azure\" para que a comunicação entre os recursos no Azure ocorra por meio da rede de backbone da Microsoft.", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "ac1d6380-f866-4bbd-a9b4-b1ee5d7908b8", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#availability-zones", - "service": "IoT", + "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": "Alto", - "text": "Aproveitar zonas de disponibilidade, se aplicável regionalmente (isso é habilitado automaticamente)", - "waf": "Fiabilidade" + "text": "Use o Firewall do Azure para controlar o tráfego de saída do Azure para a Internet, conexões de entrada não HTTP/S e filtragem de tráfego Leste/Oeste (se a organização exigir).", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "35f651e8-0124-4ef7-8c57-658e38609e6e", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", - "service": "IoT", + "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": "Média", - "text": "Esteja ciente dos failovers iniciados pela Microsoft. Eles são exercidos pela Microsoft em raras situações para fazer failover de todos os hubs IoT de uma região afetada para a região geo-emparelhada correspondente.", - "waf": "Fiabilidade" + "text": "Crie uma política global de Firewall do Azure para controlar a postura de segurança em todo o ambiente de rede global e atribua-a a todas as instâncias do Firewall do Azure. Permita que políticas granulares atendam aos requisitos de regiões específicas delegando políticas de firewall incrementais às equipes de segurança locais por meio do controle de acesso baseado em função do Azure.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "4ed3e490-dc06-4a1e-b467-5d0239d85540", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#cross-region-dr", - "service": "IoT", - "severity": "Alto", - "text": "Considere uma estratégia de DR entre regiões para cargas de trabalho críticas", - "waf": "Fiabilidade" + "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": "Baixo", + "text": "Configure provedores de segurança SaaS de parceiros compatíveis no Firewall Manager se a organização quiser usar essas soluções para ajudar a proteger as conexões de saída.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "a11ecab0-db47-46f7-9aa7-17764e7e45a1", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", - "service": "IoT", + "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": "Alto", - "text": "Saiba como acionar um failover manual.", - "waf": "Fiabilidade" + "text": "Use regras de aplicativo para filtrar o tráfego de saída no nome do host de destino para protocolos com suporte. Use regras de rede baseadas em FQDN e Firewall do Azure com proxy DNS para filtrar o tráfego de saída para a Internet em outros protocolos.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "f9db8dfb-1194-460b-aedd-34dd6a69db22", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#failback", - "service": "IoT", + "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": "Alto", - "text": "Saiba como fazer failback após um failover.", - "waf": "Fiabilidade" + "text": "Use o Firewall do Azure Premium para habilitar recursos de segurança adicionais.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", - "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", - "service": "Spring Apps", - "severity": "Média", - "text": "Os Aplicativos Spring do Azure permitem duas implantações para cada aplicativo, apenas um dos quais recebe tráfego de produção. Você pode obter tempo de inatividade zero com estratégias de implantação em verde azul. A implantação verde azul só está disponível nas camadas Standard e Enterprise. Você pode automatizar a implantação usando CI/CD com ações do ADO/GitHub", - "waf": "Fiabilidade" + "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": "Alto", + "text": "Configure o modo de Inteligência contra Ameaças do Firewall do Azure como Alerta e Negação para proteção adicional.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "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", - "severity": "Média", - "text": "As instâncias do Azure Spring Apps podem ser criadas em várias regiões para seus aplicativos e o tráfego pode ser roteado pelo Gerenciador de Tráfego/Front Door.", - "waf": "Fiabilidade" + "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": "Alto", + "text": "Configure o modo IDPS do Firewall do Azure como Negar para proteção adicional.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", - "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", - "service": "Spring Apps", - "severity": "Média", - "text": "Na região com suporte, os Aplicativos Spring do Azure podem ser implantados como zona redundante, o que significa que as instâncias são distribuídas automaticamente entre zonas de disponibilidade. Esse recurso só está disponível nas camadas Standard e Enterprise.", - "waf": "Fiabilidade" + "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": "Alto", + "text": "Para sub-redes em VNets não conectadas à WAN Virtual, anexe uma tabela de rotas para que o tráfego da Internet seja redirecionado para o Firewall do Azure ou uma Solução de Virtualização de Rede.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", - "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", - "service": "Spring Apps", + "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": "Média", - "text": "Usar mais de 1 instância de aplicativo para seus aplicativos", - "waf": "Fiabilidade" + "text": "Adicione configurações de diagnóstico para salvar logs, usando a tabela de destino Específico do Recurso, para todas as implantações do Firewall do Azure.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Operações" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "7504c230-6035-4183-95a5-85762acc6075", - "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", - "service": "Spring Apps", - "severity": "Média", - "text": "Monitore os Aplicativos Spring do Azure com logs, métricas e rastreamento. Integre o ASA com insights de aplicativos e rastreie falhas e crie pastas de trabalho.", - "waf": "Fiabilidade" + "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": "Importante", + "text": "Migre das regras clássicas do Firewall do Azure (se houver) para a Política de Firewall.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Operações" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", - "service": "Spring Apps", - "severity": "Média", - "text": "Configurar o dimensionamento automático no Spring Cloud Gateway", - "waf": "Fiabilidade" + "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": "Alto", + "text": "Use um prefixo /26 para suas sub-redes do Firewall do Azure.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "97411607-b6fd-4335-99d1-9885faf4e392", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", - "service": "Spring Apps", - "severity": "Baixo", - "text": "Habilite o dimensionamento automático para os aplicativos com o plano de consumo padrão e dedicado.", - "waf": "Fiabilidade" + "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": "Média", + "text": "Organize as regras dentro da política de firewall em Grupos de Coleção de Regras e Coleções de Regras e com base em sua frequência de uso.", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", - "link": "https://learn.microsoft.com/azure/spring-apps/overview", - "service": "Spring Apps", + "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": "Média", - "text": "Use o plano Enterprise para suporte comercial de inicialização spring para aplicativos de missão crítica. Com outras camadas, você obtém suporte a OSS.", - "waf": "Fiabilidade" + "text": "Use grupos de IP ou prefixos de IP para reduzir o número de regras de tabela de IP.", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", - "severity": "Alto", - "text": "Permitir que 2 réplicas tenham 99,9% de disponibilidade para operações de leitura", - "waf": "Fiabilidade" + "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": "Média", + "text": "Não use curingas como um IP de origem para DNATS, como * ou any, você deve especificar IPs de origem para DNATs de entrada.", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", + "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": "Média", - "text": "Permitir que 3 réplicas tenham 99,9% de disponibilidade para operações de leitura/gravação", - "waf": "Fiabilidade" + "text": "Evite o esgotamento da porta SNAT monitorando o uso da porta SNAT, avaliando as configurações do NAT Gateway e garantindo um failover contínuo. Se a contagem de portas se aproximar do limite, é um sinal de que o esgotamento do SNAT pode ser iminente.", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", - "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", - "service": "Cognitive Search", + "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": "Alto", - "text": "Aproveite as zonas de disponibilidade habilitando réplicas de leitura e/ou gravação", - "waf": "Fiabilidade" + "text": "Se você estiver usando o Firewall do Azure Premium, habilite a Inspeção TLS.", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review 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", - "severity": "Média", - "text": "Para redução regional, crie manualmente serviços em 2 ou mais regiões para a Pesquisa, pois não fornece um método automatizado de replicação de índices de pesquisa entre regiões geográficas", - "waf": "Fiabilidade" + "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": "Baixo", + "text": "Use categorias da Web para permitir ou negar o acesso de saída a tópicos específicos.", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", - "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", - "service": "Cognitive Search", - "severity": "Média", - "text": "Para sincronizar dados em vários serviços: Use indexadores para atualizar conteúdo em vários serviços ou Use APIs REST para enviar atualizações de conteúdo em vários serviços", - "waf": "Fiabilidade" + "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": "Média", + "text": "Como parte da inspeção TLS, planeje o recebimento de tráfego dos Gateways de Aplicativo do Azure para inspeção.", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review 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", + "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": "Média", - "text": "Usar o Gerenciador de Tráfego do Azure para coordenar solicitações", - "waf": "Fiabilidade" + "text": "Habilite a configuração de proxy DNS do Firewall do Azure.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", - "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", - "service": "Cognitive Search", + "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": "Alto", - "text": "Backup e restauração de um índice de pesquisa cognitiva do Azure. Use este código de exemplo para fazer backup da definição de índice e instantâneo em uma série de arquivos Json", - "waf": "Fiabilidade" + "text": "Integre o Firewall do Azure ao Azure Monitor e habilite o log de diagnóstico para armazenar e analisar logs de firewall.", + "waf": "Operações" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization Checklist", - "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", - "service": "Azure Monitor", - "text": "Regras de coleta de dados no Azure Monitor -https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview", - "training": "https://azure.microsoft.com/pricing/reservations/", - "waf": "Custar" + "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": "Baixo", + "text": "Implementar backups para suas regras de firewall", + "waf": "Operações" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "text": "Verificar instâncias de backup com a fonte de dados subjacente não encontrada", - "waf": "Custar" + "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": "Alto", + "text": "Não interrompa a comunicação do painel de controle para serviços de PaaS do Azure injetados em redes virtuais, como com uma rota 0.0.0.0/0 ou uma regra NSG que bloqueia o tráfego do painel de controle.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "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", - "text": "Excluir ou arquivar serviços não associados (discos, nics, endereços IP etc.)", - "waf": "Custar" + "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": "Média", + "text": "Acesse os serviços de PaaS do Azure localmente por meio de pontos de extremidade privados e emparelhamento privado do ExpressRoute. Esse método evita o trânsito pela Internet pública.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "text": "Considere um bom equilíbrio entre recuperação de local, armazenamento e backup para aplicativos não essenciais", - "waf": "Custar" + "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": "Alto", + "text": "Não habilite pontos de extremidade de serviço de rede virtual por padrão em todas as sub-redes.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization 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", - "text": "Verifique os gastos e as oportunidades de economia entre os 40 diferentes espaços de trabalho de análise de log - use retenção e coleta de dados diferentes para espaços de trabalho não prod - crie limite diário para reconhecimento e dimensionamento de camadas - Se você definir um limite diário, além de criar um alerta quando o limite for atingido, certifique-se de também criar uma regra de alerta para ser notificado quando alguma porcentagem for atingida (90%, por exemplo). - considerar a transformação do espaço de trabalho, se possível - 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": "Custar" + "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": "Média", + "text": "Filtre o tráfego de saída para os serviços de PaaS do Azure usando FQDNs em vez de endereços IP no Firewall do Azure ou em uma NVA para evitar a exfiltração de dados. Se estiver usando o Link Privado, você poderá bloquear todos os FQDNs, caso contrário, permita apenas os serviços de PaaS necessários.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization 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", - "text": "Impor uma política de log de limpeza e automação (se necessário, os logs podem ser movidos para armazenamento frio)", - "training": "https://www.youtube.com/watch?v=nHQYcYGKuyw", - "waf": "Custar" + "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": "Alto", + "text": "Utilize pelo menos um prefixo /27 para as sub-redes do Gateway.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "text": "Verifique se os discos são realmente necessários, se não: excluir. Se forem necessários, encontre níveis de armazenamento mais baixos ou use backup -", - "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/manage-automation", - "waf": "Custar" + "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": "Alto", + "text": "Não confie nas regras padrão de entrada do NSG usando a marca de serviço VirtualNetwork para limitar a conectividade.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization 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", - "text": "Considere mover o armazenamento não utilizado para o nível inferior, com regra personalizada - 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": "Custar" + "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": "Média", + "text": "Use NSGs para ajudar a proteger o tráfego entre sub-redes, bem como o tráfego leste/oeste na plataforma (tráfego entre zonas de destino).", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "VM", - "text": "Verifique se o Advisor está configurado para o dimensionamento correto da VM ", - "waf": "Custar" + "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": "Média", + "text": "Use NSGs e grupos de segurança de aplicativos para microssegmentar o tráfego dentro da zona de destino e evite usar uma NVA central para filtrar fluxos de tráfego.", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "description": "verifique pesquisando as Licenças de Categoria de Medidor na Análise de Custos", - "guid": "59ae568b-a38d-4498-9e22-13dbd7bb012f", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/manage/centralize-operations", - "service": "VM", - "text": "executar o script em todas as VMs do Windows 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- considere implementar uma diretiva se as VMs do Windows forem criadas com frequência", - "waf": "Custar" + "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": "Média", + "text": "Habilite os Logs de Fluxo de VNet e alimente-os na Análise de Tráfego para obter insights sobre fluxos de tráfego internos e externos.", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", - "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", - "service": "VM", - "text": " isso também pode ser colocado no AHUB se você já tiver licenças https://learn.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux?tabs=rhelpayg%2Crhelbyos%2CrhelEnablebyos%2Crhelcompliance", - "waf": "Custar" + "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": "Média", + "text": "Não implemente mais de 900 regras de NSG por NSG, devido ao limite de 1000 regras.", + "training": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", - "service": "VM", - "text": "Consolidar famílias de VM reservadas com opção de flexibilidade (não mais do que 4-5 famílias)", - "training": "https://learn.microsoft.com/azure/automation/automation-solution-vm-management", - "waf": "Custar" + "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": "Média", + "text": "Use a WAN Virtual se o cenário estiver explicitamente descrito na lista de designs de roteamento da WAN Virtual.", + "training": "https://learn.microsoft.com/learn/modules/introduction-azure-virtual-wan/", + "waf": "Operações" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "text": "Utilize instâncias reservadas do Azure: esse recurso permite reservar VMs por um período de 1 ou 3 anos, proporcionando uma economia significativa em comparação com os preços do PAYG.", - "waf": "Custar" + "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": "Média", + "text": "Use um hub de WAN Virtual por região do Azure para conectar várias zonas de destino entre regiões do Azure por meio de uma WAN Virtual do Azure global comum.", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", - "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", - "service": "VM", - "text": "Somente discos maiores podem ser reservados => 1 TiB -", - "waf": "Custar" + "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": "Média", + "text": "Para proteção e filtragem de tráfego de saída da Internet, implante o Firewall do Azure em hubs seguros.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", - "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", - "service": "VM", - "text": "Após a otimização do dimensionamento correto", - "waf": "Custar" + "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": "Média", + "text": "Verifique se a arquitetura de rede da WAN virtual está alinhada a um cenário de arquitetura identificado.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Sql/servers", - "checklist": "Cost Optimization Checklist", - "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", - "service": "Azure SQL", - "text": "Verifique se aplicável e aplique a política/alteração 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": "Custar" + "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": "Média", + "text": "Use o Azure Monitor Insights para WAN Virtual para monitorar a topologia de ponta a ponta da WAN Virtual, o status e as principais métricas.", + "waf": "Operações" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", - "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", - "service": "VM", - "text": "O desconto da peça de licença VM + (ahub + 3YRI) é de cerca de 70% de desconto", - "waf": "Custar" + "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": "Média", + "text": "Não desabilite o tráfego branch a branch na WAN Virtual, a menos que esses fluxos devam ser bloqueados explicitamente.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "text": "Considere o uso de um VMSS para corresponder à demanda em vez de dimensionamento simples", - "waf": "Custar" + "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": "Média", + "text": "Use AS-Path como preferência de roteamento de hub, pois é mais flexível que ExpressRoute ou VPN.", + "waf": "Fiabilidade" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Cost Optimization Checklist", - "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "AKS", - "text": "Use o autoscaler AKS para corresponder ao uso de clusters (verifique se os requisitos dos pods correspondem ao dimensionador)", - "waf": "Custar" + "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": "Média", + "text": "Configure a propagação baseada em rótulos na WAN Virtual, caso contrário, a conectividade entre hubs virtuais será prejudicada.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "text": "Mover pontos de recuperação para o vault-archive, quando aplicável (Validar)", - "training": "https://azure.microsoft.com/pricing/reservations/", - "waf": "Custar" + "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": "Alto", + "text": "Atribua pelo menos um prefixo /23 a hubs virtuais para garantir que haja espaço IP suficiente disponível.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.Databricks/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", - "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", - "service": "Databricks", - "text": "Considere o uso de VMs spot com fallback sempre que possível. Considere o autotermination de clusters.", - "waf": "Custar" + "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": "Alto", + "text": "Aproveite o Azure Policy estrategicamente, defina controles para seu ambiente, usando Iniciativas de Política para agrupar políticas relacionadas.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", - "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", - "service": "Azure Functions", - "text": "Funções - Reutilizar conexões", - "training": "https://learn.microsoft.com/azure/cost-management-billing/reservations/reservation-apis?toc=%2Fazure%2Fcost-management-billing%2Ftoc.json", - "waf": "Custar" + "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": "Média", + "text": "Mapeie os requisitos regulatórios e de conformidade para definições do Azure Policy e atribuições de função do Azure.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", - "link": "https://learn.microsoft.com/azure/automation/update-management/overview", - "service": "Azure Functions", - "text": "Funções - Armazenar dados em cache localmente", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", - "waf": "Custar" + "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": "Média", + "text": "Estabeleça definições do Azure Policy no grupo de gerenciamento raiz intermediário para que elas possam ser atribuídas em escopos herdados.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", - "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", - "service": "Azure Functions", - "text": "Funções - Partidas a frio - Use a funcionalidade 'Executar do pacote'. Dessa forma, o código é baixado como um único arquivo zip. Isso pode, por exemplo, resultar em melhorias significativas com as funções Javascript, que possuem muitos módulos de nó. Use ferramentas específicas de linguagem para reduzir o tamanho do pacote, por exemplo, aplicativos Javascript que agitam árvores.", - "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", - "waf": "Custar" + "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": "Alto", + "text": "Gerencie atribuições de política no nível apropriado mais alto com exclusões nos níveis inferiores, se necessário.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "Azure Functions", - "text": "Funções - Mantenha suas funções aquecidas", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "Custar" + "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": "Baixo", + "text": "Use o Azure Policy para controlar quais serviços os usuários podem provisionar no nível da assinatura/grupo de gerenciamento.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", + "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": "Azure Functions", - "text": "Ao usar o dimensionamento automático com funções diferentes, pode haver um que conduza todo o dimensionamento automático para todos os recursos - considere movê-lo para um plano de consumo separado (e considere um plano mais alto para a CPU)", - "waf": "Custar" - }, - { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", - "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", - "service": "Azure Functions", - "text": "Os aplicativos de função em um determinado plano são todos dimensionados juntos, portanto, quaisquer problemas com o dimensionamento podem afetar todos os aplicativos no plano.", - "waf": "Custar" + "service": "Policy", + "severity": "Alto", + "text": "Use políticas internas sempre que possível para minimizar a sobrecarga operacional.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", - "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", - "service": "Azure Functions", - "text": "Sou cobrado por 'tempo de espera'? Essa pergunta geralmente é feita no contexto de uma função C# que faz uma operação assíncrona e aguarda o resultado, por exemplo, aguardar Task.Delay(1000) ou aguardar cliente. GetAsync('http://google.com'). A resposta é sim - o segundo cálculo de GB é baseado na hora de início e término da função e no uso de memória durante esse período. O que realmente acontece ao longo desse tempo em termos de atividade da CPU não é levado em consideração no cálculo. Uma exceção a essa regra é se você estiver usando funções duráveis. Você não é cobrado pelo tempo gasto em espera em funções de orquestrador.aplique técnicas de modelagem de demanda sempre que possível (ambientes de desenvolvimento?) https://github.com/Azure-Samples/functions-csharp-premium-scaler", - "waf": "Custar" + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "description": "Atribuir a função Colaborador de Política de Recursos a escopos específicos permite delegar o gerenciamento de políticas a equipes relevantes. Por exemplo, uma equipe central de TI pode supervisionar as políticas no nível do grupo de gerenciamento, enquanto as equipes de aplicativos lidam com as políticas de suas assinaturas, permitindo a governança distribuída com adesão aos padrões organizacionais.", + "guid": "3f988795-25d6-4268-a6d7-0ba6c97be995", + "link": "https://learn.microsoft.com/azure/governance/policy/overview#azure-rbac-permissions-in-azure-policy", + "service": "Policy", + "severity": "Média", + "text": "Atribua a função interna de Colaborador de Política de Recursos em um escopo específico para habilitar a governança no nível do aplicativo.", + "waf": "Segurança" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Cost Optimization Checklist", - "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "Front Door", - "text": "Frontdoor - Desativar a página inicial padrãoNas configurações do aplicativo do seu aplicativo, defina AzureWebJobsDisableHomepage como true. Isso retornará um 204 (Sem Conteúdo) para o PoP para que apenas os dados de cabeçalho sejam retornados.", - "waf": "Custar" + "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": "Média", + "text": "Limite o número de atribuições do Azure Policy feitas no escopo do grupo de gerenciamento raiz para evitar o gerenciamento por meio de exclusões em escopos herdados.", + "waf": "Segurança" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Cost Optimization 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", - "text": "Frontdoor - Rota para algo que não retorna nada. Configure uma Função, Proxy de Função ou adicione uma rota em seu WebApp que retorne 200 (OK) e envie conteúdo nulo ou mínimo. A vantagem disso é que você poderá fazer logout quando for chamado.", - "waf": "Custar" + "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": "Média", + "text": "Se houver requisitos de soberania de dados, as Políticas do Azure deverão ser implantadas para aplicá-los.", + "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", - "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", - "service": "Storage", - "text": "Considere níveis de arquivamento para dados menos usados", - "waf": "Custar" + "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": "Média", + "text": "Para a Zona de Destino Soberana, implante a linha de base da política de soberania e atribua no nível correto do grupo de gerenciamento.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", - "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", - "service": "VM", - "text": "Verifique os tamanhos de disco em que o tamanho não corresponde à camada (ou seja, um disco de 513 GiB pagará um P30 (1TiB) e considere o redimensionamento", - "waf": "Custar" + "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": "Média", + "text": "Para Zona de Aterrissagem Soberana, documente os objetivos de Controle Soberano para mapeamento de políticas.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", - "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", - "service": "Storage", - "text": "Considere usar SSD padrão em vez de Premium ou Ultra sempre que possível", - "waf": "Custar" + "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": "Média", + "text": "Para a Zona de Aterrissagem Soberana, certifique-se de que o processo esteja em vigor para o gerenciamento de 'Objetivos de Controle Soberano para mapeamento de políticas'.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization 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", - "text": "Para contas de armazenamento, verifique se a camada escolhida não está somando encargos de transação (pode ser mais barato passar para a próxima camada)", - "waf": "Custar" + "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": "Média", + "text": "Use um workspace de logs de monitor único para gerenciar plataformas centralmente, exceto quando o RBAC (controle de acesso baseado em função) do Azure, os requisitos de soberania de dados ou as políticas de retenção de dados exigirem workspaces separados.", + "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "waf": "Operações" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization Checklist", - "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", - "service": "Site Recovery", - "text": "Para ASR, considere o uso de discos SSD padrão se o RPO/RTO e a taxa de transferência de replicação permitirem", - "waf": "Custar" + "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": "Alto", + "text": "Exporte logs para o Armazenamento do Azure se os requisitos de retenção de log excederem doze anos. Use o armazenamento imutável com uma política de gravação única e leitura múltipla para tornar os dados não apagáveis e não modificáveis por um intervalo especificado pelo usuário.", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "waf": "Operações" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", - "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", - "service": "Storage", - "text": "Contas de armazenamento: verifique o hot tier e/ou o GRS necessário", - "waf": "Custar" + "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": "Média", + "text": "Monitore o descompasso de configuração da VM (máquina virtual) no nível do sistema operacional usando o Azure Policy. Habilitar os recursos de auditoria da Configuração de Computador do Gerenciamento Automatizado do Azure por meio da política ajuda as cargas de trabalho da equipe de aplicativos a consumir imediatamente os recursos de recursos com pouco esforço.", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Operações" }, { "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", - "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", + "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", - "text": "Discos - valide o uso de discos SSD Premium em todos os lugares: por exemplo, não-prod pode trocar para SSD padrão ou SSD Premium sob demanda ", - "waf": "Custar" + "severity": "Média", + "text": "Use o Azure Update Manager como um mecanismo de aplicação de patch para VMs Windows e Linux no Azure.", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "waf": "Operações" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", - "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", - "service": "Synapse", - "text": "Crie orçamentos para gerenciar custos e crie alertas que notifiquem automaticamente as partes interessadas sobre anomalias de gastos e riscos de gastos excessivos.", - "waf": "Custar" + "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": "Média", + "text": "Use o Gerenciador de Atualizações do Azure como um mecanismo de aplicação de patch para VMs do Windows e do Linux fora do Azure usando o Azure Arc.", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "waf": "Operações" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "Synapse", - "text": "Exporte dados de custo para uma conta de armazenamento para análise de dados adicionais.", - "waf": "Custar" + "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": "Média", + "text": "Use o Observador de Rede para monitorar proativamente os fluxos de tráfego.", + "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", + "waf": "Operações" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "Synapse", - "text": "Controle os custos de um pool SQL dedicado pausando o recurso quando ele não estiver em uso.", - "waf": "Custar" + "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": "Média", + "text": "Use os Logs do Azure Monitor para obter insights e relatórios.", + "waf": "Operações" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", - "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", - "service": "Synapse", - "text": "Habilite o recurso de pausa automática do Apache Spark sem servidor e defina seu valor de tempo limite de acordo.", - "waf": "Custar" + "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": "Média", + "text": "Use alertas do Azure Monitor para a geração de alertas operacionais.", + "waf": "Operações" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization 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", - "text": "Crie várias definições de pool do Apache Spark de vários tamanhos.", - "waf": "Custar" + "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": "Média", + "text": "Ao usar o Acompanhamento de Alterações e Inventário por meio de Contas de Automação do Azure, verifique se você selecionou regiões com suporte para vincular seu workspace do Log Analytics e contas de automação.", + "waf": "Operações" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization 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", - "text": "Adquira unidades de confirmação (SCU) do Azure Synapse por um ano com um plano de pré-compra para economizar nos custos do Azure Synapse Analytics.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Custar" + "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": "Baixo", + "text": "Ao usar o Backup do Azure, use os tipos de backup corretos (GRS, ZRS E LRS) para o backup, pois a configuração padrão é GRS.", + "waf": "Fiabilidade" }, { "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", - "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", + "checklist": "Azure Landing Zone Review", + "guid": "f541acdc-e979-4377-acdb-3751ab2ab13a", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", "service": "VM", - "text": "Usar VMs spot para trabalhos interruptíveis: são VMs que podem ser licitadas e compradas a um preço com desconto, fornecendo uma solução econômica para cargas de trabalho não críticas.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Custar" + "severity": "Média", + "text": "Use as políticas de convidado do Azure para implantar automaticamente as configurações de software por meio de extensões de VM e impor uma configuração de VM de linha de base compatível.", + "waf": "Segurança" }, { "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "544451e1-92d3-4442-a3c7-628637a551c5", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "checklist": "Azure Landing Zone Review", + "description": "Use os recursos de configuração de convidado do Azure Policy para auditar e corrigir as configurações do computador (por exemplo, sistema operacional, aplicativo, ambiente) para garantir que os recursos estejam alinhados com as configurações esperadas e que o Gerenciamento de Atualizações possa impor o gerenciamento de patches para 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", - "text": "Dimensionamento correto de todas as VMs", - "waf": "Custar" + "severity": "Média", + "text": "Monitore o descompasso de configuração de segurança da VM por meio do Azure Policy.", + "waf": "Segurança" }, { "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", + "checklist": "Azure Landing Zone Review", + "guid": "2476e49f-541a-4cdc-b979-377bcdb3751a", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", "service": "VM", - "text": "Trocar VM dimensionada com tamanhos normalizados e mais recentes", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Custar" + "severity": "Média", + "text": "Use o Azure Site Recovery para cenários de recuperação de desastre de Máquinas Virtuais do Azure para o Azure. Isso permite replicar cargas de trabalho entre regiões.", + "waf": "Operações" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", - "text": "VMs de dimensionamento correto - comece com o monitoramento do uso abaixo de 5% e, em seguida, trabalhe até 40%", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Custar" + "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": "Média", + "text": "Use recursos de backup nativos do Azure ou uma solução de backup de terceiros compatível com o Azure.", + "waf": "Operações" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", - "text": "A conteinerização de um aplicativo pode melhorar a densidade da VM e economizar dinheiro no dimensionamento", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Custar" - }, + "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": "Alto", + "text": "Adicione configurações de diagnóstico para salvar logs do WAF de serviços de entrega de aplicativos, como o Azure Front Door e o Gateway de Aplicativo do Azure. Revise regularmente os logs para verificar se há ataques e detecções de falsos positivos.", + "waf": "Operações" + }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review Checklist", - "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", - "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", - "service": "Azure MySQL", + "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": "Média", - "text": "Aproveite o servidor flexível", - "waf": "Fiabilidade" + "text": "Envie logs do WAF de seus serviços de entrega de aplicativos, como o Azure Front Door e o Gateway de Aplicativo do Azure, para o Microsoft Sentinel. Detecte ataques e integre a telemetria do WAF ao seu ambiente geral do Azure.", + "waf": "Operações" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review 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", + "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": "Alto", - "text": "Aproveite as zonas de disponibilidade quando aplicável regionalmente", - "waf": "Fiabilidade" + "text": "Use o Azure Key Vault para armazenar seus segredos e credenciais.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review 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", + "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": "Média", - "text": "Aproveite a replicação de dados para cenários de DR entre regiões", - "waf": "Fiabilidade" + "text": "Use diferentes Azure Key Vaults para diferentes aplicativos e regiões para evitar limites de escala de transação e restringir o acesso a segredos.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", - "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", - "service": "SAP", + "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": "Média", - "text": "O Azure Center for SAP solutions (ACSS) é uma oferta do Azure que torna o SAP uma carga de trabalho de nível superior no Azure. O ACSS é uma solução de ponta a ponta que permite criar e executar sistemas SAP como uma carga de trabalho unificada no Azure e fornece uma base mais perfeita para a inovação. Você pode aproveitar os recursos de gerenciamento para sistemas SAP novos e existentes baseados no Azure.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-center-sap-solutions/?source=recommendations", - "waf": "Operações" + "text": "Provisione o Azure Key Vault com as políticas de exclusão reversível e limpeza habilitadas para permitir a proteção de retenção para objetos excluídos.", + "waf": "Segurança" }, { - "checklist": "SAP 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", + "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": "Média", - "text": "O Azure dá suporte à automação de implantações SAP no Linux e no Windows. O SAP Deployment Automation Framework é uma ferramenta de orquestração de código aberto que pode implantar, instalar e manter ambientes SAP.", - "training": "https://github.com/Azure/sap-automation", - "waf": "Operações" + "text": "Siga um modelo de privilégios mínimos limitando a autorização para excluir permanentemente chaves, segredos e certificados a funções personalizadas especializadas de ID do Microsoft Entra.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", - "service": "SAP", + "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": "Média", - "text": "Executar uma recuperação point-in-time para seus bancos de dados de produção em qualquer ponto e em um período de tempo que atenda ao seu RTO; A recuperação point-in-time normalmente inclui erros do operador excluindo dados na camada DBMS ou por meio do SAP, incidentalmente", - "waf": "Fiabilidade" + "text": "Automatize o processo de gerenciamento e renovação de certificados com autoridades de certificação públicas para facilitar a administração.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", - "service": "SAP", + "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": "Média", - "text": "Teste os tempos de backup e recuperação para verificar se eles atendem aos requisitos de RTO para restaurar todos os sistemas simultaneamente após um desastre.", - "waf": "Fiabilidade" + "text": "Estabeleça um processo automatizado para rotação de chaves e certificados.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "b651423c-8552-42db-a545-5cb50c05527a", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "SAP", - "severity": "Alto", - "text": "Você pode replicar o armazenamento padrão entre regiões emparelhadas, mas não pode usar o armazenamento padrão para armazenar seus bancos de dados ou discos rígidos virtuais. Você pode replicar backups somente entre regiões emparelhadas que você usa. Para todos os outros dados, execute sua replicação usando recursos nativos de DBMS, como SQL Server Always On ou SAP HANA System Replication. Use uma combinação de Site Recovery, rsync ou robocopy e outros softwares de terceiros para a camada de aplicativos SAP.", - "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", - "waf": "Fiabilidade" + "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": "Média", + "text": "Habilite o firewall e o ponto de extremidade de serviço de rede virtual ou o ponto de extremidade privado no cofre para controlar o acesso ao cofre de chaves.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", + "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": "Média", - "text": "Ao usar as Zonas de Disponibilidade do Azure para obter alta disponibilidade, você deve considerar a latência entre servidores de aplicativos SAP e servidores de banco de dados. Para zonas com altas latências, os procedimentos operacionais precisam estar em vigor para garantir que os servidores de aplicativos SAP e os servidores de banco de dados estejam sendo executados na mesma zona o tempo todo.", - "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", - "waf": "Fiabilidade" + "text": "Use o workspace do Log Analytics do Azure Monitor central da plataforma para auditar o uso de chave, certificado e segredo em cada instância do Key Vault.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", - "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", - "service": "SAP", - "severity": "Alto", - "text": "Configure conexões de Rota Expressa do local para as regiões primária e secundária de recuperação de desastres do Azure. Além disso, como alternativa ao uso da Rota Expressa, considere configurar conexões VPN locais para as regiões primária e secundária de recuperação de desastres do Azure.", - "training": "https://learn.microsoft.com/azure/expressroute/use-s2s-vpn-as-backup-for-expressroute-privatepeering", - "waf": "Fiabilidade" + "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": "Média", + "text": "Delegue a instanciação e o acesso privilegiado do Key Vault e use o Azure Policy para impor uma configuração consistente e compatível.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "SAP", - "severity": "Baixo", - "text": "Replique o conteúdo do cofre de chaves, como certificados, segredos ou chaves entre regiões, para que você possa descriptografar dados na região de recuperação de desastres.", - "waf": "Fiabilidade" + "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": "Média", + "text": "Use um Azure Key Vault por aplicativo por ambiente por região.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", - "service": "SAP", + "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": "Média", - "text": "Emparelhar as redes virtuais primária e de recuperação de desastres. Por exemplo, para a replicação do sistema HANA, uma rede virtual SAP HANA DB precisa ser emparelhada para a rede virtual SAP HANA DB do site de recuperação de desastres.", - "waf": "Fiabilidade" + "text": "Se você quiser trazer suas próprias chaves, isso pode não ser compatível com todos os serviços considerados. Implemente mitigação relevante para que as inconsistências não prejudiquem os resultados desejados. Escolha pares de regiões apropriados e regiões de recuperação de desastre que minimizem a latência.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", - "service": "SAP", - "severity": "Baixo", - "text": "Se você usar o armazenamento do Azure NetApp Files para suas implantações SAP, no mínimo, crie duas contas do Azure NetApp Files na camada Premium, em duas regiões.", - "training": "https://learn.microsoft.com/training/modules/choose-service-level-azure-netapp-files-hpc-applications/2-identify-decision-criteria", - "waf": "Fiabilidade" + "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": "Média", + "text": "Para a Zona de Destino Soberana, use o HSM gerenciado do Azure Key Vault para armazenar seus segredos e credenciais.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", + "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": "Média", + "text": "Use os recursos de relatório de ID do Microsoft Entra para gerar relatórios de auditoria de controle de acesso.", + "waf": "Segurança" + }, + { + "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": "Alto", - "text": "A tecnologia de replicação de banco de dados nativo deve ser usada para sincronizar o banco de dados em um par de HA.", - "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/?source=recommendations", - "waf": "Fiabilidade" + "text": "Habilite o Gerenciamento de Postura de Segurança de Nuvem do Defender para todas as assinaturas.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", - "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", - "service": "SAP", + "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": "Alto", - "text": "O CIDR da rede virtual primária (VNet) não deve entrar em conflito ou se sobrepor ao CIDR da VNet do site de recuperação de desastres", - "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", - "waf": "Fiabilidade" + "text": "Habilite um Plano de Proteção de Carga de Trabalho de Nuvem do Defender para Servidores em todas as assinaturas.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", - "service": "SAP", + "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": "Alto", - "text": "Use a Recuperação de Site para replicar um servidor de aplicativos para um site de recuperação de desastres. A Recuperação de Site também pode ajudar na replicação de VMs de cluster de serviços centrais para o site de recuperação de desastres. Ao invocar o DR, você precisará reconfigurar o cluster do Linux Pacemaker no site de DR (por exemplo, substitua o VIP ou o SBD, execute o corosync.conf e muito mais).", - "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", - "waf": "Fiabilidade" + "text": "Habilite os Planos de Proteção de Carga de Trabalho de Nuvem do Defender para Recursos do Azure em todas as assinaturas.", + "waf": "Segurança" }, { - "checklist": "SAP 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", + "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": "Alto", - "text": "Considere a disponibilidade do software SAP em relação a pontos únicos de falha. Isso inclui pontos únicos de falha em aplicativos como SGBDs utilizados nas arquiteturas SAP NetWeaver e SAP S/4HANA, SAP ABAP e ASCS + SCS. Além disso, outras ferramentas, como o 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": "Fiabilidade" + "text": "Habilite o Endpoint Protection em servidores IaaS.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", - "service": "SAP", - "severity": "Alto", - "text": "Para bancos de dados SAP e SAP, considere a implementação de clusters de failover automático. No Windows, o Clustering de Failover do Windows Server oferece suporte a failover. No Linux, Linux Pacemaker ou ferramentas de terceiros como SIOS Protection Suite e Veritas InfoScale suportam failover.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Fiabilidade" + "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": "Média", + "text": "Monitore o descompasso de aplicação de patch do sistema operacional base por meio dos Logs do Azure Monitor e do Defender para Nuvem.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", - "severity": "Alto", - "text": "O Azure não oferece suporte a arquiteturas nas quais as VMs primária e secundária compartilham armazenamento para dados DBMS. Para a camada DBMS, o padrão de arquitetura comum é replicar bancos de dados ao mesmo tempo e com pilhas de armazenamento diferentes daquelas que as VMs primária e secundária usam.", - "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": "Fiabilidade" + "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": "Média", + "text": "Conecte as configurações de recursos padrão a um workspace centralizado do Log Analytics do Azure Monitor.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", - "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", - "service": "SAP", - "severity": "Alto", - "text": "Os dados do DBMS e os arquivos de log de transação/refazer são armazenados no armazenamento em bloco com suporte do Azure ou nos Arquivos do Azure NetApp. Os Arquivos do Azure ou os Arquivos Premium do Azure não têm suporte como armazenamento para dados DBMS e/ou arquivos de log de refazer com a carga de trabalho SAP.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-databases/2-explore-database-support-azure-for-sap-workloads", - "waf": "Fiabilidade" + "checklist": "Azure Landing Zone Review", + "guid": "1761e147-f65e-4d09-bbc2-f464f23e2eba", + "link": "https://learn.microsoft.com/industry/sovereignty/transparency-logs", + "service": "Entra", + "severity": "Média", + "text": "Para Zona de Destino Soberana, habilite os logs de transparência no locatário da ID do Entra.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", - "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", - "service": "SAP", - "severity": "Alto", - "text": "Você pode usar discos compartilhados do Azure no Windows para componentes ASCS + SCS e cenários específicos de alta disponibilidade. Configure seus clusters de failover separadamente para componentes da camada de aplicativo SAP e a camada DBMS. No momento, o Azure não oferece suporte a arquiteturas de alta disponibilidade que combinam componentes da camada de aplicativo SAP e a camada DBMS em um cluster de failover.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Fiabilidade" + "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": "Média", + "text": "Para Zona de Destino Soberana, habilite o Sistema de Proteção de Dados do cliente no locatário da ID do Entra.", + "waf": "Segurança" }, { - "checklist": "SAP 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", + "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": "Alto", - "text": "A maioria dos clusters de failover para ASCS (Application Layer Components, componentes da camada de aplicativo) SAP e a camada DBMS exigem um endereço IP virtual para um cluster de failover. O Balanceador de Carga do Azure deve manipular o endereço IP virtual para todos os outros casos. Um princípio de design é usar um balanceador de carga por configuração de cluster. Recomendamos que você use a versão padrão do balanceador de carga (SKU do Standard Load Balancer).", - "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", - "waf": "Fiabilidade" + "text": "Habilite a transferência segura para contas de armazenamento.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", - "service": "SAP", + "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": "Alto", - "text": "Verifique se o IP flutuante está habilitado no balanceador de carga", - "training": "https://learn.microsoft.com/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", - "waf": "Fiabilidade" + "text": "Habilite a exclusão reversível do contêiner para a conta de armazenamento para recuperar um contêiner excluído e seu conteúdo.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "SAP", + "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": "Alto", - "text": "Antes de implantar sua infraestrutura de alta disponibilidade, e dependendo da região escolhida, determine se deseja implantar com um conjunto de disponibilidade do Azure ou uma zona de disponibilidade.", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "Fiabilidade" + "text": "Use segredos do Key Vault para evitar codificar informações confidenciais, como credenciais (máquinas virtuais, senhas de usuário), certificados ou chaves.", + "waf": "Operações" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", + "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", + "service": "Logic Apps", "severity": "Alto", - "text": "Se desejar atender aos SLAs de infraestrutura de seus aplicativos para componentes SAP (serviços centrais, servidores de aplicativos e bancos de dados), você deverá escolher as mesmas opções de alta disponibilidade (VMs, conjuntos de disponibilidade, zonas de disponibilidade) para todos os componentes.", + "text": "Selecione o plano de hospedagem de aplicativo lógico certo com base em seus requisitos de negócios e SLO", "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "cbe05bbe-209d-4490-ba47-778424d11678", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps 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", "severity": "Alto", - "text": "Não misture servidores de funções diferentes no mesmo conjunto de disponibilidade. Mantenha VMs de serviços centrais, VMs de banco de dados, VMs de aplicativos em seus próprios conjuntos de disponibilidade", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "Fiabilidade" - }, - { - "checklist": "SAP Checklist", - "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", - "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", - "service": "SAP", - "severity": "Média", - "text": "Você não pode implantar conjuntos de disponibilidade do Azure em uma zona de disponibilidade do Azure, a menos que use grupos de posicionamento de proximidade.", - "training": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "text": "Proteja aplicativos lógicos contra falhas de região com redundância de zona e zonas de disponibilidade", "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "9674e7c7-7796-4181-8920-09f4429543ba", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps 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", "severity": "Alto", - "text": "Ao criar conjuntos de disponibilidade, use o número máximo de domínios de falha e atualize domínios disponíveis. Por exemplo, se você implantar mais de duas VMs em um conjunto de disponibilidade, use o número máximo de domínios de falha (três) e domínios de atualização suficientes para limitar o efeito de possíveis falhas de hardware físico, interrupções de rede ou interrupções de energia, além da manutenção planejada do Azure. O número padrão de domínios de falha é dois e você não pode alterá-lo online mais tarde.", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", + "text": "Considere uma estratégia de DR entre regiões para cargas de trabalho críticas", "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", + "link": "https://learn.microsoft.com/azure/app-service/environment/intro", + "service": "Logic Apps", "severity": "Alto", - "text": "Quando você usa grupos de posicionamento de proximidade do Azure em uma implantação de conjunto de disponibilidade, todos os três componentes SAP (serviços centrais, servidor de aplicativos e banco de dados) devem estar no mesmo grupo de posicionamento de proximidade.", + "text": "Se estiver implantando em um ambiente isolado, use ou migre para o ASE (Ambiente do Serviço de Aplicativo) v3", "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", - "severity": "Alto", - "text": "Use um grupo de posicionamento de proximidade por SAP SID. Os grupos não se estendem por zonas de disponibilidade ou regiões do Azure", - "waf": "Fiabilidade" + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", + "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", + "service": "Logic Apps", + "severity": "Média", + "text": "Aproveite o Azure DevOps ou o GitHub para simplificar o CI/CD e proteger seu código de Aplicativo Lógico", + "waf": "Operações" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", + "service": "AVS", "severity": "Alto", - "text": "Use um dos seguintes serviços para executar clusters de serviços centrais SAP, dependendo do sistema operacional.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Fiabilidade" + "text": "Verifique se os controladores de domínio ADDS estão implantados na assinatura de identidade no Azure nativo", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "ed46b937-913e-4018-9c62-8393ab037e53", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "75089c20-990d-4927-b105-885576f76fc2", + "service": "AVS", "severity": "Média", - "text": "No momento, o Azure não oferece suporte à combinação de ASCS e HA de banco de dados no mesmo cluster do Linux Pacemaker; Separe-os em agrupamentos individuais. No entanto, você pode combinar até cinco clusters de serviços centrais em um par de VMs.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Fiabilidade" + "text": "Verifique se os sites e serviços do ADDS estão configurados para manter as solicitações de autenticação de recursos baseados no Azure (incluindo a Solução VMware do Azure) locais para o Azure", + "waf": "Segurança" }, { - "checklist": "SAP 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", - "severity": "Média", - "text": "Implante ambas as VMs no par de alta disponibilidade em um conjunto de disponibilidade ou em zonas de disponibilidade. Essas VMs devem ter o mesmo tamanho e a mesma configuração de armazenamento.", - "waf": "Fiabilidade" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", + "service": "AVS", + "severity": "Alto", + "text": "Verifique se o vCenter está conectado ao ADDS para habilitar a autenticação com base em 'contas de usuário nomeadas'", + "waf": "Segurança" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", + "service": "AVS", "severity": "Média", - "text": "O Azure oferece suporte à instalação e configuração de instâncias SAP HANA e ASCS/SCS e ERS no mesmo cluster de alta disponibilidade em execução no Red Hat Enterprise Linux (RHEL).", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Fiabilidade" + "text": "Verifique se a conexão do vCenter com o ADDS está usando um protocolo seguro (LDAPS)", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", - "severity": "Alto", - "text": "Execute todos os sistemas de produção em SSDs gerenciados Premium e use o Azure NetApp Files ou o Ultra Disk Storage. Pelo menos o disco do sistema operacional deve estar na camada Premium para que você possa obter melhor desempenho e o melhor SLA.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", - "waf": "Fiabilidade" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", + "service": "AVS", + "severity": "Média", + "text": "A conta do CloudAdmin no vCenter IdP é usada apenas como uma conta de emergência (break-glass)", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", + "service": "AVS", "severity": "Alto", - "text": "Você deve executar o SAP HANA no Azure somente nos tipos de armazenamento certificados pela SAP. Observe que determinados volumes devem ser executados em determinadas configurações de disco, quando aplicável. Essas configurações incluem a habilitação do Acelerador de Gravação e o uso do armazenamento Premium. Você também precisa garantir que o sistema de arquivos executado no armazenamento seja compatível com o DBMS executado na máquina.", - "training": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1?source=recommendations", - "waf": "Fiabilidade" + "text": "Certifique-se de que o NSX-Manager esteja integrado a um provedor de identidade externo (LDAPS)", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", + "service": "AVS", + "severity": "Média", + "text": "Foi criado um modelo RBAC para uso no VMware vSphere", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", + "service": "AVS", + "severity": "Média", + "text": "As permissões RBAC devem ser concedidas em grupos ADDS e não em usuários específicos", + "waf": "Segurança" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", + "service": "AVS", "severity": "Alto", - "text": "Considere configurar a alta disponibilidade dependendo do tipo de armazenamento usado para suas cargas de trabalho SAP. Alguns serviços de armazenamento disponíveis no Azure não têm suporte no Azure Site Recovery, portanto, sua configuração de alta disponibilidade pode ser diferente.", - "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/2-explore-disaster-recovery-sap-workloads", - "waf": "Fiabilidade" + "text": "As permissões RBAC no recurso Solução VMware do Azure no Azure são 'bloqueadas' apenas para um conjunto limitado de proprietários", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", - "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", + "service": "AVS", "severity": "Alto", - "text": "Diferentes serviços de armazenamento nativos do Azure (como Arquivos do Azure, Arquivos do Azure NetApp, Disco Compartilhado do Azure) podem não estar disponíveis em todas as regiões. Portanto, para ter uma configuração SAP semelhante na região de DR após o failover, certifique-se de que o respectivo serviço de armazenamento seja oferecido no local de DR.", - "waf": "Fiabilidade" + "text": "Certifique-se de que todas as funções personalizadas tenham escopo com autorizações permitidas do CloudAdmin", + "waf": "Segurança" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", + "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", + "service": "AVS", + "severity": "Alto", + "text": "O modelo de conectividade correto da Solução VMware do Azure está selecionado para o caso de uso do cliente em mãos?", + "waf": "Desempenho" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", + "service": "AVS", + "severity": "Alto", + "text": "Garantir que as conexões de Rota Expressa ou VPN do local para o Azure sejam monitoradas usando o 'monitor de conexão'", + "waf": "Operações" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", + "service": "AVS", "severity": "Média", - "text": "Automatize o Start-Stop do sistema SAP para gerenciar custos.", - "waf": "Custar" + "text": "Verifique se um monitor de conexão foi criado a partir de um recurso nativo do Azure para uma máquina virtual da Solução VMware do Azure para monitorar a conexão de Rota Expressa de back-end da Solução VMware do Azure", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", - "severity": "Baixo", - "text": "No caso de usar o Armazenamento Premium do Azure com o SAP HANA, o armazenamento SSD padrão do Azure pode ser usado para selecionar uma solução de armazenamento econômica. No entanto, observe que escolher o armazenamento padrão SSD ou HDD padrão do Azure afetará o SLA das VMs individuais. Além disso, para sistemas com menor taxa de transferência de E/S e baixa latência, como ambientes que não são de produção, VMs de série mais baixa podem ser usadas.", - "waf": "Custar" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", + "service": "AVS", + "severity": "Média", + "text": "Verifique se um monitor de conexão é criado a partir de um recurso local para uma máquina virtual da Solução VMware do Azure para monitorar a conectividade de ponta 2", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "9877f353-2591-4e8b-8381-e9043fed1010", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", - "severity": "Baixo", - "text": "Como uma configuração alternativa de baixo custo (multiuso), você pode escolher uma SKU de baixo desempenho para suas VMs de servidor de banco de dados HANA que não são de produção. No entanto, é importante observar que alguns tipos de VM, como a série E, não são certificados pelo HANA (SAP HANA Hardware Directory) ou não podem atingir latência de armazenamento inferior a 1ms.", - "waf": "Custar" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", + "service": "AVS", + "severity": "Alto", + "text": "Quando o servidor de rotas for usado, certifique-se de que não mais de 1000 rotas sejam propagadas do servidor de rotas para o gateway ExR para o local (limite ARS).", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", + "service": "AVS", "severity": "Alto", - "text": "Impor um modelo RBAC para grupos de gerenciamento, assinaturas, grupos de recursos e recursos", - "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", + "text": "O Gerenciamento de Identidades Privilegiadas é implementado para funções que gerenciam o recurso da Solução VMware do Azure no Portal do Azure (não são permitidas permissões permanentes)", "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "45911475-e39e-4530-accc-d979366bcda2", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", - "severity": "Média", - "text": "Impor a propagação principal para encaminhar a identidade do aplicativo de nuvem SAP para o SAP local (incluindo IaaS) por meio do conector de nuvem", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/2-explore-azure-virtual-machine-auth-access-control", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", + "service": "AVS", + "severity": "Alto", + "text": "Os relatórios de auditoria do Gerenciamento de Identidades Privilegiadas devem ser implementados para as funções PIM da Solução VMware do Azure", "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", + "service": "AVS", "severity": "Média", - "text": "Implemente SSO em aplicativos SAP SaaS como SAP Analytics Cloud, SAP Cloud Platform, Business by design, SAP Qualtrics e SAP C4C com o Azure AD usando SAML.", + "text": "Se o uso do Gerenciamento de Identidades Privilegiadas estiver sendo usado, certifique-se de que uma conta válida habilitada para ID do Entra seja criada com um registro SMTP válido para notificações de substituição automática do Host da Solução VMware do Azure. (permissões permanentes necessárias)", "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", - "severity": "Média", - "text": "Implemente SSO em aplicativos Web baseados no SAP NetWeaver, como SAP Fiori e SAP Web GUI, usando SAML.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", + "service": "AVS", + "severity": "Alto", + "text": "Limitar o uso da conta do CloudAdmin apenas ao acesso de emergência", "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", + "service": "AVS", "severity": "Média", - "text": "Implemente SSO em aplicativos Web baseados no SAP NetWeaver, como SAP Fiori e SAP Web GUI, usando SAML.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/6-exercise-integrate-azure-active-directory-sap-fiori", + "text": "Criar funções RBAC personalizadas no vCenter para implementar um modelo de privilégios mínimos dentro do vCenter", "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", + "service": "AVS", "severity": "Média", - "text": "Você pode implementar o SSO no SAP GUI usando o SAP NetWeaver SSO ou uma solução de parceiro.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", + "text": "É um processo definido para alternar regularmente as credenciais cloudadmin (vCenter) e admin (NSX)", "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", - "service": "SAP", - "severity": "Média", - "text": "Para SSO para SAP GUI e acesso ao navegador web, implemente SNC / Kerberos / SPNEGO (mecanismo de negociação GSSAPI simples e protegido) devido a sua facilidade de configuração e manutenção. Para SSO com certificados de cliente X.509, considere o SAP Secure Login Server, que é um componente da solução SAP SSO.", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/9-exercise-integrate-active-directory-sap-single-sign-on", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", + "service": "AVS", + "severity": "Alto", + "text": "Usar um provedor de identidade centralizado a ser usado para cargas de trabalho (VMs) em execução na Solução VMware do Azure", "waf": "Segurança" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", + "service": "AVS", "severity": "Média", - "text": "Para SSO para SAP GUI e acesso ao navegador web, implemente SNC / Kerberos / SPNEGO (mecanismo de negociação GSSAPI simples e protegido) devido a sua facilidade de configuração e manutenção. Para SSO com certificados de cliente X.509, considere o SAP Secure Login Server, que é um componente da solução SAP SSO.", + "text": "A filtragem de tráfego Leste-Oeste é implementada no NSX-T", "waf": "Segurança" }, { - "checklist": "SAP 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", - "severity": "Média", - "text": "Implemente o SSO usando o OAuth for SAP NetWeaver para permitir que aplicativos de terceiros ou personalizados acessem os serviços OData do SAP NetWeaver.", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", + "service": "AVS", + "severity": "Alto", + "text": "As cargas de trabalho na Solução VMware do Azure não são diretamente expostas à Internet. O tráfego é filtrado e inspecionado pelo Gateway de Aplicativo do Azure, pelo Firewall do Azure ou por soluções de terceiros", "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "a747c350-8d4c-449c-93af-393dbca77c48", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", - "service": "SAP", - "severity": "Média", - "text": "Implementar SSO no SAP HANA", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", + "service": "AVS", + "severity": "Alto", + "text": "A auditoria e o registro em log são implementados para solicitações de entrada da Internet para cargas de trabalho baseadas na Solução VMware do Azure e na Solução VMware do Azure", "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", + "service": "AVS", "severity": "Média", - "text": "Considere o Azure AD um provedor de identidade para sistemas SAP hospedados no RISE. Para obter mais informações, consulte Integrando o serviço ao Azure AD.", + "text": "O monitoramento de sessão é implementado para conexões de saída da Internet a partir da Solução VMware do Azure ou cargas de trabalho baseadas na Solução VMware do Azure para identificar atividades suspeitas/mal-intencionadas", "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", - "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "334fdf91-c234-4182-a652-75269440b4be", + "service": "AVS", "severity": "Média", - "text": "Para aplicativos que acessam o SAP, convém usar a propagação principal para estabelecer o SSO.", + "text": "A proteção padrão contra DDoS está habilitada na sub-rede do Gateway ExR/VPN no Azure", "waf": "Segurança" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", + "service": "AVS", "severity": "Média", - "text": "Se você estiver usando serviços SAP BTP ou soluções SaaS que exigem o SAP Identity Authentication Service (IAS), considere implementar SSO entre o SAP Cloud Identity Authentication Services e o Azure AD para acessar esses serviços SAP. Essa integração permite que o SAP IAS atue como um provedor de identidade de proxy e encaminhe solicitações de autenticação para o Azure AD como o repositório central do usuário e o provedor de identidade.", + "text": "Usar uma estação de trabalho de acesso privilegiado (PAW) dedicada para gerenciar a Solução VMware do Azure, o vCenter, o gerenciador NSX e o gerenciador HCX", "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", + "service": "AVS", "severity": "Média", - "text": "Implementar SSO no SAP BTP", + "text": "Habilitar a Detecção Avançada de Ameaças (Microsoft Defender for Cloud, também conhecido como ASC) para cargas de trabalho em execução na Solução VMware do Azure", "waf": "Segurança" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", + "service": "AVS", "severity": "Média", - "text": "Se você estiver usando o SAP SuccessFactors, considere usar o provisionamento automatizado de usuários do Azure AD. Com essa integração, à medida que você adiciona novos funcionários ao SAP SuccessFactors, pode criar automaticamente suas contas de usuário no Azure AD. Opcionalmente, você pode criar contas de usuário no Microsoft 365 ou em outros aplicativos SaaS com suporte no Azure AD. Use write-back do endereço de e-mail para SAP SuccessFactors.", + "text": "Usar o Azure ARC for Servers para controlar corretamente as cargas de trabalho em execução na Solução VMware do Azure usando tecnologias nativas do Azure (o Azure ARC for Azure VMware Solution ainda não está disponível)", "waf": "Segurança" }, { - "checklist": "SAP 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", - "severity": "Média", - "text": "impor políticas existentes do Grupo de Gerenciamento às assinaturas SAP", - "training": "https://learn.microsoft.com/training/modules/enterprise-scale-organization/4-management-group-subscription-organization", - "waf": "Operações" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", + "service": "AVS", + "severity": "Baixo", + "text": "Garanta que as cargas de trabalho na Solução VMware do Azure usem criptografia de dados suficiente durante o tempo de execução (como criptografia de disco convidado e SQL TDE). (a criptografia vSAN em repouso é padrão)", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", - "severity": "Alto", - "text": "Integre aplicativos fortemente acoplados na mesma assinatura SAP para evitar complexidade adicional de roteamento e gerenciamento", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-subscriptions", - "waf": "Operações" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a3592718-e6e2-4051-9267-6ae46691e883", + "service": "AVS", + "severity": "Baixo", + "text": "Quando a criptografia no convidado é usada, armazene chaves de criptografia no cofre de chaves do Azure quando possível", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", - "severity": "Alto", - "text": "Aproveite a assinatura como unidade de escala e dimensione nossos recursos, considere implantar a assinatura por ambiente, por exemplo. Sandbox, não-prod, prod ", - "training": "https://learn.microsoft.com/training/modules/configure-subscriptions/?source=recommendations", - "waf": "Operações" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5ac94222-3e13-4810-9230-81a941741583", + "service": "AVS", + "severity": "Média", + "text": "Considere usar o suporte estendido de atualização de segurança para cargas de trabalho em execução na Solução VMware do Azure (a Solução VMware do Azure é qualificada para ESU)", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", - "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", + "service": "AVS", "severity": "Alto", - "text": "Garantir o aumento da cota como parte do provisionamento de assinatura (por exemplo, total de núcleos de VM disponíveis em uma assinatura)", - "training": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", - "waf": "Operações" - }, - { - "checklist": "SAP Checklist", - "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", - "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", - "service": "SAP", - "severity": "Baixo", - "text": "A API de Cota é uma API REST que você pode usar para exibir e gerenciar cotas para serviços do Azure. Considere usá-lo, se necessário.", - "waf": "Operações" + "text": "Certifique-se de que o método de redundância de dados vSAN apropriado seja usado (especificação RAID)", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", - "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d88408f3-7273-44c8-96ba-280214590146", + "service": "AVS", "severity": "Alto", - "text": "Se estiver implantando em uma zona de disponibilidade, verifique se a implantação da zona da VM estará disponível depois que a cota for aprovada. Envie uma solicitação de suporte com a assinatura, a série VM, o número de CPUs e a zona de disponibilidade necessárias.", - "waf": "Operações" + "text": "Certifique-se de que a política de falha na tolerância esteja em vigor para atender às suas necessidades de armazenamento vSAN", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "e6e20617-3686-4af4-9791-f8935ada4332", - "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", + "service": "AVS", "severity": "Alto", - "text": "Certifique-se de que os serviços e recursos necessários estejam disponíveis nas regiões de implantação escolhidas, por exemplo. ANF, Zona etc.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/azure-best-practices/multiple-regions?source=recommendations", - "waf": "Operações" + "text": "Certifique-se de ter solicitado cota suficiente, garantindo que você tenha considerado o crescimento e o requisito de recuperação de desastres", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", + "service": "AVS", "severity": "Média", - "text": "Aproveite a marca de recurso do Azure para categorização de custos e agrupamento de recursos (: BillTo, Departamento (ou Unidade de Negócios), Ambiente (Produção, Estágio, Desenvolvimento), Camada (Camada da Web, Camada de Aplicativo), Proprietário do Aplicativo, ProjectName)", - "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", + "text": "Certifique-se de que as restrições de acesso ao ESXi sejam compreendidas, há limites de acesso que podem afetar as soluções de terceiros 3rd.", "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", - "severity": "Alto", - "text": "Ajude a proteger seu banco de dados HANA usando o serviço de Backup do Azure.", - "training": "https://learn.microsoft.com/training/modules/implement-azure-backup-sap-workloads-azure-virtual-machines/?source=recommendations", - "waf": "Fiabilidade" - }, - { - "checklist": "SAP Checklist", - "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", + "service": "AVS", "severity": "Média", - "text": "Se você implantar os Arquivos NetApp do Azure para seu banco de dados HANA, Oracle ou DB2, use a ferramenta Azure Application Consistent Snapshot (AzAcSnap) para tirar instantâneos consistentes com o aplicativo. O AzAcSnap também suporta bancos de dados Oracle. Considere usar o AzAcSnap em uma VM central em vez de em VMs individuais.", - "waf": "Fiabilidade" - }, - { - "checklist": "SAP Checklist", - "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", - "severity": "Alto", - "text": "Garanta as correspondências de fuso horário entre o sistema operacional e o sistema SAP.", + "text": "Certifique-se de ter uma política em torno da densidade e eficiência do host ESXi, tendo em mente o prazo de espera para solicitar novos nós", "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "c3c7abc0-716c-4486-893c-40e181d65539", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", + "service": "AVS", "severity": "Média", - "text": "Não agrupe serviços de aplicativos diferentes no mesmo cluster. Por exemplo, não combine clusters DRBD e de serviços centrais no mesmo cluster. No entanto, você pode usar o mesmo cluster do Pacemaker para gerenciar aproximadamente cinco serviços centrais diferentes (cluster multi-SID).", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Fiabilidade" + "text": "Garantir que um bom processo de gerenciamento de custos esteja em vigor para a Solução VMware do Azure - o Gerenciamento de Custos do Azure pode ser usado", + "waf": "Custar" }, { - "checklist": "SAP Checklist", - "guid": "a491dfc4-9353-4213-9217-eef0949f9467", - "link": "https://azure.microsoft.com/pricing/offers/dev-test/", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", + "service": "AVS", "severity": "Baixo", - "text": "Considere executar sistemas de desenvolvimento/teste em um modelo de soneca para economizar e otimizar os custos de execução do Azure.", + "text": "As instâncias reservadas do Azure são usadas para otimizar o custo de uso da Solução VMware do Azure", "waf": "Custar" }, { - "checklist": "SAP Checklist", - "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", - "link": "https://learn.microsoft.com/azure/lighthouse/overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6691e883-5ac9-4422-83e1-3810523081a9", + "service": "AVS", "severity": "Média", - "text": "Se você faz parceria com clientes gerenciando suas propriedades SAP, considere o Farol do Azure. O Azure Lighthouse permite que os provedores de serviços gerenciados usem os serviços de identidade nativos do Azure para se autenticar no ambiente dos clientes. Ele coloca o controle nas mãos dos clientes, porque eles podem revogar o acesso a qualquer momento e auditar as ações dos prestadores de serviços.", - "waf": "Operações" + "text": "Considere o uso do Azure Private-Link ao usar outros Serviços Nativos do Azure", + "waf": "Segurança" }, { - "checklist": "SAP 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", - "severity": "Média", - "text": "Use o Azure Update Manager para verificar o status das atualizações disponíveis para uma única VM ou várias VMs e considere agendar patches regulares.", - "training": "https://learn.microsoft.com/training/modules/keep-your-virtual-machines-updated/?source=recommendations", - "waf": "Operações" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", + "service": "AVS", + "severity": "Alto", + "text": "Verifique se todos os recursos necessários residem na(s) mesma(s) zona(s) de disponibilidade do Azure", + "waf": "Desempenho" }, { - "checklist": "SAP Checklist", - "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", - "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", - "service": "SAP", - "severity": "Baixo", - "text": "Otimize e gerencie as operações do SAP Basis usando o SAP Landscape Management (LaMa). Use o conector SAP LaMa para Azure para realocar, copiar, clonar e atualizar sistemas SAP.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-remote-management/?source=recommendations", - "waf": "Operações" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", + "service": "AVS", + "severity": "Média", + "text": "Habilitar cargas de trabalho de VM convidada do Microsoft Defender for Cloud for Azure VMware Solution", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "14591147-5e39-4e53-89cc-cd979366bcda", - "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", + "service": "AVS", "severity": "Média", - "text": "Use as soluções do Azure Monitor for SAP para monitorar suas cargas de trabalho SAP (SAP HANA, clusters SUSE de alta disponibilidade e sistemas SQL) no Azure. Considere complementar o Azure Monitor para soluções SAP com o SAP Solution Manager.", - "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", - "waf": "Operações" + "text": "Usar servidores habilitados para Arc do Azure para gerenciar suas cargas de trabalho de VM convidada da Solução VMware do Azure", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", - "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", + "service": "AVS", "severity": "Alto", - "text": "Execute uma verificação de extensão de VM para SAP. A Extensão de VM para SAP usa a identidade gerenciada atribuída de uma máquina virtual (VM) para acessar dados de monitoramento e configuração de VM. A verificação garante que todas as métricas de desempenho em seu aplicativo SAP venham da Extensão do Azure para SAP subjacente.", - "training": "https://learn.microsoft.com/training/modules/configure-azure-enhanced-monitoring-extension-for-sap/?source=recommendations", + "text": "Habilitar o log de diagnóstico e de métrica na solução VMware do Azure", "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", + "service": "AVS", "severity": "Média", - "text": "Use a Política do Azure para controle de acesso e relatórios de conformidade. A Política do Azure fornece a capacidade de impor configurações em toda a organização para garantir a adesão consistente à política e a detecção rápida de violações. ", - "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", + "text": "Implantar os agentes do Log Analytics nas cargas de trabalho da VM convidada da Solução VMware do Azure", "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", - "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "589d457a-927c-4397-9d11-02cad6aae11e", + "service": "AVS", "severity": "Média", - "text": "Use o Monitor de Conexão no Inspetor de Rede do Azure para monitorar métricas de latência para bancos de dados SAP e servidores de aplicativos. Ou colete e exiba medições de latência de rede usando o Azure Monitor.", - "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/collecting-and-displaying-niping-network-latency-measurements/ba-p/1833979", + "text": "Verifique se você tem uma política e uma solução de backup documentadas e implementadas para cargas de trabalho de VM da Solução VMware do Azure", "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "73686af4-6791-4f89-95ad-a43324e13811", - "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ee29711b-d352-4caa-ab79-b198dab81932", + "service": "AVS", "severity": "Média", - "text": "Execute uma verificação de qualidade para o SAP HANA na infraestrutura provisionada do Azure para verificar se as VMs provisionadas estão em conformidade com as práticas recomendadas do SAP HANA no Azure.", - "waf": "Operações" + "text": "Usar o Microsoft Defender for Cloud para monitoramento de conformidade de cargas de trabalho em execução no Azure VMware Solution", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "616785d6-fa96-4c96-ad88-518f482734c8", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", - "severity": "Alto", - "text": "Para cada assinatura do Azure, execute um teste de latência nas zonas de disponibilidade do Azure antes da implantação zonal para escolher zonas de baixa latência para implantação do SAP no Azure.", - "training": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/AvZone-Latency-Test", - "waf": "Desempenho" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", + "service": "AVS", + "severity": "Média", + "text": "São as linhas de base de conformidade aplicáveis adicionadas ao Microsoft Defender for Cloud", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", - "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", - "service": "SAP", - "severity": "Média", - "text": "Execute o Relatório de Resiliência para garantir que a configuração de toda a infraestrutura provisionada do Azure (Computação, Banco de Dados, Rede, Armazenamento, Recuperação de Site) esteja em conformidade com a configuração definida pelo Cloud Adaption Framework para Azure.", - "training": "https://learn.microsoft.com/training/paths/azure-well-architected-framework/", - "waf": "Fiabilidade" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", + "service": "AVS", + "severity": "Alto", + "text": "A residência de dados foi avaliada ao selecionar regiões do Azure a serem usadas para a implantação da Solução VMware do Azure", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", - "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", - "service": "SAP", - "severity": "Média", - "text": "Implemente a proteção contra ameaças usando a solução Microsoft Sentinel para SAP. Use esta solução para monitorar seus sistemas SAP e detectar ameaças sofisticadas em toda a lógica de negócios e camadas de aplicativos.", - "training": "https://learn.microsoft.com/training/modules/plan-microsoft-sentinel-deployment-sap/?source=recommendations", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", + "service": "AVS", + "severity": "Alto", + "text": "As implicações do processamento de dados (modelo de prestador de serviços / consumidor de serviços) são claras e documentadas", "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", - "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "547c1747-dc56-4068-a714-435cd19dd244", + "service": "AVS", "severity": "Média", - "text": "A marcação do Azure pode ser aproveitada para agrupar e controlar recursos logicamente, automatizar suas implantações e, o mais importante, fornecer visibilidade sobre os custos incorridos.", - "training": "https://learn.microsoft.com/training/modules/analyze-costs-create-budgets-azure-cost-management/?source=recommendations", - "waf": "Operações" + "text": "Considere o uso de CMK (Customer Managed Key) para vSAN somente se necessário por motivo(s) de conformidade.", + "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", - "service": "SAP", - "severity": "Baixo", - "text": "Use o monitoramento de latência entre VMs para aplicativos sensíveis à latência.", - "waf": "Desempenho" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", + "service": "AVS", + "severity": "Alto", + "text": "Criar painéis para habilitar os principais insights de monitoramento da Solução VMware do Azure", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", - "severity": "Média", - "text": "Use o monitoramento do Azure Site Recovery para manter a integridade do serviço de recuperação de desastres para servidores de aplicativos SAP.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", - "waf": "Fiabilidade" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", + "service": "AVS", + "severity": "Alto", + "text": "Criar alertas de aviso para limites críticos para alertas automáticos sobre o desempenho da solução VMware do Azure (CPU >80%, memória média >80%, vSAN >70%)", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", - "severity": "Média", - "text": "Exclua todos os sistemas de arquivos de banco de dados e programas executáveis das verificações antivírus. Incluí-los pode levar a problemas de desempenho. Verifique com os fornecedores do banco de dados para obter detalhes prescritivos na lista de exclusão. Por exemplo, a Oracle recomenda excluir /oracle//sapdata das verificações antivírus.", - "waf": "Desempenho" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9659e396-80e7-4828-ac93-5657d02bff45", + "service": "AVS", + "severity": "Alto", + "text": "Certifique-se de que o alerta crítico seja criado para monitorar se o consumo de vSAN está abaixo de 75%, pois esse é um limite de suporte do VMware", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "c027f893-f404-41a9-b33d-39d625a14964", - "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", - "service": "SAP", - "severity": "Baixo", - "text": "Considere a coleta de estatísticas completas de banco de dados para bancos de dados não-HANA após a migração. Por exemplo, implemente a nota SAP 1020260 - Entrega de estatísticas Oracle.", - "waf": "Desempenho" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", + "service": "AVS", + "severity": "Alto", + "text": "Verifique se os alertas estão configurados para alertas e notificações de Integridade do Serviço do Azure", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", + "service": "AVS", "severity": "Média", - "text": "Considere o uso do Oracle Automatic Storage Management (ASM) para todas as implantações Oracle que usam SAP no Azure.", - "training": "https://learn.microsoft.com/training/paths/administer-infrastructure-resources-in-azure/?source=recommendations", - "waf": "Desempenho" + "text": "Configurar o log da Solução VMware do Azure para ser enviado a uma conta de Armazenamento do Azure ou ao Azure EventHub para processamento", + "waf": "Operações" }, { - "checklist": "SAP 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", - "severity": "Média", - "text": "Para SAP no Azure executando Oracle, uma coleção de scripts SQL pode ajudá-lo a diagnosticar problemas de desempenho. Os relatórios do Automatic Workload Repository (AWR) contêm informações valiosas para diagnosticar problemas no sistema Oracle. Recomendamos que você execute um relatório AWR durante várias sessões e escolha horários de pico para ele, para garantir uma ampla cobertura para a análise.", - "training": "https://learn.microsoft.com/ja-jp/azure/well-architected/oracle-iaas/performance-efficiency", - "waf": "Desempenho" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", + "service": "AVS", + "severity": "Baixo", + "text": "Se for necessário um insight profundo no VMware vSphere: o vRealize Operations e/ou o vRealize Network Insights são usados na solução?", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", + "service": "AVS", "severity": "Alto", - "text": "Use o monitoramento do Azure Site Recovery para manter a integridade do serviço de recuperação de desastres para servidores de aplicativos SAP.", - "training": "https://learn.microsoft.com/training/modules/protect-on-premises-infrastructure-with-azure-site-recovery/?source=recommendations", + "text": "Verifique se a política de armazenamento vSAN para VMs NÃO é a política de armazenamento padrão, pois essa política aplica provisionamento espesso", "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", + "service": "AVS", "severity": "Média", - "text": "Para a entrega segura de aplicativos HTTP/S, use o Application Gateway v2 e verifique se a proteção e as políticas do WAF estão habilitadas.", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/", - "waf": "Segurança" + "text": "Verifique se as bibliotecas de conteúdo do vSphere não são colocadas no vSAN, pois o vSAN é um recurso finito", + "waf": "Operações" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", + "service": "AVS", "severity": "Média", - "text": "Se o DNS ou o nome virtual da máquina virtual não for alterado durante a migração para o Azure, o DNS em segundo plano e os nomes virtuais conectam muitas interfaces do sistema no cenário SAP, e os clientes só às vezes estão cientes das interfaces que os desenvolvedores definem ao longo do tempo. Surgem desafios de conexão entre vários sistemas quando os nomes virtuais ou DNS mudam após as migrações, e é recomendável manter os aliases DNS para evitar esses tipos de dificuldades.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", + "text": "Certifique-se de que os repositórios de dados da solução de backup sejam armazenados fora do armazenamento vSAN. No nativo do Azure ou em um armazenamento de dados com backup de pool de discos", "waf": "Operações" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", + "service": "AVS", "severity": "Média", - "text": "Use zonas DNS diferentes para distinguir cada ambiente (sandbox, desenvolvimento, pré-produção e produção) um do outro. A exceção é para implantações SAP com sua própria VNet; aqui, zonas DNS privadas podem não ser necessárias.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", + "text": "Garantir que as cargas de trabalho em execução na Solução VMware do Azure sejam gerenciadas de forma híbrida usando o Azure Arc for Servers (a Solução VMware do Arc for Azure está em visualização)", "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "a3592829-e6e2-4061-9368-6af46791f893", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", + "service": "AVS", "severity": "Média", - "text": "Emparelhamento de rede virtual local e global fornecem conectividade e são as abordagens preferidas para garantir a conectividade entre zonas de aterrissagem para implantações SAP em várias regiões do Azure", - "training": "https://learn.microsoft.com/training/modules/configure-vnet-peering/?source=recommendations", - "waf": "Fiabilidade" - }, - { - "checklist": "SAP Checklist", - "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", - "service": "SAP", - "severity": "Alto", - "text": "Não há suporte para implantar qualquer NVA entre o aplicativo SAP e o servidor de banco de dados SAP", - "training": "https://me.sap.com/notes/2731110", - "waf": "Desempenho" + "text": "Garantir que as cargas de trabalho em execução na Solução VMware do Azure sejam monitoradas usando o Azure Log Analytics e o Azure Monitor", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", - "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", + "service": "AVS", "severity": "Média", - "text": "Use a WAN Virtual para implantações do Azure em redes novas, grandes ou globais onde você precisa de conectividade de trânsito global entre regiões do Azure e locais locais. Com essa abordagem, você não precisará configurar manualmente o roteamento transitivo para a rede do Azure e poderá seguir um padrão para implantações do SAP no Azure.", - "training": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", + "text": "Incluir cargas de trabalho em execução na Solução VMware do Azure nas ferramentas de gerenciamento de atualizações existentes ou no Gerenciamento de Atualizações do Azure", "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", - "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", + "service": "AVS", "severity": "Média", - "text": "Considere a implantação de dispositivos virtuais de rede (NVAs) entre regiões somente se NVAs de parceiros forem usados. NVAs entre regiões ou VNets não são necessários se NVAs nativos estiverem presentes. Ao implantar tecnologias de rede de parceiros e NVAs, siga as orientações do fornecedor para verificar configurações conflitantes com a rede do Azure.", - "training": "https://learn.microsoft.com/training/modules/control-network-traffic-flow-with-routes/?source=recommendations", + "text": "Usar a Política do Azure para integrar cargas de trabalho da Solução VMware do Azure nas soluções de Gerenciamento, Monitoramento e Segurança do Azure", "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", - "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", + "service": "AVS", "severity": "Média", - "text": "A WAN virtual gerencia a conectividade entre VNets spoke para topologias baseadas em WAN virtual (não há necessidade de configurar o roteamento definido pelo usuário [UDR] ou NVAs), e a taxa de transferência máxima de rede para o tráfego de VNet-to-VNet no mesmo hub virtual é de 50 gigabits por segundo. Se necessário, as zonas de aterrissagem SAP podem usar o emparelhamento de VNet para se conectar a outras zonas de aterrissagem e superar essa limitação de largura de banda.", - "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/?source=recommendations", - "waf": "Operações" + "text": "Garantir que as cargas de trabalho em execução na Solução VMware do Azure sejam integradas ao Microsoft Defender for Cloud", + "waf": "Segurança" }, { - "checklist": "SAP 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", - "severity": "Alto", - "text": "A atribuição de IP público à VM que executa o SAP Workload não é recomendada.", - "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", - "waf": "Segurança" - }, - { - "checklist": "SAP 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", - "severity": "Alto", - "text": "Considere reservar o endereço IP no lado do DR ao configurar o ASR", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "Operações" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", + "service": "AVS", + "severity": "Média", + "text": "Certifique-se de que os backups não sejam armazenados no vSAN, pois o vSAN é um recurso finito", + "waf": "Fiabilidade" }, { - "checklist": "SAP 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", - "severity": "Alto", - "text": "Evite usar intervalos de endereços IP sobrepostos para sites de produção e DR.", - "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", - "waf": "Operações" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", + "service": "AVS", + "severity": "Média", + "text": "Todas as soluções de DR foram consideradas e uma solução que é melhor para o seu negócio foi decidida? [SRM/JetStream/Zerto/Veeam/...]", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "6e154e3a-a359-4282-ae6e-206173686af4", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", + "service": "AVS", "severity": "Média", - "text": "Embora o Azure ajude você a criar várias sub-redes delegadas em uma rede virtual, apenas uma sub-rede delegada pode existir em uma rede virtual para arquivos do Azure NetApp. As tentativas de criar um novo volume falharão se você usar mais de uma sub-rede delegada para Arquivos do Azure NetApp.", - "training": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-network-topologies?source=recommendations", - "waf": "Operações" + "text": "Usar o Azure Site Recovery quando a tecnologia de Recuperação de Desastres for IaaS nativa do Azure", + "waf": "Fiabilidade" }, { - "checklist": "SAP 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", - "severity": "Média", - "text": "Usar o Firewall do Azure para controlar o tráfego de saída do Azure para a Internet, conexões de entrada não HTTP/S e filtragem de tráfego Leste/Oeste (se a organização exigir)", - "training": "https://learn.microsoft.com/training/paths/secure-networking-infrastructure/", - "waf": "Segurança" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", + "service": "AVS", + "severity": "Alto", + "text": "Use planos de recuperação automatizados com qualquer uma das soluções de desastre, evite ao máximo tarefas manuais", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", - "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "8255461e-2aee-4345-9aec-8339248b262d", + "service": "AVS", "severity": "Média", - "text": "O Application Gateway e o Web Application Firewall têm limitações quando o Application Gateway serve como um proxy reverso para aplicativos Web SAP, conforme mostrado na comparação entre o Application Gateway, o SAP Web Dispatcher e outros serviços de terceiros.", - "training": "https://help.sap.com/docs/SUPPORT_CONTENT/si/3362959506.html", - "waf": "Segurança" + "text": "Usar o par de regiões geopolíticas como o ambiente secundário de recuperação de desastres", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", - "severity": "Média", - "text": "Use as políticas do Azure Front Door e do WAF para fornecer proteção global entre as regiões do Azure para conexões HTTP/S de entrada para uma zona de aterrissagem.", - "training": "https://learn.microsoft.com/training/paths/secure-application-delivery/", - "waf": "Segurança" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", + "service": "AVS", + "severity": "Alto", + "text": "Use 2 espaços de endereço diferentes entre as regiões, por exemplo: 10.0.0.0/16 e 192.168.0.0/16 para as diferentes regiões", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", + "service": "AVS", "severity": "Média", - "text": "Aproveite as políticas do Web Application Firewall no Azure Front Door quando estiver usando o Azure Front Door e o Application Gateway para proteger aplicativos HTTP/S. Bloqueie o Gateway de Aplicativo para receber tráfego somente do Azure Front Door.", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", - "waf": "Segurança" + "text": "O ExpressRoute Global Reach será usado para conectividade entre as Nuvens Privadas da Solução VMware do Azure primária e secundária ou o roteamento é feito por meio de dispositivos virtuais de rede?", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "5ada4332-4e13-4811-9231-81aa41742694", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", + "service": "AVS", "severity": "Média", - "text": "Use um firewall de aplicativo Web para verificar seu tráfego quando ele estiver exposto à Internet. Outra opção é usá-lo com seu balanceador de carga ou com recursos que tenham recursos internos de firewall, como o Application Gateway ou soluções de terceiros.", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", - "waf": "Segurança" + "text": "Todas as soluções de backup foram consideradas e uma solução que é melhor para o seu negócio foi decidida? [ MABS/CommVault/Metallic.io/Veeam/ . ]", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", + "service": "AVS", "severity": "Média", - "text": "Use a WAN Virtual para implantações do Azure em redes novas, grandes ou globais onde você precisa de conectividade de trânsito global entre regiões do Azure e locais locais. Com essa abordagem, você não precisará configurar manualmente o roteamento transitivo para a rede do Azure e poderá seguir um padrão para implantações do SAP no Azure.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/10-explore-azure-front-door", - "waf": "Desempenho" + "text": "Implante sua solução de backup na mesma região que sua nuvem privada da Solução VMware do Azure", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", - "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", + "service": "AVS", "severity": "Média", - "text": "Para evitar o vazamento de dados, use o Link Privado do Azure para acessar com segurança recursos de plataforma como serviço, como Armazenamento de Blobs do Azure, Arquivos do Azure, Azure Data Lake Storage Gen2, Azure Data Factory e muito mais. O Ponto de Extremidade Privado do Azure também pode ajudar a proteger o tráfego entre VNets e serviços como o Armazenamento do Azure, o Backup do Azure e muito mais. O tráfego entre sua rede virtual e o serviço habilitado para ponto de extremidade privado viaja pela rede global da Microsoft, o que impede sua exposição à Internet pública.", - "training": "https://learn.microsoft.com/training/modules/design-implement-private-access-to-azure-services/?source=recommendations", - "waf": "Segurança" + "text": "Implante sua solução de backup fora do vSan, em componentes nativos do Azure", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", - "service": "SAP", - "severity": "Alto", - "text": "Verifique se a rede acelerada do Azure está habilitada nas VMs usadas nas camadas de aplicativo SAP e DBMS.", - "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", - "waf": "Desempenho" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", + "service": "AVS", + "severity": "Baixo", + "text": "Existe um processo para solicitar uma restauração dos componentes VMware gerenciados pela Plataforma Azure?", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", - "service": "SAP", - "severity": "Média", - "text": "Verifique se as implantações internas do Azure Load Balancer estão configuradas para usar DSR (Direct Server Return). Essa configuração (Habilitando IP flutuante) reduzirá a latência quando as configurações internas do balanceador de carga forem usadas para configurações de alta disponibilidade na camada DBMS.", - "training": "https://learn.microsoft.com/ja-jp/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", - "waf": "Segurança" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", + "service": "AVS", + "severity": "Baixo", + "text": "Para implantações manuais, todas as configurações e implantações devem ser documentadas", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "6791f893-5ada-4433-84e1-3811523181aa", - "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", - "service": "SAP", - "severity": "Média", - "text": "Você pode usar as regras ASG (grupo de segurança de aplicativo) e NSG para definir listas de controle de acesso de segurança de rede entre o aplicativo SAP e as camadas DBMS. Os ASGs agrupam máquinas virtuais para ajudar a gerenciar sua segurança.", - "training": "https://learn.microsoft.com/training/modules/configure-network-security-groups/?source=recommendations", - "waf": "Segurança" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", + "service": "AVS", + "severity": "Baixo", + "text": "Para implantações manuais, considere implementar bloqueios de recursos para evitar ações acidentais em sua nuvem privada de solução VMware do Azure", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", - "severity": "Alto", - "text": "Não há suporte para a colocação da camada de aplicativo SAP e do SGBD SAP em diferentes VNets do Azure que não são emparelhadas.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "Desempenho" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", + "service": "AVS", + "severity": "Baixo", + "text": "Para implantações automatizadas, implante uma nuvem privada mínima e dimensione conforme necessário", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "fa96c96a-d885-418f-9827-34c886ba2802", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", - "severity": "Média", - "text": "Para obter a latência de rede ideal com aplicativos SAP, considere o uso de grupos de posicionamento de proximidade do Azure.", - "training": "https://learn.microsoft.com/azure/virtual-machines/co-location#planned-maintenance-and-proximity-placement-groups", - "waf": "Desempenho" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", + "service": "AVS", + "severity": "Baixo", + "text": "Para implantações automatizadas, solicite ou reserve cota antes de iniciar a implantação", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", - "severity": "Alto", - "text": "NÃO há suporte para executar uma camada do SAP Application Server e uma camada de DBMS dividida entre o local e o Azure. Ambas as camadas precisam residir completamente no local ou no Azure.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "Desempenho" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", + "service": "AVS", + "severity": "Baixo", + "text": "Para implantação automatizada, verifique se os bloqueios de recursos relevantes são criados por meio da automação ou da Política do Azure para uma governança adequada", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", - "severity": "Alto", - "text": "Não é recomendado hospedar o sistema de gerenciamento de banco de dados (DBMS) e as camadas de aplicativos dos sistemas SAP em diferentes VNets e conectá-los ao emparelhamento de VNet devido aos custos substanciais que o tráfego de rede excessivo entre as camadas pode produzir. Recomende o uso de sub-redes na rede virtual do Azure para separar a camada de aplicativo SAP e a camada DBMS.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "Custar" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", + "service": "AVS", + "severity": "Baixo", + "text": "Implemente nomes humanos compreensíveis para chaves de autorização ExR para permitir a fácil identificação da finalidade/uso das chaves", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "402a9846-d515-4061-aff8-cd30088693fa", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", - "service": "SAP", - "severity": "Alto", - "text": "Se estiver usando o Load Balancer com sistemas operacionais convidados Linux, verifique se o parâmetro de rede Linux net.ipv4.tcp_timestamps está definido como 0.", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "Desempenho" - }, - { - "checklist": "SAP Checklist", - "guid": "87585797-5551-4d53-bb7d-a94ee415734d", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", - "service": "SAP", - "severity": "Média", - "text": "Para implantações SAP RISE/ECS, o emparelhamento virtual é a maneira preferida de estabelecer conectividade com o ambiente existente do Azure do cliente. Tanto a vnet do SAP quanto a(s) vnet(s) do cliente são protegidas com grupos de segurança de rede (NSG), permitindo a comunicação nas portas SAP e de banco de dados por meio do emparelhamento vnet", - "waf": "Segurança" - }, - { - "checklist": "SAP Checklist", - "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", - "severity": "Alto", - "text": "Revise os backups de banco de dados do SAP HANA para VMs do Azure.", - "waf": "Custar" - }, - { - "checklist": "SAP Checklist", - "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", - "severity": "Média", - "text": "Revise o monitoramento interno do Site Recovery, quando usado para SAP.", - "waf": "Custar" - }, - { - "checklist": "SAP Checklist", - "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", - "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", - "service": "SAP", - "severity": "Alto", - "text": "Revise as diretrizes de monitoramento do cenário do sistema SAP HANA.", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "255461e2-aee3-4553-afc8-339248b262d6", + "service": "AVS", + "severity": "Baixo", + "text": "Usar o Cofre de chaves para armazenar segredos e chaves de autorização quando Princípios de Serviço separados são usados para implantar a Solução VMware do Azure e a Rota Expressa", "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", - "service": "SAP", - "severity": "Média", - "text": "Revise o Banco de Dados Oracle nas estratégias de backup de VM do Linux do Azure.", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", + "service": "AVS", + "severity": "Baixo", + "text": "Defina dependências de recursos para serializar ações no IaC quando muitos recursos precisarem ser implantados no/na Solução VMware do Azure, pois a Solução VMware do Azure oferece suporte apenas a um número limitado de operações paralelas.", "waf": "Operações" }, { - "checklist": "SAP 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", - "severity": "Média", - "text": "Analise o uso do Armazenamento de Blobs do Azure com o SQL Server 2016.", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", + "service": "AVS", + "severity": "Baixo", + "text": "Ao executar a configuração automatizada de segmentos NSX-T com um único gateway de Camada 1, use as APIs do Portal do Azure em vez das APIs do NSX-Manager", "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", + "service": "AVS", "severity": "Média", - "text": "Analise o uso do Backup Automatizado v2 para VMs do Azure.", - "waf": "Operações" - }, - { - "checklist": "SAP Checklist", - "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", - "service": "SAP", - "severity": "Alto", - "text": "Ativando o acelerador de gravação para a série M ao usar discos premium (V1)", - "waf": "Operações" + "text": "Ao pretender usar a expansão automatizada, certifique-se de aplicar cota suficiente da Solução VMware do Azure para as assinaturas que executam a Solução VMware do Azure", + "waf": "Desempenho" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", + "service": "AVS", "severity": "Média", - "text": "Testar a latência da zona de disponibilidade.", + "text": "Ao pretender usar o scale-in automatizado, certifique-se de levar em consideração os requisitos da política de armazenamento antes de executar essa ação", "waf": "Desempenho" }, { - "checklist": "SAP Checklist", - "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", - "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", + "service": "AVS", "severity": "Média", - "text": "Ative o SAP EarlyWatch Alert para todos os componentes SAP.", - "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", + "text": "As operações de dimensionamento sempre precisam ser serializadas em um único SDDC, pois apenas uma operação de escala pode ser executada por vez (mesmo quando vários clusters são usados)", "waf": "Desempenho" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", + "service": "AVS", "severity": "Média", - "text": "Revise a latência do servidor de aplicativos SAP para o servidor de banco de dados usando o relatório SAP ABAPMeter /SSA/CAT.", - "training": "https://me.sap.com/notes/0002879613", + "text": "Considerar e validar operações de dimensionamento em soluções de terceiros 3rd usadas na arquitetura (suportadas ou não)", "waf": "Desempenho" }, { - "checklist": "SAP Checklist", - "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", + "service": "AVS", "severity": "Média", - "text": "Revise o monitoramento de desempenho do SQL Server usando o CCMS.", + "text": "Definir e impor limites máximos de entrada/saída de escala para seu ambiente nas automações", "waf": "Desempenho" }, { - "checklist": "SAP Checklist", - "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", - "link": "https://me.sap.com/notes/500235", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", + "service": "AVS", "severity": "Média", - "text": "Teste a latência de rede entre VMs de camada de aplicativo SAP e VMs DBMS (NIPING).", - "training": "https://me.sap.com/notes/1100926/E", - "waf": "Desempenho" + "text": "Implementar regras de monitoramento para monitorar operações de dimensionamento automatizadas e monitorar o sucesso e a falha para habilitar respostas apropriadas (automatizadas)", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", - "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c5972cd4-cd21-4b07-9036-f5e6b4bfd3d5", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "AVS", + "severity": "Alto", + "text": "Ao usar o MON, esteja ciente dos limites de VMs configuradas simulataneamente (MON Limit for HCX [400 - standard, 1000 - Larger appliance])", + "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "be1f38cf-03a8-422b-b463-cbbbc8ac299e", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "AVS", + "severity": "Alto", + "text": "Ao usar o MON, você não pode habilitar o MON em mais de 100 extensões de rede", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", + "service": "AVS", "severity": "Média", - "text": "Revise os alertas do SAP HANA Studio.", + "text": "Se estiver usando uma conexão VPN para migrações, ajuste o tamanho da MTU de acordo.", "waf": "Desempenho" }, { - "checklist": "SAP Checklist", - "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", - "link": "https://me.sap.com/notes/1969700", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e614658d-d457-4e92-9139-b821102cad6e", + "service": "AVS", "severity": "Média", - "text": "Execute verificações de integridade do SAP HANA usando HANA_Configuration_Minichecks.", + "text": "Para regiões de baixa conectividade conectadas ao Azure (500Mbps ou menos), considere implantar o dispositivo de otimização de WAN HCX", "waf": "Desempenho" }, { - "checklist": "SAP Checklist", - "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", + "service": "AVS", "severity": "Média", - "text": "Se você executar VMs do Windows e Linux no Azure, no local ou em outros ambientes de nuvem, poderá usar o Centro de gerenciamento de atualizações na Automação do Azure para gerenciar atualizações do sistema operacional, incluindo patches de segurança.", - "training": "https://learn.microsoft.com/azure/automation/update-management/overview", - "waf": "Segurança" + "text": "Certifique-se de que as migrações sejam iniciadas a partir do dispositivo local e NÃO do dispositivo em nuvem (NÃO execute uma migração reversa)", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "08951710-79a2-492a-adbc-06d7a401545b", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", + "service": "AVS", "severity": "Média", - "text": "Analise rotineiramente as notas de OSS de segurança do SAP porque o SAP lança patches de segurança altamente críticos, ou hot fixes, que exigem ação imediata para proteger seus sistemas SAP.", - "training": "https://support.sap.com/en/my-support/knowledge-base/security-notes-news.html", - "waf": "Segurança" + "text": "Quando o Azure Netapp Files for usado para estender o armazenamento para a Solução VMware do Azure, considere usá-lo como um armazenamento de dados VMware em vez de anexá-lo diretamente a uma VM.", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", - "severity": "Baixo", - "text": "Para SAP no SQL Server, você pode desabilitar a conta de administrador do sistema do SQL Server porque os sistemas SAP no SQL Server não usam a conta. Certifique-se de que outro usuário com direitos de administrador do sistema possa acessar o servidor antes de desabilitar a conta de administrador do sistema original.", - "waf": "Segurança" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bff4564b-0d93-44a3-98b2-63e7dd60513a", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", + "service": "AVS", + "severity": "Média", + "text": "Verifique se um ExpressRoute Gateway dedicado está sendo usado para soluções de armazenamento de dados externos", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", - "severity": "Alto", - "text": "Desative xp_cmdshell. O recurso do SQL Server xp_cmdshell habilita um shell de comando do sistema operacional interno do SQL Server. É um risco potencial em auditorias de segurança.", - "training": "https://me.sap.com/notes/3019299/E", - "waf": "Segurança" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "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", + "severity": "Média", + "text": "Verifique se o FastPath está habilitado no ExpressRoute Gateway que está sendo usado para soluções de armazenamento de dados externos", + "waf": "Fiabilidade" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "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", "severity": "Alto", - "text": "A criptografia de servidores de banco de dados SAP HANA no Azure usa a tecnologia de criptografia nativa do SAP HANA. Além disso, se você estiver usando o SQL Server no Azure, use a TDE (Criptografia de Dados Transparente) para proteger seus dados e arquivos de log e garantir que seus backups também sejam criptografados.", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "waf": "Segurança" + "text": "Se estiver usando cluster estendido, verifique se a solução de recuperação de desastres selecionada é suportada pelo fornecedor", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", - "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", - "service": "SAP", - "severity": "Média", - "text": "A criptografia de Armazenamento do Azure está habilitada para todas as contas clássicas e do Gerenciador de Recursos do Azure e não pode ser desabilitada. Como seus dados são criptografados por padrão, você não precisa modificar seu código ou aplicativos para usar a criptografia do Armazenamento do Azure.", - "training": "https://learn.microsoft.com/training/modules/encrypt-sector-data/?source=recommendations", - "waf": "Segurança" - }, - { - "checklist": "SAP Checklist", - "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", - "link": "https://learn.microsoft.com/azure/key-vault/general/overview", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", + "service": "AVS", "severity": "Alto", - "text": "Usar o Cofre de Chaves do Azure para armazenar seus segredos e credenciais", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "Segurança" - }, - { - "checklist": "SAP Checklist", - "guid": "829e2edb-2173-4676-aff6-691b4935ada4", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "SAP", - "severity": "Média", - "text": "É recomendável BLOQUEAR os Recursos do Azure após a implantação bem-sucedida para proteger contra alterações não autorizadas. Você também pode impor restrições e regras LOCK em sua base por assinatura usando políticas personalizadas do Azure (função Personalizada).", - "training": "https://learn.microsoft.com/training/modules/use-azure-resource-manager/?source=recommendations", - "waf": "Segurança" + "text": "Se estiver usando cluster estendido, verifique se o SLA fornecido atenderá aos seus requisitos", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "SAP", - "severity": "Média", - "text": "Provisione o Cofre de Chaves do Azure com as políticas de exclusão e limpeza suaves habilitadas para permitir a proteção de retenção para objetos excluídos.", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "Segurança" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", + "service": "AVS", + "severity": "Alto", + "text": "Se estiver usando cluster estendido, verifique se ambos os circuitos da Rota Expressa estão conectados ao hub de conectividade.", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", - "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", - "service": "SAP", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", + "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", + "service": "AVS", "severity": "Alto", - "text": "Com base nos requisitos existentes, controles normativos e de conformidade (internos/externos) - Determine quais Políticas do Azure e a função RBAC do Azure são necessárias", - "training": "https://learn.microsoft.com/training/paths/describe-azure-management-governance/?source=recommendations", - "waf": "Segurança" + "text": "Se estiver usando cluster estendido, verifique se ambos os circuitos da Rota Expressa têm o GlobalReach habilitado.", + "waf": "Fiabilidade" }, { - "checklist": "SAP 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", + "service": "AVS", "severity": "Alto", - "text": "Ao habilitar o Microsoft Defender for Endpoint no ambiente SAP, recomende excluir arquivos de dados e de log em servidores DBMS em vez de direcionar todos os servidores. Siga as recomendações do fornecedor do DBMS ao excluir arquivos de destino.", - "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/microsoft-defender-endpoint-mde-for-sap-applications-on-windows/ba-p/3912268", - "waf": "Segurança" + "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" }, { - "checklist": "SAP 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", + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency checklist", + "guid": "65285269-440b-44be-9d3e-0844276d4bdc", + "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-zone-redundancy", + "service": "Redis", "severity": "Alto", - "text": "Delegue uma função personalizada de administrador SAP com acesso just-in-time do Microsoft Defender for Cloud.", - "training": "https://learn.microsoft.com/training/modules/secure-vms-with-azure-security-center/?source=recommendations", - "waf": "Segurança" + "text": "Habilite a redundância de zona para o Cache do Azure para Redis. O Cache do Azure para Redis dá suporte a configurações redundantes de zona nas camadas Premium e Enterprise. Um cache redundante de zona pode colocar seus nós em diferentes zonas de disponibilidade do Azure na mesma região. Ele elimina a interrupção do data center ou AZ como um único ponto de falha e aumenta a disponibilidade geral do cache.", + "waf": "Fiabilidade" }, { - "checklist": "SAP 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", - "severity": "Baixo", - "text": "criptografar dados em trânsito integrando o produto de segurança de terceiros com comunicações de rede seguras (SNC) para DIAG (SAP GUI), RFC e SPNEGO para HTTPS", - "training": "https://learn.microsoft.com/azure/security/fundamentals/encryption-overview#encryption-of-data-in-transit", - "waf": "Segurança" + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency 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", + "severity": "Média", + "text": "Configure a persistência de dados para uma instância do Cache do Azure para Redis. Como os dados do cache são armazenados na memória, uma falha rara e não planejada de vários nós pode fazer com que todos os dados sejam descartados. Para evitar a perda completa de dados, a persistência do Redis permite que você tire instantâneos periódicos de dados na memória e os armazene em sua conta de armazenamento.", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", - "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", - "service": "SAP", + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency 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", "severity": "Média", - "text": "O padrão é chaves gerenciadas pela Microsoft para a funcionalidade de criptografia principal e use chaves gerenciadas pelo cliente quando necessário.", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "Segurança" + "text": "Use a conta de armazenamento com redundância geográfica para persistir o Cache do Azure para dados Redis ou zonalmente redundante onde a redundância geográfica não está disponível", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "4935ada4-2223-4ece-a1b1-23181a541741", - "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", - "service": "SAP", - "severity": "Alto", - "text": "Use um Cofre de Chaves do Azure por aplicativo, por ambiente, por região.", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", - "waf": "Segurança" + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency checklist", + "guid": "a8c26c9b-32ab-45bd-bc69-98a135e33789", + "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-geo-replication", + "service": "Redis", + "severity": "Média", + "text": "Configure a replicação geográfica passiva para instâncias do Cache Premium do Azure para Redis. A replicação geográfica é um mecanismo para vincular duas ou mais instâncias do Cache do Azure para Redis, normalmente abrangendo duas regiões do Azure. A replicação geográfica foi projetada principalmente para recuperação de desastres entre regiões. Duas instâncias de cache de camada Premium são conectadas por meio de replicação geográfica de uma forma que fornece leituras e gravações no cache primário e que os dados são replicados para o cache secundário.", + "waf": "Fiabilidade" }, { - "checklist": "SAP Checklist", - "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", - "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", - "service": "SAP", - "severity": "Alto", - "text": "Para controlar e gerenciar chaves de criptografia de disco e segredos para sistemas operacionais Windows e não Windows HANA, use o Cofre de Chaves do Azure. O SAP HANA não tem suporte com o Cofre de Chaves do Azure, portanto, você deve usar métodos alternativos, como chaves SAP ABAP ou SSH.", - "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/?source=recommendations", - "waf": "Segurança" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Média", + "text": "Se você usar certificados TLS gerenciados pelo cliente com o Azure Front Door, use a versão do certificado 'Mais recente'. Reduza o risco de interrupções causadas pela renovação manual de certificados", + "waf": "Operações" }, { - "checklist": "SAP Checklist", - "guid": "209d490d-a477-4784-84d1-16785d2fa56c", - "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", - "service": "SAP", - "severity": "Alto", - "text": "Personalizar funções RBAC (controle de acesso baseado em função) para SAP em assinaturas spoke do Azure para evitar alterações acidentais relacionadas à rede", - "training": "https://learn.microsoft.com/training/modules/secure-azure-resources-with-rbac/?source=recommendations", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Média", + "text": "Verifique se você está usando o SKU do Gateway de Aplicativo v2", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", - "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", - "service": "SAP", - "severity": "Alto", - "text": "Isole DMZs e NVAs do restante do estado SAP, configure o Azure Private Link e gerencie e controle com segurança os recursos do SAP no Azure", - "training": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/secure-vnet-dmz?tabs=portal", + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Média", + "text": "Verifique se você está usando o SKU Standard para seus Azure Load Balancers", "waf": "Segurança" }, { - "checklist": "SAP 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", - "severity": "Baixo", - "text": "Considere usar o software antimalware da Microsoft no Azure para proteger suas máquinas virtuais contra arquivos mal-intencionados, adware e outras ameaças.", - "training": "https://azure.microsoft.com/blog/deploying-antimalware-solutions-on-azure-virtual-machines/", + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "guid": "9432621a-8397-4654-a882-5bc856b7ef83", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", + "service": "Load Balancer", + "severity": "Média", + "text": "Verifique se os endereços IP de front-end dos Load Balancers têm redundância de zona (a menos que você precise de front-ends zonais).", "waf": "Segurança" }, { - "checklist": "SAP 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", - "severity": "Baixo", - "text": "Para obter uma proteção ainda mais poderosa, considere usar o Microsoft Defender for Endpoint.", - "training": "https://learn.microsoft.com/training/modules/implement-endpoint-protection-use-microsoft-defender/?source=recommendations", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Média", + "text": "Seus Gateways de Aplicativo v2 devem ser implantados em sub-redes com prefixos IP iguais ou maiores que /24", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", - "severity": "Alto", - "text": "Isole os servidores de aplicativo e banco de dados SAP da Internet ou da rede local passando todo o tráfego pela rede virtual de hub, que está conectada à rede spoke por emparelhamento de rede virtual. As redes virtuais emparelhadas garantem que a solução SAP no Azure seja isolada da Internet pública.", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/?source=recommendations", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "description": "A administração de proxies reversos em geral e WAF em particular está mais próxima do aplicativo do que da rede, portanto, eles pertencem à mesma assinatura que o aplicativo. Centralizar o Gateway de Aplicativo e o WAF na assinatura de conectividade pode ser OK se ele for gerenciado por uma única equipe.", + "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "App Gateway", + "severity": "Média", + "text": "Implante o Gateway de Aplicativo do Azure v2 ou NVAs de parceiros usados para proxy de conexões HTTP(S) de entrada na rede virtual da zona de destino e com os aplicativos que eles estão protegendo.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Segurança" }, { - "checklist": "SAP 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", - "severity": "Baixo", - "text": "Para aplicativos voltados para a Internet, como o SAP Fiori, certifique-se de distribuir a carga por requisitos de aplicativo, mantendo os níveis de segurança. Para segurança de Camada 7, você pode usar um WAF (Web Application Firewall) de terceiros disponível no Azure Marketplace.", - "training": "https://learn.microsoft.com/training/modules/simplify-cloud-procurement-governance-azure-marketplace/?source=recommendations", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "App Gateway", + "severity": "Média", + "text": "Use uma rede DDoS ou planos de proteção de IP para todos os endereços IP públicos em zonas de destino do aplicativo.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "Segurança" }, { - "checklist": "SAP Checklist", - "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", - "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", - "service": "SAP", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Média", - "text": "Para habilitar a comunicação segura no Azure Monitor para soluções SAP, você pode optar por usar um certificado raiz ou um certificado de servidor. É altamente recomendável que você use certificados raiz.", - "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", - "waf": "Segurança" + "text": "Configure o dimensionamento automático com uma quantidade mínima de instâncias de duas.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Alto", - "text": "Siga as proteções do Metaprompting para uma IA razoável", - "waf": "Excelência Operacional" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Média", + "text": "Implantar o Gateway de Aplicativo em Zonas de Disponibilidade", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", - "link": "https://github.com/Azure-Samples/AI-Gateway", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Considere padrões de gateway com APIM ou soluções como AI central para melhor limitação de taxa, balanceamento de carga, autenticação e registro", - "waf": "Excelência Operacional" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Front Door", + "severity": "Média", + "text": "Use o Azure Front Door com políticas do WAF para fornecer e ajudar a proteger aplicativos HTTP/S globais que abrangem várias regiões do Azure.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Alto", - "text": "Habilitar o monitoramento para suas instâncias AOAI", - "waf": "Excelência Operacional" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "3f29812b-2363-4cef-b179-b599de0d5973", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "Front Door", + "severity": "Média", + "text": "Ao usar o Front Door e o Gateway de Aplicativo para ajudar a proteger aplicativos HTTP/S, use políticas WAF no Front Door. Bloqueie o Gateway de Aplicativo para receber tráfego somente do Front Door.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "697cb391-ed16-4b2d-886f-0a0241addde6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", - "service": "Azure OpenAI", + "ammp": true, + "arm-service": "microsoft.network/trafficManagerProfiles", + "checklist": "Azure Application Delivery Networking", + "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Traffic Manager", "severity": "Alto", - "text": "Crie alertas para notificar as equipes sobre eventos, como uma entrada no log de atividades criada por uma ação executada no recurso, como regenerar suas chaves de assinatura ou um limite de métrica, como o número de erros que excedem 10 em uma hora", - "waf": "Excelência Operacional" + "text": "Use o Gerenciador de Tráfego para fornecer aplicativos globais que abrangem protocolos diferentes de HTTP/S.", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Monitore o uso do token para evitar interrupções de serviço devido à capacidade", - "waf": "Excelência Operacional" + "checklist": "Azure Application Delivery Networking", + "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "Entra", + "severity": "Baixo", + "text": "Se os usuários precisarem apenas de acesso a aplicativos internos, o Proxy de Aplicativo de ID do Microsoft Entra foi considerado como uma alternativa à AVD (Área de Trabalho Virtual) do Azure?", + "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", - "service": "Azure OpenAI", + "checklist": "Azure Application Delivery Networking", + "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "Entra", "severity": "Média", - "text": "Observe métricas como tokens de inferência processados, monitoramento de tokens de conclusão gerados para limite de taxa", - "waf": "Excelência Operacional" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Baixo", - "text": "Se o diagnóstico não for suficiente para você, considere usar um gateway como o Gerenciamento de API do Azure na frente do Azure OpenAI para registrar prompts de entrada e respostas de saída, quando permitido", - "waf": "Excelência Operacional" + "text": "Para reduzir o número de portas de firewall abertas para conexões de entrada em sua rede, considere usar o Proxy de Aplicativo de ID do Microsoft Entra para fornecer aos usuários remotos acesso seguro e autenticado a aplicativos internos.", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", - "link": "https://github.com/Azure-Samples/openai-enterprise-iac", - "service": "Azure OpenAI", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Alto", - "text": "Usar a infraestrutura como código para implantar o serviço OpenAI do Azure, implantações de modelo e todos os recursos relacionados", - "waf": "Excelência Operacional" + "text": "Implante sua política de WAF para o Front Door no modo 'Prevenção' para que o Firewall de Aplicativo Web tome as medidas apropriadas para permitir ou negar o tráfego.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "4350d092-d234-4292-a752-8537a551c5bf", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "Azure OpenAI", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Alto", - "text": "Usar a autenticação do Microsoft Entra com identidade gerenciada em vez de chave de API", + "text": "Evite combinar o Gerenciador de Tráfego do Azure e o Azure Front Door.", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Alto", - "text": "Avalie o desempenho/precisão do sistema com um conjunto de dados dourado conhecido que tenha as entradas e as respostas corretas. Aproveite os recursos do PromptFlow para avaliação.", - "waf": "Excelência Operacional" + "text": "Use o mesmo nome de domínio no Azure Front Door e sua origem. Nomes de host incompatíveis podem causar bugs sutis.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Alto", - "text": "Avaliar o uso do modelo de taxa de transferência provisionada ", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Baixo", + "text": "Desabilite as investigações de integridade quando houver apenas uma origem em um grupo de origens do Azure Front Door.", "waf": "Desempenho" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Examinar e implementar a segurança de conteúdo do Azure AI", - "waf": "Excelência Operacional" - }, - { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1193846d-697c-4b39-8ed1-6b2d186f0a02", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#system-level-throughput", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Defina e avalie a taxa de transferência do sistema com base em tokens e resposta por minuto e alinhe-se aos requisitos", - "waf": "Desempenho" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", + "service": "Front Door", + "severity": "Média", + "text": "Selecione pontos de extremidade de investigação de integridade boa para o Azure Front Door. Considere a criação de pontos de extremidade de integridade que verifiquem todas as dependências do aplicativo.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", - "service": "Azure OpenAI", - "severity": "Média", - "text": "Melhore a latência do sistema limitando os tamanhos dos tokens, as opções de streaming", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Baixo", + "text": "Use investigações de integridade HEAD com o Azure Front Door para reduzir o tráfego que o Front Door envia para seu aplicativo.", "waf": "Desempenho" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", - "service": "Azure OpenAI", - "severity": "Média", - "text": "Estime as demandas de elasticidade para determinar a segregação de solicitações síncronas e em lote com base na prioridade. Para alta prioridade, use a abordagem síncrona e, para baixa prioridade, o processamento em lote assíncrono com fila é preferível", - "waf": "Desempenho" + "ammp": true, + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Usar o Gateway NAT do Azure em vez das regras de saída do Load Balancer para melhorar a escalabilidade SNAT", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "5bda4332-4f24-4811-9331-82ba51752694", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Alto", - "text": "Compare os requisitos de consumo de token com base nas demandas estimadas dos consumidores. Considere usar a ferramenta de benchmarking OpenAI do Azure para ajudá-lo a validar a taxa de transferência se você estiver usando implantações de Unidade de Produtividade Provisionada", - "waf": "Desempenho" + "text": "Use certificados TLS gerenciados com o Azure Front Door. Reduza o custo operacional e o risco de interrupções devido a renovações de certificados.", + "waf": "Operações" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Média", - "text": "Se você estiver usando PTUs (Unidades de Produtividade Provisionadas), considere implantar uma implantação de token por minuto (TPM) para solicitações de estouro. Use um gateway para rotear solicitações para a implantação do TPM quando os limites de PTU forem atingidos.", - "waf": "Desempenho" + "text": "Defina a configuração do WAF do Azure Front Door como código. Usando o código, você pode adotar mais facilmente a nova versão do conjunto de regras e obter proteção adicional.", + "waf": "Operações" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", - "service": "Azure OpenAI", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", + "service": "Front Door", "severity": "Alto", - "text": "Escolha o modelo certo para a tarefa certa. Escolha modelos com a compensação certa entre velocidade, qualidade de resposta e complexidade de saída", - "waf": "Desempenho" + "text": "Use o TLS de ponta a ponta com o Azure Front Door. Use o TLS para conexões de seus clientes com o Front Door e do Front Door com sua origem.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "e9951904-8384-45c9-a6cb-2912156a1147", - "link": "https://github.com/Azure/azure-openai-benchmark/", - "service": "Azure OpenAI", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", + "service": "Front Door", "severity": "Média", - "text": "Tenha uma linha de base para o desempenho sem ajuste fino para saber se o ajuste fino melhorou ou não o desempenho do modelo", - "waf": "Desempenho" + "text": "Use o redirecionamento de HTTP para HTTPS com o Azure Front Door. Ofereça suporte a clientes mais antigos redirecionando-os para uma solicitação HTTPS automaticamente.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Baixo", - "text": "Implantar várias instâncias de OAI em regiões", - "waf": "Fiabilidade" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", + "service": "Front Door", + "severity": "Alto", + "text": "Habilite o WAF do Azure Front Door. Proteja seu aplicativo contra uma variedade de ataques.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Alto", - "text": "Implemente novas tentativas e verificações de integridade com o padrão de Gateway como APIM", - "waf": "Fiabilidade" + "text": "Ajuste o WAF do Azure Front Door para sua carga de trabalho configurando o WAF no modo de detecção para reduzir e corrigir detecções de falsos positivos.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Média", - "text": "Garantir que tenha cotas adequadas de TPM e RPM para a carga de trabalho", - "waf": "Fiabilidade" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Habilite o recurso de inspeção do corpo da solicitação habilitado na política do WAF do Azure Front Door.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", - "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", - "service": "Azure OpenAI", - "severity": "Média", - "text": "Revise as considerações nas diretrizes do kit de ferramentas HAI e aplique essas práticas de interação para a análise", - "waf": "Excelência Operacional" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Habilite os conjuntos de regras padrão do WAF do Azure Front Door. Os conjuntos de regras padrão detectam e bloqueiam ataques comuns.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7f154e3a-a369-4282-ae7e-316183687a04", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", - "service": "Azure OpenAI", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Alto", + "text": "Habilite o conjunto de regras de proteção contra bot do WAF do Azure Front Door. As regras de bot detectam bots bons e ruins.", + "waf": "Segurança" + }, + { + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Média", - "text": "Implantar modelos ajustados separados entre regiões se o ajuste fino for empregado", - "waf": "Fiabilidade" + "text": "Use a versão mais recente do conjunto de regras do WAF do Azure Front Door. As atualizações do conjunto de regras são atualizadas regularmente para levar em conta o cenário de ameaças atual.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "77a1f893-5bda-4433-84f2-4811633182ba", - "link": "https://learn.microsoft.com/azure/backup/backup-overview", - "service": "Azure OpenAI", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Média", - "text": "Faça backup e replique regularmente dados críticos para garantir a disponibilidade e a capacidade de recuperação dos dados em caso de perda de dados ou falhas do sistema. Aproveite os serviços de backup e recuperação de desastre do Azure para proteger seus dados.", - "waf": "Fiabilidade" + "text": "Adicione a limitação de taxa ao WAF do Azure Front Door. A limitação de taxa bloqueia os clientes que enviam acidentalmente ou intencionalmente grandes quantidades de tráfego em um curto período de tempo.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", - "severity": "Alto", - "text": "As camadas de serviço de pesquisa de IA do Azure devem ser escolhidas para ter um SLA ", - "waf": "Fiabilidade" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Média", + "text": "Use um limite alto para os limites de taxa do WAF do Azure Front Door. Os limites de limite de taxa altos evitam o bloqueio do tráfego legítimo, ao mesmo tempo em que fornecem proteção contra números extremamente altos de solicitações que podem sobrecarregar sua infraestrutura. ", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", - "link": "https://learn.microsoft.com/purview/purview", - "service": "Azure OpenAI", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Baixo", - "text": "Classifique os dados e a confidencialidade, rotulando com o Microsoft Purview antes de gerar as inserções e certifique-se de tratar as inserções geradas com a mesma confidencialidade e classificação", + "text": "Se você não estiver esperando tráfego de todas as regiões geográficas, use filtros geográficos para bloquear o tráfego de países não esperados.", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "4fda1dbf-3dd9-45d4-ac7c-891dca1f6d56", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/use-your-data-securely", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Criptografar dados usados para RAG com criptografia SSE/Disco com BYOK opcional", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Média", + "text": "Especifique o local desconhecido (ZZ) ao filtrar geograficamente o tráfego com o WAF do Azure Front Door. Evite bloquear acidentalmente solicitações legítimas quando os endereços IP não puderem ser correspondidos geograficamente.", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", - "link": "https://learn.microsoft.com/azure/search/search-security-overview", - "service": "Azure OpenAI", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Alto", - "text": "Certifique-se de que o TLS seja aplicado para dados em trânsito entre fontes de dados, pesquisa de IA usada para RG (Geração Aumentada por Recuperação) e comunicação LLM", + "text": "Habilite o conjunto de regras de proteção contra bot do WAF do Gateway de Aplicativo do Azure. As regras de bot detectam bots bons e ruins.", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7b94ef6e-047d-42ea-8992-b1cd6e2054b2", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "Azure OpenAI", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Alto", - "text": "Use o RBAC para gerenciar o acesso aos serviços do OpenAI do Azure. Atribua permissões apropriadas aos usuários e restrinja o acesso com base em suas funções e responsabilidades", + "text": "Habilite o recurso de inspeção do corpo da solicitação habilitado na política do WAF do Gateway de Aplicativo do Azure.", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", - "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", - "service": "Azure OpenAI", - "severity": "Média", - "text": "Implemente técnicas de criptografia, mascaramento ou redação de dados para ocultar dados confidenciais ou substituí-los por valores ofuscados em ambientes de não produção ou ao compartilhar dados para fins de teste ou solução de problemas", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", + "service": "App Gateway", + "severity": "Alto", + "text": "Ajuste o WAF do Gateway de Aplicativo do Azure no modo de detecção para sua carga de trabalho. Reduza as detecções de falsos positivos.", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", - "service": "Azure OpenAI", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Alto", - "text": "Utilize o Azure Defender para detectar e responder a ameaças de segurança e configurar mecanismos de monitoramento e alerta para identificar atividades suspeitas ou violações. Aproveite o Azure Sentinel para detecção e resposta avançadas a ameaças", + "text": "Implante sua política de WAF para Gateway de Aplicativo no modo 'Prevenção'.", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", + "service": "App Gateway", "severity": "Média", - "text": "Estabeleça políticas de retenção e descarte de dados para cumprir os regulamentos de conformidade. Implemente métodos de exclusão segura para dados que não são mais necessários e mantenha uma trilha de auditoria das atividades de retenção e descarte de dados", + "text": "Adicione a limitação de taxa ao WAF do Gateway de Aplicativo do Azure. A limitação de taxa bloqueia os clientes que enviam acidentalmente ou intencionalmente grandes quantidades de tráfego em um curto período de tempo.", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", - "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Implementar proteções imediatas e detecção de aterramento usando a Segurança de conteúdo ", - "waf": "Excelência Operacional" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Média", + "text": "Use um limite alto para os limites de taxa do WAF do Gateway de Aplicativo do Azure. Os limites de limite de taxa altos evitam o bloqueio do tráfego legítimo, ao mesmo tempo em que fornecem proteção contra números extremamente altos de solicitações que podem sobrecarregar sua infraestrutura. ", + "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", - "link": "https://learn.microsoft.com/azure/compliance/", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Garanta a conformidade com os regulamentos de proteção de dados relevantes, como GDPR ou HIPAA, implementando controles de privacidade e obtendo os consentimentos ou permissões necessários para atividades de processamento de dados.", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Baixo", + "text": "Se você não estiver esperando tráfego de todas as regiões geográficas, use filtros geográficos para bloquear o tráfego de países não esperados.", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", - "service": "Azure OpenAI", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", + "service": "App Gateway", "severity": "Média", - "text": "Eduque seus funcionários sobre as melhores práticas de segurança de dados, a importância de lidar com dados com segurança e os possíveis riscos associados a violações de dados. Incentive-os a seguir os protocolos de segurança de dados diligentemente.", + "text": "Especifique o local desconhecido (ZZ) ao filtrar geograficamente o tráfego com o WAF do Gateway de Aplicativo do Azure. Evite bloquear acidentalmente solicitações legítimas quando os endereços IP não puderem ser correspondidos geograficamente.", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Mantenha os dados de produção separados dos dados de desenvolvimento e teste. Use apenas dados confidenciais reais na produção e utilize dados anônimos ou sintéticos em ambientes de desenvolvimento e teste.", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Média", + "text": "Use a versão mais recente do conjunto de regras do WAF do Gateway de Aplicativo do Azure. As atualizações do conjunto de regras são atualizadas regularmente para levar em conta o cenário de ameaças atual.", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", - "service": "Azure OpenAI", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Média", - "text": "Se você tiver níveis variados de confidencialidade de dados, considere criar índices separados para cada nível. Por exemplo, você pode ter um índice para dados gerais e outro para dados confidenciais, cada um regido por diferentes protocolos de acesso", - "waf": "Segurança" + "text": "Adicione configurações de diagnóstico para salvar os logs do WAF do Gateway de Aplicativo do Azure.", + "waf": "Operações" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", - "service": "Azure OpenAI", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Média", - "text": "Leve a segregação um passo adiante, colocando conjuntos de dados confidenciais em diferentes instâncias do serviço. Cada instância pode ser controlada com seu próprio conjunto específico de políticas RBAC", - "waf": "Segurança" + "text": "Adicione configurações de diagnóstico para salvar os logs do WAF do Azure Front Door.", + "waf": "Operações" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Reconheça que incorporações e vetores gerados a partir de informações confidenciais são eles próprios sensíveis. Esses dados devem receber as mesmas medidas de proteção que o material de origem", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Média", + "text": "Envie logs do WAF do Gateway de Aplicativo do Azure para o Microsoft Sentinel.", + "waf": "Operações" + }, + { + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Média", + "text": "Envie logs do WAF do Azure Front Door para o Microsoft Sentinel.", + "waf": "Operações" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "Média", + "text": "Defina a configuração do WAF do Gateway de Aplicativo do Azure como código. Usando o código, você pode adotar mais facilmente a nova versão do conjunto de regras e obter proteção adicional.", + "waf": "Operações" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", + "service": "App Gateway", + "severity": "Média", + "text": "Use as Políticas do WAF em vez da configuração herdada do WAF.", + "waf": "Operações" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", + "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", + "service": "App Gateway", + "severity": "Média", + "text": "Filtre o tráfego de entrada nos back-ends para que eles aceitem apenas conexões da sub-rede do Gateway de Aplicativo, por exemplo, com NSGs.", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "3571449a-b805-43d8-af89-dc7b33be2a1a", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Aplique o RBAC aos armazenamentos de dados com incorporações e vetores e acesso ao escopo com base nos requisitos de acesso da função", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", + "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", + "service": "Front Door", + "severity": "Média", + "text": "Verifique se suas origens recebem apenas o tráfego da instância do Azure Front Door.", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", + "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", + "service": "App Gateway", "severity": "Alto", - "text": "Configurar o ponto de extremidade privado para serviços de IA para restringir o acesso ao serviço em sua rede", + "text": "Você deve criptografar o tráfego para os servidores de back-end.", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", - "service": "Azure OpenAI", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", + "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", + "service": "App Gateway", "severity": "Alto", - "text": "Imponha um controle estrito de tráfego de entrada e saída com o Firewall do Azure e UDRs e limite os pontos de integração externos", + "text": "Você deve usar um Web Application Firewall.", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", - "service": "Azure OpenAI", - "severity": "Alto", - "text": "Implemente segmentação de rede e controles de acesso para restringir o acesso ao aplicativo LLM apenas a usuários e sistemas autorizados e evitar movimentos laterais", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", + "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", + "service": "App Gateway", + "severity": "Média", + "text": "Redirecionar HTTP para HTTPS", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", - "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", - "service": "Azure OpenAI", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "Média", - "text": "Use ferramentas de compactação imediatas como LLMLingua ou gprtrim", - "waf": "Otimização de custos" + "text": "Use cookies gerenciados por gateway para direcionar o tráfego de uma sessão de usuário para o mesmo servidor para processamento", + "waf": "Operações" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", - "service": "Azure OpenAI", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", + "service": "App Gateway", "severity": "Alto", - "text": "Certifique-se de que as APIs e os endpoints usados pelo aplicativo LLM estejam devidamente protegidos com mecanismos de autenticação e autorização, como identidades gerenciadas, chaves de API ou OAuth, para impedir o acesso não autorizado.", + "text": "Habilitar a drenagem de conexão durante atualizações de serviço planejadas para evitar a perda de conexão para membros existentes do pool de back-end", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", + "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", + "service": "App Gateway", + "severity": "Baixo", + "text": "Crie páginas de erro personalizadas para exibir uma experiência de usuário personalizada", + "waf": "Operações" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", + "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", + "service": "App Gateway", "severity": "Média", - "text": "Aplique mecanismos fortes de autenticação do usuário final, como autenticação multifator, para impedir o acesso não autorizado ao aplicativo LLM e aos recursos de rede associados", + "text": "Edite solicitações HTTP e cabeçalhos de resposta para facilitar o roteamento e a troca de informações entre o cliente e o servidor", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "93555620-2bfe-4456-9b0d-834a348b263e", - "service": "Azure OpenAI", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "App Gateway", "severity": "Média", - "text": "Implemente ferramentas de monitoramento de rede para detectar e analisar o tráfego de rede em busca de atividades suspeitas ou maliciosas. Habilite o registro para capturar eventos de rede e facilitar a análise forense em caso de incidentes de segurança", + "text": "Configure o Front Door para otimizar o roteamento de tráfego da Web global e o desempenho e a confiabilidade do usuário final de nível superior por meio de failover global rápido", + "waf": "Desempenho" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "29dcc19f-a8fa-4c35-8281-290577538793", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "App Gateway", + "severity": "Média", + "text": "Usar o balanceamento de carga da camada de transporte", + "waf": "Desempenho" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", + "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", + "service": "App Gateway", + "severity": "Média", + "text": "Configurar o roteamento com base no host ou no nome de domínio para vários aplicativos Web em um único gateway", "waf": "Segurança" }, { - "arm-service": "Microsoft.CognitiveServices/accounts", - "checklist": "Azure OpenAI Review", - "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", - "service": "Azure OpenAI", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", + "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", + "service": "App Gateway", "severity": "Média", - "text": "Realize auditorias de segurança e testes de penetração para identificar e resolver quaisquer pontos fracos ou vulnerabilidades de segurança de rede na infraestrutura de rede do aplicativo LLM", + "text": "Centralize o gerenciamento de certificados SSL para reduzir a sobrecarga de criptografia e descriptografia de um farm de servidores de back-end", + "waf": "Segurança" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", + "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", + "service": "App Gateway", + "severity": "Baixo", + "text": "Usar o Gateway de Aplicativo para obter suporte nativo para protocolos WebSocket e HTTP/2", "waf": "Segurança" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", + "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", - "severity": "Baixo", - "text": "Os Serviços de IA do Azure são marcados corretamente para melhor gerenciamento", + "severity": "Alto", + "text": "Siga as proteções do Metaprompting para uma IA razoável", "waf": "Excelência Operacional" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", + "guid": "d4391898-cd28-48be-b6b1-7cb8245451e1", + "link": "https://github.com/Azure-Samples/AI-Gateway", "service": "Azure OpenAI", - "severity": "Baixo", - "text": "As contas do Serviço de IA do Azure seguem as convenções de nomenclatura organizacional", + "severity": "Alto", + "text": "Considere padrões de gateway com APIM ou soluções como AI central para melhor limitação de taxa, balanceamento de carga, autenticação e registro", "waf": "Excelência Operacional" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", - "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", + "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", "severity": "Alto", - "text": "Os logs de diagnóstico nos recursos de serviços de IA do Azure devem ser habilitados", + "text": "Habilitar o monitoramento para suas instâncias AOAI", "waf": "Excelência Operacional" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", - "link": "https://learn.microsoft.com/azure/ai-services/authentication", + "guid": "697cb391-ed16-4b2d-886f-0a0241addde6", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring#set-up-alerts", "service": "Azure OpenAI", "severity": "Alto", - "text": "Recomenda-se que o acesso à chave (autenticação local) seja desabilitado por segurança. Depois de desabilitar o acesso baseado em chave, o Microsoft Entra ID se torna o único método de acesso, o que permite manter o princípio de privilégio mínimo e o controle granular. ", - "waf": "Segurança" + "text": "Crie alertas para notificar as equipes sobre eventos, como uma entrada no log de atividades criada por uma ação executada no recurso, como regenerar suas chaves de assinatura ou um limite de métrica, como o número de erros que excedem 10 em uma hora", + "waf": "Excelência Operacional" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "guid": "8a477cde-b486-41bc-9bc1-0ae66e25d4d5", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", "service": "Azure OpenAI", "severity": "Alto", - "text": "Armazene e gerencie chaves com segurança usando o Azure Key Vault. Evite codificar ou inserir chaves confidenciais no código do aplicativo LLM e recuperá-las com segurança do Azure Key Vault usando identidades gerenciadas", - "waf": "Segurança" + "text": "Monitore o uso do token para evitar interrupções de serviço devido à capacidade", + "waf": "Excelência Operacional" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", - "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "guid": "a3aec2c4-e243-46b0-936c-b45e17960eee", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/monitoring", "service": "Azure OpenAI", - "severity": "Alto", - "text": "Gire e expire regularmente as chaves armazenadas no Azure Key Vault para minimizar o risco de acesso não autorizado.", - "waf": "Segurança" + "severity": "Média", + "text": "Observe métricas como tokens de inferência processados, monitoramento de tokens de conclusão gerados para limite de taxa", + "waf": "Excelência Operacional" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "adfe27be-e297-401a-a352-baaab79b088d", - "link": "https://github.com/openai/tiktoken", + "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", - "severity": "Alto", - "text": "Use tiktoken para entender os tamanhos de token para otimizações de token no modo de conversação", - "waf": "Otimização de custos" + "severity": "Baixo", + "text": "Se o diagnóstico não for suficiente para você, considere usar um gateway como o Gerenciamento de API do Azure na frente do Azure OpenAI para registrar prompts de entrada e respostas de saída, quando permitido", + "waf": "Excelência Operacional" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", - "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", + "guid": "3af30ed3-2947-498b-8178-a2c5a46ceb54", + "link": "https://github.com/Azure-Samples/openai-enterprise-iac", "service": "Azure OpenAI", "severity": "Alto", - "text": "Siga práticas de codificação segura para evitar vulnerabilidades comuns, como ataques de injeção, cross-site scripting (XSS) ou configurações incorretas de segurança", - "waf": "Segurança" + "text": "Usar a infraestrutura como código para implantar o serviço OpenAI do Azure, implantações de modelo e todos os recursos relacionados", + "waf": "Excelência Operacional" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "78c06a73-a22a-4495-9e6a-8dc4a20e27c3", - "link": "https://learn.microsoft.com/azure/devops/repos/security/github-advanced-security-dependency-scanning?view=azure-devops", + "guid": "4350d092-d234-4292-a752-8537a551c5bf", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", "service": "Azure OpenAI", "severity": "Alto", - "text": "Configure um processo para atualizar e corrigir regularmente as bibliotecas LLM e outros componentes do sistema", + "text": "Usar a autenticação do Microsoft Entra com identidade gerenciada em vez de chave de API", "waf": "Segurança" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "e29711b1-352b-4eee-879b-588defc4972c", - "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", + "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", "severity": "Alto", - "text": "Aderir aos termos de uso, políticas e diretrizes do Azure OpenAI ou de outros LLMs e casos de uso permitidos", + "text": "Avalie o desempenho/precisão do sistema com um conjunto de dados dourado conhecido que tenha as entradas e as respostas corretas. Aproveite os recursos do PromptFlow para avaliação.", "waf": "Excelência Operacional" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "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", + "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", - "severity": "Média", - "text": "Entender a diferença no custo de modelos básicos e modelos ajustados e tamanhos de etapa de token", - "waf": "Otimização de custos" + "severity": "Alto", + "text": "Avaliar o uso do modelo de taxa de transferência provisionada ", + "waf": "Desempenho" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "guid": "cd288bed-6b17-4cb8-8454-51e1aed3453a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/overview", "service": "Azure OpenAI", "severity": "Alto", - "text": "Solicitações em lote, sempre que possível, para minimizar a sobrecarga por chamada, o que pode reduzir os custos gerais. Certifique-se de otimizar o tamanho do lote", - "waf": "Otimização de custos" + "text": "Examinar e implementar a segurança de conteúdo do Azure AI", + "waf": "Excelência Operacional" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", + "guid": "1193846d-697c-4b39-8ed1-6b2d186f0a02", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#system-level-throughput", "service": "Azure OpenAI", - "severity": "Média", - "text": "Configure um sistema de rastreamento de custos que monitore o uso do modelo e use essas informações para ajudar a informar as escolhas do modelo e solicitar tamanhos", - "waf": "Otimização de custos" + "severity": "Alto", + "text": "Defina e avalie a taxa de transferência do sistema com base em tokens e resposta por minuto e alinhe-se aos requisitos", + "waf": "Desempenho" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "166cd072-af9b-4141-a898-a535e737897e", - "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/quota?tabs=rest#understanding-rate-limits", + "guid": "41addde6-8a47-47cd-bb48-61bc3bc10ae6", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#improve-performance", "service": "Azure OpenAI", "severity": "Média", - "text": "Defina um limite máximo para o número de tokens por resposta do modelo. Otimize o tamanho para garantir que seja grande o suficiente para uma resposta válida", - "waf": "Otimização de custos" + "text": "Melhore a latência do sistema limitando os tamanhos dos tokens, as opções de streaming", + "waf": "Desempenho" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", - "link": "https://learn.microsoft.com/azure/search/search-reliability", + "guid": "6e25d4d5-a3ae-4c2c-9e24-36b0336cb45e", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", "service": "Azure OpenAI", "severity": "Média", - "text": "Examine as diretrizes fornecidas sobre como configurar a pesquisa de IA para confiabilidade", - "waf": "Excelência Operacional" + "text": "Estime as demandas de elasticidade para determinar a segregação de solicitações síncronas e em lote com base na prioridade. Para alta prioridade, use a abordagem síncrona e, para baixa prioridade, o processamento em lote assíncrono com fila é preferível", + "waf": "Desempenho" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "3266b225-86f4-4a16-92bd-ddea8a487cde", - "link": "https://learn.microsoft.com/azure/search/vector-search-index-size?tabs=portal-vector-quota", + "guid": "5bda4332-4f24-4811-9331-82ba51752694", + "link": "https://github.com/Azure/azure-openai-benchmark/", "service": "Azure OpenAI", - "severity": "Média", - "text": "Planejar e gerenciar o armazenamento de vetores do AI Search", - "waf": "Excelência Operacional" + "severity": "Alto", + "text": "Compare os requisitos de consumo de token com base nas demandas estimadas dos consumidores. Considere usar a ferramenta de benchmarking OpenAI do Azure para ajudá-lo a validar a taxa de transferência se você estiver usando implantações de Unidade de Produtividade Provisionada", + "waf": "Desempenho" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "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", + "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", "severity": "Média", - "text": "Aplique as práticas do LLMOps para automatizar o gerenciamento do ciclo de vida de seus aplicativos GenAI", - "waf": "Excelência Operacional" + "text": "Se você estiver usando PTUs (Unidades de Produtividade Provisionadas), considere implantar uma implantação de token por minuto (TPM) para solicitações de estouro. Use um gateway para rotear solicitações para a implantação do TPM quando os limites de PTU forem atingidos.", + "waf": "Desempenho" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "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", + "guid": "e8a13f98-8794-424d-9267-86d60b96c97b", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/models", "service": "Azure OpenAI", "severity": "Alto", - "text": "Avalie o uso de modelos de faturamento - PAYG vs PTU", - "waf": "Otimização de custos" + "text": "Escolha o modelo certo para a tarefa certa. Escolha modelos com a compensação certa entre velocidade, qualidade de resposta e complexidade de saída", + "waf": "Desempenho" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "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", + "guid": "e9951904-8384-45c9-a6cb-2912156a1147", + "link": "https://github.com/Azure/azure-openai-benchmark/", "service": "Azure OpenAI", "severity": "Média", - "text": "Avaliar a qualidade de prompts e aplicativos ao alternar entre versões de modelo", - "waf": "Excelência Operacional" + "text": "Tenha uma linha de base para o desempenho sem ajuste fino para saber se o ajuste fino melhorou ou não o desempenho do modelo", + "waf": "Desempenho" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "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", + "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", - "severity": "Média", - "text": "Avalie, monitore e refine seus aplicativos GenAI para recursos como fundamentação, relevância, precisão, coerência, fluência,", - "waf": "Excelência Operacional" + "severity": "Baixo", + "text": "Implantar várias instâncias de OAI em regiões", + "waf": "Fiabilidade" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "294798b1-578b-4219-a46c-eb5443513592", + "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", - "severity": "Média", - "text": "Avaliar os resultados do Azure AI Search com base em diferentes parâmetros de pesquisa", - "waf": "Excelência Operacional" + "severity": "Alto", + "text": "Implemente novas tentativas e verificações de integridade com o padrão de Gateway como APIM", + "waf": "Fiabilidade" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "2744293b-b628-4537-a551-19b08e8f5854", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", + "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", "severity": "Média", - "text": "Olhe para os modelos de ajuste fino como forma de aumentar a precisão somente quando você tiver tentado outras abordagens básicas, como engenharia rápida e RAG com seus dados", - "waf": "Excelência Operacional" + "text": "Garantir que tenha cotas adequadas de TPM e RPM para a carga de trabalho", + "waf": "Fiabilidade" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "287d9cec-166c-4d07-8af9-b141a898a535", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/advanced-prompt-engineering?pivots=programming-language-chat-completions", + "guid": "ec723923-7a15-42d6-ac5e-402925387e5c", + "link": "https://www.microsoft.com/research/project/guidelines-for-human-ai-interaction/", "service": "Azure OpenAI", "severity": "Média", - "text": "Use técnicas de engenharia rápida para melhorar a precisão das respostas do LLM", + "text": "Revise as considerações nas diretrizes do kit de ferramentas HAI e aplique essas práticas de interação para a análise", "waf": "Excelência Operacional" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "e737897e-71ca-47da-acfa-962a1594946d", - "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", + "guid": "7f154e3a-a369-4282-ae7e-316183687a04", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/business-continuity-disaster-recovery", "service": "Azure OpenAI", "severity": "Média", - "text": "Equipe vermelha de seus aplicativos GenAI", - "waf": "Segurança" + "text": "Implantar modelos ajustados separados entre regiões se o ajuste fino for empregado", + "waf": "Fiabilidade" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", - "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", + "guid": "77a1f893-5bda-4433-84f2-4811633182ba", + "link": "https://learn.microsoft.com/azure/backup/backup-overview", "service": "Azure OpenAI", "severity": "Média", - "text": "Forneça aos usuários finais opções de pontuação para respostas LLM e acompanhe essas pontuações. ", - "waf": "Excelência Operacional" + "text": "Faça backup e replique regularmente dados críticos para garantir a disponibilidade e a capacidade de recuperação dos dados em caso de perda de dados ou falhas do sistema. Aproveite os serviços de backup e recuperação de desastre do Azure para proteger seus dados.", + "waf": "Fiabilidade" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "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", + "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", "severity": "Alto", - "text": "Considere as práticas de gerenciamento de cotas", - "waf": "Otimização de custos" + "text": "As camadas de serviço de pesquisa de IA do Azure devem ser escolhidas para ter um SLA ", + "waf": "Fiabilidade" }, { "arm-service": "Microsoft.CognitiveServices/accounts", "checklist": "Azure OpenAI Review", - "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", - "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", + "guid": "99013a5d-3ce4-474d-acbd-8682a6abca2a", + "link": "https://learn.microsoft.com/purview/purview", "service": "Azure OpenAI", - "severity": "Média", - "text": "Use soluções de balanceador de carga, como gateway baseado em APIM, para balancear carga e capacidade entre serviços e regiões", - "waf": "Excelência Operacional" + "severity": "Baixo", + "text": "Classifique os dados e a confidencialidade, rotulando com o Microsoft Purview antes de gerar as inserções e certifique-se de tratar as inserções geradas com a mesma confidencialidade e classificação", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", - "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", - "service": "IoT Hub DPS", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "4fda1dbf-3dd9-45d4-ac7c-891dca1f6d56", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/use-your-data-securely", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Selecione o plano de hospedagem de aplicativo lógico certo com base em seus requisitos de negócios e SLO", - "waf": "Fiabilidade" + "text": "Criptografar dados usados para RAG com criptografia SSE/Disco com BYOK opcional", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "59ae558b-937d-4498-9e11-12dbd7ba012f", + "link": "https://learn.microsoft.com/azure/search/search-security-overview", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Proteja aplicativos lógicos contra falhas de região com redundância de zona e zonas de disponibilidade", - "waf": "Fiabilidade" + "text": "Certifique-se de que o TLS seja aplicado para dados em trânsito entre fontes de dados, pesquisa de IA usada para RG (Geração Aumentada por Recuperação) e comunicação LLM", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7b94ef6e-047d-42ea-8992-b1cd6e2054b2", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Considere uma estratégia de DR entre regiões para cargas de trabalho críticas", - "waf": "Fiabilidade" + "text": "Use o RBAC para gerenciar o acesso aos serviços do OpenAI do Azure. Atribua permissões apropriadas aos usuários e restrinja o acesso com base em suas funções e responsabilidades", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "IoT Hub DPS", - "severity": "Alto", - "text": "Se estiver implantando em um ambiente isolado, use ou migre para o ASE (Ambiente do Serviço de Aplicativo) v3", - "waf": "Fiabilidade" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "9769e4a6-91e8-4838-ac93-6667e13c0056", + "link": "https://learn.microsoft.com/azure/security/fundamentals/data-encryption-best-practices", + "service": "Azure OpenAI", + "severity": "Média", + "text": "Implemente técnicas de criptografia, mascaramento ou redação de dados para ocultar dados confidenciais ou substituí-los por valores ofuscados em ambientes de não produção ou ao compartilhar dados para fins de teste ou solução de problemas", + "waf": "Segurança" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "IoT Hub DPS", - "severity": "Média", - "text": "Aproveite o Azure DevOps ou o GitHub para simplificar o CI/CD e proteger seu código de Aplicativo Lógico", - "waf": "Operações" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", - "severity": "Baixo", - "text": "Consulte a arquitetura de aplicativo Web com redundância de zona altamente disponível da linha de base para obter as práticas recomendadas", - "waf": "Fiabilidade" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", - "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", - "service": "App Services", - "severity": "Média", - "text": "Use as camadas Premium e Standard. Esses níveis oferecem suporte a slots de preparo e backups automatizados.", - "waf": "Fiabilidade" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", - "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "74b1e945-b459-4837-be7a-d6c6d3b375a5", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-cloud-introduction", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Aproveite as zonas de disponibilidade quando aplicável regionalmente (requer a camada Premium v2 ou v3)", - "waf": "Fiabilidade" + "text": "Utilize o Azure Defender para detectar e responder a ameaças de segurança e configurar mecanismos de monitoramento e alerta para identificar atividades suspeitas ou violações. Aproveite o Azure Sentinel para detecção e resposta avançadas a ameaças", + "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Média", - "text": "Implementar verificações de integridade", - "waf": "Fiabilidade" + "text": "Estabeleça políticas de retenção e descarte de dados para cumprir os regulamentos de conformidade. Implemente métodos de exclusão segura para dados que não são mais necessários e mantenha uma trilha de auditoria das atividades de retenção e descarte de dados", + "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", - "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a9c27d9c-42bb-46bd-8c69-99a246f3389a", + "link": "https://learn.microsoft.com/azure/ai-services/content-safety/concepts/jailbreak-detection", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Consulte as práticas recomendadas de backup e restauração para o Serviço de Aplicativo do Azure", - "waf": "Fiabilidade" + "text": "Implementar proteções imediatas e detecção de aterramento usando a Segurança de conteúdo ", + "waf": "Excelência Operacional" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a775c6ee-95b9-46ad-a844-ce3b2b38b876", + "link": "https://learn.microsoft.com/azure/compliance/", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Implementar práticas recomendadas de confiabilidade do Serviço de Aplicativo do Azure", - "waf": "Fiabilidade" + "text": "Garanta a conformidade com os regulamentos de proteção de dados relevantes, como GDPR ou HIPAA, implementando controles de privacidade e obtendo os consentimentos ou permissões necessários para atividades de processamento de dados.", + "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", - "severity": "Baixo", - "text": "Familiarizar-se com como mover um aplicativo do Serviço de Aplicativo para outra região durante um desastre", - "waf": "Fiabilidade" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ba2cf204-9901-43a5-b3ce-474dccbd8682", + "service": "Azure OpenAI", + "severity": "Média", + "text": "Eduque seus funcionários sobre as melhores práticas de segurança de dados, a importância de lidar com dados com segurança e os possíveis riscos associados a violações de dados. Incentive-os a seguir os protocolos de segurança de dados diligentemente.", + "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "eae01e6e-842e-452f-9721-d928c1b1cd52", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Familiarizar-se com o suporte de confiabilidade no Serviço de Aplicativo do Azure", - "waf": "Fiabilidade" + "text": "Mantenha os dados de produção separados dos dados de desenvolvimento e teste. Use apenas dados confidenciais reais na produção e utilize dados anônimos ou sintéticos em ambientes de desenvolvimento e teste.", + "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1e54a29a-9de3-499c-bd7b-28dc93555620", + "service": "Azure OpenAI", "severity": "Média", - "text": "Verifique se \"Sempre Ativo\" está habilitado para Aplicativos de Função em execução em um plano de serviço de aplicativo", - "waf": "Fiabilidade" + "text": "Se você tiver níveis variados de confidencialidade de dados, considere criar índices separados para cada nível. Por exemplo, você pode ter um índice para dados gerais e outro para dados confidenciais, cada um regido por diferentes protocolos de acesso", + "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "2bfe4564-b0d8-434a-948b-263e6dd60512", + "service": "Azure OpenAI", "severity": "Média", - "text": "Monitorar instâncias do Serviço de Aplicativo usando verificações de integridade", - "waf": "Fiabilidade" + "text": "Leve a segregação um passo adiante, colocando conjuntos de dados confidenciais em diferentes instâncias do serviço. Cada instância pode ser controlada com seu próprio conjunto específico de políticas RBAC", + "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", - "service": "App Services", - "severity": "Média", - "text": "Monitorar a disponibilidade e a capacidade de resposta do aplicativo Web ou site usando testes de disponibilidade do Application Insights", - "waf": "Fiabilidade" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "a36498f6-dbad-438e-ad53-cc7ce1d7aaab", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Reconheça que incorporações e vetores gerados a partir de informações confidenciais são eles próprios sensíveis. Esses dados devem receber as mesmas medidas de proteção que o material de origem", + "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "b4e3f2d5-a5c6-4d7e-8b2f-c5d9e7a8f0ea", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", - "service": "App Services", - "severity": "Baixo", - "text": "Usar o teste Application Insights Standard para monitorar a disponibilidade e a capacidade de resposta do aplicativo Web ou site", - "waf": "Fiabilidade" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3571449a-b805-43d8-af89-dc7b33be2a1a", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/role-based-access-control", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Aplique o RBAC aos armazenamentos de dados com incorporações e vetores e acesso ao escopo com base nos requisitos de acesso da função", + "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Use o Cofre de Chaves do Azure para armazenar quaisquer segredos de que o aplicativo precisa. O Cofre de Chaves fornece um ambiente seguro e auditado para armazenar segredos e está bem integrado ao Serviço de Aplicativo por meio do SDK do Cofre de Chaves ou das Referências do Cofre de Chaves do Serviço de Aplicativo.", - "guid": "834ac932-223e-4ce8-8b12-3071a5416415", - "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Alto", - "text": "Usar o Cofre de Chaves para armazenar segredos", + "text": "Configurar o ponto de extremidade privado para serviços de IA para restringir o acesso ao serviço em sua rede", "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Use uma Identidade Gerenciada para se conectar ao Cofre de Chaves usando o SDK do Cofre de Chaves ou por meio das Referências do Cofre de Chaves do Serviço de Aplicativo.", - "guid": "833ea3ad-2c2d-4e73-8165-c3acbef4abe1", - "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "ac8ac199-ebb9-41a3-9d90-cae2cc881370", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Usar a Identidade Gerenciada para se conectar ao Cofre de Chaves", + "text": "Imponha um controle estrito de tráfego de entrada e saída com o Firewall do Azure e UDRs e limite os pontos de integração externos", "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Armazene o certificado TLS do Serviço de Aplicativo no Cofre de Chaves.", - "guid": "f8d39fda-4776-4831-9c11-5775c2ea55b4", - "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-certificate", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6f7c0cba-fe51-4464-add4-57e927138b82", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Use o Cofre de Chaves para armazenar o certificado TLS.", + "text": "Implemente segmentação de rede e controles de acesso para restringir o acesso ao aplicativo LLM apenas a usuários e sistemas autorizados e evitar movimentos laterais", "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Os sistemas que processam informações confidenciais devem ser isolados. Para fazer isso, use Planos do Serviço de Aplicativo ou Ambientes do Serviço de Aplicativo separados e considere o uso de assinaturas ou grupos de gerenciamento diferentes.", - "guid": "6ad48408-ee72-4734-a475-ba18fdbf590c", - "link": "https://learn.microsoft.com/azure/app-service/overview-hosting-plans", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "7f42c78e-78cb-46a2-8ad1-90916e6a8d8f", + "link": "https://www.microsoft.com/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/", + "service": "Azure OpenAI", "severity": "Média", - "text": "Isolar sistemas que processam informações confidenciais", + "text": "Use ferramentas de compactação imediatas como LLMLingua ou gprtrim", + "waf": "Otimização de custos" + }, + { + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1102cac6-eae0-41e6-b842-e52f4721d928", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/managed-identity", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Certifique-se de que as APIs e os endpoints usados pelo aplicativo LLM estejam devidamente protegidos com mecanismos de autenticação e autorização, como identidades gerenciadas, chaves de API ou OAuth, para impedir o acesso não autorizado.", "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Os discos locais no Serviço de Aplicativo não são criptografados e os dados confidenciais não devem ser armazenados neles. (Por exemplo: D:\\\\Local e %TMP%).", - "guid": "e65de8e0-3f9b-4cbd-9682-66abca264f9a", - "link": "https://learn.microsoft.com/azure/app-service/operating-system-functionality#file-access", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Média", - "text": "Não armazene dados confidenciais no disco local", + "text": "Aplique mecanismos fortes de autenticação do usuário final, como autenticação multifator, para impedir o acesso não autorizado ao aplicativo LLM e aos recursos de rede associados", "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Para aplicativos Web autenticados, use um Provedor de Identidade bem estabelecido, como o Azure AD ou o Azure AD B2C. Aproveite a estrutura de aplicativo de sua escolha para se integrar a esse provedor ou use o recurso de Autenticação/Autorização do Serviço de Aplicativo.", - "guid": "919ca0b2-c121-459e-814b-933df574eccc", - "link": "https://learn.microsoft.com/azure/app-service/overview-authentication-authorization", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "93555620-2bfe-4456-9b0d-834a348b263e", + "service": "Azure OpenAI", "severity": "Média", - "text": "Usar um provedor de identidade estabelecido para autenticação", + "text": "Implemente ferramentas de monitoramento de rede para detectar e analisar o tráfego de rede em busca de atividades suspeitas ou maliciosas. Habilite o registro para capturar eventos de rede e facilitar a análise forense em caso de incidentes de segurança", "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Implante código no Serviço de Aplicativo a partir de um ambiente controlado e confiável, como um pipeline de implantação de DevOps bem gerenciado e seguro. Isso evita que o código que não foi controlado por versão e verificado para ser implantado a partir de um host mal-intencionado.", - "guid": "3f9bcbd4-6826-46ab-aa26-4f9a19aed9c5", - "link": "https://learn.microsoft.com/azure/app-service/deploy-best-practices", - "service": "App Services", - "severity": "Alto", - "text": "Implantar a partir de um ambiente confiável", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6dd60512-a364-498f-9dba-d38ead53cc7c", + "service": "Azure OpenAI", + "severity": "Média", + "text": "Realize auditorias de segurança e testes de penetração para identificar e resolver quaisquer pontos fracos ou vulnerabilidades de segurança de rede na infraestrutura de rede do aplicativo LLM", "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Desative a autenticação básica para FTP/FTPS e WebDeploy/SCM. Isso desabilita o acesso a esses serviços e impõe o uso de pontos de extremidade protegidos do Azure AD para implantação. Observe que o site do SCM também pode ser aberto usando credenciais do Azure AD.", - "guid": "5d04c2c3-919c-4a0b-8c12-159e114b933d", - "link": "https://learn.microsoft.com/azure/app-service/deploy-configure-credentials#disable-basic-authentication", - "service": "App Services", - "severity": "Alto", - "text": "Desabilitar a autenticação básica", - "waf": "Segurança" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e1d7aaab-3571-4449-ab80-53d89f89dc7b", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/tag-resources?tabs=json", + "service": "Azure OpenAI", + "severity": "Baixo", + "text": "Os Serviços de IA do Azure são marcados corretamente para melhor gerenciamento", + "waf": "Excelência Operacional" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Sempre que possível, use a Identidade Gerenciada para se conectar aos recursos protegidos do Azure AD. Se isso não for possível, armazene segredos no Cofre de Chaves e conecte-se ao Cofre de Chaves usando uma Identidade Gerenciada.", - "guid": "f574eccc-d9bd-43ba-bcda-3b54eb2eb03d", - "link": "https://learn.microsoft.com/azure/app-service/overview-managed-identity?tabs=portal%2Chttp", - "service": "App Services", - "severity": "Alto", - "text": "Usar a Identidade Gerenciada para se conectar a recursos", - "waf": "Segurança" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "77036e5e-6b4b-4ed3-b503-547c1347dc56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/azure-best-practices/resource-abbreviations", + "service": "Azure OpenAI", + "severity": "Baixo", + "text": "As contas do Serviço de IA do Azure seguem as convenções de nomenclatura organizacional", + "waf": "Excelência Operacional" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Onde estiver usando imagens armazenadas no Registro de Contêiner do Azure, extraia-as usando uma Identidade Gerenciada.", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "028a71ff-e1ce-415d-b3f0-d5e772d41e36", + "link": "https://learn.microsoft.com/azure/ai-services/diagnostic-logging", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Extrair contêineres usando uma identidade gerenciada", - "waf": "Segurança" + "text": "Os logs de diagnóstico nos recursos de serviços de IA do Azure devem ser habilitados", + "waf": "Excelência Operacional" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Ao definir as configurações de diagnóstico do Serviço de Aplicativo, você pode enviar toda a telemetria para o Log Analytics como o destino central para registro em log e monitoramento. Isso permite que você monitore a atividade de tempo de execução do Serviço de Aplicativo, como logs HTTP, logs de aplicativos, logs de plataforma, ...", - "guid": "47768314-c115-4775-a2ea-55b46ad48408", - "link": "https://learn.microsoft.com/azure/app-service/troubleshoot-diagnostic-logs", - "service": "App Services", - "severity": "Média", - "text": "Enviar logs de tempo de execução do Serviço de Aplicativo para o Log Analytics", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "11cc57b4-a4b1-4410-b439-58a8c2289b3d", + "link": "https://learn.microsoft.com/azure/ai-services/authentication", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Recomenda-se que o acesso à chave (autenticação local) seja desabilitado por segurança. Depois de desabilitar o acesso baseado em chave, o Microsoft Entra ID se torna o único método de acesso, o que permite manter o princípio de privilégio mínimo e o controle granular. ", "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Configure uma configuração de diagnóstico para enviar o log de atividades para o Log Analytics como o destino central para registro e monitoramento. Isso permite que você monitore a atividade do plano de controle no próprio recurso do Serviço de Aplicativo.", - "guid": "ee72734b-475b-4a18-bdbf-590ce65de8e0", - "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", - "service": "App Services", - "severity": "Média", - "text": "Enviar logs de atividade do Serviço de Aplicativo para o Log Analytics", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "6b57cfc6-5546-41e1-a3e3-453a3c863964", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Armazene e gerencie chaves com segurança usando o Azure Key Vault. Evite codificar ou inserir chaves confidenciais no código do aplicativo LLM e recuperá-las com segurança do Azure Key Vault usando identidades gerenciadas", "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Controle o acesso à rede de saída usando uma combinação de integração regional de VNet, grupos de segurança de rede e UDR's. O tráfego deve ser roteado para um NVA, como o Firewall do Azure. Certifique-se de monitorar os logs do Firewall.", - "guid": "c12159e1-14b9-433d-b574-ecccd9bd3baf", - "link": "https://learn.microsoft.com/azure/app-service/overview-vnet-integration", - "service": "App Services", - "severity": "Média", - "text": "O acesso à rede de saída deve ser controlado", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "8b652d6c-15f5-4129-9539-8e6ded227dd1", + "link": "https://learn.microsoft.com/azure/key-vault/general/best-practices", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Gire e expire regularmente as chaves armazenadas no Azure Key Vault para minimizar o risco de acesso não autorizado.", "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Você pode fornecer um IP de saída estável usando a integração de rede virtual e um gateway NAT de rede virtual ou um NVA como o Firewall do Azure. Isso permite que a parte receptora permita uma lista com base no IP, caso seja necessário. Observe que, para comunicações com os Serviços do Azure, geralmente não há necessidade de depender do endereço IP e mecânicas como Pontos de Extremidade de Serviço devem ser usadas. (Além disso, o uso de pontos de extremidade privados na extremidade de recebimento evita que o SNAT aconteça e fornece um intervalo de IP de saída estável.)", - "guid": "cda3b54e-b2eb-403d-b9a2-582718d2ddb1", - "link": "https://learn.microsoft.com/azure/app-service/networking/nat-gateway-integration", - "service": "App Services", - "severity": "Baixo", - "text": "Garantir um IP estável para comunicações de saída para endereços de Internet", - "waf": "Segurança" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "adfe27be-e297-401a-a352-baaab79b088d", + "link": "https://github.com/openai/tiktoken", + "service": "Azure OpenAI", + "severity": "Alto", + "text": "Use tiktoken para entender os tamanhos de token para otimizações de token no modo de conversação", + "waf": "Otimização de custos" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Controle o acesso à rede de entrada usando uma combinação de Restrições de Acesso do Serviço de Aplicativo, Pontos de Extremidade de Serviço ou Pontos de Extremidade Privados. Diferentes restrições de acesso podem ser necessárias e configuradas para o próprio aplicativo Web e o site do SCM.", - "guid": "0725769e-e669-41a4-a34a-c932223ece80", - "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "42b06c21-d799-49a6-96f4-389a7f42c78e", + "link": "https://learn.microsoft.com/azure/security/develop/secure-dev-overview", + "service": "Azure OpenAI", "severity": "Alto", - "text": "O acesso à rede de entrada deve ser controlado", + "text": "Siga práticas de codificação segura para evitar vulnerabilidades comuns, como ataques de injeção, cross-site scripting (XSS) ou configurações incorretas de segurança", "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Proteja-se contra tráfego de entrada mal-intencionado usando um Firewall de Aplicativo Web, como o Gateway de Aplicativo ou o Azure Front Door. Certifique-se de monitorar os logs do WAF.", - "guid": "b123071a-5416-4415-a33e-a3ad2c2de732", - "link": "https://learn.microsoft.com/azure/app-service/networking/app-gateway-with-service-endpoints", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Alto", - "text": "Usar um WAF na frente do Serviço de Aplicativo", + "text": "Configure um processo para atualizar e corrigir regularmente as bibliotecas LLM e outros componentes do sistema", "waf": "Segurança" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Certifique-se de que o WAF não pode ser ignorado bloqueando o acesso apenas ao WAF. Use uma combinação de Restrições de Acesso, Pontos de Extremidade de Serviço e Pontos de Extremidade Privados.", - "guid": "165c3acb-ef4a-4be1-b8d3-9fda47768314", - "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e29711b1-352b-4eee-879b-588defc4972c", + "link": "https://learn.microsoft.com/legal/cognitive-services/openai/code-of-conduct", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Evite que o WAF seja ignorado", - "waf": "Segurança" + "text": "Aderir aos termos de uso, políticas e diretrizes do Azure OpenAI ou de outros LLMs e casos de uso permitidos", + "waf": "Excelência Operacional" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Defina a política TLS mínima como 1.2 na configuração do Serviço de Aplicativo.", - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Média", - "text": "Definir a política TLS mínima como 1.2", - "waf": "Segurança" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Configure o Serviço de Aplicativo para usar somente HTTPS. Isso faz com que o Serviço de Aplicativo redirecione de HTTP para HTTPS. Considere fortemente o uso de HTTP Strict Transport Security (HSTS) em seu código ou a partir de seu WAF, que informa aos navegadores que o site só deve ser acessado usando 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", - "severity": "Alto", - "text": "Usar somente HTTPS", - "waf": "Segurança" + "text": "Entender a diferença no custo de modelos básicos e modelos ajustados e tamanhos de etapa de token", + "waf": "Otimização de custos" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Não use curingas em sua configuração do CORS, pois isso permite que todas as origens acessem o serviço (derrotando assim o propósito do CORS). Especificamente, permita apenas as origens que você espera poder acessar o serviço.", - "guid": "68266abc-a264-4f9a-89ae-d9c55d04c2c3", - "link": "https://learn.microsoft.com/azure/app-service/app-service-web-tutorial-rest-api", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "1347dc56-028a-471f-be1c-e15dd3f0d5e7", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/latency#batching", + "service": "Azure OpenAI", "severity": "Alto", - "text": "Curingas não devem ser usados para CORS", - "waf": "Segurança" + "text": "Solicitações em lote, sempre que possível, para minimizar a sobrecarga por chamada, o que pode reduzir os custos gerais. Certifique-se de otimizar o tamanho do lote", + "waf": "Otimização de custos" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "A depuração remota não deve ser ativada na produção, pois isso abre portas adicionais no serviço, o que aumenta a superfície de ataque. Observe que o serviço ativa a depuração remota automaticamente após 48 horas.", - "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", - "severity": "Alto", - "text": "Desativar a depuração remota", - "waf": "Segurança" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "72d41e36-11cc-457b-9a4b-1410d43958a8", + "link": "https://learn.microsoft.com/azure/ai-services/openai/how-to/manage-costs", + "service": "Azure OpenAI", + "severity": "Média", + "text": "Configure um sistema de rastreamento de custos que monitore o uso do modelo e use essas informações para ajudar a informar as escolhas do modelo e solicitar tamanhos", + "waf": "Otimização de custos" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Habilite o Defender para o Serviço de Aplicativo. Isso (entre outras ameaças) detecta comunicações com endereços IP mal-intencionados conhecidos. Analise as recomendações do Defender for App Service como parte de suas operações.", - "guid": "18d2ddb1-0725-4769-be66-91a4834ac932", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-app-service-introduction", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Média", - "text": "Habilitar o Defender for Cloud - Defender for App Service", - "waf": "Segurança" + "text": "Defina um limite máximo para o número de tokens por resposta do modelo. Otimize o tamanho para garantir que seja grande o suficiente para uma resposta válida", + "waf": "Otimização de custos" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "O Azure fornece proteção contra DDoS Basic em sua rede, que pode ser aprimorada com recursos inteligentes de DDoS Standard que aprendem sobre padrões normais de tráfego e podem detectar comportamentos incomuns. O DDoS Standard se aplica a uma Rede Virtual, portanto, ele deve ser configurado para o recurso de rede na frente do aplicativo, como o Application Gateway ou um NVA.", - "guid": "223ece80-b123-4071-a541-6415833ea3ad", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "71ca7da8-cfa9-462a-8594-946da97dc3a2", + "link": "https://learn.microsoft.com/azure/search/search-reliability", + "service": "Azure OpenAI", "severity": "Média", - "text": "Habilitar o padrão de proteção DDOS na rede virtual WAF", - "waf": "Segurança" + "text": "Examine as diretrizes fornecidas sobre como configurar a pesquisa de IA para confiabilidade", + "waf": "Excelência Operacional" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Ao usar imagens armazenadas no Registro de Contêiner do Azure, extraia-as por uma rede virtual do Registro de Contêiner do Azure usando seu ponto de extremidade privado e a configuração do aplicativo '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", - "severity": "Média", - "text": "Extrair contêineres por uma rede virtual", - "waf": "Segurança" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Realizar um teste de penetração na aplicação web seguindo as regras de teste de penetração de engajamento.", - "guid": "eb2eb03d-d9a2-4582-918d-2ddb10725769", - "link": "https://learn.microsoft.com/azure/security/fundamentals/pen-testing", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "3266b225-86f4-4a16-92bd-ddea8a487cde", + "link": "https://learn.microsoft.com/azure/search/vector-search-index-size?tabs=portal-vector-quota", + "service": "Azure OpenAI", "severity": "Média", - "text": "Realizar um teste de penetração", - "waf": "Segurança" + "text": "Planejar e gerenciar o armazenamento de vetores do AI Search", + "waf": "Excelência Operacional" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Implante código confiável que foi validado e verificado em busca de vulnerabilidades de acordo com as práticas de DevSecOps.", - "guid": "19aed9c5-5d04-4c2c-9919-ca0b2c12159e", - "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/devsecops-in-azure", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Média", - "text": "Implantar código validado", - "waf": "Segurança" + "text": "Aplique as práticas do LLMOps para automatizar o gerenciamento do ciclo de vida de seus aplicativos GenAI", + "waf": "Excelência Operacional" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Use as versões mais recentes de plataformas, linguagens de programação, protocolos e estruturas suportadas.", - "guid": "114b933d-f574-4ecc-ad9b-d3bafcda3b54", - "link": "https://learn.microsoft.com/azure/app-service/overview-patch-os-runtime", - "service": "App Services", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Alto", - "text": "Use plataformas, linguagens, protocolos e frameworks atualizados", - "waf": "Segurança" + "text": "Avalie o uso de modelos de faturamento - PAYG vs PTU", + "waf": "Otimização de custos" }, { - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Média", - "text": "Use um locatário do Entra para gerenciar seus recursos do Azure, a menos que você tenha um requisito regulatório ou comercial claro para multilocatários.", - "waf": "Operações" - }, - { - "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": "Baixo", - "text": "Use a abordagem de Automação Multilocatário para gerenciar seus locatários de ID do Microsoft Entra.", - "waf": "Operações" + "text": "Avaliar a qualidade de prompts e aplicativos ao alternar entre versões de modelo", + "waf": "Excelência Operacional" }, { - "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": "Alto", - "text": "Use o Azure Lighthouse para gerenciamento de vários locatários com as mesmas IDs.", - "training": "https://learn.microsoft.com/azure/lighthouse/concepts/cross-tenant-management-experience", - "waf": "Operações" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "Média", + "text": "Avalie, monitore e refine seus aplicativos GenAI para recursos como fundamentação, relevância, precisão, coerência, fluência,", + "waf": "Excelência Operacional" }, { - "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": "Alto", - "text": "Se você conceder a um parceiro acesso para administrar seu locatário, use o Azure Lighthouse.", - "waf": "Custar" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "294798b1-578b-4219-a46c-eb5443513592", + "service": "Azure OpenAI", + "severity": "Média", + "text": "Avaliar os resultados do Azure AI Search com base em diferentes parâmetros de pesquisa", + "waf": "Excelência Operacional" }, { - "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": "Alto", - "text": "Aplique um modelo RBAC que se alinhe ao seu modelo operacional de nuvem. Escopo e Atribuição entre Grupos de Gerenciamento e Assinaturas.", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "Segurança" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "2744293b-b628-4537-a551-19b08e8f5854", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/fine-tuning-considerations", + "service": "Azure OpenAI", + "severity": "Média", + "text": "Olhe para os modelos de ajuste fino como forma de aumentar a precisão somente quando você tiver tentado outras abordagens básicas, como engenharia rápida e RAG com seus dados", + "waf": "Excelência Operacional" }, { - "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": "Alto", - "text": "Use apenas o tipo de autenticação Conta corporativa ou de estudante para todos os tipos de conta. Evite usar a conta da Microsoft", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", - "waf": "Segurança" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", + "severity": "Média", + "text": "Use técnicas de engenharia rápida para melhorar a precisão das respostas do LLM", + "waf": "Excelência Operacional" }, { - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "e737897e-71ca-47da-acfa-962a1594946d", + "link": "https://learn.microsoft.com/azure/ai-services/openai/concepts/red-teaming", + "service": "Azure OpenAI", "severity": "Média", - "text": "Use apenas grupos para atribuir permissões. Adicione grupos locais ao grupo Somente ID do Entra se um sistema de gerenciamento de grupo já estiver em vigor.", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "text": "Equipe vermelha de seus aplicativos GenAI", "waf": "Segurança" }, { - "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": "Alto", - "text": "Imponha políticas de Acesso Condicional da ID do Microsoft Entra para qualquer usuário com direitos a ambientes do Azure.", - "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", - "waf": "Segurança" + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "edb117e6-76aa-4f66-aca4-8e5a95f2223e", + "link": "https://www.microsoft.com/haxtoolkit/guideline/encourage-granular-feedback/", + "service": "Azure OpenAI", + "severity": "Média", + "text": "Forneça aos usuários finais opções de pontuação para respostas LLM e acompanhe essas pontuações. ", + "waf": "Excelência Operacional" }, { - "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", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "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", "severity": "Alto", - "text": "Imponha a autenticação multifator para qualquer usuário com direitos aos ambientes do Azure.", - "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", - "waf": "Segurança" - }, - { - "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": "Média", - "text": "Imponha o Microsoft Entra ID Privileged Identity Management (PIM) para estabelecer acesso permanente zero e privilégios mínimos.", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", - "waf": "Segurança" + "text": "Considere as práticas de gerenciamento de cotas", + "waf": "Otimização de custos" }, { - "checklist": "Azure Landing Zone Review", - "guid": "8b9fe5c4-1049-4d40-9a92-3c3474d00018", - "link": "https://learn.microsoft.com/en-us/entra/identity/domain-services/overview", - "service": "Entra", + "arm-service": "Microsoft.CognitiveServices/accounts", + "checklist": "Azure OpenAI Review", + "guid": "9de0d5d7-31d4-41e3-911c-817bfafbc410", + "link": "https://github.com/Azure/aoai-apim/blob/main/README.md", + "service": "Azure OpenAI", "severity": "Média", - "text": "Se estiver planejando alternar dos Serviços de Domínio Active Directory para os serviços de domínio Entra, avalie a compatibilidade de todas as cargas de trabalho.", - "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", - "waf": "Segurança" + "text": "Use soluções de balanceador de carga, como gateway baseado em APIM, para balancear carga e capacidade entre serviços e regiões", + "waf": "Excelência Operacional" }, { - "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", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review Checklist", + "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", + "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", + "service": "Azure MySQL", "severity": "Média", - "text": "Integre os logs de ID do Microsoft Entra com o Azure Monitor central da plataforma. O Azure Monitor permite uma única fonte de verdade sobre dados de log e monitoramento no Azure, oferecendo às organizações opções nativas de nuvem para atender aos requisitos de coleta e retenção de logs.", - "waf": "Segurança" + "text": "Aproveite o servidor flexível", + "waf": "Fiabilidade" }, { - "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", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review 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", "severity": "Alto", - "text": "Implemente um acesso de emergência ou contas de emergência para evitar o bloqueio de conta em todo o locatário.", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", - "waf": "Segurança" - }, - { - "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": "Média", - "text": "Não use contas sincronizadas locais para atribuições de função de ID do Microsoft Entra, a menos que você tenha um cenário que exija isso especificamente.", - "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", - "waf": "Segurança" + "text": "Aproveite as zonas de disponibilidade quando aplicável regionalmente", + "waf": "Fiabilidade" }, { - "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", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review 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", "severity": "Média", - "text": "Ao usar o Proxy de Aplicativo de ID do Microsoft Entra para fornecer acesso de usuários remotos a aplicativos, gerencie-o como um recurso da plataforma, pois você só pode ter uma instância por locatário.", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", - "waf": "Segurança" + "text": "Aproveite a replicação de dados para cenários de DR entre regiões", + "waf": "Fiabilidade" }, { - "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": "Média", - "text": "Use uma topologia de rede hub-and-spoke para cenários de rede que exigem flexibilidade máxima.", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "Segurança" + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization Checklist", + "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", + "service": "Azure Monitor", + "text": "Regras de coleta de dados no Azure Monitor -https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview", + "training": "https://azure.microsoft.com/pricing/reservations/", + "waf": "Custar" }, { - "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": "Alto", - "text": "Implante serviços de rede compartilhados, incluindo gateways do ExpressRoute, gateways de VPN e Firewall do Azure ou NVAs de parceiros na rede virtual do hub central. Se necessário, implante também serviços DNS.", + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "text": "Verificar instâncias de backup com a fonte de dados subjacente não encontrada", "waf": "Custar" }, { - "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": "Alto", - "text": "Use um plano de proteção de IP ou rede DDoS para todos os endereços IP públicos nas zonas de destino do aplicativo.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Segurança" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "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", + "text": "Excluir ou arquivar serviços não associados (discos, nics, endereços IP etc.)", + "waf": "Custar" }, { - "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": "Média", - "text": "Ao implantar tecnologias de rede de parceiros ou NVAs, siga as diretrizes do fornecedor do parceiro.", - "waf": "Fiabilidade" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "text": "Considere um bom equilíbrio entre recuperação de local, armazenamento e backup para aplicativos não essenciais", + "waf": "Custar" }, { - "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": "Baixo", - "text": "Se você precisar de trânsito entre o ExpressRoute e os gateways de VPN em cenários hub e spoke, use o Servidor de Rota do Azure.", - "waf": "Segurança" + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization 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", + "text": "Verifique os gastos e as oportunidades de economia entre os 40 diferentes espaços de trabalho de análise de log - use retenção e coleta de dados diferentes para espaços de trabalho não prod - crie limite diário para reconhecimento e dimensionamento de camadas - Se você definir um limite diário, além de criar um alerta quando o limite for atingido, certifique-se de também criar uma regra de alerta para ser notificado quando alguma porcentagem for atingida (90%, por exemplo). - considerar a transformação do espaço de trabalho, se possível - 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": "Custar" }, { - "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": "Baixo", - "text": "Se estiver usando o Servidor de Roteamento, use um prefixo /27 para a sub-rede do Servidor de Roteamento.", - "waf": "Segurança" + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization 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", + "text": "Impor uma política de log de limpeza e automação (se necessário, os logs podem ser movidos para armazenamento frio)", + "training": "https://www.youtube.com/watch?v=nHQYcYGKuyw", + "waf": "Custar" }, { - "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": "Média", - "text": "Para arquiteturas de rede com várias topologias hub-and-spoke em regiões do Azure, use emparelhamentos de rede virtual global entre as VNets do hub para conectar as regiões entre si.", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-virtual-networks/", - "waf": "Desempenho" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "text": "Verifique se os discos são realmente necessários, se não: excluir. Se forem necessários, encontre níveis de armazenamento mais baixos ou use backup -", + "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/manage-automation", + "waf": "Custar" }, { - "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": "Média", - "text": "Use o Azure Monitor para Redes para monitorar o estado de ponta a ponta das redes no Azure.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", - "waf": "Operações" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization 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", + "text": "Considere mover o armazenamento não utilizado para o nível inferior, com regra personalizada - 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": "Custar" }, { - "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": "Média", - "text": "Se você tiver mais de 400 redes spoke em uma região, implante um hub adicional para ignorar os limites de emparelhamento VNet (500) e o número máximo de prefixos que podem ser anunciados por meio do ExpressRoute (1000).", - "waf": "Fiabilidade" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "VM", + "text": "Verifique se o Advisor está configurado para o dimensionamento correto da VM ", + "waf": "Custar" }, { - "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": "Média", - "text": "Limite o número de rotas por tabela de rotas a 400.", - "waf": "Fiabilidade" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "description": "verifique pesquisando as Licenças de Categoria de Medidor na Análise de Custos", + "guid": "59ae568b-a38d-4498-9e22-13dbd7bb012f", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/manage/centralize-operations", + "service": "VM", + "text": "executar o script em todas as VMs do Windows 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- considere implementar uma diretiva se as VMs do Windows forem criadas com frequência", + "waf": "Custar" }, { - "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": "Alto", - "text": "Use a configuração 'Permitir tráfego para rede virtual remota' ao configurar emparelhamentos VNet.", - "waf": "Fiabilidade" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "service": "VM", + "text": " isso também pode ser colocado no AHUB se você já tiver licenças https://learn.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux?tabs=rhelpayg%2Crhelbyos%2CrhelEnablebyos%2Crhelcompliance", + "waf": "Custar" }, { - "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": "Média", - "text": "Quando você estiver usando o ExpressRoute Direct, configure o MACsec para criptografar o tráfego no nível da camada dois entre os roteadores da organização e o MSEE. O diagrama mostra essa criptografia no fluxo.", - "waf": "Segurança" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", + "service": "VM", + "text": "Consolidar famílias de VM reservadas com opção de flexibilidade (não mais do que 4-5 famílias)", + "training": "https://learn.microsoft.com/azure/automation/automation-solution-vm-management", + "waf": "Custar" }, { - "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": "Média", - "text": "Para cenários em que o MACsec não é uma opção (por exemplo, não usando o ExpressRoute Direct), use um gateway de VPN para estabelecer túneis IPsec no emparelhamento privado do ExpressRoute.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", - "waf": "Segurança" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "text": "Utilize instâncias reservadas do Azure: esse recurso permite reservar VMs por um período de 1 ou 3 anos, proporcionando uma economia significativa em comparação com os preços do PAYG.", + "waf": "Custar" }, { - "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": "Alto", - "text": "Verifique se nenhum espaço de endereço IP sobreposto entre regiões do Azure e locais é usado.", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "Segurança" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", + "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", + "service": "VM", + "text": "Somente discos maiores podem ser reservados => 1 TiB -", + "waf": "Custar" }, { - "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": "Média", - "text": "Use endereços IP dos intervalos de alocação de endereços para Internets privadas (RFC 1918).", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "Segurança" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", + "service": "VM", + "text": "Após a otimização do dimensionamento correto", + "waf": "Custar" }, { - "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": "Alto", - "text": "Certifique-se de que o espaço de endereço IP não seja desperdiçado, não crie redes virtuais desnecessariamente grandes (por exemplo, /16).", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "Desempenho" + "arm-service": "Microsoft.Sql/servers", + "checklist": "Cost Optimization Checklist", + "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", + "service": "Azure SQL", + "text": "Verifique se aplicável e aplique a política/alteração 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": "Custar" }, { - "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": "Alto", - "text": "Não use intervalos de endereços IP sobrepostos para sites de produção e recuperação de desastres.", - "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", - "waf": "Fiabilidade" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", + "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", + "service": "VM", + "text": "O desconto da peça de licença VM + (ahub + 3YRI) é de cerca de 70% de desconto", + "waf": "Custar" }, { - "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": "Média", - "text": "Para ambientes em que a resolução de nomes no Azure é tudo o que é necessário, use o DNS Privado do Azure para resolução com uma zona delegada para resolução de nomes (como 'azure.contoso.com').", - "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", - "waf": "Operações" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "text": "Considere o uso de um VMSS para corresponder à demanda em vez de dimensionamento simples", + "waf": "Custar" }, { - "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": "Média", - "text": "Para ambientes em que a resolução de nomes no Azure e no local é necessária e não há nenhum serviço DNS corporativo existente, como o Active Directory, use o Resolvedor Privado de DNS do Azure para rotear solicitações de DNS para o Azure ou para servidores DNS locais.", - "training": "https://learn.microsoft.com/training/modules/intro-to-azure-dns-private-resolver/", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Cost Optimization Checklist", + "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "service": "AKS", + "text": "Use o autoscaler AKS para corresponder ao uso de clusters (verifique se os requisitos dos pods correspondem ao dimensionador)", + "waf": "Custar" }, { - "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": "Baixo", - "text": "Cargas de trabalho especiais que exigem e implantam seu próprio DNS (como o Red Hat OpenShift) devem usar sua solução de DNS preferida.", - "waf": "Operações" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "text": "Mover pontos de recuperação para o vault-archive, quando aplicável (Validar)", + "training": "https://azure.microsoft.com/pricing/reservations/", + "waf": "Custar" }, { - "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": "Alto", - "text": "Habilite o registro automático para o DNS do Azure para gerenciar automaticamente o ciclo de vida dos registros DNS para as máquinas virtuais implantadas em uma rede virtual.", - "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", - "waf": "Operações" + "arm-service": "Microsoft.Databricks/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", + "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", + "service": "Databricks", + "text": "Considere o uso de VMs spot com fallback sempre que possível. Considere o autotermination de clusters.", + "waf": "Custar" }, { - "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": "Média", - "text": "Use o Azure Bastion para se conectar com segurança à sua rede.", - "waf": "Segurança" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", + "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", + "service": "Azure Functions", + "text": "Funções - Reutilizar conexões", + "training": "https://learn.microsoft.com/azure/cost-management-billing/reservations/reservation-apis?toc=%2Fazure%2Fcost-management-billing%2Ftoc.json", + "waf": "Custar" }, { - "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": "Média", - "text": "Use o Azure Bastion em uma sub-rede /26 ou maior.", - "waf": "Segurança" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", + "link": "https://learn.microsoft.com/azure/automation/update-management/overview", + "service": "Azure Functions", + "text": "Funções - Armazenar dados em cache localmente", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", + "waf": "Custar" }, { - "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": "Média", - "text": "Use as políticas do Azure Front Door e do WAF para fornecer proteção global entre regiões do Azure para conexões HTTP/S de entrada para uma zona de destino.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Segurança" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", + "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", + "service": "Azure Functions", + "text": "Funções - Partidas a frio - Use a funcionalidade 'Executar do pacote'. Dessa forma, o código é baixado como um único arquivo zip. Isso pode, por exemplo, resultar em melhorias significativas com as funções Javascript, que possuem muitos módulos de nó. Use ferramentas específicas de linguagem para reduzir o tamanho do pacote, por exemplo, aplicativos Javascript que agitam árvores.", + "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", + "waf": "Custar" }, { - "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": "Baixo", - "text": "Ao usar o Azure Front Door e o Gateway de Aplicativo do Azure para ajudar a proteger aplicativos HTTP/S, use políticas WAF no Azure Front Door. Bloqueie o Gateway de Aplicativo do Azure para receber tráfego somente do Azure Front Door.", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "Segurança" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "Azure Functions", + "text": "Funções - Mantenha suas funções aquecidas", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Custar" }, { - "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": "Alto", - "text": "Quando WAFs e outros proxies reversos forem necessários para conexões HTTP/S de entrada, implante-os em uma rede virtual de zona de destino e junto com os aplicativos que eles estão protegendo e expondo à Internet.", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "Segurança" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Azure Functions", + "text": "Ao usar o dimensionamento automático com funções diferentes, pode haver um que conduza todo o dimensionamento automático para todos os recursos - considere movê-lo para um plano de consumo separado (e considere um plano mais alto para a CPU)", + "waf": "Custar" }, { - "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": "Alto", - "text": "Use os planos de Rede ou Proteção de IP do Azure contra DDoS para ajudar a proteger os pontos de extremidade de endereços IP públicos nas redes virtuais.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Segurança" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", + "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", + "service": "Azure Functions", + "text": "Os aplicativos de função em um determinado plano são todos dimensionados juntos, portanto, quaisquer problemas com o dimensionamento podem afetar todos os aplicativos no plano.", + "waf": "Custar" }, { - "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": "Alto", - "text": "Planeje como gerenciar a configuração e a estratégia de tráfego de saída da rede antes da próxima alteração significativa. Em 30 de setembro de 2025, o acesso de saída padrão para novas implantações será desativado e somente configurações de acesso explícito serão permitidas.", - "waf": "Fiabilidade" + "arm-service": "Microsoft.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", + "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", + "service": "Azure Functions", + "text": "Sou cobrado por 'tempo de espera'? Essa pergunta geralmente é feita no contexto de uma função C# que faz uma operação assíncrona e aguarda o resultado, por exemplo, aguardar Task.Delay(1000) ou aguardar cliente. GetAsync('http://google.com'). A resposta é sim - o segundo cálculo de GB é baseado na hora de início e término da função e no uso de memória durante esse período. O que realmente acontece ao longo desse tempo em termos de atividade da CPU não é levado em consideração no cálculo. Uma exceção a essa regra é se você estiver usando funções duráveis. Você não é cobrado pelo tempo gasto em espera em funções de orquestrador.aplique técnicas de modelagem de demanda sempre que possível (ambientes de desenvolvimento?) https://github.com/Azure-Samples/functions-csharp-premium-scaler", + "waf": "Custar" }, { - "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": "Alto", - "text": "Adicione configurações de diagnóstico para salvar logs relacionados a DDoS para todos os endereços IP públicos protegidos (IP DDoS ou Proteção de Rede).", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Segurança" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Cost Optimization Checklist", + "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Front Door", + "text": "Frontdoor - Desativar a página inicial padrãoNas configurações do aplicativo do seu aplicativo, defina AzureWebJobsDisableHomepage como true. Isso retornará um 204 (Sem Conteúdo) para o PoP para que apenas os dados de cabeçalho sejam retornados.", + "waf": "Custar" }, { - "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": "Alto", - "text": "Verifique se há uma atribuição de política para negar endereços IP públicos diretamente vinculados a máquinas virtuais. Use exclusões se IPs públicos forem necessários em VMs específicas.", - "waf": "Segurança" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Cost Optimization 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", + "text": "Frontdoor - Rota para algo que não retorna nada. Configure uma Função, Proxy de Função ou adicione uma rota em seu WebApp que retorne 200 (OK) e envie conteúdo nulo ou mínimo. A vantagem disso é que você poderá fazer logout quando for chamado.", + "waf": "Custar" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", + "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", + "service": "Storage", + "text": "Considere níveis de arquivamento para dados menos usados", + "waf": "Custar" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", + "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", + "service": "VM", + "text": "Verifique os tamanhos de disco em que o tamanho não corresponde à camada (ou seja, um disco de 513 GiB pagará um P30 (1TiB) e considere o redimensionamento", + "waf": "Custar" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", + "service": "Storage", + "text": "Considere usar SSD padrão em vez de Premium ou Ultra sempre que possível", + "waf": "Custar" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization 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", + "text": "Para contas de armazenamento, verifique se a camada escolhida não está somando encargos de transação (pode ser mais barato passar para a próxima camada)", + "waf": "Custar" + }, + { + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization Checklist", + "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", + "service": "Site Recovery", + "text": "Para ASR, considere o uso de discos SSD padrão se o RPO/RTO e a taxa de transferência de replicação permitirem", + "waf": "Custar" }, { - "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": "Média", - "text": "Use o ExpressRoute como a conexão principal com o Azure. Use VPNs como fonte de conectividade de backup.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Desempenho" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization Checklist", + "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", + "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", + "service": "Storage", + "text": "Contas de armazenamento: verifique o hot tier e/ou o GRS necessário", + "waf": "Custar" }, { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "Azure Landing Zone Review", - "description": "Você pode usar o prefixo AS-path e pesos de conexão para influenciar o tráfego do Azure para o local e toda a gama de atributos BGP em seus próprios roteadores para influenciar o tráfego do local para o Azure.", - "guid": "f29812b2-363c-4efe-879b-599de0d5973c", - "link": "https://learn.microsoft.com/azure/expressroute/expressroute-routing", - "service": "ExpressRoute", - "severity": "Média", - "text": "Ao usar vários circuitos do ExpressRoute ou vários locais locais, use atributos BGP para otimizar o roteamento.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Fiabilidade" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", + "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", + "service": "VM", + "text": "Discos - valide o uso de discos SSD Premium em todos os lugares: por exemplo, não-prod pode trocar para SSD padrão ou SSD Premium sob demanda ", + "waf": "Custar" }, { - "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": "Média", - "text": "Selecione o SKU correto para os gateways ExpressRoute/VPN com base nos requisitos de largura de banda e desempenho.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Desempenho" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", + "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", + "service": "Synapse", + "text": "Crie orçamentos para gerenciar custos e crie alertas que notifiquem automaticamente as partes interessadas sobre anomalias de gastos e riscos de gastos excessivos.", + "waf": "Custar" }, { - "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": "Alto", - "text": "Verifique se você está usando circuitos do ExpressRoute de dados ilimitados somente se atingir a largura de banda que justifica seu custo.", + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "Synapse", + "text": "Exporte dados de custo para uma conta de armazenamento para análise de dados adicionais.", "waf": "Custar" }, { - "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": "Alto", - "text": "Aproveite o SKU local do ExpressRoute para reduzir o custo de seus circuitos, se o local de emparelhamento de circuito der suporte às regiões do Azure para o SKU Local.", + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "Synapse", + "text": "Controle os custos de um pool SQL dedicado pausando o recurso quando ele não estiver em uso.", "waf": "Custar" }, { - "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": "Média", - "text": "Implante um gateway do ExpressRoute com redundância de zona nas regiões do Azure com suporte.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Fiabilidade" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", + "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", + "service": "Synapse", + "text": "Habilite o recurso de pausa automática do Apache Spark sem servidor e defina seu valor de tempo limite de acordo.", + "waf": "Custar" }, { - "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": "Média", - "text": "Para cenários que exigem largura de banda superior a 10 Gbps ou portas dedicadas de 10/100 Gbps, use o ExpressRoute Direct.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Desempenho" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization 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", + "text": "Crie várias definições de pool do Apache Spark de vários tamanhos.", + "waf": "Custar" }, { - "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": "Média", - "text": "Quando a baixa latência for necessária ou a taxa de transferência do local para o Azure precisar ser maior que 10 Gbps, habilite o FastPath para ignorar o gateway do ExpressRoute do caminho de dados.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Desempenho" + "arm-service": "Microsoft.Synapse/workspaces", + "checklist": "Cost Optimization 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", + "text": "Adquira unidades de confirmação (SCU) do Azure Synapse por um ano com um plano de pré-compra para economizar nos custos do Azure Synapse Analytics.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Custar" }, { - "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": "Média", - "text": "Use gateways de VPN com redundância de zona para conectar branches ou locais remotos ao Azure (quando disponível).", - "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", - "waf": "Fiabilidade" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", + "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", + "service": "VM", + "text": "Usar VMs spot para trabalhos interruptíveis: são VMs que podem ser licitadas e compradas a um preço com desconto, fornecendo uma solução econômica para cargas de trabalho não críticas.", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Custar" }, { - "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": "Média", - "text": "Use dispositivos VPN redundantes locais (ativo/ativo ou ativo/passivo).", - "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", - "waf": "Fiabilidade" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "544451e1-92d3-4442-a3c7-628637a551c5", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "VM", + "text": "Dimensionamento correto de todas as VMs", + "waf": "Custar" }, { - "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": "Alto", - "text": "Se estiver usando o ExpressRoute Direct, considere usar circuitos locais do ExpressRoute para as regiões locais do Azure para economizar custos.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", + "service": "VM", + "text": "Trocar VM dimensionada com tamanhos normalizados e mais recentes", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "Custar" }, { - "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": "Média", - "text": "Quando o isolamento de tráfego ou a largura de banda dedicada for necessária, como para separar ambientes de produção e não produção, use circuitos diferentes do ExpressRoute. Ele ajudará você a garantir domínios de roteamento isolados e aliviar os riscos de vizinhos barulhentos.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Segurança" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", + "text": "VMs de dimensionamento correto - comece com o monitoramento do uso abaixo de 5% e, em seguida, trabalhe até 40%", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "Custar" }, { - "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": "Média", - "text": "Monitore a disponibilidade e a utilização do ExpressRoute usando o Express Route Insights interno.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Operações" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", + "text": "A conteinerização de um aplicativo pode melhorar a densidade da VM e economizar dinheiro no dimensionamento", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "Custar" }, { - "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": "Média", - "text": "Use o Monitor da Conexão para monitoramento de conectividade em toda a rede, especialmente entre o local e o Azure.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Operações" + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Azure Functions", + "severity": "Alto", + "text": "Selecione o plano de hospedagem de função certo com base em seus requisitos de negócios e SLO", + "waf": "Fiabilidade" }, { - "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": "Média", - "text": "Use circuitos do ExpressRoute de diferentes locais de emparelhamento para redundância.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Azure Functions", + "severity": "Alto", + "text": "Aproveitar zonas de disponibilidade quando aplicável regionalmente (não disponível para a camada de consumo)", "waf": "Fiabilidade" }, { - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "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", "severity": "Média", - "text": "Use a VPN site a site como failover do ExpressRoute, se estiver usando apenas um único circuito do ExpressRoute.", + "text": "Considere uma estratégia de DR entre regiões para cargas de trabalho críticas", "waf": "Fiabilidade" }, { - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "Azure Functions", "severity": "Alto", - "text": "Se você estiver usando uma tabela de rotas no GatewaySubnet, certifique-se de que as rotas de gateway sejam propagadas.", + "text": "Se estiver implantando em um ambiente isolado, use ou migre para o ASE (Ambiente do Serviço de Aplicativo) v3", "waf": "Fiabilidade" }, { - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "Azure Functions", "severity": "Alto", - "text": "Se estiver usando o ExpressRoute, o roteamento local deverá ser dinâmico: no caso de uma falha de conexão, ele deverá convergir para a conexão restante do circuito. A carga deve ser compartilhada entre ambas as conexões, idealmente como ativa/ativa, embora ativa/passiva também seja suportada.", + "text": "Verifique se 'Sempre Ativado' está habilitado para todos os Aplicativos de Função em execução no Plano do Serviço de Aplicativo", "waf": "Fiabilidade" }, { - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "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", "severity": "Média", - "text": "Verifique se os dois links físicos do circuito do ExpressRoute estão conectados a dois dispositivos de borda distintos em sua rede.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "text": "Emparelhe um aplicativo de função com sua própria conta de armazenamento. Tente não reutilizar contas de armazenamento para aplicativos de função, a menos que eles estejam firmemente acoplados", "waf": "Fiabilidade" }, { - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "Azure Functions", "severity": "Média", - "text": "Certifique-se de que a Detecção de Encaminhamento Bidirecional (BFD) esteja habilitada e configurada em dispositivos de roteamento de borda do cliente ou provedor.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Fiabilidade" + "text": "Aproveite o Azure DevOps ou o GitHub para simplificar o CI/CD e proteger seu código do Aplicativo de Função", + "waf": "Operações" }, { - "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": "Alto", - "text": "Conecte o Gateway do ExpressRoute a dois ou mais circuitos de diferentes locais de emparelhamento para maior resiliência.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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", + "severity": "Baixo", + "text": "Consulte a arquitetura de aplicativo Web com redundância de zona altamente disponível da linha de base para obter as práticas recomendadas", "waf": "Fiabilidade" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", + "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", + "service": "App Services", "severity": "Média", - "text": "Configure logs de diagnóstico e alertas para o gateway de rede virtual do ExpressRoute.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Operações" + "text": "Use as camadas Premium e Standard. Esses níveis oferecem suporte a slots de preparo e backups automatizados.", + "waf": "Fiabilidade" }, { - "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": "Média", - "text": "Não use circuitos do ExpressRoute para comunicação VNet para VNet.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "Desempenho" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", + "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", + "service": "App Services", + "severity": "Alto", + "text": "Aproveite as zonas de disponibilidade quando aplicável regionalmente (requer a camada Premium v2 ou v3)", + "waf": "Fiabilidade" }, { - "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": "Baixo", - "text": "Não envie o tráfego do Azure para locais híbridos para inspeção. Em vez disso, siga o princípio \"o tráfego no Azure permanece no Azure\" para que a comunicação entre os recursos no Azure ocorra por meio da rede de backbone da Microsoft.", - "waf": "Desempenho" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Services", + "severity": "Média", + "text": "Implementar verificações de integridade", + "waf": "Fiabilidade" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", + "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", + "service": "App Services", "severity": "Alto", - "text": "Use o Firewall do Azure para controlar o tráfego de saída do Azure para a Internet, conexões de entrada não HTTP/S e filtragem de tráfego Leste/Oeste (se a organização exigir).", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Segurança" + "text": "Consulte as práticas recomendadas de backup e restauração para o Serviço de Aplicativo do Azure", + "waf": "Fiabilidade" }, { - "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": "Média", - "text": "Crie uma política global de Firewall do Azure para controlar a postura de segurança em todo o ambiente de rede global e atribua-a a todas as instâncias do Firewall do Azure. Permita que políticas granulares atendam aos requisitos de regiões específicas delegando políticas de firewall incrementais às equipes de segurança locais por meio do controle de acesso baseado em função do Azure.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Segurança" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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", + "severity": "Alto", + "text": "Implementar práticas recomendadas de confiabilidade do Serviço de Aplicativo do Azure", + "waf": "Fiabilidade" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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", "severity": "Baixo", - "text": "Configure provedores de segurança SaaS de parceiros compatíveis no Firewall Manager se a organização quiser usar essas soluções para ajudar a proteger as conexões de saída.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Segurança" + "text": "Familiarizar-se com como mover um aplicativo do Serviço de Aplicativo para outra região durante um desastre", + "waf": "Fiabilidade" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", + "service": "App Services", "severity": "Alto", - "text": "Use regras de aplicativo para filtrar o tráfego de saída no nome do host de destino para protocolos com suporte. Use regras de rede baseadas em FQDN e Firewall do Azure com proxy DNS para filtrar o tráfego de saída para a Internet em outros protocolos.", - "waf": "Segurança" + "text": "Familiarizar-se com o suporte de confiabilidade no Serviço de Aplicativo do Azure", + "waf": "Fiabilidade" }, { - "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": "Alto", - "text": "Use o Firewall do Azure Premium para habilitar recursos de segurança adicionais.", - "waf": "Segurança" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "App Services", + "severity": "Média", + "text": "Verifique se \"Sempre Ativo\" está habilitado para Aplicativos de Função em execução em um plano de serviço de aplicativo", + "waf": "Fiabilidade" }, { - "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": "Alto", - "text": "Configure o modo de Inteligência contra Ameaças do Firewall do Azure como Alerta e Negação para proteção adicional.", - "waf": "Segurança" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Services", + "severity": "Média", + "text": "Monitorar instâncias do Serviço de Aplicativo usando verificações de integridade", + "waf": "Fiabilidade" }, { - "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": "Alto", - "text": "Configure o modo IDPS do Firewall do Azure como Negar para proteção adicional.", - "waf": "Segurança" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", + "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", + "service": "App Services", + "severity": "Média", + "text": "Monitorar a disponibilidade e a capacidade de resposta do aplicativo Web ou site usando testes de disponibilidade do Application Insights", + "waf": "Fiabilidade" }, { - "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": "Alto", - "text": "Para sub-redes em VNets não conectadas à WAN Virtual, anexe uma tabela de rotas para que o tráfego da Internet seja redirecionado para o Firewall do Azure ou uma Solução de Virtualização de Rede.", - "waf": "Segurança" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "b4e3f2d5-a5c6-4d7e-8b2f-c5d9e7a8f0ea", + "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", + "service": "App Services", + "severity": "Baixo", + "text": "Usar o teste Application Insights Standard para monitorar a disponibilidade e a capacidade de resposta do aplicativo Web ou site", + "waf": "Fiabilidade" }, { - "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": "Média", - "text": "Adicione configurações de diagnóstico para salvar logs, usando a tabela de destino Específico do Recurso, para todas as implantações do Firewall do Azure.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Operações" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Use o Cofre de Chaves do Azure para armazenar quaisquer segredos de que o aplicativo precisa. O Cofre de Chaves fornece um ambiente seguro e auditado para armazenar segredos e está bem integrado ao Serviço de Aplicativo por meio do SDK do Cofre de Chaves ou das Referências do Cofre de Chaves do Serviço de Aplicativo.", + "guid": "834ac932-223e-4ce8-8b12-3071a5416415", + "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", + "service": "App Services", + "severity": "Alto", + "text": "Usar o Cofre de Chaves para armazenar segredos", + "waf": "Segurança" }, { - "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": "Importante", - "text": "Migre das regras clássicas do Firewall do Azure (se houver) para a Política de Firewall.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "Operações" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Use uma Identidade Gerenciada para se conectar ao Cofre de Chaves usando o SDK do Cofre de Chaves ou por meio das Referências do Cofre de Chaves do Serviço de Aplicativo.", + "guid": "833ea3ad-2c2d-4e73-8165-c3acbef4abe1", + "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", + "service": "App Services", + "severity": "Alto", + "text": "Usar a Identidade Gerenciada para se conectar ao Cofre de Chaves", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Armazene o certificado TLS do Serviço de Aplicativo no Cofre de Chaves.", + "guid": "f8d39fda-4776-4831-9c11-5775c2ea55b4", + "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-certificate", + "service": "App Services", "severity": "Alto", - "text": "Use um prefixo /26 para suas sub-redes do Firewall do Azure.", + "text": "Use o Cofre de Chaves para armazenar o certificado TLS.", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Os sistemas que processam informações confidenciais devem ser isolados. Para fazer isso, use Planos do Serviço de Aplicativo ou Ambientes do Serviço de Aplicativo separados e considere o uso de assinaturas ou grupos de gerenciamento diferentes.", + "guid": "6ad48408-ee72-4734-a475-ba18fdbf590c", + "link": "https://learn.microsoft.com/azure/app-service/overview-hosting-plans", + "service": "App Services", "severity": "Média", - "text": "Organize as regras dentro da política de firewall em Grupos de Coleção de Regras e Coleções de Regras e com base em sua frequência de uso.", - "waf": "Desempenho" + "text": "Isolar sistemas que processam informações confidenciais", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Os discos locais no Serviço de Aplicativo não são criptografados e os dados confidenciais não devem ser armazenados neles. (Por exemplo: D:\\\\Local e %TMP%).", + "guid": "e65de8e0-3f9b-4cbd-9682-66abca264f9a", + "link": "https://learn.microsoft.com/azure/app-service/operating-system-functionality#file-access", + "service": "App Services", "severity": "Média", - "text": "Use grupos de IP ou prefixos de IP para reduzir o número de regras de tabela de IP.", - "waf": "Desempenho" + "text": "Não armazene dados confidenciais no disco local", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Para aplicativos Web autenticados, use um Provedor de Identidade bem estabelecido, como o Azure AD ou o Azure AD B2C. Aproveite a estrutura de aplicativo de sua escolha para se integrar a esse provedor ou use o recurso de Autenticação/Autorização do Serviço de Aplicativo.", + "guid": "919ca0b2-c121-459e-814b-933df574eccc", + "link": "https://learn.microsoft.com/azure/app-service/overview-authentication-authorization", + "service": "App Services", "severity": "Média", - "text": "Não use curingas como um IP de origem para DNATS, como * ou any, você deve especificar IPs de origem para DNATs de entrada.", - "waf": "Desempenho" + "text": "Usar um provedor de identidade estabelecido para autenticação", + "waf": "Segurança" }, { - "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": "Média", - "text": "Evite o esgotamento da porta SNAT monitorando o uso da porta SNAT, avaliando as configurações do NAT Gateway e garantindo um failover contínuo. Se a contagem de portas se aproximar do limite, é um sinal de que o esgotamento do SNAT pode ser iminente.", - "waf": "Desempenho" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Implante código no Serviço de Aplicativo a partir de um ambiente controlado e confiável, como um pipeline de implantação de DevOps bem gerenciado e seguro. Isso evita que o código que não foi controlado por versão e verificado para ser implantado a partir de um host mal-intencionado.", + "guid": "3f9bcbd4-6826-46ab-aa26-4f9a19aed9c5", + "link": "https://learn.microsoft.com/azure/app-service/deploy-best-practices", + "service": "App Services", + "severity": "Alto", + "text": "Implantar a partir de um ambiente confiável", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Desative a autenticação básica para FTP/FTPS e WebDeploy/SCM. Isso desabilita o acesso a esses serviços e impõe o uso de pontos de extremidade protegidos do Azure AD para implantação. Observe que o site do SCM também pode ser aberto usando credenciais do Azure AD.", + "guid": "5d04c2c3-919c-4a0b-8c12-159e114b933d", + "link": "https://learn.microsoft.com/azure/app-service/deploy-configure-credentials#disable-basic-authentication", + "service": "App Services", "severity": "Alto", - "text": "Se você estiver usando o Firewall do Azure Premium, habilite a Inspeção TLS.", - "waf": "Desempenho" + "text": "Desabilitar a autenticação básica", + "waf": "Segurança" }, { - "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": "Baixo", - "text": "Use categorias da Web para permitir ou negar o acesso de saída a tópicos específicos.", - "waf": "Desempenho" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Sempre que possível, use a Identidade Gerenciada para se conectar aos recursos protegidos do Azure AD. Se isso não for possível, armazene segredos no Cofre de Chaves e conecte-se ao Cofre de Chaves usando uma Identidade Gerenciada.", + "guid": "f574eccc-d9bd-43ba-bcda-3b54eb2eb03d", + "link": "https://learn.microsoft.com/azure/app-service/overview-managed-identity?tabs=portal%2Chttp", + "service": "App Services", + "severity": "Alto", + "text": "Usar a Identidade Gerenciada para se conectar a recursos", + "waf": "Segurança" }, { - "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": "Média", - "text": "Como parte da inspeção TLS, planeje o recebimento de tráfego dos Gateways de Aplicativo do Azure para inspeção.", - "waf": "Desempenho" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Onde estiver usando imagens armazenadas no Registro de Contêiner do Azure, extraia-as usando uma Identidade Gerenciada.", + "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", + "severity": "Alto", + "text": "Extrair contêineres usando uma identidade gerenciada", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Ao definir as configurações de diagnóstico do Serviço de Aplicativo, você pode enviar toda a telemetria para o Log Analytics como o destino central para registro em log e monitoramento. Isso permite que você monitore a atividade de tempo de execução do Serviço de Aplicativo, como logs HTTP, logs de aplicativos, logs de plataforma, ...", + "guid": "47768314-c115-4775-a2ea-55b46ad48408", + "link": "https://learn.microsoft.com/azure/app-service/troubleshoot-diagnostic-logs", + "service": "App Services", "severity": "Média", - "text": "Habilite a configuração de proxy DNS do Firewall do Azure.", + "text": "Enviar logs de tempo de execução do Serviço de Aplicativo para o Log Analytics", "waf": "Segurança" }, { - "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": "Alto", - "text": "Integre o Firewall do Azure ao Azure Monitor e habilite o log de diagnóstico para armazenar e analisar logs de firewall.", - "waf": "Operações" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Configure uma configuração de diagnóstico para enviar o log de atividades para o Log Analytics como o destino central para registro e monitoramento. Isso permite que você monitore a atividade do plano de controle no próprio recurso do Serviço de Aplicativo.", + "guid": "ee72734b-475b-4a18-bdbf-590ce65de8e0", + "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", + "service": "App Services", + "severity": "Média", + "text": "Enviar logs de atividade do Serviço de Aplicativo para o Log Analytics", + "waf": "Segurança" }, { - "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": "Baixo", - "text": "Implementar backups para suas regras de firewall", - "waf": "Operações" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Controle o acesso à rede de saída usando uma combinação de integração regional de VNet, grupos de segurança de rede e UDR's. O tráfego deve ser roteado para um NVA, como o Firewall do Azure. Certifique-se de monitorar os logs do Firewall.", + "guid": "c12159e1-14b9-433d-b574-ecccd9bd3baf", + "link": "https://learn.microsoft.com/azure/app-service/overview-vnet-integration", + "service": "App Services", + "severity": "Média", + "text": "O acesso à rede de saída deve ser controlado", + "waf": "Segurança" }, { - "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": "Alto", - "text": "Não interrompa a comunicação do painel de controle para serviços de PaaS do Azure injetados em redes virtuais, como com uma rota 0.0.0.0/0 ou uma regra NSG que bloqueia o tráfego do painel de controle.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Você pode fornecer um IP de saída estável usando a integração de rede virtual e um gateway NAT de rede virtual ou um NVA como o Firewall do Azure. Isso permite que a parte receptora permita uma lista com base no IP, caso seja necessário. Observe que, para comunicações com os Serviços do Azure, geralmente não há necessidade de depender do endereço IP e mecânicas como Pontos de Extremidade de Serviço devem ser usadas. (Além disso, o uso de pontos de extremidade privados na extremidade de recebimento evita que o SNAT aconteça e fornece um intervalo de IP de saída estável.)", + "guid": "cda3b54e-b2eb-403d-b9a2-582718d2ddb1", + "link": "https://learn.microsoft.com/azure/app-service/networking/nat-gateway-integration", + "service": "App Services", + "severity": "Baixo", + "text": "Garantir um IP estável para comunicações de saída para endereços de Internet", "waf": "Segurança" }, { - "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": "Média", - "text": "Acesse os serviços de PaaS do Azure localmente por meio de pontos de extremidade privados e emparelhamento privado do ExpressRoute. Esse método evita o trânsito pela Internet pública.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Controle o acesso à rede de entrada usando uma combinação de Restrições de Acesso do Serviço de Aplicativo, Pontos de Extremidade de Serviço ou Pontos de Extremidade Privados. Diferentes restrições de acesso podem ser necessárias e configuradas para o próprio aplicativo Web e o site do SCM.", + "guid": "0725769e-e669-41a4-a34a-c932223ece80", + "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", + "service": "App Services", + "severity": "Alto", + "text": "O acesso à rede de entrada deve ser controlado", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Proteja-se contra tráfego de entrada mal-intencionado usando um Firewall de Aplicativo Web, como o Gateway de Aplicativo ou o Azure Front Door. Certifique-se de monitorar os logs do WAF.", + "guid": "b123071a-5416-4415-a33e-a3ad2c2de732", + "link": "https://learn.microsoft.com/azure/app-service/networking/app-gateway-with-service-endpoints", + "service": "App Services", "severity": "Alto", - "text": "Não habilite pontos de extremidade de serviço de rede virtual por padrão em todas as sub-redes.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "text": "Usar um WAF na frente do Serviço de Aplicativo", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Certifique-se de que o WAF não pode ser ignorado bloqueando o acesso apenas ao WAF. Use uma combinação de Restrições de Acesso, Pontos de Extremidade de Serviço e Pontos de Extremidade Privados.", + "guid": "165c3acb-ef4a-4be1-b8d3-9fda47768314", + "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", + "service": "App Services", + "severity": "Alto", + "text": "Evite que o WAF seja ignorado", + "waf": "Segurança" + }, + { + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Defina a política TLS mínima como 1.2 na configuração do Serviço de Aplicativo.", + "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", "severity": "Média", - "text": "Filtre o tráfego de saída para os serviços de PaaS do Azure usando FQDNs em vez de endereços IP no Firewall do Azure ou em uma NVA para evitar a exfiltração de dados. Se estiver usando o Link Privado, você poderá bloquear todos os FQDNs, caso contrário, permita apenas os serviços de PaaS necessários.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "text": "Definir a política TLS mínima como 1.2", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Configure o Serviço de Aplicativo para usar somente HTTPS. Isso faz com que o Serviço de Aplicativo redirecione de HTTP para HTTPS. Considere fortemente o uso de HTTP Strict Transport Security (HSTS) em seu código ou a partir de seu WAF, que informa aos navegadores que o site só deve ser acessado usando 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", "severity": "Alto", - "text": "Utilize pelo menos um prefixo /27 para as sub-redes do Gateway.", + "text": "Usar somente HTTPS", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Não use curingas em sua configuração do CORS, pois isso permite que todas as origens acessem o serviço (derrotando assim o propósito do CORS). Especificamente, permita apenas as origens que você espera poder acessar o serviço.", + "guid": "68266abc-a264-4f9a-89ae-d9c55d04c2c3", + "link": "https://learn.microsoft.com/azure/app-service/app-service-web-tutorial-rest-api", + "service": "App Services", "severity": "Alto", - "text": "Não confie nas regras padrão de entrada do NSG usando a marca de serviço VirtualNetwork para limitar a conectividade.", + "text": "Curingas não devem ser usados para CORS", "waf": "Segurança" }, { - "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": "Média", - "text": "Use NSGs para ajudar a proteger o tráfego entre sub-redes, bem como o tráfego leste/oeste na plataforma (tráfego entre zonas de destino).", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "A depuração remota não deve ser ativada na produção, pois isso abre portas adicionais no serviço, o que aumenta a superfície de ataque. Observe que o serviço ativa a depuração remota automaticamente após 48 horas.", + "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", + "severity": "Alto", + "text": "Desativar a depuração remota", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Habilite o Defender para o Serviço de Aplicativo. Isso (entre outras ameaças) detecta comunicações com endereços IP mal-intencionados conhecidos. Analise as recomendações do Defender for App Service como parte de suas operações.", + "guid": "18d2ddb1-0725-4769-be66-91a4834ac932", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-app-service-introduction", + "service": "App Services", "severity": "Média", - "text": "Use NSGs e grupos de segurança de aplicativos para microssegmentar o tráfego dentro da zona de destino e evite usar uma NVA central para filtrar fluxos de tráfego.", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "text": "Habilitar o Defender for Cloud - Defender for App Service", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "O Azure fornece proteção contra DDoS Basic em sua rede, que pode ser aprimorada com recursos inteligentes de DDoS Standard que aprendem sobre padrões normais de tráfego e podem detectar comportamentos incomuns. O DDoS Standard se aplica a uma Rede Virtual, portanto, ele deve ser configurado para o recurso de rede na frente do aplicativo, como o Application Gateway ou um NVA.", + "guid": "223ece80-b123-4071-a541-6415833ea3ad", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "App Services", "severity": "Média", - "text": "Habilite os Logs de Fluxo de VNet e alimente-os na Análise de Tráfego para obter insights sobre fluxos de tráfego internos e externos.", - "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "text": "Habilitar o padrão de proteção DDOS na rede virtual WAF", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Ao usar imagens armazenadas no Registro de Contêiner do Azure, extraia-as por uma rede virtual do Registro de Contêiner do Azure usando seu ponto de extremidade privado e a configuração do aplicativo '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", "severity": "Média", - "text": "Não implemente mais de 900 regras de NSG por NSG, devido ao limite de 1000 regras.", - "training": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", - "waf": "Fiabilidade" + "text": "Extrair contêineres por uma rede virtual", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Realizar um teste de penetração na aplicação web seguindo as regras de teste de penetração de engajamento.", + "guid": "eb2eb03d-d9a2-4582-918d-2ddb10725769", + "link": "https://learn.microsoft.com/azure/security/fundamentals/pen-testing", + "service": "App Services", "severity": "Média", - "text": "Use a WAN Virtual se o cenário estiver explicitamente descrito na lista de designs de roteamento da WAN Virtual.", - "training": "https://learn.microsoft.com/learn/modules/introduction-azure-virtual-wan/", - "waf": "Operações" + "text": "Realizar um teste de penetração", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Implante código confiável que foi validado e verificado em busca de vulnerabilidades de acordo com as práticas de DevSecOps.", + "guid": "19aed9c5-5d04-4c2c-9919-ca0b2c12159e", + "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/devsecops-in-azure", + "service": "App Services", "severity": "Média", - "text": "Use um hub de WAN Virtual por região do Azure para conectar várias zonas de destino entre regiões do Azure por meio de uma WAN Virtual do Azure global comum.", - "waf": "Desempenho" + "text": "Implantar código validado", + "waf": "Segurança" }, { - "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": "Média", - "text": "Para proteção e filtragem de tráfego de saída da Internet, implante o Firewall do Azure em hubs seguros.", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Use as versões mais recentes de plataformas, linguagens de programação, protocolos e estruturas suportadas.", + "guid": "114b933d-f574-4ecc-ad9b-d3bafcda3b54", + "link": "https://learn.microsoft.com/azure/app-service/overview-patch-os-runtime", + "service": "App Services", + "severity": "Alto", + "text": "Use plataformas, linguagens, protocolos e frameworks atualizados", "waf": "Segurança" }, { - "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": "Média", - "text": "Verifique se a arquitetura de rede da WAN virtual está alinhada a um cenário de arquitetura identificado.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", + "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", + "service": "AKS", + "severity": "Baixo", + "text": "Se necessário para cargas de trabalho do AKS Windows, os contêineres HostProcess podem ser usados", "waf": "Fiabilidade" }, { - "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": "Média", - "text": "Use o Azure Monitor Insights para WAN Virtual para monitorar a topologia de ponta a ponta da WAN Virtual, o status e as principais métricas.", - "waf": "Operações" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", + "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", + "service": "AKS", + "severity": "Baixo", + "text": "Usar o KEDA se estiver executando cargas de trabalho orientadas a eventos", + "waf": "Desempenho" }, { - "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": "Média", - "text": "Não desabilite o tráfego branch a branch na WAN Virtual, a menos que esses fluxos devam ser bloqueados explicitamente.", - "waf": "Fiabilidade" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", + "link": "https://dapr.io/", + "service": "AKS", + "severity": "Baixo", + "text": "Use o Dapr para facilitar o desenvolvimento de microsserviços", + "waf": "Operações" }, { - "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": "Média", - "text": "Use AS-Path como preferência de roteamento de hub, pois é mais flexível que ExpressRoute ou VPN.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Alto", + "text": "Use a oferta AKS apoiada por SLA", "waf": "Fiabilidade" }, { - "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": "Média", - "text": "Configure a propagação baseada em rótulos na WAN Virtual, caso contrário, a conectividade entre hubs virtuais será prejudicada.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", + "severity": "Baixo", + "text": "Usar orçamentos de interrupção em seu pod e definições de implantação", "waf": "Fiabilidade" }, { - "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", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure AKS Review", + "guid": "3c763963-7a55-42d5-a15e-401955387e5c", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", + "service": "ACR", "severity": "Alto", - "text": "Atribua pelo menos um prefixo /23 a hubs virtuais para garantir que haja espaço IP suficiente disponível.", + "text": "Se estiver usando um registro privado, configure a replicação de região para armazenar imagens em várias regiões", "waf": "Fiabilidade" }, { - "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": "Alto", - "text": "Aproveite o Azure Policy estrategicamente, defina controles para seu ambiente, usando Iniciativas de Política para agrupar políticas relacionadas.", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", + "service": "AKS", + "severity": "Baixo", + "text": "Use um aplicativo externo, como kubecost, para alocar custos para diferentes usuários", + "waf": "Custar" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", + "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", + "service": "AKS", + "severity": "Baixo", + "text": "Usar o modo de redução para excluir/desalocar nós", + "waf": "Custar" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", + "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", + "service": "AKS", + "severity": "Média", + "text": "Quando necessário, use a GPU de partioning de várias instâncias em clusters AKS", + "waf": "Custar" }, { - "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": "Média", - "text": "Mapeie os requisitos regulatórios e de conformidade para definições do Azure Policy e atribuições de função do Azure.", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", + "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", + "service": "AKS", + "severity": "Baixo", + "text": "Se estiver executando um cluster de desenvolvimento/teste, use NodePool Start/Stop", + "waf": "Custar" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Média", - "text": "Estabeleça definições do Azure Policy no grupo de gerenciamento raiz intermediário para que elas possam ser atribuídas em escopos herdados.", + "text": "Usar a Política do Azure para Kubernetes para garantir a conformidade do cluster", "waf": "Segurança" }, { - "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": "Alto", - "text": "Gerencie atribuições de política no nível apropriado mais alto com exclusões nos níveis inferiores, se necessário.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Média", + "text": "Separe os aplicativos do plano de controle com pools de nós de usuário/sistema", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", + "link": "https://learn.microsoft.com/azure/aks/use-system-pools", + "service": "AKS", "severity": "Baixo", - "text": "Use o Azure Policy para controlar quais serviços os usuários podem provisionar no nível da assinatura/grupo de gerenciamento.", + "text": "Adicione mancha ao seu nodepool do sistema para torná-lo dedicado", "waf": "Segurança" }, { - "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": "Alto", - "text": "Use políticas internas sempre que possível para minimizar a sobrecarga operacional.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", + "link": "https://learn.microsoft.com/azure/container-registry/", + "service": "AKS", + "severity": "Média", + "text": "Usar um registro privado para suas imagens, como o ACR", "waf": "Segurança" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "Azure Landing Zone Review", - "description": "Atribuir a função Colaborador de Política de Recursos a escopos específicos permite delegar o gerenciamento de políticas a equipes relevantes. Por exemplo, uma equipe central de TI pode supervisionar as políticas no nível do grupo de gerenciamento, enquanto as equipes de aplicativos lidam com as políticas de suas assinaturas, permitindo a governança distribuída com adesão aos padrões organizacionais.", - "guid": "3f988795-25d6-4268-a6d7-0ba6c97be995", - "link": "https://learn.microsoft.com/azure/governance/policy/overview#azure-rbac-permissions-in-azure-policy", - "service": "Policy", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure AKS Review", + "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", + "link": "https://learn.microsoft.com/azure/security-center/container-security", + "service": "ACR", "severity": "Média", - "text": "Atribua a função interna de Colaborador de Política de Recursos em um escopo específico para habilitar a governança no nível do aplicativo.", + "text": "Analise suas imagens em busca de vulnerabilidades", "waf": "Segurança" }, { - "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": "Média", - "text": "Limite o número de atribuições do Azure Policy feitas no escopo do grupo de gerenciamento raiz para evitar o gerenciamento por meio de exclusões em escopos herdados.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", + "service": "AKS", + "severity": "Alto", + "text": "Definir requisitos de separação de aplicativos (namespace/nodepool/cluster)", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", + "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", + "service": "AKS", "severity": "Média", - "text": "Se houver requisitos de soberania de dados, as Políticas do Azure deverão ser implantadas para aplicá-los.", - "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "text": "Armazene seus segredos no Cofre de Chaves do Azure com o driver do CSI Secrets Store", "waf": "Segurança" }, { - "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": "Média", - "text": "Para a Zona de Destino Soberana, implante a linha de base da política de soberania e atribua no nível correto do grupo de gerenciamento.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", + "link": "https://learn.microsoft.com/azure/aks/update-credentials", + "service": "AKS", + "severity": "Alto", + "text": "Se estiver usando entidades de serviço para o cluster, atualize as credenciais periodicamente (como trimestralmente)", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", + "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", + "service": "AKS", "severity": "Média", - "text": "Para Zona de Aterrissagem Soberana, documente os objetivos de Controle Soberano para mapeamento de políticas.", + "text": "Se necessário, adicione criptografia etcd do Serviço de Gerenciamento de Chaves", "waf": "Segurança" }, { - "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": "Média", - "text": "Para a Zona de Aterrissagem Soberana, certifique-se de que o processo esteja em vigor para o gerenciamento de 'Objetivos de Controle Soberano para mapeamento de políticas'.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", + "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", + "service": "AKS", + "severity": "Baixo", + "text": "Se necessário, considere o uso de computação confidencial para AKS", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", + "service": "AKS", "severity": "Média", - "text": "Use um workspace de logs de monitor único para gerenciar plataformas centralmente, exceto quando o RBAC (controle de acesso baseado em função) do Azure, os requisitos de soberania de dados ou as políticas de retenção de dados exigirem workspaces separados.", - "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "waf": "Operações" + "text": "Considere o uso do Defender for Containers", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Alto", - "text": "Exporte logs para o Armazenamento do Azure se os requisitos de retenção de log excederem doze anos. Use o armazenamento imutável com uma política de gravação única e leitura múltipla para tornar os dados não apagáveis e não modificáveis por um intervalo especificado pelo usuário.", - "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", - "waf": "Operações" - }, - { - "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": "Média", - "text": "Monitore o descompasso de configuração da VM (máquina virtual) no nível do sistema operacional usando o Azure Policy. Habilitar os recursos de auditoria da Configuração de Computador do Gerenciamento Automatizado do Azure por meio da política ajuda as cargas de trabalho da equipe de aplicativos a consumir imediatamente os recursos de recursos com pouco esforço.", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "Operações" + "text": "Usar identidades gerenciadas em vez de entidades de serviço", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Média", - "text": "Use o Azure Update Manager como um mecanismo de aplicação de patch para VMs Windows e Linux no Azure.", - "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", - "waf": "Operações" + "text": "Integrar autenticação com AAD (usando a integração gerenciada)", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", + "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", + "service": "AKS", "severity": "Média", - "text": "Use o Gerenciador de Atualizações do Azure como um mecanismo de aplicação de patch para VMs do Windows e do Linux fora do Azure usando o Azure Arc.", - "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", - "waf": "Operações" + "text": "Limitar o acesso ao admin kubeconfig (get-credentials --admin)", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", + "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", + "service": "AKS", "severity": "Média", - "text": "Use o Observador de Rede para monitorar proativamente os fluxos de tráfego.", - "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", - "waf": "Operações" + "text": "Integrar autorização com AAD RBAC", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", + "service": "AKS", + "severity": "Alto", + "text": "Usar namespaces para restringir o privilégio RBAC no Kubernetes", + "waf": "Segurança" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", + "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", + "service": "AKS", "severity": "Média", - "text": "Use os Logs do Azure Monitor para obter insights e relatórios.", - "waf": "Operações" + "text": "Para o Gerenciamento de Acesso à Identidade de Pod, use a Identidade de Carga de Trabalho do Azure AD (visualização)", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", + "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", + "service": "AKS", "severity": "Média", - "text": "Use alertas do Azure Monitor para a geração de alertas operacionais.", - "waf": "Operações" + "text": "Para logins não interativos do AKS, use kubelogin (visualização)", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Média", - "text": "Ao usar o Acompanhamento de Alterações e Inventário por meio de Contas de Automação do Azure, verifique se você selecionou regiões com suporte para vincular seu workspace do Log Analytics e contas de automação.", - "waf": "Operações" + "text": "Desativar contas locais do AKS", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Baixo", - "text": "Ao usar o Backup do Azure, use os tipos de backup corretos (GRS, ZRS E LRS) para o backup, pois a configuração padrão é GRS.", - "waf": "Fiabilidade" + "text": "Configurar, se necessário, o acesso ao cluster just-in-time", + "waf": "Segurança" }, { - "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": "Média", - "text": "Use as políticas de convidado do Azure para implantar automaticamente as configurações de software por meio de extensões de VM e impor uma configuração de VM de linha de base compatível.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Baixo", + "text": "Configurar, se necessário, o acesso condicional do AAD para AKS", "waf": "Segurança" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Azure Landing Zone Review", - "description": "Use os recursos de configuração de convidado do Azure Policy para auditar e corrigir as configurações do computador (por exemplo, sistema operacional, aplicativo, ambiente) para garantir que os recursos estejam alinhados com as configurações esperadas e que o Gerenciamento de Atualizações possa impor o gerenciamento de patches para 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": "Média", - "text": "Monitore o descompasso de configuração de segurança da VM por meio do Azure Policy.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", + "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", + "service": "AKS", + "severity": "Baixo", + "text": "Se necessário para cargas de trabalho do Windows AKS, configure o gMSA ", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Média", - "text": "Use o Azure Site Recovery para cenários de recuperação de desastre de Máquinas Virtuais do Azure para o Azure. Isso permite replicar cargas de trabalho entre regiões.", - "waf": "Operações" + "text": "Para um controle mais fino, considere usar uma Identidade Kubelet gerenciada", + "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", + "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", + "service": "AKS", "severity": "Média", - "text": "Use recursos de backup nativos do Azure ou uma solução de backup de terceiros compatível com o Azure.", - "waf": "Operações" + "text": "Se estiver usando AGIC, não compartilhe um AppGW entre clusters", + "waf": "Fiabilidade" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Alto", - "text": "Adicione configurações de diagnóstico para salvar logs do WAF de serviços de entrega de aplicativos, como o Azure Front Door e o Gateway de Aplicativo do Azure. Revise regularmente os logs para verificar se há ataques e detecções de falsos positivos.", - "waf": "Operações" + "text": "Não use AKS HTTP Routing Add-On, use em vez disso a entrada NGINX gerenciada com o complemento de roteamento de aplicativo.", + "waf": "Fiabilidade" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", + "service": "AKS", "severity": "Média", - "text": "Envie logs do WAF de seus serviços de entrega de aplicativos, como o Azure Front Door e o Gateway de Aplicativo do Azure, para o Microsoft Sentinel. Detecte ataques e integre a telemetria do WAF ao seu ambiente geral do Azure.", - "waf": "Operações" + "text": "Para cargas de trabalho do Windows, use a Rede Acelerada", + "waf": "Desempenho" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Alto", - "text": "Use o Azure Key Vault para armazenar seus segredos e credenciais.", - "waf": "Segurança" + "text": "Use o ALB padrão (em oposição ao básico)", + "waf": "Fiabilidade" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Média", - "text": "Use diferentes Azure Key Vaults para diferentes aplicativos e regiões para evitar limites de escala de transação e restringir o acesso a segredos.", + "text": "Se estiver usando o CNI do Azure, considere usar sub-redes diferentes para NodePools", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", + "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", + "service": "AKS", "severity": "Média", - "text": "Provisione o Azure Key Vault com as políticas de exclusão reversível e limpeza habilitadas para permitir a proteção de retenção para objetos excluídos.", + "text": "Usar Pontos de Extremidade Privados (preferencial) ou Pontos de Extremidade de Serviço de Rede Virtual para acessar serviços de PaaS do cluster", "waf": "Segurança" }, { - "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": "Média", - "text": "Siga um modelo de privilégios mínimos limitando a autorização para excluir permanentemente chaves, segredos e certificados a funções personalizadas especializadas de ID do Microsoft Entra.", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Alto", + "text": "Escolha o melhor plug-in de rede CNI para seus requisitos (Azure CNI recomendado)", + "waf": "Fiabilidade" }, { - "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": "Média", - "text": "Automatize o processo de gerenciamento e renovação de certificados com autoridades de certificação públicas para facilitar a administração.", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", + "severity": "Alto", + "text": "Se estiver usando o Azure CNI, dimensione sua sub-rede de acordo considerando o número máximo de pods por nó", + "waf": "Desempenho" }, { - "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": "Média", - "text": "Estabeleça um processo automatizado para rotação de chaves e certificados.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", + "severity": "Alto", + "text": "Se estiver usando o Azure CNI, verifique o máximo de pods/nó (padrão 30)", + "waf": "Desempenho" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "description": "Para aplicativos internos, as organizações geralmente abrem toda a sub-rede AKS em seus firewalls. Isso abre o acesso de rede para os nós também e, potencialmente, para os pods também (se estiver usando o Azure CNI). Se os IPs do LoadBalancer estiverem em uma sub-rede diferente, somente este precisará estar disponível para os clientes do aplicativo. Outra razão é que, se os endereços IP na sub-rede AKS são um recurso escasso, consumir seus endereços IP para serviços reduzirá a escalabilidade máxima do cluster.", + "guid": "13c00567-4b1e-4945-a459-c373e7ed6162", + "link": "https://learn.microsoft.com/azure/aks/internal-lb", + "service": "AKS", + "severity": "Baixo", + "text": "Se estiver usando serviços LoadBalancer de IP privado, use uma sub-rede dedicada (não a sub-rede AKS)", "waf": "Segurança" }, { - "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": "Média", - "text": "Habilite o firewall e o ponto de extremidade de serviço de rede virtual ou o ponto de extremidade privado no cofre para controlar o acesso ao cofre de chaves.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", + "severity": "Alto", + "text": "Dimensione o intervalo de endereços IP do serviço de acordo (isso limitará a escalabilidade do cluster)", + "waf": "Fiabilidade" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", + "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", + "service": "AKS", + "severity": "Baixo", + "text": "Se necessário, adicione seu próprio plugin CNI", "waf": "Segurança" }, { - "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": "Média", - "text": "Use o workspace do Log Analytics do Azure Monitor central da plataforma para auditar o uso de chave, certificado e segredo em cada instância do Key Vault.", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Baixo", + "text": "Se necessário, configure o IP público por nó no AKS", + "waf": "Desempenho" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", + "link": "https://learn.microsoft.com/azure/aks/concepts-network", + "service": "AKS", "severity": "Média", - "text": "Delegue a instanciação e o acesso privilegiado do Key Vault e use o Azure Policy para impor uma configuração consistente e compatível.", - "waf": "Segurança" + "text": "Usar um controlador de entrada para expor aplicativos baseados na Web em vez de expô-los com serviços do tipo LoadBalancer", + "waf": "Fiabilidade" }, { - "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": "Média", - "text": "Use um Azure Key Vault por aplicativo por ambiente por região.", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", + "link": "https://learn.microsoft.com/azure/aks/nat-gateway", + "service": "AKS", + "severity": "Baixo", + "text": "Usar o Gateway NAT do Azure como outboundType para dimensionar o tráfego de saída", + "waf": "Fiabilidade" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Média", - "text": "Se você quiser trazer suas próprias chaves, isso pode não ser compatível com todos os serviços considerados. Implemente mitigação relevante para que as inconsistências não prejudiquem os resultados desejados. Escolha pares de regiões apropriados e regiões de recuperação de desastre que minimizem a latência.", - "waf": "Segurança" + "text": "Usar alocações dinâmicas de IPs para evitar o esgotamento de IP do CNI do Azure", + "waf": "Fiabilidade" }, { - "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": "Média", - "text": "Para a Zona de Destino Soberana, use o HSM gerenciado do Azure Key Vault para armazenar seus segredos e credenciais.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Alto", + "text": "Filtre o tráfego de saída com AzFW/NVA se seus requisitos de segurança exigirem", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Média", - "text": "Use os recursos de relatório de ID do Microsoft Entra para gerar relatórios de auditoria de controle de acesso.", + "text": "Se estiver usando um ponto de extremidade de API público, restrinja os endereços IP que podem acessá-lo", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Alto", - "text": "Habilite o Gerenciamento de Postura de Segurança de Nuvem do Defender para todas as assinaturas.", + "text": "Use clusters privados se seus requisitos exigirem", "waf": "Segurança" }, { - "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": "Alto", - "text": "Habilite um Plano de Proteção de Carga de Trabalho de Nuvem do Defender para Servidores em todas as assinaturas.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Média", + "text": "Para os nós AKS do Windows 2019 e 2022, as Diretivas de Rede Calico podem ser usadas ", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Alto", - "text": "Habilite os Planos de Proteção de Carga de Trabalho de Nuvem do Defender para Recursos do Azure em todas as assinaturas.", + "text": "Habilitar uma opção de Política de Rede do Kubernetes (Calico/Azure)", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", "severity": "Alto", - "text": "Habilite o Endpoint Protection em servidores IaaS.", + "text": "Usar diretivas de rede do Kubernetes para aumentar a segurança intra-cluster", "waf": "Segurança" }, { - "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": "Média", - "text": "Monitore o descompasso de aplicação de patch do sistema operacional base por meio dos Logs do Azure Monitor e do Defender para Nuvem.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", + "severity": "Alto", + "text": "Usar um WAF para cargas de trabalho da Web (UIs ou APIs)", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Média", - "text": "Conecte as configurações de recursos padrão a um workspace centralizado do Log Analytics do Azure Monitor.", + "text": "Usar DDoS Standard na Rede Virtual AKS", "waf": "Segurança" }, { - "checklist": "Azure Landing Zone Review", - "guid": "1761e147-f65e-4d09-bbc2-f464f23e2eba", - "link": "https://learn.microsoft.com/industry/sovereignty/transparency-logs", - "service": "Entra", - "severity": "Média", - "text": "Para Zona de Destino Soberana, habilite os logs de transparência no locatário da ID do Entra.", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Baixo", + "text": "Se necessário, adicione o proxy HTTP da empresa", "waf": "Segurança" }, { - "checklist": "Azure Landing Zone Review", - "guid": "d21a922d-5ca7-427a-82a6-35f7b21f1bfc", - "link": "https://learn.microsoft.com/azure/security/fundamentals/customer-lockbox-overview", - "service": "Entra", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", + "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", + "service": "AKS", "severity": "Média", - "text": "Para Zona de Destino Soberana, habilite o Sistema de Proteção de Dados do cliente no locatário da ID do Entra.", + "text": "Considere o uso de uma malha de serviço para gerenciamento avançado de comunicação de microsserviços", "waf": "Segurança" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", + "service": "AKS", "severity": "Alto", - "text": "Habilite a transferência segura para contas de armazenamento.", - "waf": "Segurança" + "text": "Configurar alertas nas métricas mais críticas (consulte Insights de contêiner para obter recomendações)", + "waf": "Operações" }, { - "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": "Alto", - "text": "Habilite a exclusão reversível do contêiner para a conta de armazenamento para recuperar um contêiner excluído e seu conteúdo.", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "337453a3-cc63-4963-9a65-22ac19e80696", + "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", + "service": "AKS", + "severity": "Baixo", + "text": "Verifique regularmente o Azure Advisor para obter recomendações sobre o seu cluster", + "waf": "Operações" }, { - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", + "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", + "service": "AKS", + "severity": "Baixo", + "text": "Habilitar a rotação automática do certificado AKS", + "waf": "Operações" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", + "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", + "service": "AKS", "severity": "Alto", - "text": "Use segredos do Key Vault para evitar codificar informações confidenciais, como credenciais (máquinas virtuais, senhas de usuário), certificados ou chaves.", + "text": "Tenha um processo regular para atualizar sua versão do kubernetes periodicamente (trimestralmente, por exemplo), ou use o recurso de atualização automática do AKS", "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", + "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", + "service": "AKS", "severity": "Alto", - "text": "Verifique se os controladores de domínio ADDS estão implantados na assinatura de identidade no Azure nativo", - "waf": "Segurança" + "text": "Use kured para atualizações de nó do Linux caso você não esteja usando a atualização de imagem de nó", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "75089c20-990d-4927-b105-885576f76fc2", - "service": "AVS", - "severity": "Média", - "text": "Verifique se os sites e serviços do ADDS estão configurados para manter as solicitações de autenticação de recursos baseados no Azure (incluindo a Solução VMware do Azure) locais para o Azure", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", + "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", + "service": "AKS", + "severity": "Alto", + "text": "Tenha um processo regular para atualizar as imagens do nó do cluster periodicamente (semanalmente, por exemplo)", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", - "service": "AVS", - "severity": "Alto", - "text": "Verifique se o vCenter está conectado ao ADDS para habilitar a autenticação com base em 'contas de usuário nomeadas'", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", + "service": "AKS", + "severity": "Baixo", + "text": "Considere gitops para implantar aplicativos ou configuração de cluster em vários clusters", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", - "service": "AVS", - "severity": "Média", - "text": "Verifique se a conexão do vCenter com o ADDS está usando um protocolo seguro (LDAPS)", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d7672c26-7602-4482-85a4-14527fbe855c", + "link": "https://learn.microsoft.com/azure/aks/command-invoke", + "service": "AKS", + "severity": "Baixo", + "text": "Considere o uso do comando AKS invoke em clusters privados", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", - "service": "AVS", - "severity": "Média", - "text": "A conta do CloudAdmin no vCenter IdP é usada apenas como uma conta de emergência (break-glass)", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", + "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", + "service": "AKS", + "severity": "Baixo", + "text": "Para eventos planejados, considere o uso do Dreno Automático de Nó", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", + "link": "https://learn.microsoft.com/azure/aks/faq", + "service": "AKS", "severity": "Alto", - "text": "Certifique-se de que o NSX-Manager esteja integrado a um provedor de identidade externo (LDAPS)", - "waf": "Segurança" + "text": "Desenvolver práticas próprias de governança para garantir que nenhuma alteração seja realizada pelos operadores no nó RG (também conhecido como 'infra RG')", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", - "service": "AVS", - "severity": "Média", - "text": "Foi criado um modelo RBAC para uso no VMware vSphere", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Baixo", + "text": "Use o nome personalizado do Node RG (também conhecido como 'Infra RG')", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", + "link": "https://kubernetes.io/docs/setup/release/notes/", + "service": "AKS", "severity": "Média", - "text": "As permissões RBAC devem ser concedidas em grupos ADDS e não em usuários específicos", - "waf": "Segurança" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", - "service": "AVS", - "severity": "Alto", - "text": "As permissões RBAC no recurso Solução VMware do Azure no Azure são 'bloqueadas' apenas para um conjunto limitado de proprietários", - "waf": "Segurança" + "text": "Não use APIs do Kubernetes preteridas em seus manifestos do YAML", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", - "service": "AVS", - "severity": "Alto", - "text": "Certifique-se de que todas as funções personalizadas tenham escopo com autorizações permitidas do CloudAdmin", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", + "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", + "service": "AKS", + "severity": "Baixo", + "text": "Manchar os nós do Windows", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", - "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", - "service": "AVS", - "severity": "Alto", - "text": "O modelo de conectividade correto da Solução VMware do Azure está selecionado para o caso de uso do cliente em mãos?", - "waf": "Desempenho" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Baixo", + "text": "Mantenha o nível de patch dos contêineres do Windows sincronizado com o nível do patch do host", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", - "service": "AVS", - "severity": "Alto", - "text": "Garantir que as conexões de Rota Expressa ou VPN do local para o Azure sejam monitoradas usando o 'monitor de conexão'", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "description": "Por meio de Configurações de Diagnóstico no nível do cluster", + "guid": "5b56ad48-408f-4e72-934c-476ba280dcf5", + "link": "https://learn.microsoft.com/azure/aks/monitor-aks", + "service": "AKS", + "severity": "Baixo", + "text": "Envie logs mestre (também conhecidos como logs de API) para o Azure Monitor ou sua solução de gerenciamento de logs preferida", "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", - "service": "AVS", - "severity": "Média", - "text": "Verifique se um monitor de conexão foi criado a partir de um recurso nativo do Azure para uma máquina virtual da Solução VMware do Azure para monitorar a conexão de Rota Expressa de back-end da Solução VMware do Azure", - "waf": "Operações" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", + "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", + "service": "AKS", + "severity": "Baixo", + "text": "Se necessário, use instantâneos do nodePool", + "waf": "Custar" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", - "service": "AVS", - "severity": "Média", - "text": "Verifique se um monitor de conexão é criado a partir de um recurso local para uma máquina virtual da Solução VMware do Azure para monitorar a conectividade de ponta 2", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", + "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", + "service": "AKS", + "severity": "Baixo", + "text": "Considere pools de nós spot para cargas de trabalho não sensíveis ao tempo", "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", - "service": "AVS", - "severity": "Alto", - "text": "Quando o servidor de rotas for usado, certifique-se de que não mais de 1000 rotas sejam propagadas do servidor de rotas para o gateway ExR para o local (limite ARS).", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Baixo", + "text": "Considere o nó virtual AKS para intermitência rápida", "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", + "service": "AKS", "severity": "Alto", - "text": "O Gerenciamento de Identidades Privilegiadas é implementado para funções que gerenciam o recurso da Solução VMware do Azure no Portal do Azure (não são permitidas permissões permanentes)", - "waf": "Segurança" + "text": "Monitore suas métricas de cluster com o Container Insights (ou outras ferramentas como o Prometheus)", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "Alto", - "text": "Os relatórios de auditoria do Gerenciamento de Identidades Privilegiadas devem ser implementados para as funções PIM da Solução VMware do Azure", - "waf": "Segurança" + "text": "Armazene e analise seus logs de cluster com o Container Insights (ou outras ferramentas como Telegraf/ElasticSearch)", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", + "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", + "service": "AKS", + "severity": "Média", + "text": "Monitorar a utilização da CPU e da memória dos nós", + "waf": "Operações" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "1a4835ac-9422-423e-ae80-b123081a5417", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "severity": "Média", - "text": "Se o uso do Gerenciamento de Identidades Privilegiadas estiver sendo usado, certifique-se de que uma conta válida habilitada para ID do Entra seja criada com um registro SMTP válido para notificações de substituição automática do Host da Solução VMware do Azure. (permissões permanentes necessárias)", - "waf": "Segurança" + "text": "Se estiver usando o Azure CNI, monitore a % de IPs de pod consumidos por nó", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", - "service": "AVS", - "severity": "Alto", - "text": "Limitar o uso da conta do CloudAdmin apenas ao acesso de emergência", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "description": "A E/S no disco do sistema operacional é um recurso crítico. Se o sistema operacional nos nós for limitado na E/S, isso pode levar a um comportamento imprevisível, geralmente terminando no nó sendo declarado NotReady", + "guid": "415833ea-3ad3-4c2d-b733-165c3acbe04b", + "link": "https://learn.microsoft.com/azure/virtual-machines/premium-storage-performance", + "service": "AKS", + "severity": "Média", + "text": "Monitorar a profundidade da fila de disco do sistema operacional nos nós", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "be209d39-fda4-4777-a424-d116785c2fa5", + "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", + "service": "AKS", "severity": "Média", - "text": "Criar funções RBAC personalizadas no vCenter para implementar um modelo de privilégios mínimos dentro do vCenter", - "waf": "Segurança" + "text": "Se não estiver usando filtragem de saída com AzFW/NVA, monitore as portas SNAT ALB alocadas padrão", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", + "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", + "service": "AKS", "severity": "Média", - "text": "É um processo definido para alternar regularmente as credenciais cloudadmin (vCenter) e admin (NSX)", - "waf": "Segurança" + "text": "Assine as notificações de integridade de recursos para seu cluster AKS", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", "severity": "Alto", - "text": "Usar um provedor de identidade centralizado a ser usado para cargas de trabalho (VMs) em execução na Solução VMware do Azure", - "waf": "Segurança" + "text": "Configurar solicitações e limites nas especificações do pod", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "769ef669-1a48-435a-a942-223ece80b123", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", "severity": "Média", - "text": "A filtragem de tráfego Leste-Oeste é implementada no NSX-T", - "waf": "Segurança" + "text": "Impor cotas de recursos para namespaces", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "081a5417-4158-433e-a3ad-3c2de733165c", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", + "service": "AKS", "severity": "Alto", - "text": "As cargas de trabalho na Solução VMware do Azure não são diretamente expostas à Internet. O tráfego é filtrado e inspecionado pelo Gateway de Aplicativo do Azure, pelo Firewall do Azure ou por soluções de terceiros", - "waf": "Segurança" + "text": "Verifique se sua assinatura tem cota suficiente para expandir seus nodepools", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", - "service": "AVS", - "severity": "Alto", - "text": "A auditoria e o registro em log são implementados para solicitações de entrada da Internet para cargas de trabalho baseadas na Solução VMware do Azure e na Solução VMware do Azure", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Média", + "text": "Usar o Autoscaler de Cluster", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", - "service": "AVS", - "severity": "Média", - "text": "O monitoramento de sessão é implementado para conexões de saída da Internet a partir da Solução VMware do Azure ou cargas de trabalho baseadas na Solução VMware do Azure para identificar atividades suspeitas/mal-intencionadas", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Baixo", + "text": "Personalizar a configuração do nó para pools de nós AKS", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "334fdf91-c234-4182-a652-75269440b4be", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", + "link": "https://learn.microsoft.com/azure/aks/concepts-scale", + "service": "AKS", "severity": "Média", - "text": "A proteção padrão contra DDoS está habilitada na sub-rede do Gateway ExR/VPN no Azure", - "waf": "Segurança" + "text": "Use o Autoscaler do Pod Horizontal quando necessário", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", - "service": "AVS", - "severity": "Média", - "text": "Usar uma estação de trabalho de acesso privilegiado (PAW) dedicada para gerenciar a Solução VMware do Azure, o vCenter, o gerenciador NSX e o gerenciador HCX", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "description": "Nós maiores trarão maior desempenho e recursos, como discos efêmeros e rede acelerada, mas aumentarão o raio de explosão e diminuirão a granularidade de dimensionamento", + "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", + "severity": "Alto", + "text": "Considere um tamanho de nó apropriado, não muito grande ou muito pequeno", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", - "service": "AVS", - "severity": "Média", - "text": "Habilitar a Detecção Avançada de Ameaças (Microsoft Defender for Cloud, também conhecido como ASC) para cargas de trabalho em execução na Solução VMware do Azure", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", + "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", + "service": "AKS", + "severity": "Baixo", + "text": "Se mais de 5000 nós forem necessários para escalabilidade, considere o uso de um cluster AKS adicional", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", - "service": "AVS", - "severity": "Média", - "text": "Usar o Azure ARC for Servers para controlar corretamente as cargas de trabalho em execução na Solução VMware do Azure usando tecnologias nativas do Azure (o Azure ARC for Azure VMware Solution ainda não está disponível)", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", + "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", + "service": "AKS", + "severity": "Baixo", + "text": "Considere assinar o EventGrid Events para automação AKS", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", + "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", + "service": "AKS", "severity": "Baixo", - "text": "Garanta que as cargas de trabalho na Solução VMware do Azure usem criptografia de dados suficiente durante o tempo de execução (como criptografia de disco convidado e SQL TDE). (a criptografia vSAN em repouso é padrão)", - "waf": "Segurança" + "text": "Para operações de longa duração em um cluster AKS, considere o encerramento do evento", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "a3592718-e6e2-4051-9267-6ae46691e883", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", + "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", + "service": "AKS", "severity": "Baixo", - "text": "Quando a criptografia no convidado é usada, armazene chaves de criptografia no cofre de chaves do Azure quando possível", - "waf": "Segurança" + "text": "Se necessário, considere usar hosts dedicados do Azure para nós AKS", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "5ac94222-3e13-4810-9230-81a941741583", - "service": "AVS", - "severity": "Média", - "text": "Considere usar o suporte estendido de atualização de segurança para cargas de trabalho em execução na Solução VMware do Azure (a Solução VMware do Azure é qualificada para ESU)", - "waf": "Segurança" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "Alto", + "text": "Usar discos efêmeros do sistema operacional", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", - "service": "AVS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", + "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", + "service": "AKS", "severity": "Alto", - "text": "Certifique-se de que o método de redundância de dados vSAN apropriado seja usado (especificação RAID)", - "waf": "Fiabilidade" + "text": "Para discos não efêmeros, use IOPS altos e discos maiores do sistema operacional para os nós ao executar muitos pods/nó, pois requer alto desempenho para executar vários pods e gerará logs enormes com limites de rotação de log AKS padrão", + "waf": "Desempenho" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", + "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", + "service": "AKS", + "severity": "Baixo", + "text": "Para a opção de armazenamento de hiperdesempenho, use Ultra Disks no AKS", + "waf": "Desempenho" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", + "service": "AKS", + "severity": "Média", + "text": "Evite manter o estado no cluster e armazene dados fora (AzStorage, AzSQL, Cosmos, etc)", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d88408f3-7273-44c8-96ba-280214590146", - "service": "AVS", - "severity": "Alto", - "text": "Certifique-se de que a política de falha na tolerância esteja em vigor para atender às suas necessidades de armazenamento vSAN", - "waf": "Fiabilidade" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", + "service": "AKS", + "severity": "Média", + "text": "Se estiver usando o AzFiles Standard, considere o AzFiles Premium e/ou ANF por motivos de desempenho", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", - "service": "AVS", - "severity": "Alto", - "text": "Certifique-se de ter solicitado cota suficiente, garantindo que você tenha considerado o crescimento e o requisito de recuperação de desastres", - "waf": "Fiabilidade" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", + "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", + "service": "AKS", + "severity": "Média", + "text": "Se estiver usando Discos e AZs do Azure, considere ter nodepools dentro de uma zona para disco LRS com VolumeBindingMode:WaitForFirstConsumer para provisionar armazenamento na zona direita ou use o disco ZRS para nodepools abrangendo várias zonas", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", - "service": "AVS", + "checklist": "Identity Review Checklist", + "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", + "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", + "service": "Entra", "severity": "Média", - "text": "Certifique-se de que as restrições de acesso ao ESXi sejam compreendidas, há limites de acesso que podem afetar as soluções de terceiros 3rd.", - "waf": "Operações" + "text": "Use o token revogável de longa duração, armazene seu token em cache e adquira o token silenciosamente usando a Microsoft Identity Library", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", - "service": "AVS", + "checklist": "Identity Review Checklist", + "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", + "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", + "service": "AAD B2C", "severity": "Média", - "text": "Certifique-se de ter uma política em torno da densidade e eficiência do host ESXi, tendo em mente o prazo de espera para solicitar novos nós", - "waf": "Operações" + "text": "Certifique-se de que os fluxos de usuário de entrada sejam armazenados em backup e resilientes. Certifique-se de que o código que você usa para entrar em seus usuários é de backup e recuperável. Interfaces resilientes com processos externos", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", - "service": "AVS", + "checklist": "Identity Review 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", "severity": "Média", - "text": "Garantir que um bom processo de gerenciamento de custos esteja em vigor para a Solução VMware do Azure - o Gerenciamento de Custos do Azure pode ser usado", - "waf": "Custar" + "text": "Os ativos de marca personalizados devem ser hospedados em uma CDN", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", - "service": "AVS", + "checklist": "Identity Review Checklist", + "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", + "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", + "service": "AAD B2C", "severity": "Baixo", - "text": "As instâncias reservadas do Azure são usadas para otimizar o custo de uso da Solução VMware do Azure", - "waf": "Custar" + "text": "Ter vários provedores de identidade (ou seja, fazer login com suas contas da Microsoft, Google, Facebook)", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6691e883-5ac9-4422-83e1-3810523081a9", - "service": "AVS", + "checklist": "Identity Review 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", "severity": "Média", - "text": "Considere o uso do Azure Private-Link ao usar outros Serviços Nativos do Azure", - "waf": "Segurança" + "text": "Siga as regras de VM para alta disponibilidade no nível da VM (discos premium, dois ou mais em uma região, em zonas de disponibilidade diferentes)", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", - "service": "AVS", - "severity": "Alto", - "text": "Verifique se todos os recursos necessários residem na(s) mesma(s) zona(s) de disponibilidade do Azure", - "waf": "Desempenho" + "checklist": "Identity Review 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", + "severity": "Média", + "text": "Não replique! A replicação pode criar problemas com a sincronização de diretórios", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", - "service": "AVS", + "checklist": "Identity Review 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", "severity": "Média", - "text": "Habilitar cargas de trabalho de VM convidada do Microsoft Defender for Cloud for Azure VMware Solution", - "waf": "Segurança" + "text": "Ter ativo-ativo para várias regiões", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", - "service": "AVS", + "checklist": "Identity Review Checklist", + "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", "severity": "Média", - "text": "Usar servidores habilitados para Arc do Azure para gerenciar suas cargas de trabalho de VM convidada da Solução VMware do Azure", - "waf": "Segurança" + "text": "Adicionar carimbos de serviço de Domínio do Azure AD a regiões e locais adicionais", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", - "service": "AVS", - "severity": "Alto", - "text": "Habilitar o log de diagnóstico e de métrica na solução VMware do Azure", - "waf": "Operações" + "checklist": "Identity Review Checklist", + "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", + "severity": "Média", + "text": "Usar conjuntos de réplicas para DR", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "d7941d4a-7b6f-458f-8714-2f8f8c059ad4", + "link": "https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies", + "service": "APIM", "severity": "Média", - "text": "Implantar os agentes do Log Analytics nas cargas de trabalho da VM convidada da Solução VMware do Azure", + "text": "Implementar uma política de tratamento de erros em nível global", "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "589d457a-927c-4397-9d11-02cad6aae11e", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Média", - "text": "Verifique se você tem uma política e uma solução de backup documentadas e implementadas para cargas de trabalho de VM da Solução VMware do Azure", + "text": "Certifique-se de que todas as políticas de APIs incluam um elemento .", "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ee29711b-d352-4caa-ab79-b198dab81932", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "a5c45b03-93b6-42fe-b16b-8fccb6a79902", + "link": "https://learn.microsoft.com/azure/api-management/policy-fragments", + "service": "APIM", "severity": "Média", - "text": "Usar o Microsoft Defender for Cloud para monitoramento de conformidade de cargas de trabalho em execução no Azure VMware Solution", - "waf": "Segurança" + "text": "Usar fragmentos de política para evitar a repetição das mesmas definições de políticas em várias APIs", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "c3818a95-6ff3-4474-88dc-e809b46dad6a", + "link": "https://learn.microsoft.com/azure/api-management/monetization-support", + "service": "APIM", "severity": "Média", - "text": "São as linhas de base de conformidade aplicáveis adicionadas ao Microsoft Defender for Cloud", - "waf": "Segurança" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", - "service": "AVS", - "severity": "Alto", - "text": "A residência de dados foi avaliada ao selecionar regiões do Azure a serem usadas para a implantação da Solução VMware do Azure", - "waf": "Segurança" + "text": "Se você estiver planejando monetizar suas APIs, consulte o artigo 'suporte à monetização' para obter as práticas recomendadas", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "a7d0840a-c8c4-4e83-adec-5ca578eb4049", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor#resource-logs", + "service": "APIM", "severity": "Alto", - "text": "As implicações do processamento de dados (modelo de prestador de serviços / consumidor de serviços) são claras e documentadas", - "waf": "Segurança" + "text": "Habilitar Configurações de Diagnóstico para exportar logs para o Azure Monitor", + "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "547c1747-dc56-4068-a714-435cd19dd244", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "8691fa38-45ed-4299-a247-fecd98d35deb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-app-insights", + "service": "APIM", "severity": "Média", - "text": "Considere o uso de CMK (Customer Managed Key) para vSAN somente se necessário por motivo(s) de conformidade.", - "waf": "Segurança" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", - "service": "AVS", - "severity": "Alto", - "text": "Criar painéis para habilitar os principais insights de monitoramento da Solução VMware do Azure", + "text": "Habilite o Application Insights para telemetria mais detalhada", "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "55fd27bb-76ac-4a91-bc37-049e885be6b7", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-use-azure-monitor", + "service": "APIM", "severity": "Alto", - "text": "Criar alertas de aviso para limites críticos para alertas automáticos sobre o desempenho da solução VMware do Azure (CPU >80%, memória média >80%, vSAN >70%)", + "text": "Configurar alertas sobre as métricas mais críticas", "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9659e396-80e7-4828-ac93-5657d02bff45", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Alto", - "text": "Certifique-se de que o alerta crítico seja criado para monitorar se o consumo de vSAN está abaixo de 75%, pois esse é um limite de suporte do VMware", - "waf": "Operações" + "text": "Certifique-se de que os certificados SSL personalizados sejam armazenados em um Cofre de Chaves do Azure para que possam ser acessados e atualizados com segurança", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Alto", - "text": "Verifique se os alertas estão configurados para alertas e notificações de Integridade do Serviço do Azure", - "waf": "Operações" + "text": "Proteger solicitações de entrada para APIs (plano de dados) com o Azure AD", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "5e5f64ba-c90e-480e-8888-398d96cf0bfb", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-aad", + "service": "APIM", "severity": "Média", - "text": "Configurar o log da Solução VMware do Azure para ser enviado a uma conta de Armazenamento do Azure ou ao Azure EventHub para processamento", - "waf": "Operações" + "text": "Usar o Microsoft Entra ID para autenticar usuários no Portal do Desenvolvedor", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", - "service": "AVS", - "severity": "Baixo", - "text": "Se for necessário um insight profundo no VMware vSphere: o vRealize Operations e/ou o vRealize Network Insights são usados na solução?", - "waf": "Operações" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "f8e574ce-280f-49c8-b2ef-68279b081cf3", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-create-groups", + "service": "APIM", + "severity": "Média", + "text": "Criar grupos apropriados para controlar a visibilidade dos produtos", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", - "service": "AVS", - "severity": "Alto", - "text": "Verifique se a política de armazenamento vSAN para VMs NÃO é a política de armazenamento padrão, pois essa política aplica provisionamento espesso", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "06862505-2d9a-4874-9491-2837b00a3475", + "link": "https://learn.microsoft.com/azure/api-management/backends", + "service": "APIM", + "severity": "Média", + "text": "Use o recurso Back-ends para eliminar configurações redundantes de back-end de API", "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "03b125d5-b69b-4739-b7fd-84b86da4933e", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-properties?tabs=azure-portal", + "service": "APIM", "severity": "Média", - "text": "Verifique se as bibliotecas de conteúdo do vSphere não são colocadas no vSAN, pois o vSAN é um recurso finito", + "text": "Usar Valores Nomeados para armazenar valores comuns que podem ser usados em políticas", "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "beae759e-4ddb-4326-bf26-47f87d3454b6", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-deploy-multi-region", + "service": "APIM", "severity": "Média", - "text": "Certifique-se de que os repositórios de dados da solução de backup sejam armazenados fora do armazenamento vSAN. No nativo do Azure ou em um armazenamento de dados com backup de pool de discos", - "waf": "Operações" + "text": "Para DR, aproveite o nível premium com implantações dimensionadas em duas ou mais regiões para um SLA de 99,99%", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "9c8d1664-dd9a-49d4-bd83-950af0af4044", + "link": "https://learn.microsoft.com/azure/api-management/high-availability", + "service": "APIM", "severity": "Média", - "text": "Garantir que as cargas de trabalho em execução na Solução VMware do Azure sejam gerenciadas de forma híbrida usando o Azure Arc for Servers (a Solução VMware do Arc for Azure está em visualização)", - "waf": "Operações" + "text": "Implante pelo menos uma unidade em duas ou mais zonas de disponibilidade para um SLA aumentado de 99,99%", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", - "service": "AVS", - "severity": "Média", - "text": "Garantir que as cargas de trabalho em execução na Solução VMware do Azure sejam monitoradas usando o Azure Log Analytics e o Azure Monitor", - "waf": "Operações" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "Alto", + "text": "Verifique se há uma rotina de backup automatizada", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "43e60b94-7bca-43a2-aadf-efb04d63a485", + "link": "https://learn.microsoft.com/azure/api-management/retry-policy", + "service": "APIM", "severity": "Média", - "text": "Incluir cargas de trabalho em execução na Solução VMware do Azure nas ferramentas de gerenciamento de atualizações existentes ou no Gerenciamento de Atualizações do Azure", - "waf": "Operações" + "text": "Use Políticas para adicionar uma URL de back-end de failover e cache para reduzir chamadas com falha.", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", - "service": "AVS", - "severity": "Média", - "text": "Usar a Política do Azure para integrar cargas de trabalho da Solução VMware do Azure nas soluções de Gerenciamento, Monitoramento e Segurança do Azure", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "8210699f-8d43-45c2-8f19-57e54134bd8f", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-log-event-hubs", + "service": "APIM", + "severity": "Baixo", + "text": "Se você precisar registrar em níveis de alto desempenho, considere a política de Hubs de Eventos", "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "121bfc39-fa7b-4096-b93b-ab56c1bc0bed", + "link": "https://learn.microsoft.com/azure/api-management/api-management-sample-flexible-throttling", + "service": "APIM", "severity": "Média", - "text": "Garantir que as cargas de trabalho em execução na Solução VMware do Azure sejam integradas ao Microsoft Defender for Cloud", - "waf": "Segurança" + "text": "Aplicar políticas de limitação para controlar o número de solicitações por segundo", + "training": "https://learn.microsoft.com/training/modules/protect-apis-on-api-management/", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "bb5f356b-3daf-47a2-a9ee-867a8100bbd5", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-autoscale", + "service": "APIM", "severity": "Média", - "text": "Certifique-se de que os backups não sejam armazenados no vSAN, pois o vSAN é um recurso finito", - "waf": "Fiabilidade" + "text": "Configurar o dimensionamento automático para dimensionar o número de instâncias quando a carga aumenta", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "84b94abb-59b6-4b9d-8587-3413669468e8", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-provision-self-hosted-gateway", + "service": "APIM", "severity": "Média", - "text": "Todas as soluções de DR foram consideradas e uma solução que é melhor para o seu negócio foi decidida? [SRM/JetStream/Zerto/Veeam/...]", - "waf": "Fiabilidade" + "text": "Implante gateways auto-hospedados onde o Azure não tem uma região próxima às APIs de back-end.", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "1fe8db45-a017-4888-8c4d-4422583cfae0", + "link": "https://learn.microsoft.com/azure/api-management/upgrade-and-scale#upgrade-and-scale", + "service": "APIM", "severity": "Média", - "text": "Usar o Azure Site Recovery quando a tecnologia de Recuperação de Desastres for IaaS nativa do Azure", + "text": "Use a camada premium para cargas de trabalho de produção.", "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", - "service": "AVS", - "severity": "Alto", - "text": "Use planos de recuperação automatizados com qualquer uma das soluções de desastre, evite ao máximo tarefas manuais", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "Média", + "text": "No modelo de várias regiões, use Políticas para rotear as solicitações para back-ends regionais com base na disponibilidade ou latência.", "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "8255461e-2aee-4345-9aec-8339248b262d", - "service": "AVS", - "severity": "Média", - "text": "Usar o par de regiões geopolíticas como o ambiente secundário de recuperação de desastres", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "Alto", + "text": "Esteja atento aos limites da APIM", "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "10f58602-f0f9-4d77-972a-956f6e0f2600", + "link": "https://learn.microsoft.com/en-us/azure/api-management/self-hosted-gateway-overview", + "service": "APIM", "severity": "Alto", - "text": "Use 2 espaços de endereço diferentes entre as regiões, por exemplo: 10.0.0.0/16 e 192.168.0.0/16 para as diferentes regiões", + "text": "Certifique-se de que as implantações de gateway auto-hospedado sejam resilientes.", "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "7519e385-a88b-4d34-966b-6269d686e890", + "link": "https://learn.microsoft.com/azure/api-management/front-door-api-management", + "service": "APIM", "severity": "Média", - "text": "O ExpressRoute Global Reach será usado para conectividade entre as Nuvens Privadas da Solução VMware do Azure primária e secundária ou o roteamento é feito por meio de dispositivos virtuais de rede?", - "waf": "Fiabilidade" + "text": "Usar o Azure Front Door na frente do APIM para implantação em várias regiões", + "waf": "Desempenho" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Média", - "text": "Todas as soluções de backup foram consideradas e uma solução que é melhor para o seu negócio foi decidida? [ MABS/CommVault/Metallic.io/Veeam/ . ]", - "waf": "Fiabilidade" + "text": "Implantar o serviço em uma rede virtual (VNet)", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Média", - "text": "Implante sua solução de backup na mesma região que sua nuvem privada da Solução VMware do Azure", - "waf": "Fiabilidade" + "text": "Implante NSG (grupos de segurança de rede) em suas sub-redes para restringir ou monitorar o tráfego de/para APIM.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Média", - "text": "Implante sua solução de backup fora do vSan, em componentes nativos do Azure", - "waf": "Fiabilidade" + "text": "Implante pontos de extremidade privados para filtrar o tráfego de entrada quando o APIM não for implantado em uma rede virtual.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", - "service": "AVS", - "severity": "Baixo", - "text": "Existe um processo para solicitar uma restauração dos componentes VMware gerenciados pela Plataforma Azure?", - "waf": "Fiabilidade" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "Alto", + "text": "Desabilitar o acesso à rede pública", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", - "service": "AVS", - "severity": "Baixo", - "text": "Para implantações manuais, todas as configurações e implantações devem ser documentadas", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "0674d750-0c6f-4ac0-8717-ceec04d0bdbd", + "link": "https://learn.microsoft.com/azure/api-management/automation-manage-api-management", + "service": "APIM", + "severity": "Média", + "text": "Simplifique o gerenciamento com scripts de automação do PowerShell", "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", - "service": "AVS", - "severity": "Baixo", - "text": "Para implantações manuais, considere implementar bloqueios de recursos para evitar ações acidentais em sua nuvem privada de solução VMware do Azure", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "Média", + "text": "Configure APIM via Infrastructure-as-code. Analise as práticas recomendadas de DevOps do Cloud Adaption Framework APIM Landing Zone Accelerator", "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", - "service": "AVS", - "severity": "Baixo", - "text": "Para implantações automatizadas, implante uma nuvem privada mínima e dimensione conforme necessário", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "6c3a27c0-197f-426c-9ffa-86fed51d9ab6", + "link": "https://learn.microsoft.com/azure/api-management/visual-studio-code-tutorial", + "service": "APIM", + "severity": "Média", + "text": "Promover o uso da extensão API do Visual Studio Code para um desenvolvimento de API mais rápido", "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", - "service": "AVS", - "severity": "Baixo", - "text": "Para implantações automatizadas, solicite ou reserve cota antes de iniciar a implantação", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "354f1c03-8112-4965-85ad-c0074bddf231", + "link": "https://learn.microsoft.com/azure/api-management/devops-api-development-templates", + "service": "APIM", + "severity": "Média", + "text": "Implemente DevOps e CI/CD em seu fluxo de trabalho", "waf": "Operações" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", - "service": "AVS", - "severity": "Baixo", - "text": "Para implantação automatizada, verifique se os bloqueios de recursos relevantes são criados por meio da automação ou da Política do Azure para uma governança adequada", - "waf": "Operações" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "b6439493-426a-45f3-9697-cf65baee208d", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates-for-clients", + "service": "APIM", + "severity": "Média", + "text": "APIs seguras usando autenticação de certificado de cliente", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", - "service": "AVS", - "severity": "Baixo", - "text": "Implemente nomes humanos compreensíveis para chaves de autorização ExR para permitir a fácil identificação da finalidade/uso das chaves", - "waf": "Operações" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "2a67d143-1033-4c0a-8732-680896478f08", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-mutual-certificates", + "service": "APIM", + "severity": "Média", + "text": "Serviços de back-end seguros usando autenticação de certificado de cliente", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "255461e2-aee3-4553-afc8-339248b262d6", - "service": "AVS", - "severity": "Baixo", - "text": "Usar o Cofre de chaves para armazenar segredos e chaves de autorização quando Princípios de Serviço separados são usados para implantar a Solução VMware do Azure e a Rota Expressa", - "waf": "Operações" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "074435f5-4a46-41ac-b521-d6114cb5d845", + "link": "https://learn.microsoft.com/azure/api-management/mitigate-owasp-api-threats", + "service": "APIM", + "severity": "Média", + "text": "Consulte o artigo \"Recomendações para mitigar as 10 principais ameaças da segurança da API OWASP\" e verifique o que é aplicável às suas APIs", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", - "service": "AVS", - "severity": "Baixo", - "text": "Defina dependências de recursos para serializar ações no IaC quando muitos recursos precisarem ser implantados no/na Solução VMware do Azure, pois a Solução VMware do Azure oferece suporte apenas a um número limitado de operações paralelas.", - "waf": "Operações" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "5507c4b8-a7f8-41d6-9661-418c987100c9", + "link": "https://learn.microsoft.com/azure/api-management/authorizations-overview", + "service": "APIM", + "severity": "Média", + "text": "Usar o recurso Autorizações para simplificar o gerenciamento do token OAuth 2.0 para suas APIs de back-end", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", - "service": "AVS", - "severity": "Baixo", - "text": "Ao executar a configuração automatizada de segmentos NSX-T com um único gateway de Camada 1, use as APIs do Portal do Azure em vez das APIs do NSX-Manager", - "waf": "Operações" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "guid": "2deee033-b906-4bc2-9f26-c8d3699fe091", + "link": "https://learn.microsoft.com/azure/api-management/api-management-howto-manage-protocols-ciphers", + "service": "APIM", + "severity": "Alto", + "text": "Use a versão mais recente do TLS ao criptografar informações em trânsito. Desative protocolos e cifras desatualizados e desnecessários quando possível.", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", - "service": "AVS", - "severity": "Média", - "text": "Ao pretender usar a expansão automatizada, certifique-se de aplicar cota suficiente da Solução VMware do Azure para as assinaturas que executam a Solução VMware do Azure", - "waf": "Desempenho" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "Alto", + "text": "Certifique-se de que os segredos (valores nomeados) sejam armazenados em um Cofre de Chaves do Azure para que possam ser acessados e atualizados com segurança", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", - "service": "AVS", + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", "severity": "Média", - "text": "Ao pretender usar o scale-in automatizado, certifique-se de levar em consideração os requisitos da política de armazenamento antes de executar essa ação", - "waf": "Desempenho" + "text": "Use identidades gerenciadas para autenticar em outros recursos do Azure sempre que possível", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", - "service": "AVS", - "severity": "Média", - "text": "As operações de dimensionamento sempre precisam ser serializadas em um único SDDC, pois apenas uma operação de escala pode ser executada por vez (mesmo quando vários clusters são usados)", - "waf": "Desempenho" + "arm-service": "Microsoft.ApiManagement/service", + "checklist": "Azure API Management Review", + "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", + "severity": "Alto", + "text": "Usar o WAF (Web Application Firewall) implantando o Application Gateway na frente do APIM", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", - "service": "AVS", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", + "severity": "Alto", + "text": "Permitir que 2 réplicas tenham 99,9% de disponibilidade para operações de leitura", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", "severity": "Média", - "text": "Considerar e validar operações de dimensionamento em soluções de terceiros 3rd usadas na arquitetura (suportadas ou não)", - "waf": "Desempenho" + "text": "Permitir que 3 réplicas tenham 99,9% de disponibilidade para operações de leitura/gravação", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", - "service": "AVS", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", + "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", + "service": "Cognitive Search", + "severity": "Alto", + "text": "Aproveite as zonas de disponibilidade habilitando réplicas de leitura e/ou gravação", + "waf": "Fiabilidade" + }, + { + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review 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", "severity": "Média", - "text": "Definir e impor limites máximos de entrada/saída de escala para seu ambiente nas automações", - "waf": "Desempenho" + "text": "Para redução regional, crie manualmente serviços em 2 ou mais regiões para a Pesquisa, pois não fornece um método automatizado de replicação de índices de pesquisa entre regiões geográficas", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", - "service": "AVS", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", + "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", + "service": "Cognitive Search", "severity": "Média", - "text": "Implementar regras de monitoramento para monitorar operações de dimensionamento automatizadas e monitorar o sucesso e a falha para habilitar respostas apropriadas (automatizadas)", - "waf": "Operações" + "text": "Para sincronizar dados em vários serviços: Use indexadores para atualizar conteúdo em vários serviços ou Use APIs REST para enviar atualizações de conteúdo em vários serviços", + "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c5972cd4-cd21-4b07-9036-f5e6b4bfd3d5", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", - "severity": "Alto", - "text": "Ao usar o MON, esteja ciente dos limites de VMs configuradas simulataneamente (MON Limit for HCX [400 - standard, 1000 - Larger appliance])", - "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review 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", + "severity": "Média", + "text": "Usar o Gerenciador de Tráfego do Azure para coordenar solicitações", "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "be1f38cf-03a8-422b-b463-cbbbc8ac299e", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", + "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", + "service": "Cognitive Search", "severity": "Alto", - "text": "Ao usar o MON, você não pode habilitar o MON em mais de 100 extensões de rede", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "text": "Backup e restauração de um índice de pesquisa cognitiva do Azure. Use este código de exemplo para fazer backup da definição de índice e instantâneo em uma série de arquivos Json", "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", - "service": "AVS", - "severity": "Média", - "text": "Se estiver usando uma conexão VPN para migrações, ajuste o tamanho da MTU de acordo.", - "waf": "Desempenho" + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "O Hub de Eventos do Azure fornece criptografia de dados em repouso. Se você usar sua própria chave, os dados ainda serão criptografados usando a chave gerenciada pela Microsoft, mas, além disso, a chave gerenciada pela Microsoft será criptografada usando a chave gerenciada pelo cliente. ", + "guid": "7aaf12e7-b94e-4f6e-847d-2d92981b1cd6", + "link": "https://learn.microsoft.com/azure/event-hubs/configure-customer-managed-key", + "service": "Event Hubs", + "severity": "Baixo", + "text": "Usar a opção de chave gerenciada pelo cliente na criptografia de dados em repouso quando necessário", + "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e614658d-d457-4e92-9139-b821102cad6e", - "service": "AVS", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Os namespaces dos Hubs de Eventos do Azure permitem que os clientes enviem e recebam dados com TLS 1.0 e superior. Para impor medidas de segurança mais rígidas, você pode configurar o namespace dos Hubs de Eventos para exigir que os clientes enviem e recebam dados com uma versão mais recente do TLS. Se um namespace de Hubs de Eventos exigir uma versão mínima do TLS, todas as solicitações feitas com uma versão mais antiga falharão. ", + "guid": "d2f54b29-769e-43a6-a0e7-828ac936657e", + "link": "https://learn.microsoft.com/azure/event-hubs/transport-layer-security-configure-minimum-version", + "service": "Event Hubs", "severity": "Média", - "text": "Para regiões de baixa conectividade conectadas ao Azure (500Mbps ou menos), considere implantar o dispositivo de otimização de WAN HCX", - "waf": "Desempenho" + "text": "Impor uma versão mínima necessária do TLS (Transport Layer Security) para solicitações ", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", - "service": "AVS", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Quando você cria um namespace de Hubs de Eventos, uma regra de política chamada RootManageSharedAccessKey é criada automaticamente para o namespace. Essa política tem permissões de gerenciamento para todo o namespace. É recomendável que você trate essa regra como uma conta raiz administrativa e não a use em seu aplicativo. Recomenda-se o uso do AAD como um provedor de autenticação com RBAC. ", + "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", "severity": "Média", - "text": "Certifique-se de que as migrações sejam iniciadas a partir do dispositivo local e NÃO do dispositivo em nuvem (NÃO execute uma migração reversa)", - "waf": "Fiabilidade" + "text": "Evite usar conta root quando não for necessário", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", - "service": "AVS", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "As identidades gerenciadas para recursos do Azure podem autorizar o acesso a recursos dos Hubs de Eventos usando credenciais do Azure AD de aplicativos em execução em VMs (Máquinas Virtuais) do Azure, aplicativos de Função, Conjuntos de Dimensionamento de Máquina Virtual e outros serviços. Usando identidades gerenciadas para recursos do Azure junto com a autenticação do Azure AD, você pode evitar o armazenamento de credenciais com seus aplicativos executados na nuvem. ", + "guid": "3a365a5c-7acb-4e48-abd5-4cd79f2e8776", + "link": "https://learn.microsoft.com/azure/event-hubs/authenticate-managed-identity?tabs=latest", + "service": "Event Hubs", "severity": "Média", - "text": "Quando o Azure Netapp Files for usado para estender o armazenamento para a Solução VMware do Azure, considere usá-lo como um armazenamento de dados VMware em vez de anexá-lo diretamente a uma VM.", - "waf": "Fiabilidade" + "text": "Quando possível, seu aplicativo deve estar usando uma identidade gerenciada para autenticar no Hub de Eventos do Azure. Caso contrário, considere ter a credencial de armazenamento (SAS, credencial da entidade de serviço) no Cofre de Chaves do Azure ou em um serviço equivalente", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bff4564b-0d93-44a3-98b2-63e7dd60513a", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", - "service": "AVS", - "severity": "Média", - "text": "Verifique se um ExpressRoute Gateway dedicado está sendo usado para soluções de armazenamento de dados externos", - "waf": "Fiabilidade" + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Ao criar permissões, forneça controle refinado sobre o acesso de um cliente ao Hub de Eventos do Azure. As permissões no Hub de Eventos do Azure podem e devem ter o escopo definido para o nível de recurso individual, por exemplo, grupo de consumidores, entidade de hub de eventos, namespaces de hub de eventos, 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", + "severity": "Alto", + "text": "Usar RBAC do plano de dados de privilégios mínimos", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Os logs de recursos do Hub de Eventos do Azure incluem logs operacionais, logs de rede virtual e logs de Kafka. Os logs de auditoria de tempo de execução capturam informações de diagnóstico agregadas para todas as operações de acesso ao plano de dados (como eventos de envio ou recebimento) nos Hubs de Eventos.", + "guid": "b38b875b-a1cf-4104-a900-3a4d3ce474db", + "link": "https://learn.microsoft.com/azure/event-hubs/monitor-event-hubs-reference", + "service": "Event Hubs", "severity": "Média", - "text": "Verifique se o FastPath está habilitado no ExpressRoute Gateway que está sendo usado para soluções de armazenamento de dados externos", - "waf": "Fiabilidade" + "text": "Habilite o registro em log para investigação de segurança. Use o Azure Monitor para capturar métricas e logs como logs de recursos, logs de auditoria de tempo de execução e logs Kafka", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "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", - "severity": "Alto", - "text": "Se estiver usando cluster estendido, verifique se a solução de recuperação de desastres selecionada é suportada pelo fornecedor", - "waf": "Fiabilidade" + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Por padrão, o Hub de Eventos do Azure tem um endereço IP público e pode ser acessado pela Internet. Os pontos de extremidade privados permitem que o tráfego entre sua rede virtual e o Hub de Eventos do Azure percorra a rede de backbone da Microsoft. Além disso, você deve desabilitar os pontos de extremidade públicos se eles não forem usados. ", + "guid": "5abca2a4-eda1-4dae-8cc9-5d48c6b791dc", + "link": "https://learn.microsoft.com/azure/event-hubs/private-link-service", + "service": "Event Hubs", + "severity": "Média", + "text": "Considere o uso de pontos de extremidade privados para acessar o Hub de Eventos do Azure e desabilitar o acesso à rede pública quando aplicável.", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "AVS", - "severity": "Alto", - "text": "Se estiver usando cluster estendido, verifique se o SLA fornecido atenderá aos seus requisitos", - "waf": "Fiabilidade" + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Com o firewall IP, você pode restringir ainda mais o ponto de extremidade público a apenas um conjunto de endereços IPv4 ou intervalos de endereços IPv4 na notação CIDR (Roteamento entre Domínios Sem Classe). ", + "guid": "a0e6c465-89e5-458b-a37d-3974d1112dbd", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-ip-filtering", + "service": "Event Hubs", + "severity": "Média", + "text": "Considere permitir apenas o acesso ao namespace do Hub de Eventos do Azure a partir de endereços IP ou intervalos específicos", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "Segurança" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", - "service": "AVS", - "severity": "Alto", - "text": "Se estiver usando cluster estendido, verifique se ambos os circuitos da Rota Expressa estão conectados ao hub de conectividade.", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "31d41e36-11c8-417b-8afb-c410d4391898", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-AEH_v1.docx", + "service": "Event Hubs", + "severity": "Média", + "text": "Aproveite o Manual de Resilência do FTA", "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", - "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", - "service": "AVS", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": " Isso será ativado automaticamente para um novo namespace de EH criado a partir do portal com SKUs Premium, Dedicado ou Standard em uma região habilitada para região. Os metadados do EH e os próprios dados do evento são replicados entre zonas", + "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", "severity": "Alto", - "text": "Se estiver usando cluster estendido, verifique se ambos os circuitos da Rota Expressa têm o GlobalReach habilitado.", + "text": "Aproveite as zonas de disponibilidade, se aplicável regionalmente", "waf": "Fiabilidade" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", - "service": "AVS", - "severity": "Alto", - "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.", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "20b56c56-ad58-4519-8f82-735c586bb281", + "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", + "service": "Event Hubs", + "severity": "Média", + "text": "Use os SKUs Premium ou Dedicado para desempenho previsível", "waf": "Fiabilidade" }, { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency checklist", - "guid": "65285269-440b-44be-9d3e-0844276d4bdc", - "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-zone-redundancy", - "service": "Redis", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "O recurso interno de recuperação de desastres geográficos, quando habilitado, garante que toda a configuração de um namespace (Hubs de Eventos, Grupos de Consumidores e configurações) seja replicada continuamente de um namespace primário para um namespace secundário e permite uma movimentação de failover única do primário para o secundário a qualquer momento. O recurso Ativo/Passivo foi projetado para facilitar a recuperação e o abandono de uma região do Azure com falha sem precisar alterar as configurações do aplicativo", + "guid": "dc15a1c0-75ee-49f1-90ac-ccd579376bcd", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-geo-dr?tabs=portal", + "service": "Event Hubs", "severity": "Alto", - "text": "Habilite a redundância de zona para o Cache do Azure para Redis. O Cache do Azure para Redis dá suporte a configurações redundantes de zona nas camadas Premium e Enterprise. Um cache redundante de zona pode colocar seus nós em diferentes zonas de disponibilidade do Azure na mesma região. Ele elimina a interrupção do data center ou AZ como um único ponto de falha e aumenta a disponibilidade geral do cache.", - "waf": "Fiabilidade" - }, - { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency 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", - "severity": "Média", - "text": "Configure a persistência de dados para uma instância do Cache do Azure para Redis. Como os dados do cache são armazenados na memória, uma falha rara e não planejada de vários nós pode fazer com que todos os dados sejam descartados. Para evitar a perda completa de dados, a persistência do Redis permite que você tire instantâneos periódicos de dados na memória e os armazene em sua conta de armazenamento.", + "text": "Planejar a recuperação de desastres geográficos usando a configuração passiva ativa", "waf": "Fiabilidade" }, { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency 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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Deve ser usado para configurações de DR em que uma interrupção ou perda de dados de eventos na região derrubada não pode ser tolerada. Para esses casos, siga as diretrizes de replicação e não use o recurso interno de recuperação de desastres geográficos (ativo/passivo). Com Ativo/Ativo, mantenha vários Hubs de Eventos em diferentes regiões e namespaces, e os eventos serão replicados entre os hubs", + "guid": "6e31b67d-67ba-4591-89c0-9e805d597c7e", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-federation-overview", + "service": "Event Hubs", "severity": "Média", - "text": "Use a conta de armazenamento com redundância geográfica para persistir o Cache do Azure para dados Redis ou zonalmente redundante onde a redundância geográfica não está disponível", + "text": "Para aplicativos críticos para os negócios, use a configuração ativa", "waf": "Fiabilidade" }, { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency checklist", - "guid": "a8c26c9b-32ab-45bd-bc69-98a135e33789", - "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-geo-replication", - "service": "Redis", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", + "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", + "service": "Event Hubs", "severity": "Média", - "text": "Configure a replicação geográfica passiva para instâncias do Cache Premium do Azure para Redis. A replicação geográfica é um mecanismo para vincular duas ou mais instâncias do Cache do Azure para Redis, normalmente abrangendo duas regiões do Azure. A replicação geográfica foi projetada principalmente para recuperação de desastres entre regiões. Duas instâncias de cache de camada Premium são conectadas por meio de replicação geográfica de uma forma que fornece leituras e gravações no cache primário e que os dados são replicados para o cache secundário.", + "text": "Projetar Hubs de Eventos Resilientes", "waf": "Fiabilidade" } ], "metadata": { "name": "WAF checklist", - "timestamp": "August 05, 2024" + "timestamp": "August 08, 2024" }, "severities": [ { @@ -9018,7 +9018,7 @@ }, { "description": "Recomendação compreendida, mas não necessária pelos requisitos atuais", - "name": "Não é necessário" + "name": "Risco aceito" }, { "description": "Não aplicável ao projeto atual", diff --git a/checklists/waf_checklist.zh-Hant.json b/checklists/waf_checklist.zh-Hant.json index 7c2c24e92..692a96cf1 100644 --- a/checklists/waf_checklist.zh-Hant.json +++ b/checklists/waf_checklist.zh-Hant.json @@ -1,1231 +1,1023 @@ { "items": [ { - "checklist": "Identity Review Checklist", - "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", - "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", - "service": "Entra", - "severity": "中等", - "text": "使用長期可撤銷令牌,緩存令牌並使用 Microsoft 標識庫以靜默方式獲取令牌", - "waf": "可靠性" - }, - { - "checklist": "Identity Review Checklist", - "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", - "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", - "service": "AAD B2C", - "severity": "中等", - "text": "請確保登錄使用者流已備份並具有復原能力。請確保用於登錄使用者的代碼已備份且可恢復。與外部進程的彈性介面", - "waf": "可靠性" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", + "service": "AVS", + "severity": "高", + "text": "確保在本機 Azure 的標識訂閱中部署了 ADDS 域控制器", + "waf": "安全" }, { - "checklist": "Identity Review 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "75089c20-990d-4927-b105-885576f76fc2", + "service": "AVS", "severity": "中等", - "text": "自訂品牌資產應託管在CDN上", - "waf": "性能" + "text": "確保將 ADDS 網站和服務配置為將來自基於 Azure 的資源(包括 Azure VMware 解決方案)的身份驗證請求保留到 Azure 本地", + "waf": "安全" }, { - "checklist": "Identity Review Checklist", - "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", - "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", - "service": "AAD B2C", - "severity": "低", - "text": "擁有多個標識提供者(即使用您的 Microsoft、Google、Facebook 帳戶登錄)", - "waf": "可靠性" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", + "service": "AVS", + "severity": "高", + "text": "確保 vCenter 已連接到 ADDS,以啟用基於「指定用戶帳戶」的身份驗證", + "waf": "安全" }, { - "checklist": "Identity Review 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", + "service": "AVS", "severity": "中等", - "text": "遵循 VM 規則,實現 VM 級別的高可用性(高級磁碟,一個區域中的兩個或更多磁碟,位於不同的可用性區域)", - "waf": "可靠性" + "text": "確保從 vCenter 到 ADDS 的連接使用安全協定 (LDAPS)", + "waf": "安全" }, { - "checklist": "Identity Review 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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", + "service": "AVS", "severity": "中等", - "text": "不要複製!複製可能會產生目錄同步問題", - "waf": "可靠性" + "text": "vCenter IdP 中的 CloudAdmin 帳戶僅用作緊急帳戶 (break-glass)", + "waf": "安全" }, { - "checklist": "Identity Review 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", - "severity": "中等", - "text": "對多區域具有主動-主動", - "waf": "可靠性" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", + "service": "AVS", + "severity": "高", + "text": "確保 NSX-Manager 與外部身份提供程式 (LDAPS) 集成", + "waf": "安全" }, { - "checklist": "Identity Review Checklist", - "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", + "service": "AVS", "severity": "中等", - "text": "將 Azure AD 域服務標記添加到其他區域和位置", - "waf": "可靠性" + "text": "是否已創建 RBAC 模型以在 VMware vSphere 中使用", + "waf": "安全" }, { - "checklist": "Identity Review Checklist", - "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", - "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", - "service": "Entra", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", + "service": "AVS", "severity": "中等", - "text": "將副本集用於DR", - "waf": "可靠性" + "text": "RBAC 許可權應授予 ADDS 組,而不是特定使用者", + "waf": "安全" }, { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency checklist", - "guid": "65285269-440b-44be-9d3e-0844276d4bdc", - "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-zone-redundancy", - "service": "Redis", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", + "service": "AVS", "severity": "高", - "text": "為 Azure Cache for Redis 啟用區域冗餘。Azure Cache for Redis 支持高級層和企業層中的區域冗餘配置。區域冗餘緩存可以將其節點放置在同一區域的不同 Azure 可用性區域中。它消除了作為單點故障的數據中心或可用區中斷,並提高了緩存的整體可用性。", - "waf": "可靠性" - }, - { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency 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", - "severity": "中等", - "text": "為 Azure Cache for Redis 實例配置數據持久性。由於緩存數據存儲在記憶體中,因此多個節點的罕見和計劃外故障可能會導致所有數據被丟棄。為了避免完全丟失數據,Redis 持久性允許您定期拍攝記憶體中數據的快照,並將其存儲到存儲帳戶中。", - "waf": "可靠性" + "text": "Azure 中 Azure VMware 解決方案資源的 RBAC 許可權僅「鎖定」為一組有限的擁有者", + "waf": "安全" }, { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency 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", - "severity": "中等", - "text": "使用異地冗餘存儲帳戶保留 Azure Cache for Redis 數據,或在異地冗餘不可用的情況下使用區域冗餘", - "waf": "可靠性" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", + "service": "AVS", + "severity": "高", + "text": "確保所有自定義角色的範圍都具有 CloudAdmin 允許的授權", + "waf": "安全" }, { - "arm-service": "microsoft.cache/redis", - "checklist": "Redis Resiliency checklist", - "guid": "a8c26c9b-32ab-45bd-bc69-98a135e33789", - "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-geo-replication", - "service": "Redis", - "severity": "中等", - "text": "為高級 Azure Cache for Redis 實例配置被動異地複製。異地複製是一種用於連結兩個或多個 Azure Cache for Redis 實例的機制,通常跨越兩個 Azure 區域。異地複製主要用於跨區域災難恢復。兩個高級層緩存實例通過異地複製進行連接,從而提供對主緩存的讀取和寫入,並將數據複製到輔助緩存。", - "waf": "可靠性" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", + "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", + "service": "AVS", + "severity": "高", + "text": "是否為手頭的客戶用例選擇了正確的 Azure VMware 解決方案連接模型", + "waf": "性能" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", - "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", - "service": "AKS", - "severity": "低", - "text": "如果 AKS Windows 工作負載需要,可以使用 HostProcess 容器", - "waf": "可靠性" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", + "service": "AVS", + "severity": "高", + "text": "確保使用「連接監視器」監視從本地到 Azure 的 ExpressRoute 或 VPN 連接", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", - "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", - "service": "AKS", - "severity": "低", - "text": "如果運行事件驅動的工作負載,請使用KEDA", - "waf": "性能" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", + "service": "AVS", + "severity": "中等", + "text": "確保創建從 Azure 本機資源到 Azure VMware 解決方案虛擬機的連接監視器,以監視 Azure VMware 解決方案後端 ExpressRoute 連接", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", - "link": "https://dapr.io/", - "service": "AKS", - "severity": "低", - "text": "使用 Dapr 簡化微服務開發", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", + "service": "AVS", + "severity": "中等", + "text": "確保創建從本地資源到 Azure VMware 解決方案虛擬機的連接監視器,以監視端到端連接", "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", + "service": "AVS", "severity": "高", - "text": "使用 SLA 支援的 AKS 產品/服務", - "waf": "可靠性" + "text": "使用路由伺服器時,請確保從路由伺服器到 ExR 閘道再到本地的路由不超過 1000 個(ARS 限制)。", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", - "severity": "低", - "text": "在容器和部署定義中使用中斷預算", - "waf": "可靠性" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", + "service": "AVS", + "severity": "高", + "text": "是否為在 Azure 門戶中管理 Azure VMware 解決方案資源的角色實現了 Privileged Identity Management(不允許長期許可權)", + "waf": "安全" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure AKS Review", - "guid": "3c763963-7a55-42d5-a15e-401955387e5c", - "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", - "service": "ACR", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", + "service": "AVS", "severity": "高", - "text": "如果使用專用註冊表,請配置區域複製以將映像存儲在多個區域中", - "waf": "可靠性" + "text": "應為 Azure VMware 解決方案 PIM 角色實現 Privileged Identity Management 審核報告", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", - "service": "AKS", - "severity": "低", - "text": "使用外部應用(如 kubecost)將成本分配給不同的使用者", - "waf": "成本" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", - "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", - "service": "AKS", - "severity": "低", - "text": "使用縮減模式刪除/取消分配節點", - "waf": "成本" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", - "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", + "service": "AVS", "severity": "中等", - "text": "需要時,請在 AKS 群集上使用多實例分組 GPU", - "waf": "成本" + "text": "如果使用 Privileged Identity Management,請確保使用有效的 SMTP 記錄創建啟用了 Entra ID 的有效帳戶,以便 Azure VMware 解決方案自動主機更換通知。(需要長期許可)", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", - "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", - "service": "AKS", - "severity": "低", - "text": "如果運行開發/測試群集,請使用 NodePool Start/Stop", - "waf": "成本" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", + "service": "AVS", + "severity": "高", + "text": "將 CloudAdmin 帳戶的使用限制為僅緊急訪問", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", + "service": "AVS", "severity": "中等", - "text": "使用適用於 Kubernetes 的 Azure Policy 確保群集符合性", + "text": "在 vCenter 中創建自定義 RBAC 角色,以在 vCenter 中實施最小特權模型", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", + "service": "AVS", "severity": "中等", - "text": "使用使用者/系統節點池將應用程式與控制平面分開", + "text": "是定義為定期輪換 cloudadmin (vCenter) 和管理員 (NSX) 憑據的過程", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", - "link": "https://learn.microsoft.com/azure/aks/use-system-pools", - "service": "AKS", - "severity": "低", - "text": "向系統節點池添加污點以使其專用", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", + "service": "AVS", + "severity": "高", + "text": "使用集中式識別提供者用於在 Azure VMware 解決方案上運行的工作負載 (VM)", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", - "link": "https://learn.microsoft.com/azure/container-registry/", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", + "service": "AVS", "severity": "中等", - "text": "對映像使用專用註冊表,例如 ACR", + "text": "是否在 NSX-T 中實施了東西向流量篩選", "waf": "安全" }, { - "arm-service": "microsoft.containerregistry/registries", - "checklist": "Azure AKS Review", - "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", - "link": "https://learn.microsoft.com/azure/security-center/container-security", - "service": "ACR", - "severity": "中等", - "text": "掃描映像以查找漏洞", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", + "service": "AVS", + "severity": "高", + "text": "Azure VMware 解決方案上的工作負載不會直接向 Internet 公開。流量由 Azure 應用程式閘道、Azure 防火牆或第三方解決方案進行篩選和檢查", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", + "service": "AVS", "severity": "高", - "text": "定義應用分離要求(命名空間/節點池/集群)", + "text": "對 Azure VMware 解決方案和基於 Azure VMware 解決方案的工作負載的入站 Internet 請求實施審核和日誌記錄", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", - "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", + "service": "AVS", "severity": "中等", - "text": "使用 CSI 機密存儲驅動程式將機密存儲在 Azure Key Vault 中", + "text": "對來自 Azure VMware 解決方案或基於 Azure VMware 解決方案的工作負載的出站 Internet 連接實施會話監視,以識別可疑/惡意活動", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", - "link": "https://learn.microsoft.com/azure/aks/update-credentials", - "service": "AKS", - "severity": "高", - "text": "如果將服務主體用於群集,請定期刷新憑據(如每季度)", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "334fdf91-c234-4182-a652-75269440b4be", + "service": "AVS", + "severity": "中等", + "text": "是否在 Azure 的 ExR/VPN 閘道子網上啟用了 DDoS 標準防護", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", - "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", + "service": "AVS", "severity": "中等", - "text": "如果需要,請添加金鑰管理服務 etcd 加密", + "text": "使用專用特權訪問工作站 (PAW) 管理 Azure VMware 解決方案、vCenter、NSX Manager 和 HCX Manager", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", - "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", - "service": "AKS", - "severity": "低", - "text": "如果需要,請考慮使用適用於 AKS 的機密計算", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", + "service": "AVS", + "severity": "中等", + "text": "為 Azure VMware 解決方案上運行的工作負載啟用高級威脅檢測(Microsoft Defender for Cloud,又名 ASC)", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", + "service": "AVS", "severity": "中等", - "text": "考慮使用 Defender for Containers", + "text": "使用適用於伺服器的 Azure ARC 使用 Azure 本機技術正確管理在 Azure VMware 解決方案上運行的工作負載(適用於 Azure VMware 解決方案的 Azure ARC 尚不可用)", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "高", - "text": "使用託管標識而不是服務主體", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", + "service": "AVS", + "severity": "低", + "text": "確保 Azure VMware 解決方案上的工作負載在運行時使用足夠的數據加密(如來賓內磁碟加密和 SQL TDE)。(vSAN 靜態加密為預設加密)", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "中等", - "text": "將身份驗證與 AAD(使用託管集成)集成", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a3592718-e6e2-4051-9267-6ae46691e883", + "service": "AVS", + "severity": "低", + "text": "使用來賓內加密時,請盡可能將加密密鑰存儲在 Azure Key Vault 中", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", - "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5ac94222-3e13-4810-9230-81a941741583", + "service": "AVS", "severity": "中等", - "text": "限制對管理員 kubeconfig (get-credentials --admin) 的訪問", + "text": "請考慮對 Azure VMware 解決方案上運行的工作負載使用擴展的安全更新支援(Azure VMware 解決方案符合 ESU 條件)", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", - "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", - "service": "AKS", - "severity": "中等", - "text": "將授權與 AAD RBAC 集成", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", + "service": "AVS", + "severity": "高", + "text": "確保使用適當的 vSAN 資料冗餘方法(RAID 規範)", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d88408f3-7273-44c8-96ba-280214590146", + "service": "AVS", "severity": "高", - "text": "在 Kubernetes 中使用命名空間限制 RBAC 許可權", - "waf": "安全" + "text": "確保允許失敗策略已到位,以滿足您的 vSAN 儲存需求", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", - "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", - "service": "AKS", - "severity": "中等", - "text": "對於 Pod Identity Access Management,請使用 Azure AD 工作負載標識(預覽版)", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", + "service": "AVS", + "severity": "高", + "text": "確保已請求足夠的配額,確保已考慮增長和災難恢復要求", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", - "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", + "service": "AVS", "severity": "中等", - "text": "對於 AKS 非互動式登錄名,請使用 kubelogin(預覽版)", - "waf": "安全" + "text": "確保瞭解對 ESXi 的訪問限制,其中存在可能影響第三方解決方案的訪問限制。", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", + "service": "AVS", "severity": "中等", - "text": "禁用 AKS 本地帳戶", - "waf": "安全" + "text": "確保您制定了有關ESXi主機密度和效率的策略,並牢記請求新節點的提前期", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "低", - "text": "如果需要,請配置 Just-in-time 群集訪問", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", + "service": "AVS", + "severity": "中等", + "text": "確保 Azure VMware 解決方案的良好成本管理流程已到位 - 可以使用 Azure 成本管理", + "waf": "成本" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", + "service": "AVS", "severity": "低", - "text": "如果需要,為 AKS 配置 AAD 條件訪問", - "waf": "安全" + "text": "Azure 預留實例是否用於優化使用 Azure VMware 解決方案的成本", + "waf": "成本" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", - "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", - "service": "AKS", - "severity": "低", - "text": "如果 Windows AKS 工作負載需要,請配置 gMSA", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6691e883-5ac9-4422-83e1-3810523081a9", + "service": "AVS", + "severity": "中等", + "text": "使用其他 Azure 本機服務時,請考慮使用 Azure 專用連結", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", + "service": "AVS", + "severity": "高", + "text": "確保所有必需的資源都駐留在同一個 Azure 可用性區域中", + "waf": "性能" + }, + { + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", + "service": "AVS", "severity": "中等", - "text": "為了獲得更精細的控制,請考慮使用託管的 Kubelet 身份", + "text": "為 Azure VMware 解決方案來賓 VM 工作負載啟用 Microsoft Defender for Cloud", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", - "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", + "service": "AVS", "severity": "中等", - "text": "如果使用 AGIC,請勿跨集群共用 AppGW", - "waf": "可靠性" + "text": "使用已啟用 Azure Arc 的伺服器管理 Azure VMware 解決方案來賓 VM 工作負載", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", + "service": "AVS", "severity": "高", - "text": "不要使用 AKS HTTP 路由載入項,而是將託管 NGINX 入口與應用程式路由載入項一起使用。", - "waf": "可靠性" + "text": "在 Azure VMware 解決方案上啟用診斷和指標日誌記錄", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", + "service": "AVS", "severity": "中等", - "text": "對於 Windows 工作負載,請使用加速網路", - "waf": "性能" + "text": "將Log Analytics代理部署到 Azure VMware 解決方案來賓 VM 工作負載", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "高", - "text": "使用標準 ALB(而不是基本 ALB)", - "waf": "可靠性" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "589d457a-927c-4397-9d11-02cad6aae11e", + "service": "AVS", + "severity": "中等", + "text": "確保已針對 Azure VMware 解決方案 VM 工作負載記錄並實施了備份策略和解決方案", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ee29711b-d352-4caa-ab79-b198dab81932", + "service": "AVS", "severity": "中等", - "text": "如果使用 Azure CNI,請考慮對 NodePool 使用不同的子網", + "text": "使用 Microsoft Defender for Cloud 對 Azure VMware 解決方案上運行的工作負載進行合規性監視", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", - "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", + "service": "AVS", "severity": "中等", - "text": "使用專用終結點(首選)或虛擬網路服務終結點從群集訪問 PaaS 服務", + "text": "是否將適用的合規性基線添加到 Microsoft Defender for Cloud", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", + "service": "AVS", "severity": "高", - "text": "選擇最適合你要求的 CNI 網路外掛程式(建議使用 Azure CNI)", - "waf": "可靠性" + "text": "在選擇要用於 Azure VMware 解決方案部署的 Azure 區域時是否評估了數據駐留", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", + "service": "AVS", "severity": "高", - "text": "如果使用 Azure CNI,請根據每個節點的最大 Pod 數相應地調整子網的大小", - "waf": "性能" + "text": "數據處理影響(服務提供者/服務消費者模型)是否清晰且有據可查", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", - "severity": "高", - "text": "如果使用 Azure CNI,請檢查每個節點的最大 Pod 數(預設為 30)", - "waf": "性能" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "547c1747-dc56-4068-a714-435cd19dd244", + "service": "AVS", + "severity": "中等", + "text": "僅當出於合規性原因需要時,才考慮將CMK(客戶管理的密鑰)用於 vSAN。", + "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "對於內部應用,組織通常會在其防火牆中打開整個AKS子網。這也會打開對節點的網路訪問,並可能打開對 Pod 的訪問(如果使用 Azure CNI)。如果 LoadBalancer IP 位於不同的子網中,則只有此子網可供應用用戶端使用。另一個原因是,如果 AKS 子網中的 IP 位址是稀缺資源,則將其 IP 位址用於服務會降低群集的最大可伸縮性。", - "guid": "13c00567-4b1e-4945-a459-c373e7ed6162", - "link": "https://learn.microsoft.com/azure/aks/internal-lb", - "service": "AKS", - "severity": "低", - "text": "如果使用專用IP LoadBalancer服務,請使用專用子網(而不是 AKS 子網)", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", + "service": "AVS", + "severity": "高", + "text": "創建儀錶板以啟用核心 Azure VMware 解決方案監視見解", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", + "service": "AVS", "severity": "高", - "text": "相應調整服務 IP 位址範圍的大小(這將限制群集的可伸縮性)", - "waf": "可靠性" + "text": "針對 Azure VMware 解決方案性能(CPU >80%、平均記憶體 >80%、vSAN >70%)自動警報的關鍵閾值創建警告警報", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", - "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", - "service": "AKS", - "severity": "低", - "text": "如果需要,請添加您自己的 CNI 外掛程式", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9659e396-80e7-4828-ac93-5657d02bff45", + "service": "AVS", + "severity": "高", + "text": "確保創建嚴重警示以監控 vSAN 消耗量是否低於 75%,因為這是 VMware 的支援閾值", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "低", - "text": "如果需要,請在 AKS 中配置每個節點的公共 IP", - "waf": "性能" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", + "service": "AVS", + "severity": "高", + "text": "確保為 Azure 服務運行狀況警報和通知配置警報", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", - "link": "https://learn.microsoft.com/azure/aks/concepts-network", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", + "service": "AVS", "severity": "中等", - "text": "使用入口控制器公開基於 Web 的應用,而不是使用 LoadBalancer 類型的服務公開它們", - "waf": "可靠性" + "text": "將 Azure VMware 解決方案記錄設定為發送到 Azure 儲存帳戶或 Azure EventHub 進行處理", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", - "link": "https://learn.microsoft.com/azure/aks/nat-gateway", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", + "service": "AVS", "severity": "低", - "text": "使用 Azure NAT 閘道作為 outboundType 來縮放出口流量", - "waf": "可靠性" + "text": "如果需要深入瞭解 VMware vSphere:解決方案中是否使用了 vRealize Operations 和/或 vRealize Network Insights?", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "中等", - "text": "使用IP的動態分配來避免 Azure CNI IP 耗盡", - "waf": "可靠性" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", + "service": "AVS", + "severity": "高", + "text": "確保虛擬機的 vSAN 儲存策略不是預設存儲策略,因為此策略應用厚置備", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "高", - "text": "如果安全要求要求,請使用 AzFW/NVA 篩選出口流量", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", + "service": "AVS", + "severity": "中等", + "text": "確保未將 vSphere 內容庫放置在 vSAN 上,因為 vSAN 是有限的資源", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", + "service": "AVS", "severity": "中等", - "text": "如果使用公共 API 終端節點,請限制可以存取它的 IP 位址", - "waf": "安全" + "text": "確保備份解決方案的數據存儲庫存儲在 vSAN 儲存之外。在 Azure 本機或磁碟池支持的數據存儲中", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "高", - "text": "如果要求要求,請使用私有集群", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", + "service": "AVS", + "severity": "中等", + "text": "確保使用 Azure Arc for Servers 進行混合管理,確保在 Azure VMware 解決方案上運行的工作負載(Arc for Azure VMware 解決方案處於預覽狀態)", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", + "service": "AVS", "severity": "中等", - "text": "對於 Windows 2019 和 2022 AKS 節點,可以使用 Calico 網路策略", - "waf": "安全" + "text": "確保使用 Azure Log Analytics 和 Azure Monitor 監視在 Azure VMware 解決方案上運行的工作負載", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "高", - "text": "啟用 Kubernetes 網路策略選項 (Calico/Azure)", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", + "service": "AVS", + "severity": "中等", + "text": "在現有更新管理工具或 Azure 更新管理中包括在 Azure VMware 解決方案上運行的工作負載", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", - "severity": "高", - "text": "使用 Kubernetes 網路策略提高集群內安全性", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", + "service": "AVS", + "severity": "中等", + "text": "使用 Azure Policy 在 Azure 管理、監視和安全解決方案中加入 Azure VMware 解決方案工作負載", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", - "service": "AKS", - "severity": "高", - "text": "將 WAF 用於 Web 工作負載(UI 或 API)", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", + "service": "AVS", + "severity": "中等", + "text": "確保在 Azure VMware 解決方案上運行的工作負載已載入 Microsoft Defender for Cloud", "waf": "安全" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", + "service": "AVS", "severity": "中等", - "text": "在 AKS 虛擬網路中使用 DDoS 標準", - "waf": "安全" + "text": "確保備份不存儲在 vSAN 上,因為 vSAN 是有限的資源", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "低", - "text": "如果需要,請添加公司 HTTP 代理", - "waf": "安全" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", + "service": "AVS", + "severity": "中等", + "text": "是否考慮了所有災難恢復解決方案,並決定了最適合您業務的解決方案?[SRM/JetStream/Zerto/Veeam/...]", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", - "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", + "service": "AVS", "severity": "中等", - "text": "考慮使用服務網格進行高級微服務通信管理", - "waf": "安全" + "text": "當災難恢復技術是本機 Azure IaaS 時,請使用 Azure Site Recovery", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", + "service": "AVS", "severity": "高", - "text": "設定有關最關鍵指標的警報(請參閱容器見解以獲取建議)", - "waf": "操作" + "text": "將自動恢復計劃與任一災難解決方案結合使用,盡可能避免手動任務", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "337453a3-cc63-4963-9a65-22ac19e80696", - "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", - "service": "AKS", - "severity": "低", - "text": "定期查看 Azure 顧問,瞭解有關群集的建議", - "waf": "操作" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "8255461e-2aee-4345-9aec-8339248b262d", + "service": "AVS", + "severity": "中等", + "text": "使用地緣政治區域對作為輔助災難恢復環境", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", - "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", - "service": "AKS", - "severity": "低", - "text": "啟用 AKS 自動證書輪換", - "waf": "操作" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", + "service": "AVS", + "severity": "高", + "text": "在區域之間使用 2 個不同的地址空間,例如:10.0.0.0/16 和 192.168.0.0/16 用於不同的區域", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", - "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", - "service": "AKS", - "severity": "高", - "text": "定期(例如,每季度)升級 kubernetes 版本,或使用 AKS 自動升級功能", - "waf": "操作" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", + "service": "AVS", + "severity": "中等", + "text": "ExpressRoute Global Reach 是用於主 Azure VMware 解決方案私有雲和輔助 Azure VMware 解決方案私有雲之間的連接,還是通過網路虛擬設備完成路由?", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", - "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", - "service": "AKS", - "severity": "高", - "text": "如果您不使用 node-image 升級,請使用 kured 進行 Linux 節點升級", - "waf": "操作" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", + "service": "AVS", + "severity": "中等", + "text": "是否考慮了所有備份解決方案,並決定了最適合您業務的解決方案?[ MABS/CommVault/Metallic.io/Veeam/ .", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", - "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", - "service": "AKS", - "severity": "高", - "text": "定期(例如,每周)升級群集節點映像的常規過程", - "waf": "操作" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", + "service": "AVS", + "severity": "中等", + "text": "將備份解決方案部署在與 Azure VMware 解決方案私有雲相同的區域中", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", - "service": "AKS", - "severity": "低", - "text": "考慮使用 gitops 將應用程式或集群配置部署到多個集群", - "waf": "操作" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", + "service": "AVS", + "severity": "中等", + "text": "在 vSan 外部的 Azure 本機組件上部署備份解決方案", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "d7672c26-7602-4482-85a4-14527fbe855c", - "link": "https://learn.microsoft.com/azure/aks/command-invoke", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", + "service": "AVS", "severity": "低", - "text": "請考慮在專用群集上使用 AKS 命令調用", - "waf": "操作" + "text": "是否已制定請求還原由 Azure 平臺管理的 VMware 元件的流程?", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", - "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", + "service": "AVS", "severity": "低", - "text": "對於計劃的事件,請考慮使用 Node Auto Drain", - "waf": "操作" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", - "link": "https://learn.microsoft.com/azure/aks/faq", - "service": "AKS", - "severity": "高", - "text": "開發自己的治理實踐,以確保節點 RG(又名“基礎設施 RG”)中的操作員不會執行任何更改", + "text": "對於手動部署,必須記錄所有配置和部署", "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", + "service": "AVS", "severity": "低", - "text": "使用自定義節點 RG(又名“Infra RG”)名稱", + "text": "對於手動部署,請考慮實施資源鎖,以防止對 Azure VMware 解決方案私有雲執行意外操作", "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", - "link": "https://kubernetes.io/docs/setup/release/notes/", - "service": "AKS", - "severity": "中等", - "text": "請勿在 YAML 清單中使用已棄用的 Kubernetes API", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", + "service": "AVS", + "severity": "低", + "text": "對於自動化部署,請部署最小的私有雲並根據需要進行擴展", "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", - "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", + "service": "AVS", "severity": "低", - "text": "污染 Windows 節點", + "text": "對於自動部署,請在開始部署之前請求或預留配額", "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", + "service": "AVS", "severity": "低", - "text": "使 Windows 容器修補程式級別與主機修補程式級別保持同步", + "text": "對於自動部署,請確保通過自動化或 Azure Policy 創建相關資源鎖,以便進行適當的治理", "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "通過群集級別的診斷設置", - "guid": "5b56ad48-408f-4e72-934c-476ba280dcf5", - "link": "https://learn.microsoft.com/azure/aks/monitor-aks", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", + "service": "AVS", "severity": "低", - "text": "將主日誌(又名 API 紀錄)發送到 Azure Monitor 或首選日誌管理解決方案", + "text": "為 ExR 授權金鑰實現人類可理解的名稱,以便輕鬆識別密鑰的目的/用途", "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", - "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "255461e2-aee3-4553-afc8-339248b262d6", + "service": "AVS", "severity": "低", - "text": "如果需要,請使用 nodePool 快照", - "waf": "成本" + "text": "當使用單獨的服務原則部署 Azure VMware 解決方案和 ExpressRoute 時,請使用 Key Vault 儲存機密和授權密鑰", + "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", - "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", + "service": "AVS", "severity": "低", - "text": "考慮將現成節點池用於對時間敏感的工作負載", + "text": "當需要在 Azure VMware 解決方案中/上部署許多資源時,定義用於在 IaC 中序列化操作的資源依賴項,因為 Azure VMware 解決方案僅支援有限數量的並行操作。", "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", + "service": "AVS", "severity": "低", - "text": "考慮用於快速突發的 AKS 虛擬節點", + "text": "使用單個 Tier-1 閘道執行 NSX-T 分段的自動配置時,請使用 Azure 門戶 API 而不是 NSX-Manager API", "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", - "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", - "service": "AKS", - "severity": "高", - "text": "使用 Container Insights(或 Prometheus 等其他工具)監控集群指標", - "waf": "操作" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", + "service": "AVS", + "severity": "中等", + "text": "打算使用自動橫向擴展時,請務必為運行 Azure VMware 解決方案的訂閱申請足夠的 Azure VMware 解決方案配額", + "waf": "性能" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "高", - "text": "使用 Container Insights(或 Telegraf/ElasticSearch 等其他工具)存儲和分析集群日誌", - "waf": "操作" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", + "service": "AVS", + "severity": "中等", + "text": "打算使用自動縮減時,請務必在執行此操作之前考慮存儲策略要求", + "waf": "性能" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", - "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", + "service": "AVS", "severity": "中等", - "text": "監控節點的 CPU 和記憶體利用率", - "waf": "操作" + "text": "擴展操作始終需要在單個 SDDC 中序列化,因為一次只能執行一個擴展操作(即使使用多個集群也是如此)", + "waf": "性能" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "1a4835ac-9422-423e-ae80-b123081a5417", - "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", + "service": "AVS", "severity": "中等", - "text": "如果使用 Azure CNI,請監視每個節點消耗的 Pod IP 的百分比", - "waf": "操作" + "text": "考慮並驗證體系結構中使用的第三方解決方案的縮放操作(支援與否)", + "waf": "性能" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "OS 磁碟上的 I/O 是關鍵資源。如果節點中的操作系統在 I/O 上受到限制,這可能會導致不可預知的行為,通常最終導致節點被聲明為 NotReady", - "guid": "415833ea-3ad3-4c2d-b733-165c3acbe04b", - "link": "https://learn.microsoft.com/azure/virtual-machines/premium-storage-performance", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", + "service": "AVS", "severity": "中等", - "text": "監視節點中的OS磁碟佇列深度", - "waf": "操作" + "text": "在自動化中為環境定義和強制實施橫向擴展/橫向擴展最大限制", + "waf": "性能" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "be209d39-fda4-4777-a424-d116785c2fa5", - "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", + "service": "AVS", "severity": "中等", - "text": "如果不對 AzFW/NVA 使用出口篩選,請監視標準 ALB 分配的 SNAT 連接埠", + "text": "實施監控規則以監控自動擴展操作,並監控成功和失敗,以啟用適當的(自動化)回應", "waf": "操作" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", - "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", - "service": "AKS", - "severity": "中等", - "text": "訂閱 AKS 群集的資源運行狀況通知", - "waf": "操作" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c5972cd4-cd21-4b07-9036-f5e6b4bfd3d5", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "AVS", "severity": "高", - "text": "在 Pod 規範中配置請求和限制", - "waf": "操作" - }, - { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "769ef669-1a48-435a-a942-223ece80b123", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", - "service": "AKS", - "severity": "中等", - "text": "強制實施命名空間的資源配額", - "waf": "操作" + "text": "使用 MON 時,請注意同時配置的 VM 的限制(HCX 的 MON 限制 [400 - 標準,1000 - 大型設備])", + "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "081a5417-4158-433e-a3ad-3c2de733165c", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "be1f38cf-03a8-422b-b463-cbbbc8ac299e", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "AVS", "severity": "高", - "text": "確保訂閱具有足夠的配額來橫向擴展節點池", - "waf": "操作" + "text": "使用 MON 時,不能在超過 100 個網路分機上啟用 MON", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", + "service": "AVS", "severity": "中等", - "text": "使用群集自動縮放程式", + "text": "如果使用 VPN 連接進行遷移,請相應地調整 MTU 大小。", "waf": "性能" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", - "severity": "低", - "text": "自定義 AKS 節點池的節點配置", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e614658d-d457-4e92-9139-b821102cad6e", + "service": "AVS", + "severity": "中等", + "text": "對於連接到 Azure(500Mbps 或更低)的低連接區域,請考慮部署 HCX WAN 優化設備", "waf": "性能" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", - "link": "https://learn.microsoft.com/azure/aks/concepts-scale", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", + "service": "AVS", "severity": "中等", - "text": "需要時使用 Horizontal Pod Autoscaler", - "waf": "性能" + "text": "確保從本地裝置啟動遷移,而不是從雲端裝置啟動遷移(不要執行反向遷移)", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "description": "更大的節點將帶來更高的性能和功能,例如臨時磁碟和加速網路,但它們會增加爆炸半徑並降低擴展粒度", - "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", - "severity": "高", - "text": "考慮適當的節點大小,不要太大或太小", - "waf": "性能" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", + "service": "AVS", + "severity": "中等", + "text": "使用 Azure Netapp Files 擴展 Azure VMware 解決方案的儲存時,請考慮將其用作 VMware 資料儲存庫,而不是直接附加到 VM 。", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", - "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", - "service": "AKS", - "severity": "低", - "text": "如果可伸縮性需要超過 5000 個節點,請考慮使用其他 AKS 群集", - "waf": "性能" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "bff4564b-0d93-44a3-98b2-63e7dd60513a", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", + "service": "AVS", + "severity": "中等", + "text": "確保將專用 ExpressRoute 閘道用於外部資料儲存解決方案", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", - "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", - "service": "AKS", - "severity": "低", - "text": "考慮訂閱 EventGrid Events for AKS 自動化", - "waf": "性能" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "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", + "severity": "中等", + "text": "確保在用於外部數據存儲解決方案的 ExpressRoute 閘道上啟用了 FastPath", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", - "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", - "service": "AKS", - "severity": "低", - "text": "若要在 AKS 群集上長時間運行操作,請考慮事件終止", - "waf": "性能" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "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", + "severity": "高", + "text": "如果使用延伸群集,請確保供應商支援所選的災難恢復解決方案", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", - "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", - "service": "AKS", - "severity": "低", - "text": "如果需要,請考慮將 Azure 專用主機用於 AKS 節點", - "waf": "性能" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", + "service": "AVS", + "severity": "高", + "text": "如果使用延伸群集,請確保提供的 SLA 符合您的要求", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "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", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", + "service": "AVS", "severity": "高", - "text": "使用臨時OS磁碟", - "waf": "性能" + "text": "如果使用延伸群集,請確保兩條 ExpressRoute 線路都連接到連接中心。", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", - "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", - "service": "AKS", + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", + "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", + "service": "AVS", "severity": "高", - "text": "對於非臨時磁碟,在運行多個 Pod/節點時,請為節點使用高 IOPS 和更大的 OS 磁碟,因為它需要高性能才能運行多個 Pod,並且會生成具有預設 AKS 日誌輪換閾值的大量日誌", - "waf": "性能" + "text": "如果使用延伸群集,請確保兩條 ExpressRoute 線路都啟用了 GlobalReach。", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", - "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", - "service": "AKS", - "severity": "低", - "text": "對於超高性能存儲選項,請在 AKS 上使用超級磁碟For hyper performance storage option use Ultra Disks on AKS", - "waf": "性能" + "arm-service": "Microsoft.AVS/privateClouds", + "checklist": "Azure VMware Solution Design Review", + "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", + "service": "AVS", + "severity": "高", + "text": "是否正確考慮了網站容災設置,並在需要時為您的業務進行了更改。", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", - "service": "AKS", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "ab91932c-9fc9-4d1b-a881-37f5e6c0cb9e", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ADF_v1.docx", + "service": "Azure Data Factory", "severity": "中等", - "text": "避免將狀態保留在群集中,並將數據存儲在外部(AzStorage、AzSQL、Cosmos 等)", - "waf": "性能" + "text": "利用 Azure 數據工廠的 FTA 復原能力手冊", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", - "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", - "service": "AKS", - "severity": "中等", - "text": "如果使用 AzFiles Standard,出於性能原因,請考慮使用 AzFiles Premium 和/或 ANF", - "waf": "性能" + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "e503547c-d447-4e82-9138-a7200f1cac6d", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", + "severity": "高", + "text": "在支援可用區的區域中使用區域冗餘管道", + "waf": "可靠性" }, { - "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Azure AKS Review", - "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", - "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", - "service": "AKS", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "9ef1d6e8-32e5-42e3-911c-818b1a0bc511", + "link": "https://learn.microsoft.com/azure/data-factory/source-control", + "service": "Azure Data Factory", "severity": "中等", - "text": "如果使用 Azure 磁碟和可用區,請考慮在區域內為 LRS 磁碟設置節點池,並使用 VolumeBindingMode:WaitForFirstConsumer 在正確的區域中預配存儲,或將 ZRS 磁碟用於跨多個區域的節點池", - "waf": "性能" - }, - { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Azure Functions", - "severity": "高", - "text": "根據您的業務和 SLO 要求選擇正確的功能託管計劃", - "waf": "可靠性" - }, - { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", - "service": "Azure Functions", - "severity": "高", - "text": "利用區域適用的可用區(不適用於消耗層)", + "text": "使用 DevOps 透過 Github/Azure DevOps 集成備份 ARM 範本", "waf": "可靠性" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "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", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "e43a18a9-cd29-49cf-b7b1-7db8255562f2", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", "severity": "中等", - "text": "考慮為關鍵工作負載制定跨區域災難恢復策略", - "waf": "可靠性" - }, - { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "Azure Functions", - "severity": "高", - "text": "如果部署到獨立環境,請使用或遷移到應用服務環境 (ASE) v3", - "waf": "可靠性" - }, - { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "Azure Functions", - "severity": "高", - "text": "確保為應用服務計劃上運行的所有函數應用啟用“始終開啟”", + "text": "請確保在另一個區域中複製自承載集成運行時 VM", "waf": "可靠性" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "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", + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "guid": "aee4563a-fd83-4393-98b2-62d6dc5f512a", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", + "service": "Azure Data Factory", "severity": "中等", - "text": "將函數應用與其自己的存儲帳戶配對。盡量不要重用函數應用的存儲帳戶,除非它們緊密耦合", + "text": "請確保在姊妹區域中複製或複製您的網路。必須在另一個區域創建 Vnet 的副本", "waf": "可靠性" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Azure Function Review", - "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "Azure Functions", - "severity": "中等", - "text": "利用 Azure DevOps 或 GitHub 簡化 CI/CD 並保護函數應用代碼", - "waf": "操作" + "arm-service": "Microsoft.DataFactory/datafactories", + "checklist": "Azure Data Factory Review Checklist", + "description": "如果ADF管道使用Key Vault,則無需執行任何操作即可複製Key Vault。Key Vault 是一項託管服務,Microsoft 會為你處理它", + "guid": "25498f6d-bad3-47da-a43b-c6ce1d7aa9b2", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "Azure Data Factory", + "severity": "低", + "text": "如果使用 Keyvault 集成,請使用 Keyvault 的 SLA 來瞭解可用性", + "waf": "可靠性" }, { "arm-service": "Microsoft.ApiManagement/service", @@ -1649,3500 +1441,3633 @@ "waf": "安全" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", - "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", - "service": "Spring Apps", - "severity": "中等", - "text": "Azure Spring Apps 允許對每個應用進行兩次部署,其中只有一個部署接收生產流量。您可以使用藍綠部署策略實現零停機時間。藍綠部署僅在標準層和企業層中可用。可以使用 CI/CD 和 ADO/GitHub 操作自動執行部署", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ab5351f6-383a-45ed-9c5e-b143b16db40a", + "link": "https://learn.microsoft.com/azure/aks/use-windows-hpc", + "service": "AKS", + "severity": "低", + "text": "如果 AKS Windows 工作負載需要,可以使用 HostProcess 容器", "waf": "可靠性" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "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", - "severity": "中等", - "text": "可以在多個區域中為應用程式創建 Azure Spring Apps 實例,並且流量管理器/Front Door 可以路由流量。", - "waf": "可靠性" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a280dcf5-90ce-465d-b8e1-3f9ccbd46926", + "link": "https://learn.microsoft.com/azure/azure-functions/functions-kubernetes-keda", + "service": "AKS", + "severity": "低", + "text": "如果運行事件驅動的工作負載,請使用KEDA", + "waf": "性能" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", - "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", - "service": "Spring Apps", - "severity": "中等", - "text": "在支持的區域中,Azure Spring Apps 可以部署為區域冗餘,這意味著實例會自動分佈在可用性區域之間。此功能僅在標準層和企業層中可用。", - "waf": "可靠性" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "26886d20-b66c-457b-a591-19bf8e8f5c58", + "link": "https://dapr.io/", + "service": "AKS", + "severity": "低", + "text": "使用 Dapr 簡化微服務開發", + "waf": "操作" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", - "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", - "service": "Spring Apps", - "severity": "中等", - "text": "對應用使用1個以上的應用實例", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "高", + "text": "使用 SLA 支援的 AKS 產品/服務", "waf": "可靠性" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "7504c230-6035-4183-95a5-85762acc6075", - "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", - "service": "Spring Apps", - "severity": "中等", - "text": "使用日誌、指標和跟蹤監視 Azure Spring Apps。將 ASA 與應用程式見解集成,並跟蹤故障並創建工作簿。", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c1288b3c-6a57-4cfc-9444-51e1a3d3453a", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", + "severity": "低", + "text": "在容器和部署定義中使用中斷預算", "waf": "可靠性" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", - "service": "Spring Apps", - "severity": "中等", - "text": "在 Spring Cloud Gateway 中設置自動縮放", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure AKS Review", + "guid": "3c763963-7a55-42d5-a15e-401955387e5c", + "link": "https://learn.microsoft.com/azure/container-registry/container-registry-geo-replication", + "service": "ACR", + "severity": "高", + "text": "如果使用專用註冊表,請配置區域複製以將映像存儲在多個區域中", "waf": "可靠性" }, { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "97411607-b6fd-4335-99d1-9885faf4e392", - "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", - "service": "Spring Apps", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f82cb8eb-8c0a-4a63-a25a-4956eaa8dc4a", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/aks/eslz-cost-governance-with-kubecost", + "service": "AKS", "severity": "低", - "text": "為具有標準使用量和專用計劃的應用啟用自動縮放。", - "waf": "可靠性" - }, - { - "arm-service": "Microsoft.AppPlatform/Spring", - "checklist": "Azure Spring Apps Review", - "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", - "link": "https://learn.microsoft.com/azure/spring-apps/overview", - "service": "Spring Apps", - "severity": "中等", - "text": "使用企業計劃為關鍵任務應用提供 Spring Boot 的商業支援。使用其他層,您可以獲得 OSS 支援。", - "waf": "可靠性" + "text": "使用外部應用(如 kubecost)將成本分配給不同的使用者", + "waf": "成本" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "4d3dfbab-9924-4831-a68d-fdf0d72f462c", + "link": "https://learn.microsoft.com/azure/aks/scale-down-mode", + "service": "AKS", "severity": "低", - "text": "有關最佳實踐,請參閱基線高可用性區域冗餘 Web 應用程式體系結構", - "waf": "可靠性" + "text": "使用縮減模式刪除/取消分配節點", + "waf": "成本" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", - "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", - "service": "App Services", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "87e651ea-bc4a-4a87-a6df-c06a4b570ebc", + "link": "https://learn.microsoft.com/azure/aks/gpu-multi-instance", + "service": "AKS", "severity": "中等", - "text": "使用高級層和標準層。這些層支援暫存槽和自動備份。", - "waf": "可靠性" + "text": "需要時,請在 AKS 群集上使用多實例分組 GPU", + "waf": "成本" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", - "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", - "service": "App Services", - "severity": "高", - "text": "利用區域適用的可用性區域(需要高級 v2 或 v3 層)", - "waf": "可靠性" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "2b72a08b-0410-4cd6-9093-e068a5cf27e8", + "link": "https://learn.microsoft.com/azure/aks/start-stop-nodepools", + "service": "AKS", + "severity": "低", + "text": "如果運行開發/測試群集,請使用 NodePool Start/Stop", + "waf": "成本" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Services", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中等", - "text": "實施健康檢查", - "waf": "可靠性" + "text": "使用適用於 Kubernetes 的 Azure Policy 確保群集符合性", + "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", - "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", - "service": "App Services", - "severity": "高", - "text": "請參閱 Azure 應用服務的備份和還原最佳做法", - "waf": "可靠性" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "中等", + "text": "使用使用者/系統節點池將應用程式與控制平面分開", + "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", - "severity": "高", - "text": "實現 Azure 應用服務可靠性最佳做法", - "waf": "可靠性" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a7a1f893-9bda-4477-98f2-4c116775c2ea", + "link": "https://learn.microsoft.com/azure/aks/use-system-pools", + "service": "AKS", + "severity": "低", + "text": "向系統節點池添加污點以使其專用", + "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "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", - "severity": "低", - "text": "熟悉如何在災難期間將應用服務應用移動到另一個區域", - "waf": "可靠性" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "55b46a94-8008-4ae7-b7e4-b475b6c8bdbf", + "link": "https://learn.microsoft.com/azure/container-registry/", + "service": "AKS", + "severity": "中等", + "text": "對映像使用專用註冊表,例如 ACR", + "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", - "service": "App Services", + "arm-service": "microsoft.containerregistry/registries", + "checklist": "Azure AKS Review", + "guid": "59bce65d-e8a0-43f9-9879-468d66a786d6", + "link": "https://learn.microsoft.com/azure/security-center/container-security", + "service": "ACR", + "severity": "中等", + "text": "掃描映像以查找漏洞", + "waf": "安全" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d167dd18-2b0a-4c24-8b99-9a646f8389a7", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-cluster-isolation", + "service": "AKS", "severity": "高", - "text": "熟悉 Azure 應用服務中的可靠性支援", - "waf": "可靠性" + "text": "定義應用分離要求(命名空間/節點池/集群)", + "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", - "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", - "service": "App Services", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "5e3df584-eccc-4d97-a3b6-bcda3b50eb2e", + "link": "https://github.com/Azure/secrets-store-csi-driver-provider-azure", + "service": "AKS", "severity": "中等", - "text": "確保為在應用服務計劃上運行的函數應用啟用“Always On”", - "waf": "可靠性" + "text": "使用 CSI 機密存儲驅動程式將機密存儲在 Azure Key Vault 中", + "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", - "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", - "service": "App Services", - "severity": "中等", - "text": "使用運行狀況檢查監視應用服務實例", - "waf": "可靠性" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b03dda6d-58d7-4c89-8ddb-107d5769ae66", + "link": "https://learn.microsoft.com/azure/aks/update-credentials", + "service": "AKS", + "severity": "高", + "text": "如果將服務主體用於群集,請定期刷新憑據(如每季度)", + "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", - "service": "App Services", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e7ba73a3-0508-4f80-806f-527db30cee96", + "link": "https://learn.microsoft.com/azure/aks/use-kms-etcd-encryption", + "service": "AKS", "severity": "中等", - "text": "使用 Application Insights 可用性測試監視 Web 應用或網站的可用性和回應能力", - "waf": "可靠性" + "text": "如果需要,請添加金鑰管理服務 etcd 加密", + "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "guid": "b4e3f2d5-a5c6-4d7e-8b2f-c5d9e7a8f0ea", - "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", - "service": "App Services", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ec8e4e42-0344-41b0-b865-9123e8956d31", + "link": "https://learn.microsoft.com/azure/confidential-computing/confidential-nodes-aks-overview", + "service": "AKS", "severity": "低", - "text": "使用 Application Insights 標準測試監視 Web 應用或網站的可用性和回應能力", - "waf": "可靠性" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "使用 Azure Key Vault 儲存應用程式所需的任何機密。 Key Vault 為儲存機密提供安全且經過審核的環境,並通過 Key Vault SDK 或應用服務 Key Vault 引用與應用服務很好地集成。", - "guid": "834ac932-223e-4ce8-8b12-3071a5416415", - "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", - "service": "App Services", - "severity": "高", - "text": "使用 Key Vault 儲存機密", + "text": "如果需要,請考慮使用適用於 AKS 的機密計算", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "使用託管標識通過 Key Vault SDK 或透過應用服務 Key Vault 引用連接到 Key Vault。", - "guid": "833ea3ad-2c2d-4e73-8165-c3acbef4abe1", - "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", - "service": "App Services", - "severity": "高", - "text": "使用託管標識連接到 Key VaultUse Managed Identity to connect to Key Vault", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c9e95ffe-6dd1-4a17-8c5f-110389ca9b21", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-containers-enable", + "service": "AKS", + "severity": "中等", + "text": "考慮使用 Defender for Containers", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "將應用服務 TLS 證書存儲在 Key Vault 中。", - "guid": "f8d39fda-4776-4831-9c11-5775c2ea55b4", - "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-certificate", - "service": "App Services", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "高", - "text": "使用 Key Vault 儲存 TLS 證書。", + "text": "使用託管標識而不是服務主體", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "處理敏感信息的系統應隔離。 為此,請使用單獨的應用服務計劃或應用服務環境,並考慮使用不同的訂閱或管理組。", - "guid": "6ad48408-ee72-4734-a475-ba18fdbf590c", - "link": "https://learn.microsoft.com/azure/app-service/overview-hosting-plans", - "service": "App Services", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中等", - "text": "隔離處理敏感信息的系統", + "text": "將身份驗證與 AAD(使用託管集成)集成", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "應用服務上的本地磁碟未加密,敏感數據不應存儲在這些磁碟上。 (例如:D:\\\\Local 和 %TMP%)。", - "guid": "e65de8e0-3f9b-4cbd-9682-66abca264f9a", - "link": "https://learn.microsoft.com/azure/app-service/operating-system-functionality#file-access", - "service": "App Services", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a2fe27b2-e287-401a-8352-beedf79b488d", + "link": "https://learn.microsoft.com/azure/aks/control-kubeconfig-access", + "service": "AKS", "severity": "中等", - "text": "不要將敏感數據存儲在本地磁碟上", + "text": "限制對管理員 kubeconfig (get-credentials --admin) 的訪問", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "對於經過身份驗證的 Web 應用程式,請使用成熟的標識提供者,例如 Azure AD 或 Azure AD B2C。 利用所選的應用程式框架與此提供程式整合,或使用應用服務身份驗證/授權功能。", - "guid": "919ca0b2-c121-459e-814b-933df574eccc", - "link": "https://learn.microsoft.com/azure/app-service/overview-authentication-authorization", - "service": "App Services", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "eec4962c-c3bd-421b-b77f-26e5e6b3bec3", + "link": "https://learn.microsoft.com/azure/aks/manage-azure-rbac", + "service": "AKS", "severity": "中等", - "text": "使用已建立的身份提供程式進行身份驗證", + "text": "將授權與 AAD RBAC 集成", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "將代碼從受控且受信任的環境(例如管理良好且安全的 DevOps 部署管道)部署到應用服務。這樣可以避免未經版本控制和驗證從惡意主機部署的代碼。", - "guid": "3f9bcbd4-6826-46ab-aa26-4f9a19aed9c5", - "link": "https://learn.microsoft.com/azure/app-service/deploy-best-practices", - "service": "App Services", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d4f3537c-1346-4dc5-9027-a71ffe1bd05d", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-identity", + "service": "AKS", "severity": "高", - "text": "從受信任的環境部署", + "text": "在 Kubernetes 中使用命名空間限制 RBAC 許可權", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "禁用 FTP/FTPS 和 WebDeploy/SCM 的基本身份驗證。 這將禁止訪問這些服務,並強制使用 Azure AD 安全終結點進行部署。 請注意,還可以使用 Azure AD 憑據打開 SCM 網站。", - "guid": "5d04c2c3-919c-4a0b-8c12-159e114b933d", - "link": "https://learn.microsoft.com/azure/app-service/deploy-configure-credentials#disable-basic-authentication", - "service": "App Services", - "severity": "高", - "text": "禁用基本身份驗證", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d2e0d5d7-71d4-41e3-910c-c57b4a4b1410", + "link": "https://learn.microsoft.com/azure/aks/workload-identity-migration-sidecar", + "service": "AKS", + "severity": "中等", + "text": "對於 Pod Identity Access Management,請使用 Azure AD 工作負載標識(預覽版)", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "如果可能,請使用託管標識連接到 Azure AD 受保護的資源。 如果無法做到這一點,請將機密存儲在 Key Vault 中,並改用託管標識連接到 Key Vault。", - "guid": "f574eccc-d9bd-43ba-bcda-3b54eb2eb03d", - "link": "https://learn.microsoft.com/azure/app-service/overview-managed-identity?tabs=portal%2Chttp", - "service": "App Services", - "severity": "高", - "text": "使用託管標識連接到資源", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f4dcf690-1b30-407d-abab-6f8aa780d3a3", + "link": "https://learn.microsoft.com/azure/aks/managed-aad#non-interactive-sign-in-with-kubelogin", + "service": "AKS", + "severity": "中等", + "text": "對於 AKS 非互動式登錄名,請使用 kubelogin(預覽版)", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "如果使用 Azure 容器註冊表中儲存的映像,請使用託管標識拉取這些映像。", - "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", - "severity": "高", - "text": "使用託管標識拉取容器", - "waf": "安全" - }, - { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "通過配置應用服務的診斷設置,可以將所有遙測數據發送到Log Analytics,作為日誌記錄和監視的中心目標。這允許你監視應用服務的運行時活動,例如 HTTP 日誌、應用程式日誌、平臺日誌等。", - "guid": "47768314-c115-4775-a2ea-55b46ad48408", - "link": "https://learn.microsoft.com/azure/app-service/troubleshoot-diagnostic-logs", - "service": "App Services", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中等", - "text": "將應用服務運行時日誌發送到Log Analytics", + "text": "禁用 AKS 本地帳戶", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "設置診斷設置,將活動日誌發送到Log Analytics,作為日誌記錄和監視的中心目標。這樣,你就可以監視應用服務資源本身上的控制平面活動。", - "guid": "ee72734b-475b-4a18-bdbf-590ce65de8e0", - "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", - "service": "App Services", - "severity": "中等", - "text": "將應用服務活動日誌發送到Log Analytics", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "低", + "text": "如果需要,請配置 Just-in-time 群集訪問", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "使用區域 VNet 集成、網路安全組和 UDR 的組合來控制出站網路訪問。 流量應路由到 NVA,例如 Azure 防火牆。 確保監控防火牆的日誌。", - "guid": "c12159e1-14b9-433d-b574-ecccd9bd3baf", - "link": "https://learn.microsoft.com/azure/app-service/overview-vnet-integration", - "service": "App Services", - "severity": "中等", - "text": "應控制出站網路訪問", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "低", + "text": "如果需要,為 AKS 配置 AAD 條件訪問", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "可以使用 VNet 集成並使用 VNet NAT 閘道或 NVA(如 Azure 防火牆)來提供穩定的出站 IP。 這允許接收方根據需要根據IP列出允許清單。 請注意,對於與 Azure 服務的通信,通常不需要依賴於 IP 位址,應改用服務終結點等機制。 (此外,在接收端使用專用終結點可避免發生 SNAT,並提供穩定的出站 IP 範圍。", - "guid": "cda3b54e-b2eb-403d-b9a2-582718d2ddb1", - "link": "https://learn.microsoft.com/azure/app-service/networking/nat-gateway-integration", - "service": "App Services", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e1123a7c-a333-4eb4-a120-4ee3f293c9f3", + "link": "https://learn.microsoft.com/azure/aks/use-group-managed-service-accounts", + "service": "AKS", "severity": "低", - "text": "確保與互聯網位址的出站通信具有穩定的IP", + "text": "如果 Windows AKS 工作負載需要,請配置 gMSA", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "使用應用服務訪問限制、服務終結點或專用終結點的組合來控制入站網路訪問。對於 Web 應用本身和 SCM 網站,可能需要和配置不同的訪問限制。", - "guid": "0725769e-e669-41a4-a34a-c932223ece80", - "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", - "service": "App Services", - "severity": "高", - "text": "應控制入站網路訪問", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "中等", + "text": "為了獲得更精細的控制,請考慮使用託管的 Kubelet 身份", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "使用 Web 應用程式防火牆(如應用程式閘道或 Azure Front Door)防範惡意入站流量。 請務必監控 WAF 的日誌。", - "guid": "b123071a-5416-4415-a33e-a3ad2c2de732", - "link": "https://learn.microsoft.com/azure/app-service/networking/app-gateway-with-service-endpoints", - "service": "App Services", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "cbd8ac2a-aebc-4a2a-94da-1dbf3dc99248", + "link": "https://azure.github.io/application-gateway-kubernetes-ingress/setup/install-existing/", + "service": "AKS", + "severity": "中等", + "text": "如果使用 AGIC,請勿跨集群共用 AppGW", + "waf": "可靠性" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "高", - "text": "在應用服務前面使用 WAF", - "waf": "安全" + "text": "不要使用 AKS HTTP 路由載入項,而是將託管 NGINX 入口與應用程式路由載入項一起使用。", + "waf": "可靠性" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "確保僅鎖定對 WAF 的訪問,從而無法繞過 WAF。 結合使用訪問限制、服務終結點和專用終結點。", - "guid": "165c3acb-ef4a-4be1-b8d3-9fda47768314", - "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", - "service": "App Services", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "7bacd7b9-c025-4a9d-a5d2-25d6bc5439d9", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview", + "service": "AKS", + "severity": "中等", + "text": "對於 Windows 工作負載,請使用加速網路", + "waf": "性能" + }, + { + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "高", - "text": "避免繞過 WAF", - "waf": "安全" + "text": "使用標準 ALB(而不是基本 ALB)", + "waf": "可靠性" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "在應用服務配置中將最低 TLS 策略設置為 1.2。", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中等", - "text": "將最低 TLS 策略設置為 1.2", + "text": "如果使用 Azure CNI,請考慮對 NodePool 使用不同的子網", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "將應用服務配置為僅使用 HTTPS。 這會導致應用服務從 HTTP 重定向到 HTTPS。 強烈建議在代碼或 WAF 中使用 HTTP 嚴格傳輸安全性 (HSTS),這會通知瀏覽器只能使用 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", - "severity": "高", - "text": "僅使用 HTTPS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c3c39c98-6bb2-4c12-859a-114b5e3df584", + "link": "https://learn.microsoft.com/azure/private-link/private-link-overview", + "service": "AKS", + "severity": "中等", + "text": "使用專用終結點(首選)或虛擬網路服務終結點從群集訪問 PaaS 服務", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "不要在 CORS 配置中使用通配符,因為這允許所有源訪問服務(從而破壞 CORS 的目的)。具體而言,僅允許您希望能夠訪問服務的源。", - "guid": "68266abc-a264-4f9a-89ae-d9c55d04c2c3", - "link": "https://learn.microsoft.com/azure/app-service/app-service-web-tutorial-rest-api", - "service": "App Services", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "高", - "text": "不得將通配符用於 CORS", - "waf": "安全" + "text": "選擇最適合你要求的 CNI 網路外掛程式(建議使用 Azure CNI)", + "waf": "可靠性" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "不得在生產環境中啟用遠端調試,因為這會在服務上打開其他埠,從而增加攻擊面。請注意,該服務會在 48 小時後自動轉為遠端調試。", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "7faf12e7-0943-4f63-8472-2da29c2b1cd6", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", "severity": "高", - "text": "關閉遠端調試", - "waf": "安全" + "text": "如果使用 Azure CNI,請根據每個節點的最大 Pod 數相應地調整子網的大小", + "waf": "性能" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "啟用 Defender for App Service。 這(除其他威脅外)檢測與已知惡意IP位址的通信。 在操作過程中查看 Defender for App Service 中的建議。", - "guid": "18d2ddb1-0725-4769-be66-91a4834ac932", - "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-app-service-introduction", - "service": "App Services", - "severity": "中等", - "text": "啟用 Defender for Cloud - Defender for App Service", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "22f54b29-bade-43aa-b1e8-c38ec9366673", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", + "severity": "高", + "text": "如果使用 Azure CNI,請檢查每個節點的最大 Pod 數(預設為 30)", + "waf": "性能" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "Azure 在其網路上提供 DDoS 基本保護,可以通過智慧 DDoS 標準功能進行改進,該功能可以瞭解正常的流量模式並檢測異常行為。DDoS 標準適用於虛擬網路,因此必須為應用前面的網路資源(例如應用程式閘道或 NVA)配置它。", - "guid": "223ece80-b123-4071-a541-6415833ea3ad", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "App Services", - "severity": "中等", - "text": "在 WAF VNet 上啟用 DDOS 保護標準", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "description": "對於內部應用,組織通常會在其防火牆中打開整個AKS子網。這也會打開對節點的網路訪問,並可能打開對 Pod 的訪問(如果使用 Azure CNI)。如果 LoadBalancer IP 位於不同的子網中,則只有此子網可供應用用戶端使用。另一個原因是,如果 AKS 子網中的 IP 位址是稀缺資源,則將其 IP 位址用於服務會降低群集的最大可伸縮性。", + "guid": "13c00567-4b1e-4945-a459-c373e7ed6162", + "link": "https://learn.microsoft.com/azure/aks/internal-lb", + "service": "AKS", + "severity": "低", + "text": "如果使用專用IP LoadBalancer服務,請使用專用子網(而不是 AKS 子網)", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "如果使用 Azure 容器註冊表中儲存的映像,請使用其專用終結點和應用設置“WEBSITE_PULL_IMAGE_OVER_VNET”通過虛擬網络從 Azure 容器註冊表拉取這些映射。", - "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", - "severity": "中等", - "text": "通過虛擬網路拉取容器", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "43f63047-22d9-429c-8b1c-d622f54b29ba", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", + "severity": "高", + "text": "相應調整服務 IP 位址範圍的大小(這將限制群集的可伸縮性)", + "waf": "可靠性" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "按照參與的滲透測試規則對 Web 應用程式進行滲透測試。", - "guid": "eb2eb03d-d9a2-4582-918d-2ddb10725769", - "link": "https://learn.microsoft.com/azure/security/fundamentals/pen-testing", - "service": "App Services", - "severity": "中等", - "text": "進行滲透測試", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "57bf217f-6dc8-481c-81e2-785773e9c00f", + "link": "https://learn.microsoft.com/azure/aks/use-byo-cni", + "service": "AKS", + "severity": "低", + "text": "如果需要,請添加您自己的 CNI 外掛程式", "waf": "安全" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "部署根據 DevSecOps 實踐驗證和掃描漏洞的受信任代碼。", - "guid": "19aed9c5-5d04-4c2c-9919-ca0b2c12159e", - "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/devsecops-in-azure", - "service": "App Services", - "severity": "中等", - "text": "部署經過驗證的代碼", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "低", + "text": "如果需要,請在 AKS 中配置每個節點的公共 IP", + "waf": "性能" }, { - "arm-service": "microsoft.web/sites", - "checklist": "Azure App Service Review", - "description": "使用最新版本的受支援平臺、程式設計語言、協定和框架。", - "guid": "114b933d-f574-4ecc-ad9b-d3bafcda3b54", - "link": "https://learn.microsoft.com/azure/app-service/overview-patch-os-runtime", - "service": "App Services", - "severity": "高", - "text": "使用最新的平臺、語言、協定和框架", - "waf": "安全" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b3808b9f-a1cf-4204-ad01-3a923ce474db", + "link": "https://learn.microsoft.com/azure/aks/concepts-network", + "service": "AKS", + "severity": "中等", + "text": "使用入口控制器公開基於 Web 的應用,而不是使用 LoadBalancer 類型的服務公開它們", + "waf": "可靠性" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", - "severity": "高", - "text": "使 2 個副本具有 99.9% 的讀取操作可用性", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ccb534e7-416e-4a1d-8e93-533b53199085", + "link": "https://learn.microsoft.com/azure/aks/nat-gateway", + "service": "AKS", + "severity": "低", + "text": "使用 Azure NAT 閘道作為 outboundType 來縮放出口流量", "waf": "可靠性" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", - "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", - "service": "Cognitive Search", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中等", - "text": "使 3 個副本具有 99.9% 的讀/寫操作可用性", + "text": "使用IP的動態分配來避免 Azure CNI IP 耗盡", "waf": "可靠性" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", - "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", - "service": "Cognitive Search", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "高", - "text": "通過啟用讀取和/或寫入副本來利用可用區", - "waf": "可靠性" + "text": "如果安全要求要求,請使用 AzFW/NVA 篩選出口流量", + "waf": "安全" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中等", - "text": "對於區域冗餘,請在2個或更多區域中為搜索手動創建服務,因為它不提供跨地理區域複製搜索索引的自動方法", - "waf": "可靠性" + "text": "如果使用公共 API 終端節點,請限制可以存取它的 IP 位址", + "waf": "安全" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", - "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", - "service": "Cognitive Search", - "severity": "中等", - "text": "若要跨多個服務同步數據,請使用索引器更新多個服務上的內容,或使用 REST API 推送多個服務上的內容更新", - "waf": "可靠性" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "高", + "text": "如果要求要求,請使用私有集群", + "waf": "安全" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review 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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "中等", - "text": "使用 Azure 流量管理器協調請求", - "waf": "可靠性" + "text": "對於 Windows 2019 和 2022 AKS 節點,可以使用 Calico 網路策略", + "waf": "安全" }, { - "arm-service": "Microsoft.Search/searchServices", - "checklist": "Cognitive Search Review Checklist", - "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", - "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", - "service": "Cognitive Search", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "高", - "text": "備份和還原 Azure 認知搜索索引。使用此範例代碼將索引定義和快照備份到一系列 Json 檔", - "waf": "可靠性" + "text": "啟用 Kubernetes 網路策略選項 (Calico/Azure)", + "waf": "安全" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization Checklist", - "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", - "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", - "service": "Azure Monitor", - "text": "Azure Monitor 中的數據收集規則 -https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview", - "training": "https://azure.microsoft.com/pricing/reservations/", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "85e2223e-ce8b-4b12-907c-a5f16f158e3e", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", + "severity": "高", + "text": "使用 Kubernetes 網路策略提高集群內安全性", + "waf": "安全" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "text": "檢查未找到底層數據源的備份實例", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "a3a92c2d-e7e2-4165-a3a8-7af4a7a1f893", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-network", + "service": "AKS", + "severity": "高", + "text": "將 WAF 用於 Web 工作負載(UI 或 API)", + "waf": "安全" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "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", - "text": "刪除或存檔未關聯的服務(磁碟、網卡、IP 位址等)", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "中等", + "text": "在 AKS 虛擬網路中使用 DDoS 標準", + "waf": "安全" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "text": "考慮在網站恢復存儲和非任務關鍵型應用程式的備份之間取得良好的平衡", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "低", + "text": "如果需要,請添加公司 HTTP 代理", + "waf": "安全" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization 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", - "text": "檢查 40 個不同 Log Analytics 工作區之間的支出和節省機會 - 對非生產工作區使用不同的保留和數據收集 - 創建每日上限以實現意識和層大小調整 - 如果確實設置了每日上限,除了在達到上限時創建警報外,請確保還創建警報規則,以便在達到某個百分比(例如 90%)時收到通知。- 如果可能,考慮工作空間改造 - 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": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e9855d04-c3c3-49c9-a6bb-2c12159a114b", + "link": "https://learn.microsoft.com/azure/aks/servicemesh-about", + "service": "AKS", + "severity": "中等", + "text": "考慮使用服務網格進行高級微服務通信管理", + "waf": "安全" }, { - "arm-service": "Microsoft.Insights/components", - "checklist": "Cost Optimization 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", - "text": "強制執行清除日誌策略和自動化(如果需要,可以將記錄移至冷存儲)", - "training": "https://www.youtube.com/watch?v=nHQYcYGKuyw", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "67f7a9ed-5b31-4f38-a3f3-9812b2463cff", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-metric-alerts", + "service": "AKS", + "severity": "高", + "text": "設定有關最關鍵指標的警報(請參閱容器見解以獲取建議)", + "waf": "操作" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "text": "檢查磁碟是否確實需要,如果不是:刪除。如果需要,請尋找較低的儲存層或使用備份 -", - "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/manage-automation", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "337453a3-cc63-4963-9a65-22ac19e80696", + "link": "https://learn.microsoft.com/azure/advisor/advisor-get-started", + "service": "AKS", + "severity": "低", + "text": "定期查看 Azure 顧問,瞭解有關群集的建議", + "waf": "操作" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization 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", - "text": "考慮使用自定義規則將未使用的存儲移動到較低層 - 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": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "3aa70560-e7e7-4968-be3d-628af35b2ced", + "link": "https://learn.microsoft.com/azure/aks/certificate-rotation", + "service": "AKS", + "severity": "低", + "text": "啟用 AKS 自動證書輪換", + "waf": "操作" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "VM", - "text": "確保 advisor 配置為適合 VM 大小調整", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "e189c599-df0d-45a7-9dd4-ce32c1881370", + "link": "https://learn.microsoft.com/azure/aks/supported-kubernetes-versions", + "service": "AKS", + "severity": "高", + "text": "定期(例如,每季度)升級 kubernetes 版本,或使用 AKS 自動升級功能", + "waf": "操作" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "description": "通過在成本分析系統中搜索計量類別許可證進行檢查", - "guid": "59ae568b-a38d-4498-9e22-13dbd7bb012f", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/manage/centralize-operations", - "service": "VM", - "text": "在所有 Windows VM 上運行腳本 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 - 如果頻繁創建 Windows VM,請考慮實施策略", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "6f7c4c0d-4e51-4464-ad24-57ed67138b82", + "link": "https://learn.microsoft.com/azure/aks/node-updates-kured", + "service": "AKS", + "severity": "高", + "text": "如果您不使用 node-image 升級,請使用 kured 進行 Linux 節點升級", + "waf": "操作" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", - "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", - "service": "VM", - "text": "如果您已經擁有許可證,也可以將其置於 AHUB https://learn.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux?tabs=rhelpayg%2Crhelbyos%2CrhelEnablebyos%2Crhelcompliance", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "139c9580-ade3-426a-ba09-cf157d9f6477", + "link": "https://learn.microsoft.com/azure/aks/node-image-upgrade", + "service": "AKS", + "severity": "高", + "text": "定期(例如,每周)升級群集節點映像的常規過程", + "waf": "操作" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", - "service": "VM", - "text": "使用靈活性選項(不超過 4-5 個系列)整合保留的 VM 系列", - "training": "https://learn.microsoft.com/azure/automation/automation-solution-vm-management", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "0102ce16-ee30-41e6-b882-e52e4621dd68", + "link": "https://learn.microsoft.com/azure/architecture/example-scenario/bedrock/bedrock-automated-deployments", + "service": "AKS", + "severity": "低", + "text": "考慮使用 gitops 將應用程式或集群配置部署到多個集群", + "waf": "操作" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "text": "利用 Azure 預留實例:此功能允許將 VM 預留 1 年或 3 年,與 PAYG 價格相比,可顯著節省成本。", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "d7672c26-7602-4482-85a4-14527fbe855c", + "link": "https://learn.microsoft.com/azure/aks/command-invoke", + "service": "AKS", + "severity": "低", + "text": "請考慮在專用群集上使用 AKS 命令調用", + "waf": "操作" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", - "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", - "service": "VM", - "text": "只能保留較大的磁碟 => 1 TiB -", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "31d7aaab-7571-4449-ab80-53d89e89d17b", + "link": "https://learn.microsoft.com/azure/aks/node-auto-repair#node-autodrain", + "service": "AKS", + "severity": "低", + "text": "對於計劃的事件,請考慮使用 Node Auto Drain", + "waf": "操作" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", - "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", - "service": "VM", - "text": "調整大小優化后", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "ed0fda7f-211b-47c7-8b6e-c18873fb473c", + "link": "https://learn.microsoft.com/azure/aks/faq", + "service": "AKS", + "severity": "高", + "text": "開發自己的治理實踐,以確保節點 RG(又名“基礎設施 RG”)中的操作員不會執行任何更改", + "waf": "操作" }, { - "arm-service": "Microsoft.Sql/servers", - "checklist": "Cost Optimization Checklist", - "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", - "service": "Azure SQL", - "text": "檢查是否適用並強制執行策略/更改 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": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "低", + "text": "使用自定義節點 RG(又名“Infra RG”)名稱", + "waf": "操作" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", - "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", - "service": "VM", - "text": "虛擬機 + 許可證部分折扣 (ahub + 3YRI) 約為 70% 的折扣", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b2463cff-e189-4c59-adf0-d5a73dd4ce32", + "link": "https://kubernetes.io/docs/setup/release/notes/", + "service": "AKS", + "severity": "中等", + "text": "請勿在 YAML 清單中使用已棄用的 Kubernetes API", + "waf": "操作" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization 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", - "text": "考慮使用 VMSS 來滿足需求,而不是按比例調整", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c1881370-6f7c-44c0-b4e5-14648d2457ed", + "link": "https://learn.microsoft.com/azure-stack/aks-hci/adapt-apps-mixed-os-clusters", + "service": "AKS", + "severity": "低", + "text": "污染 Windows 節點", + "waf": "操作" }, { "arm-service": "microsoft.containerservice/managedClusters", - "checklist": "Cost Optimization Checklist", - "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "checklist": "Azure AKS Review", + "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", - "text": "使用 AKS 自動縮放程式符合群集使用方式(確保 Pod 要求與縮放程式符合)", - "waf": "成本" + "severity": "低", + "text": "使 Windows 容器修補程式級別與主機修補程式級別保持同步", + "waf": "操作" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization 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", - "text": "將恢復點移至保管庫存檔(如果適用)(驗證)", - "training": "https://azure.microsoft.com/pricing/reservations/", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "description": "通過群集級別的診斷設置", + "guid": "5b56ad48-408f-4e72-934c-476ba280dcf5", + "link": "https://learn.microsoft.com/azure/aks/monitor-aks", + "service": "AKS", + "severity": "低", + "text": "將主日誌(又名 API 紀錄)發送到 Azure Monitor 或首選日誌管理解決方案", + "waf": "操作" }, { - "arm-service": "Microsoft.Databricks/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", - "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", - "service": "Databricks", - "text": "請考慮盡可能使用帶回退功能的現成 VM。考慮群集的自動終止。", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "64d1a846-e28a-4b6b-9a33-22a635c15a21", + "link": "https://learn.microsoft.com/azure/aks/node-pool-snapshot", + "service": "AKS", + "severity": "低", + "text": "如果需要,請使用 nodePool 快照", "waf": "成本" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", - "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", - "service": "Azure Functions", - "text": "功能 - 重用連接", - "training": "https://learn.microsoft.com/azure/cost-management-billing/reservations/reservation-apis?toc=%2Fazure%2Fcost-management-billing%2Ftoc.json", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c5a5b252-1e44-4a59-a9d2-399c4d7b68d0", + "link": "https://learn.microsoft.com/azure/aks/spot-node-pool", + "service": "AKS", + "severity": "低", + "text": "考慮將現成節點池用於對時間敏感的工作負載", + "waf": "操作" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", - "link": "https://learn.microsoft.com/azure/automation/update-management/overview", - "service": "Azure Functions", - "text": "函數 - 本地快取資料", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "低", + "text": "考慮用於快速突發的 AKS 虛擬節點", + "waf": "操作" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", - "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", - "service": "Azure Functions", - "text": "函數 - 冷啟動 - 使用“從包運行”功能。這樣,代碼將下載為單個 zip 檔。例如,這可以顯著改進具有大量節點模組的 Javascript 函數。使用特定於語言的工具來減小包大小,例如,搖樹 Javascript 應用程式。", - "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "6f8389a7-f82c-4b8e-a8c0-aa63a25a4956", + "link": "https://learn.microsoft.com/azure/azure-monitor/insights/container-insights-overview", + "service": "AKS", + "severity": "高", + "text": "使用 Container Insights(或 Prometheus 等其他工具)監控集群指標", + "waf": "操作" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "Azure Functions", - "text": "功能 - 保持功能溫暖", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "成本" - }, - { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", - "link": "https://learn.microsoft.com/azure/governance/policy/overview", - "service": "Azure Functions", - "text": "使用具有不同功能的自動縮放時,可能會有一個資源驅動所有資源的所有自動縮放 - 請考慮將其移動到單獨的消耗計劃(並考慮更高的 CPU 計劃)", - "waf": "成本" - }, - { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", - "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", - "service": "Azure Functions", - "text": "給定計劃中的函數應用都縮放在一起,因此縮放的任何問題都可能影響計劃中的所有應用。", - "waf": "成本" - }, - { - "arm-service": "Microsoft.Web/sites", - "checklist": "Cost Optimization Checklist", - "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", - "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", - "service": "Azure Functions", - "text": "我需要為「等待時間」付費嗎?這個問題通常是在執行異步操作並等待結果的 C# 函數的上下文中提出的,例如 await Task.Delay(1000) 或 await client。GetAsync('http://google.com')。答案是肯定的 - GB 秒計算基於函數的開始和結束時間以及該時間段內的記憶體使用方式。在這段時間內實際發生的CPU活動未計入計算。此規則的一個例外是,如果使用的是持久函數。您無需為在業務流程協調程式函數中等待所花費的時間付費。在可能的情況下應用需求塑造技術(開發環境?)https://github.com/Azure-Samples/functions-csharp-premium-scaler", - "waf": "成本" - }, - { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Cost Optimization Checklist", - "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "Front Door", - "text": "Frontdoor - 關閉預設主頁在應用的應用程式設置中,將 AzureWebJobsDisableHomepage 設置為 true。這將向PoP返回204(無內容),因此僅返回標頭數據。", - "waf": "成本" - }, - { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Cost Optimization 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", - "text": "Frontdoor - 路由到不返回任何內容的內容。設置函數、函數代理,或在 WebApp 中添加返回 200 (OK) 且不發送內容或發送最少內容的路由。這樣做的好處是您可以在調用時註銷。", - "waf": "成本" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", - "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", - "service": "Storage", - "text": "考慮為使用較少的數據存檔層", - "waf": "成本" - }, - { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", - "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", - "service": "VM", - "text": "檢查大小與層不匹配的磁碟大小(即 513 GiB 磁碟將支付 P30 (1TiB) 並考慮調整大小", - "waf": "成本" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", - "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", - "service": "Storage", - "text": "盡可能考慮使用標準 SSD,而不是 Premium 或 Ultra", - "waf": "成本" - }, - { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization 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", - "text": "對於存儲帳戶,請確保所選層不會增加事務費用(移動到下一層可能會更便宜)", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "高", + "text": "使用 Container Insights(或 Telegraf/ElasticSearch 等其他工具)存儲和分析集群日誌", + "waf": "操作" }, { - "arm-service": "Microsoft.RecoveryServices/vaults", - "checklist": "Cost Optimization Checklist", - "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", - "service": "Site Recovery", - "text": "對於 ASR,如果 RPO/RTO 和複製輸送量允許,請考慮使用標準 SSD 磁碟", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "4621dd68-c5a5-4be2-bdb1-1726769ef669", + "link": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze", + "service": "AKS", + "severity": "中等", + "text": "監控節點的 CPU 和記憶體利用率", + "waf": "操作" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Cost Optimization Checklist", - "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", - "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", - "service": "Storage", - "text": "存儲帳戶:檢查熱層和/或 GRS 必填", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "1a4835ac-9422-423e-ae80-b123081a5417", + "link": "https://learn.microsoft.com/azure/aks/configure-azure-cni", + "service": "AKS", + "severity": "中等", + "text": "如果使用 Azure CNI,請監視每個節點消耗的 Pod IP 的百分比", + "waf": "操作" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", - "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", - "service": "VM", - "text": "磁碟 - 驗證高級 SSD 磁碟在任何地方的使用方式:例如,非生產磁碟可以交換到標準 SSD 或按需高級 SSD", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "description": "OS 磁碟上的 I/O 是關鍵資源。如果節點中的操作系統在 I/O 上受到限制,這可能會導致不可預知的行為,通常最終導致節點被聲明為 NotReady", + "guid": "415833ea-3ad3-4c2d-b733-165c3acbe04b", + "link": "https://learn.microsoft.com/azure/virtual-machines/premium-storage-performance", + "service": "AKS", + "severity": "中等", + "text": "監視節點中的OS磁碟佇列深度", + "waf": "操作" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", - "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", - "service": "Synapse", - "text": "創建預算以管理成本並創建警報,自動通知利益相關者支出異常和超支風險。", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "be209d39-fda4-4777-a424-d116785c2fa5", + "link": "https://learn.microsoft.com/azure/aks/load-balancer-standard", + "service": "AKS", + "severity": "中等", + "text": "如果不對 AzFW/NVA 使用出口篩選,請監視標準 ALB 分配的 SNAT 連接埠", + "waf": "操作" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "Synapse", - "text": "將成本數據匯出到存儲帳戶以進行其他數據分析。", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "74c2ee76-569b-4a79-a57e-dedf91b022c9", + "link": "https://learn.microsoft.com/azure/aks/aks-resource-health", + "service": "AKS", + "severity": "中等", + "text": "訂閱 AKS 群集的資源運行狀況通知", + "waf": "操作" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "Synapse", - "text": "通過在不使用資源時暫停資源來控制專用 SQL 池的成本。", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "b54eb2eb-03dd-4aa3-9927-18e2edb11726", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", + "severity": "高", + "text": "在 Pod 規範中配置請求和限制", + "waf": "操作" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization Checklist", - "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", - "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", - "service": "Synapse", - "text": "啟用無伺服器 Apache Spark 自動暫停功能,並相應地設置超時值。", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "769ef669-1a48-435a-a942-223ece80b123", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-scheduler", + "service": "AKS", + "severity": "中等", + "text": "強制實施命名空間的資源配額", + "waf": "操作" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization 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", - "text": "創建多個不同大小的 Apache Spark 池定義。", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "081a5417-4158-433e-a3ad-3c2de733165c", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", + "service": "AKS", + "severity": "高", + "text": "確保訂閱具有足夠的配額來橫向擴展節點池", + "waf": "操作" }, { - "arm-service": "Microsoft.Synapse/workspaces", - "checklist": "Cost Optimization 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", - "text": "使用預購計劃購買為期一年的 Azure Synapse 提交單元 (SCU),以節省 Azure Synapse Analytics 成本。", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "中等", + "text": "使用群集自動縮放程式", + "waf": "性能" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", - "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", - "service": "VM", - "text": "將現成 VM 用於可中斷作業:這些 VM 可以以折扣價競標和購買,為非關鍵工作負載提供經濟高效的解決方案。", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", + "severity": "低", + "text": "自定義 AKS 節點池的節點配置", + "waf": "性能" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "544451e1-92d3-4442-a3c7-628637a551c5", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "VM", - "text": "合理調整所有 VM 的大小", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "faa19bfe-9d55-4d04-a3c4-919ca1b2d121", + "link": "https://learn.microsoft.com/azure/aks/concepts-scale", + "service": "AKS", + "severity": "中等", + "text": "需要時使用 Horizontal Pod Autoscaler", + "waf": "性能" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", - "service": "VM", - "text": "將 VM 大小與規範化大小和最新大小交換", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "description": "更大的節點將帶來更高的性能和功能,例如臨時磁碟和加速網路,但它們會增加爆炸半徑並降低擴展粒度", + "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", + "severity": "高", + "text": "考慮適當的節點大小,不要太大或太小", + "waf": "性能" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", - "text": "調整 VM 大小 - 從低於 5% 的監視使用率開始,然後工作到 40%", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "38800e6a-ae01-40a2-9fbc-ae5a06e5462d", + "link": "https://learn.microsoft.com/azure/aks/quotas-skus-regions#service-quotas-and-limits", + "service": "AKS", + "severity": "低", + "text": "如果可伸縮性需要超過 5000 個節點,請考慮使用其他 AKS 群集", + "waf": "性能" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Cost Optimization Checklist", - "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "VM", - "text": "容器化應用程式可以提高 VM 密度並節省擴展成本", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "成本" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "9583c0f6-6083-43f6-aa6b-df7102c901bb", + "link": "https://learn.microsoft.com/azure/event-grid/event-schema-aks", + "service": "AKS", + "severity": "低", + "text": "考慮訂閱 EventGrid Events for AKS 自動化", + "waf": "性能" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", - "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", - "service": "IoT Hub DPS", - "severity": "高", - "text": "根據業務和 SLO 要求選擇正確的邏輯應用託管計劃", - "waf": "可靠性" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c5016d8c-c6c9-4165-89ae-673ef0fff19d", + "link": "https://learn.microsoft.com/azure/aks/manage-abort-operations", + "service": "AKS", + "severity": "低", + "text": "若要在 AKS 群集上長時間運行操作,請考慮事件終止", + "waf": "性能" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "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", - "severity": "高", - "text": "使用區域冗餘和可用性區域保護邏輯應用免受區域故障的影響", - "waf": "可靠性" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "c4e37133-f186-4ce1-aed9-9f1b32f6e021", + "link": "https://learn.microsoft.com/azure/aks/use-azure-dedicated-hosts", + "service": "AKS", + "severity": "低", + "text": "如果需要,請考慮將 Azure 專用主機用於 AKS 節點", + "waf": "性能" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "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", "severity": "高", - "text": "考慮為關鍵工作負載制定跨區域災難恢復策略", - "waf": "可靠性" + "text": "使用臨時OS磁碟", + "waf": "性能" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", - "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", - "service": "IoT Hub DPS", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "f0ce315f-1120-4166-8206-94f2cf3a4d07", + "link": "https://learn.microsoft.com/azure/virtual-machines/disks-types", + "service": "AKS", "severity": "高", - "text": "如果部署到獨立環境,請使用或遷移到應用服務環境 (ASE) v3", - "waf": "可靠性" + "text": "對於非臨時磁碟,在運行多個 Pod/節點時,請為節點使用高 IOPS 和更大的 OS 磁碟,因為它需要高性能才能運行多個 Pod,並且會生成具有預設 AKS 日誌輪換閾值的大量日誌", + "waf": "性能" }, { - "arm-service": "Microsoft.Devices/provisioningServices", - "checklist": "Device Provisioning Service Review", - "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", - "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", - "service": "IoT Hub DPS", - "severity": "中等", - "text": "利用 Azure DevOps 或 GitHub 簡化 CI/CD 並保護邏輯應用代碼", - "waf": "操作" + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "39c486ce-d5af-4062-89d5-18bb5fd795db", + "link": "https://learn.microsoft.com/azure/aks/use-ultra-disks", + "service": "AKS", + "severity": "低", + "text": "對於超高性能存儲選項,請在 AKS 上使用超級磁碟For hyper performance storage option use Ultra Disks on AKS", + "waf": "性能" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", - "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", - "service": "Bot service", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "9f7547c1-747d-4c56-868a-714435bd19dd", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-multi-region", + "service": "AKS", "severity": "中等", - "text": "遵循 Azure 機器人服務中的可靠性支持建議", - "waf": "可靠性" + "text": "避免將狀態保留在群集中,並將數據存儲在外部(AzStorage、AzSQL、Cosmos 等)", + "waf": "性能" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", - "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", - "service": "Bot service", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "24429eb7-2281-4376-85cc-57b4a4b18142", + "link": "https://learn.microsoft.com/azure/aks/operator-best-practices-storage", + "service": "AKS", "severity": "中等", - "text": "部署具有本地數據駐留和區域合規性的機器人", - "waf": "可靠性" + "text": "如果使用 AzFiles Standard,出於性能原因,請考慮使用 AzFiles Premium 和/或 ANF", + "waf": "性能" }, { - "arm-service": "Microsoft.BotService/botServices", - "checklist": "Azure Bot Service", - "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", + "arm-service": "microsoft.containerservice/managedClusters", + "checklist": "Azure AKS Review", + "guid": "83958a8c-2689-4b32-ab57-cfc64546135a", + "link": "https://learn.microsoft.com/azure/aks/availability-zones#azure-disk-availability-zone-support", + "service": "AKS", "severity": "中等", - "text": "Azure 機器人服務在全域和區域服務的主動-主動模式下運行。發生中斷時,無需檢測錯誤或管理服務。Azure 機器人服務在多區域地理體系結構中自動執行自動故障轉移和自動恢復。對於歐盟機器人區域服務,Azure 機器人服務在歐洲境內提供兩個完整區域,並提供主動/主動複製,以確保冗餘。對於全球機器人服務,所有可用的區域/地理位置都可以作為全球足跡。", - "waf": "可靠性" + "text": "如果使用 Azure 磁碟和可用區,請考慮在區域內為 LRS 磁碟設置節點池,並使用 VolumeBindingMode:WaitForFirstConsumer 在正確的區域中預配存儲,或將 ZRS 磁碟用於跨多個區域的節點池", + "waf": "性能" }, { - "checklist": "SAP Checklist", - "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", - "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", - "service": "SAP", + "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": "中等", - "text": "Azure SAP 解決方案中心 (ACSS) 是一項 Azure 產品/服務,可使 SAP 成為 Azure 上的頂級工作負載。ACSS 是一種端到端解決方案,使你能夠在 Azure 上創建和運行 SAP 系統作為統一的工作負載,並為創新提供更無縫的基礎。可以利用新的和現有的基於 Azure 的 SAP 系統的管理功能。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-center-sap-solutions/?source=recommendations", + "text": "使用一個 Entra 租戶來管理 Azure 資源,除非你對多租戶有明確的法規或業務要求。", "waf": "操作" }, { - "checklist": "SAP 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", - "severity": "中等", - "text": "Azure 支援在Linux和 Windows 中自動執行 SAP 部署。SAP 部署自動化框架是一種開源編排工具,可以部署、安裝和維護 SAP 環境。", - "training": "https://github.com/Azure/sap-automation", + "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": "低", + "text": "使用多租戶自動化方法管理 Microsoft Entra ID 租戶。", "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", - "service": "SAP", - "severity": "中等", - "text": "在符合 RTO 要求的任何時間點和時間範圍內對生產資料庫執行時間點恢復;時間點恢復通常包括操作員在DBMS層上或通過SAP刪除數據時出現的錯誤", - "waf": "可靠性" - }, - { - "checklist": "SAP Checklist", - "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", - "service": "SAP", - "severity": "中等", - "text": "測試備份和恢復時間,以驗證它們是否滿足在災難發生后同時還原所有系統的 RTO 要求。", - "waf": "可靠性" - }, - { - "checklist": "SAP Checklist", - "guid": "b651423c-8552-42db-a545-5cb50c05527a", - "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", - "service": "SAP", + "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": "高", - "text": "可以在配對區域之間複製標準存儲,但不能使用標準存儲來存儲資料庫或虛擬硬碟。您只能在使用的配對區域之間複製備份。對於所有其他數據,請使用本機 DBMS 功能(如 SQL Server Always On 或 SAP HANA 系統複製)運行複製。將 Site Recovery、rsync 或 robocopy 以及其他第三方軟體組合用於 SAP 應用程式層。", - "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", - "waf": "可靠性" - }, - { - "checklist": "SAP Checklist", - "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", - "severity": "中等", - "text": "使用 Azure 可用性區域實現高可用性時,必須考慮 SAP 應用程式伺服器和資料庫伺服器之間的延遲。對於具有高延遲的區域,需要制定操作過程,以確保 SAP 應用程式伺服器和資料庫伺服器始終在同一區域中運行。", - "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", - "waf": "可靠性" + "text": "使用具有相同 ID 的 Azure Lighthouse 進行多租戶管理。", + "training": "https://learn.microsoft.com/azure/lighthouse/concepts/cross-tenant-management-experience", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", - "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", - "service": "SAP", + "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": "高", - "text": "設置從本地到主要和次要 Azure 災難恢復區域的 ExpressRoute 連接。此外,作為使用 ExpressRoute 的替代方法,請考慮設置從本地到主要和輔助 Azure 災難恢復區域的 VPN 連接。", - "training": "https://learn.microsoft.com/azure/expressroute/use-s2s-vpn-as-backup-for-expressroute-privatepeering", - "waf": "可靠性" - }, - { - "checklist": "SAP Checklist", - "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "SAP", - "severity": "低", - "text": "跨區域複製證書、機密或密鑰等金鑰保管庫內容,以便解密DR區域中的數據。", - "waf": "可靠性" - }, - { - "checklist": "SAP Checklist", - "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", - "service": "SAP", - "severity": "中等", - "text": "對等連接主虛擬網路和災難恢復虛擬網路。例如,對於 HANA 系統複製,需要將 SAP HANA DB 虛擬網路對等互連到災難恢復網站的 SAP HANA DB 虛擬網路。", - "waf": "可靠性" + "text": "如果向合作夥伴授予管理租戶的訪問許可權,請使用 Azure Lighthouse。", + "waf": "成本" }, { - "checklist": "SAP Checklist", - "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", - "service": "SAP", - "severity": "低", - "text": "如果將 Azure NetApp 檔案儲存用於 SAP 部署,則至少要在兩個區域的高級層中創建兩個 Azure NetApp 檔帳戶。", - "training": "https://learn.microsoft.com/training/modules/choose-service-level-azure-netapp-files-hpc-applications/2-identify-decision-criteria", - "waf": "可靠性" + "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": "高", + "text": "強制實施與雲操作模型相符的 RBAC 模型。跨管理組和訂閱確定範圍和分配。", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", + "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": "高", - "text": "應使用本機資料庫複製技術來同步HA對中的資料庫。", - "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/?source=recommendations", - "waf": "可靠性" + "text": "僅對所有帳戶類型使用身份驗證類型「工作或學校帳戶」。避免使用 Microsoft 帳戶", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", - "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", - "service": "SAP", - "severity": "高", - "text": "主虛擬網路 (VNet) 的 CIDR 不應與DR網站的 VNet 的 CIDR 衝突或重疊", - "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", - "waf": "可靠性" + "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": "中等", + "text": "僅使用組來分配許可權。如果已建立組管理系統,則將本地組添加到僅 Entra ID 組。", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", - "service": "SAP", + "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": "高", - "text": "使用 Site Recovery 將應用程式伺服器複製到 DR 網站。Site Recovery 還可以説明將中心服務群集 VM 複製到DR網站。調用DR時,需要在DR網站上重新配置Linux Pacemaker群集(例如,替換VIP或SBD、運行 corosync.conf 等)。", - "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", - "waf": "可靠性" + "text": "對有權訪問 Azure 環境的任何用戶強制實施 Microsoft Entra ID 條件訪問策略。", + "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "waf": "安全" }, { - "checklist": "SAP 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", + "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": "高", - "text": "考慮 SAP 軟體針對單點故障的可用性。這包括應用程式中的單點故障,例如 SAP NetWeaver 和 SAP S/4HANA 架構中使用的 DBMS、SAP ABAP 和 ASCS + SCS。此外,還有其他工具,例如 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": "可靠性" + "text": "對有權訪問 Azure 環境的任何使用者強制實施多重身份驗證。", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", - "service": "SAP", - "severity": "高", - "text": "對於 SAP 和 SAP 資料庫,請考慮實現自動故障轉移群集。在 Windows 中,Windows Server 故障轉移群集支援故障轉移。在 Linux 中,Linux Pacemaker 或第三方工具(如 SIOS Protection Suite 和 Veritas InfoScale)支援故障轉移。", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "可靠性" + "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": "中等", + "text": "強制實施 Microsoft Entra ID 特權標識管理 (PIM) 以建立零長期訪問許可權和最低特權。", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", - "service": "SAP", - "severity": "高", - "text": "Azure 不支援主 VM 和輔助 VM 共用 DBMS 數據存儲的體系結構。對於 DBMS 層,常見的體系結構模式是同時複製資料庫,並使用與主虛擬機和輔助虛擬機使用的存儲堆疊不同的存儲堆疊。", - "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": "可靠性" + "checklist": "Azure Landing Zone Review", + "guid": "8b9fe5c4-1049-4d40-9a92-3c3474d00018", + "link": "https://learn.microsoft.com/en-us/entra/identity/domain-services/overview", + "service": "Entra", + "severity": "中等", + "text": "如果計劃從 Active Directory 域服務切換到 Entra 域服務,請評估所有工作負載的相容性。", + "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", - "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", - "service": "SAP", - "severity": "高", - "text": "DBMS 數據和事務/重做日誌檔存儲在 Azure 支援的塊存儲或 Azure NetApp 檔中。不支援將 Azure 檔案儲存或 Azure 高級檔儲存作為 DBMS 資料和/或使用 SAP 工作負載重做日誌檔的存儲。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-databases/2-explore-database-support-azure-for-sap-workloads", - "waf": "可靠性" + "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": "中等", + "text": "將 Microsoft Entra ID 日誌與平臺為中心的 Azure Monitor 集成。Azure Monitor 允許圍繞 Azure 中的日誌和監視數據提供單一事實來源,為組織提供雲原生選項,以滿足日誌收集和保留方面的要求。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", - "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", - "service": "SAP", + "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": "高", - "text": "可以在 Windows 中將 Azure 共用磁碟用於 ASCS + SCS 元件和特定的高可用性方案。為 SAP 應用程式層元件和 DBMS 層單獨設置故障轉移群集。Azure 目前不支援將 SAP 應用程式層元件和 DBMS 層合併到一個故障轉移群集中的高可用性體系結構。", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "可靠性" + "text": "實施緊急訪問或打破玻璃帳戶,以防止租戶範圍的帳戶鎖定。", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "waf": "安全" }, { - "checklist": "SAP 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", - "severity": "高", - "text": "SAP 應用程式層元件 (ASCS) 和 DBMS 層的大多數故障轉移群集都需要故障轉移群集的虛擬 IP 位址。 Azure 負載均衡器應處理所有其他情況的虛擬IP位址。一個設計原則是每個集群配置使用一個負載均衡器。建議使用標準版本的負載均衡器(標準負載均衡器 SKU)。", - "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", - "waf": "可靠性" + "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": "中等", + "text": "請勿使用本地同步帳戶進行 Microsoft Entra ID 角色分配,除非你有特別需要它的方案。", + "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", - "service": "SAP", - "severity": "高", - "text": "確保在負載均衡器上啟用了浮動IP", - "training": "https://learn.microsoft.com/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", - "waf": "可靠性" + "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": "中等", + "text": "使用 Microsoft Entra ID 應用程式代理為遠端使用者提供對應用程式的訪問許可權時,請將其作為平臺資源進行管理,因為每個租戶只能有一個實例。", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability", - "service": "SAP", - "severity": "高", - "text": "在部署高可用性基礎結構之前,請根據所選的區域確定是使用 Azure 可用性集還是可用性區域進行部署。", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "可靠性" + "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": "中等", + "text": "對於需要最大靈活性的網路方案,請使用中心輻射型網路拓撲。", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "安全" }, { - "checklist": "SAP 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", + "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": "高", - "text": "如果要滿足 SAP 元件(中央服務、應用程式伺服器和資料庫)應用程式的基礎結構 SLA,則必須為所有元件選擇相同的高可用性選項(VM、可用性集、可用性區域)。", - "waf": "可靠性" + "text": "在中心虛擬網路中部署共用網路服務,包括 ExpressRoute 閘道、VPN 閘道和 Azure 防火牆或合作夥伴 NVA。如有必要,還可以部署 DNS 服務。", + "waf": "成本" }, { - "checklist": "SAP Checklist", - "guid": "cbe05bbe-209d-4490-ba47-778424d11678", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", + "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": "高", - "text": "不要在同一可用性集中混合使用不同角色的伺服器。將中央服務 VM、資料庫 VM、應用程式 VM 保留在自己的可用性集中", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "可靠性" + "text": "對應用程式登陸區域中的所有公共IP位址使用 DDoS 網路或IP保護計畫。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", - "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", - "service": "SAP", + "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": "中等", - "text": "除非使用鄰近放置組,否則無法在 Azure 可用性區域內部署 Azure 可用性集。", - "training": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "text": "部署合作夥伴網路技術或 NVA 時,請遵循合作夥伴供應商的指導。", "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "9674e7c7-7796-4181-8920-09f4429543ba", - "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", - "service": "SAP", - "severity": "高", - "text": "創建可用性集時,請使用最大數量的容錯域和更新可用的域。例如,如果在一個可用性集中部署兩個以上的 VM,請使用最大數量的容錯域(三個)和足夠的更新域來限制潛在的物理硬體故障、網路中斷或電源中斷的影響,以及 Azure 計劃內維護。默認的容錯域數為 2,以後無法連線更改。", - "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", - "waf": "可靠性" + "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": "低", + "text": "如果需要在中心輻射型方案中在 ExpressRoute 和 VPN 閘道之間傳輸,請使用 Azure 路由伺服器。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", - "severity": "高", - "text": "在可用性集部署中使用 Azure 鄰近放置組時,所有三個 SAP 元件(中央服務、應用程式伺服器和資料庫)都應位於同一鄰近放置組中。", - "waf": "可靠性" + "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": "低", + "text": "如果使用路由伺服器,請對路由伺服器子網使用 /27 前置綴。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", - "severity": "高", - "text": "每個 SAP SID 使用一個鄰近放置組。組不跨可用性區域或 Azure 區域", - "waf": "可靠性" + "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": "中等", + "text": "對於跨 Azure 區域具有多個中心輻射型拓撲的網路體系結構,請在中心 VNet 之間使用全域虛擬網路對等互連將區域相互連接。", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-virtual-networks/", + "waf": "性能" }, { - "checklist": "SAP 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", - "severity": "高", - "text": "根據操作系統的不同,使用以下服務之一來運行 SAP 中心服務群集。", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "可靠性" + "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": "中等", + "text": "使用用於網路的 Azure Monitor 監視 Azure 上網路的端到端狀態。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "ed46b937-913e-4018-9c62-8393ab037e53", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", - "service": "SAP", + "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": "中等", - "text": "Azure 目前不支援將 ASCS 和 DB HA 組合在同一 Linux Pacemaker 群集中;將它們分成單獨的集群。但是,最多可以將五個多個中心服務群集合併到一對 VM 中。", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "text": "如果一個區域中有超過 400 個分支網路,請部署一個額外的中心,以繞過 VNet 對等互連限制 (500) 和可通過 ExpressRoute 播發的最大前綴數 (1000)。", "waf": "可靠性" }, { - "checklist": "SAP 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", + "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": "中等", - "text": "在可用性集或可用性區域中的高可用性對中部署兩個 VM。這些 VM 的大小應相同,並具有相同的存儲配置。", + "text": "將每個路由表的路由數限制為 400 個。", + "waf": "可靠性" + }, + { + "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": "高", + "text": "配置 VNet 對等互連時,請使用「允許流量流向遠端虛擬網路」設置。", "waf": "可靠性" }, { - "checklist": "SAP 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", + "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": "中等", - "text": "Azure 支援在 Red Hat Enterprise Linux (RHEL) 上運行的同一高可用性群集上安裝和配置 SAP HANA 和 ASCS/SCS 和 ERS 實例。", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "可靠性" + "text": "使用 ExpressRoute Direct 時,請配置 MACsec,以便加密組織路由器和 MSEE 之間的第二層級別的流量。該圖顯示了流中的此加密。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", - "severity": "高", - "text": "在高級託管 SSD 上運行所有生產系統,並使用 Azure NetApp 檔或超級磁碟存儲。至少OS磁碟應位於高級層,以便您可以獲得更好的性能和最佳SLA。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", - "waf": "可靠性" + "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": "中等", + "text": "對於無法使用MACsec的情況(例如,不使用ExpressRoute Direct),請使用 VPN 閘道通過 ExpressRoute 專用對等互連建立 IPsec 隧道。", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", - "service": "SAP", + "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": "高", - "text": "應僅在 SAP 認證的存儲類型上運行 Azure 上的 SAP HANA。請注意,某些卷必須在某些磁碟配置(如果適用)上運行。這些配置包括啟用寫入加速器和使用高級存儲。您還需要確保在儲存上運行的檔案系統與在電腦上運行的 DBMS 相容。", - "training": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1?source=recommendations", - "waf": "可靠性" + "text": "確保在 Azure 區域和本地位置之間不使用重疊的 IP 位址空間。", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", - "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", - "service": "SAP", + "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": "中等", + "text": "使用專用 Internet 的位址分配範圍中的 IP 位址 (RFC 1918)。", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "安全" + }, + { + "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": "高", - "text": "請考慮根據用於 SAP 工作負載的儲存類型配置高可用性。Azure Site Recovery 不支援 Azure 中提供的某些存儲服務,因此高可用性配置可能會有所不同。", - "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/2-explore-disaster-recovery-sap-workloads", - "waf": "可靠性" + "text": "確保不會浪費IP位址空間,不要創建不必要的大型虛擬網路(例如/16)。", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "性能" }, { - "checklist": "SAP Checklist", - "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", - "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", - "service": "SAP", + "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": "高", - "text": "不同的本機 Azure 儲存服務(如 Azure 檔存儲、Azure NetApp 檔、Azure 共用磁碟)可能並非在所有區域都可用。因此,若要在故障轉移后在DR區域上設置類似的SAP,請確保在DR網站中提供相應的存儲服務。", + "text": "請勿對生產網站和災難恢復網站使用重疊的IP位址範圍。", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", "waf": "可靠性" }, { - "checklist": "SAP 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", + "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": "中等", - "text": "自動執行 SAP System Start-Stop 以管理成本。", - "waf": "成本" + "text": "對於只需要在 Azure 中進行名稱解析的環境,請使用 Azure 專用 DNS 進行解析,並使用委託區域進行名稱解析(例如“azure.contoso.com”)。", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", - "severity": "低", - "text": "如果將 Azure 高級存儲與 SAP HANA 配合使用,則可以使用 Azure 標準 SSD 儲存來選擇成本敏感的儲存解決方案。但是,請注意,選擇“標準 SSD”或“標準 HDD Azure”存儲將影響各個 VM 的 SLA。此外,對於具有較低 I/O 輸送量和低延遲的系統(例如非生產環境),可以使用較低系列的 VM。", - "waf": "成本" + "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": "中等", + "text": "對於需要跨 Azure 和本地進行名稱解析且沒有現有企業 DNS 服務(如 Active Directory)的環境,請使用 Azure DNS 專用解析程式將 DNS 請求路由到 Azure 或本地 DNS 伺服器。", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-dns-private-resolver/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "9877f353-2591-4e8b-8381-e9043fed1010", - "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", - "service": "SAP", + "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": "低", - "text": "作為成本較低的替代配置(多用途),可以為非生產 HANA 資料庫伺服器 VM 選擇低性能 SKU。但是,請務必注意,某些 VM 類型(如 E 系列)未經 HANA 認證(SAP HANA 硬體目錄),或者無法實現小於 1 毫秒的存儲延遲。", - "waf": "成本" + "text": "需要並部署自己的 DNS(例如 Red Hat OpenShift)的特殊工作負載應使用其首選的 DNS 解決方案。", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", - "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", - "service": "SAP", + "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": "高", - "text": "對管理組、訂閱、資源組和資源強制實施 RBAC 模型", - "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", - "waf": "安全" + "text": "啟用 Azure DNS 的自動註冊,以自動管理虛擬網路中部署的虛擬機的 DNS 記錄的生命週期。", + "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "45911475-e39e-4530-accc-d979366bcda2", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", + "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": "中等", - "text": "強制實施主體傳播,以便透過雲連接器將身份從 SAP 雲應用程式轉發到 SAP 本地(包括 IaaS)", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/2-explore-azure-virtual-machine-auth-access-control", + "text": "使用 Azure Bastion 安全地連接到網路。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", - "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", - "service": "SAP", + "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": "中等", - "text": "使用 SAML 通過 Azure AD 實現 SAP SaaS 應用程式(如 SAP Analytics Cloud、SAP Cloud Platform、Business by Design、SAP Qualtrics 和 SAP C4C)的 SSO。", + "text": "在子網 /26 或更大的情況下使用 Azure Bastion。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", + "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": "中等", - "text": "使用 SAML 對基於 SAP NetWeaver 的 Web 應用程式(如 SAP Fiori 和 SAP Web GUI)實施 SSO。", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", + "text": "使用 Azure Front Door 和 WAF 策略跨 Azure 區域為登陸區域的入站 HTTP/S 連接提供全域保護。", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", - "service": "SAP", - "severity": "中等", - "text": "使用 SAML 對基於 SAP NetWeaver 的 Web 應用程式(如 SAP Fiori 和 SAP Web GUI)實施 SSO。", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/6-exercise-integrate-azure-active-directory-sap-fiori", + "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": "低", + "text": "使用 Azure Front Door 和 Azure 應用程式閘道幫助保護 HTTP/S 應用時,請在 Azure Front Door 中使用 WAF 策略。鎖定 Azure 應用程式閘道,以便僅接收來自 Azure Front Door 的流量。", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", - "service": "SAP", - "severity": "中等", - "text": "可以使用SAP NetWeaver SSO 或合作夥伴解決方案將 SSO 實現到 SAP GUI。", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", + "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": "高", + "text": "當入站 HTTP/S 連接需要 WAF 和其他反向代理時,請將它們部署在登陸區域虛擬網路中,並將它們與它們要保護和向 Internet 公開的應用一起部署。", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", - "service": "SAP", - "severity": "中等", - "text": "對於 SAP GUI 和 Web 瀏覽器存取的 SSO,請實施 SNC/Kerberos/SPNEGO(簡單且受保護的 GSSAPI 協商機制),因為它易於配置和維護。對於使用 X.509 用戶端證書的 SSO,請考慮 SAP 安全登錄伺服器,它是 SAP SSO 解決方案的一個元件。", - "training": "https://learn.microsoft.com/training/modules/explore-identity-services/9-exercise-integrate-active-directory-sap-single-sign-on", + "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": "高", + "text": "使用 Azure DDoS 網路或 IP 保護計劃來幫助保護虛擬網路中的公共 IP 位址終結點。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "安全" }, { - "checklist": "SAP 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", - "severity": "中等", - "text": "對於 SAP GUI 和 Web 瀏覽器存取的 SSO,請實施 SNC/Kerberos/SPNEGO(簡單且受保護的 GSSAPI 協商機制),因為它易於配置和維護。對於使用 X.509 用戶端證書的 SSO,請考慮 SAP 安全登錄伺服器,它是 SAP SSO 解決方案的一個元件。", + "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": "高", + "text": "在即將到來的重大更改之前,規劃如何管理網路出站流量配置和策略。2025 年 9 月 30 日,新部署的預設出站訪問將停用,僅允許顯式訪問配置。", + "waf": "可靠性" + }, + { + "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": "高", + "text": "添加診斷設置以保存所有受保護的公共IP位址(DDoS IP或網路保護)的 DDoS 相關日誌。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "安全" + }, + { + "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": "高", + "text": "確保存在策略分配,以拒絕直接綁定到虛擬機的公共IP位址。 如果特定 VM 上需要公共 IP,請使用排除項。", "waf": "安全" }, { - "checklist": "SAP 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", + "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": "中等", - "text": "使用 OAuth for SAP NetWeaver 實現 SSO,以允許第三方或自定義應用程式訪問 SAP NetWeaver OData 服務。", - "waf": "安全" + "text": "使用 ExpressRoute 作為到 Azure 的主要連接。 使用 VPN 作為備用連接源。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "性能" }, { - "checklist": "SAP Checklist", - "guid": "a747c350-8d4c-449c-93af-393dbca77c48", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", - "service": "SAP", + "arm-service": "microsoft.network/expressRouteCircuits", + "checklist": "Azure Landing Zone Review", + "description": "可以使用 AS 路徑預置和連接權重來影響從 Azure 到本地的流量,並使用自己的路由器中的所有 BGP 屬性來影響從本地到 Azure 的流量。", + "guid": "f29812b2-363c-4efe-879b-599de0d5973c", + "link": "https://learn.microsoft.com/azure/expressroute/expressroute-routing", + "service": "ExpressRoute", "severity": "中等", - "text": "實現 SSO 到 SAP HANA", - "waf": "安全" + "text": "使用多個 ExpressRoute 線路或多個本地位置時,請使用 BGP 屬性來優化路由。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", - "service": "SAP", + "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": "中等", - "text": "將 Azure AD 視為 RISE 上託管的 SAP 系統的標識提供者。有關詳細資訊,請參閱將服務與 Azure AD 集成。", - "waf": "安全" + "text": "根據頻寬和性能要求為 ExpressRoute/VPN 閘道選擇正確的 SKU。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "性能" }, { - "checklist": "SAP Checklist", - "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", - "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", - "service": "SAP", - "severity": "中等", - "text": "對於訪問 SAP 的應用程式,可能需要使用主體傳播來建立 SSO。", - "waf": "安全" + "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": "高", + "text": "確保僅在達到與其成本相符的頻寬時才使用無限數據的 ExpressRoute 線路。", + "waf": "成本" }, { - "checklist": "SAP 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", + "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": "高", + "text": "如果線路對等互連位置支援本地 SKU 的 Azure 區域,則利用 ExpressRoute 的本地 SKU 來降低線路成本。", + "waf": "成本" + }, + { + "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": "中等", - "text": "如果使用的是需要 SAP Identity Authentication Service (IAS) 的 SAP BTP 服務或 SaaS 解決方案,請考慮在 SAP Cloud Identity Authentication Services 和 Azure AD 之間實現 SSO 以存取這些 SAP 服務。此集成允許 SAP IAS 充當代理標識提供者,並將身份驗證請求轉發到 Azure AD,作為中央使用者存儲和標識提供者。", - "waf": "安全" + "text": "在受支援的 Azure 區域中部署區域冗餘 ExpressRoute 閘道。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", - "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", - "service": "SAP", + "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": "中等", - "text": "實現 SSO 到 SAP BTP", - "waf": "安全" + "text": "對於需要頻寬高於 10 Gbps 或專用 10/100 Gbps 埠的方案,請使用 ExpressRoute Direct。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "性能" }, { - "checklist": "SAP 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", + "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": "中等", - "text": "如果使用的是 SAP SuccessFactors,請考慮使用 Azure AD 自動使用者預配。通過此整合,當你向 SAP SuccessFactors 添加新員工時,可以在 Azure AD 中自動建立使用者帳戶。 (可選)可以在 Microsoft 365 或 Azure AD 支援的其他 SaaS 應用程式中建立使用者帳戶。 使用將電子郵件地址寫回 SAP SuccessFactors。", - "waf": "安全" + "text": "如果需要低延遲,或者從本地到 Azure 的輸送量必須大於 10 Gbps,請啟用 FastPath 以從數據路徑繞過 ExpressRoute 閘道。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "性能" }, { - "checklist": "SAP 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", + "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": "中等", - "text": "對 SAP 訂閱強制實施現有管理組策略", - "training": "https://learn.microsoft.com/training/modules/enterprise-scale-organization/4-management-group-subscription-organization", - "waf": "操作" + "text": "使用區域冗餘 VPN 閘道將分支或遠端位置連接到 Azure(如果可用)。", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", + "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", - "severity": "高", - "text": "將緊密耦合的應用程式集成到同一個 SAP 訂閱中,以避免額外的路由和管理複雜性", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-subscriptions", - "waf": "操作" + "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": "中等", + "text": "在本地使用冗餘 VPN 設備(主動/主動或主動/被動)。", + "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", + "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "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": "高", - "text": "利用訂閱作為縮放單元並擴展我們的資源,請考慮按環境部署訂閱,例如。沙箱、非生產、生產", - "training": "https://learn.microsoft.com/training/modules/configure-subscriptions/?source=recommendations", - "waf": "操作" + "text": "如果使用 ExpressRoute Direct,請考慮使用到本地 Azure 區域的 ExpressRoute 本地線路來節省成本。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "成本" }, { - "checklist": "SAP Checklist", - "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", - "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", - "service": "SAP", - "severity": "高", - "text": "確保在訂閱預配過程中增加配額(例如,訂閱中可用的 VM 核心總數)", - "training": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", - "waf": "操作" + "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": "中等", + "text": "當需要流量隔離或專用頻寬時,例如用於分離生產環境和非生產環境,請使用不同的 ExpressRoute 線路。它將幫助您確保隔離的路由域並減輕嘈雜的鄰居風險。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", - "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", - "service": "SAP", - "severity": "低", - "text": "配額 API 是一個 REST API,可用於查看和管理 Azure 服務的配額。如有必要,請考慮使用它。", + "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": "中等", + "text": "使用內置的 Express Route Insights 監視 ExpressRoute 的可用性和利用率。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", - "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", - "service": "SAP", - "severity": "高", - "text": "如果部署到可用性區域,請確保在配額獲得批准后,VM 的區域部署可用。提交支援請求,其中包含所需的訂閱、VM 系列、CPU 數量和可用性區域。", + "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": "中等", + "text": "使用連接監視器監視整個網路的連接監視,尤其是本地和 Azure 之間的連接監視。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "e6e20617-3686-4af4-9791-f8935ada4332", - "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", - "service": "SAP", - "severity": "高", - "text": "確保所需的服務和功能在所選部署區域內可用,例如。ANF、區域等", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/azure-best-practices/multiple-regions?source=recommendations", - "waf": "操作" + "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": "中等", + "text": "使用來自不同對等互連位置的 ExpressRoute 線路實現冗餘。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", - "service": "SAP", + "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": "中等", - "text": "利用 Azure 資源標記進行成本分類和資源分組(:BillTo、部門(或營業單位)、環境(生產、階段、開發)、層(Web 層、應用層)、應用程式擁有者、ProjectName)", - "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", - "waf": "操作" + "text": "如果僅使用單個 ExpressRoute 線路,則使用網站到網站 VPN 作為 ExpressRoute 的故障轉移。", + "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", + "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": "高", - "text": "使用 Azure 備份服務幫助保護 HANA 資料庫。", - "training": "https://learn.microsoft.com/training/modules/implement-azure-backup-sap-workloads-azure-virtual-machines/?source=recommendations", + "text": "如果在 GatewaySubnet 中使用路由表,請確保傳播閘道路由。", "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", - "service": "SAP", - "severity": "中等", - "text": "如果為 HANA、Oracle 或 DB2 資料庫部署 Azure NetApp 檔,請使用 Azure 應用程式一致性快照工具( AzAcSnap )來創建應用程式一致性快照。AzAcSnap 還支援 Oracle 資料庫。請考慮在中央 VM 上使用 AzAcSnap,而不是在單個 VM 上使用 AzAcSnap。", + "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": "高", + "text": "如果使用 ExpressRoute,則本地路由應是動態的:如果連接失敗,它應收斂到線路的其餘連接。負載應在兩個連接之間共用,理想情況下為主動/主動,儘管也支持主動/被動。", "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", - "severity": "高", - "text": "確保操作系統和 SAP 系統之間的時區匹配。", - "waf": "操作" + "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": "中等", + "text": "確保 ExpressRoute 線路的兩個物理鏈路連接到網路中的兩個不同的邊緣設備。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "c3c7abc0-716c-4486-893c-40e181d65539", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", - "service": "SAP", + "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": "中等", - "text": "不要將不同的應用程式服務分組到同一個集群中。例如,不要將DRBD和中央服務集群組合在同一集群上。但是,可以使用同一個 Pacemaker 群集來管理大約五個不同的中心服務(多 SID 群集)。", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "text": "確保在客戶或供應商邊緣路由設備上啟用並配置雙向轉發檢測 (BFD)。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "a491dfc4-9353-4213-9217-eef0949f9467", - "link": "https://azure.microsoft.com/pricing/offers/dev-test/", - "service": "SAP", - "severity": "低", - "text": "請考慮在暫停模型中運行開發/測試系統,以節省和優化 Azure 運行成本。", - "waf": "成本" + "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": "高", + "text": "將 ExpressRoute 閘道連接到來自不同對等互連位置的兩條或多條線路,以實現更高的復原能力。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", - "link": "https://learn.microsoft.com/azure/lighthouse/overview", - "service": "SAP", + "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": "中等", - "text": "如果通過管理客戶的 SAP 資產與客戶合作,請考慮使用 Azure Lighthouse。Azure Lighthouse 允許託管服務提供者使用 Azure 本機標識服務對客戶的環境進行身份驗證。它將控制權交到客戶手中,因為他們可以隨時撤銷訪問許可權並審核服務提供者的行為。", + "text": "配置 ExpressRoute 虛擬網路閘道的診斷日誌和警報。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", "waf": "操作" }, { - "checklist": "SAP 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", + "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": "中等", - "text": "使用 Azure Update Manager 檢查單個 VM 或多個 VM 的可用更新狀態,並考慮計劃定期修補。", - "training": "https://learn.microsoft.com/training/modules/keep-your-virtual-machines-updated/?source=recommendations", - "waf": "操作" + "text": "請勿使用 ExpressRoute 線路進行 VNet 到 VNet 通信。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "性能" }, { - "checklist": "SAP Checklist", - "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", - "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", - "service": "SAP", + "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": "低", - "text": "使用 SAP Landscape Management (LaMa) 優化和管理 SAP Basis 運營。使用適用於 Azure 的 SAP LaMa 連接器重新置放、複製、克隆和刷新 SAP 系統。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-remote-management/?source=recommendations", - "waf": "操作" + "text": "請勿將 Azure 流量發送到混合位置進行檢查。 相反,請遵循“Azure 中的流量保留在 Azure 中”的原則,以便 Azure 中的資源之間的通信通過 Microsoft 主幹網络進行。", + "waf": "性能" }, { - "checklist": "SAP Checklist", - "guid": "14591147-5e39-4e53-89cc-cd979366bcda", - "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", - "service": "SAP", + "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": "高", + "text": "使用 Azure 防火牆來管理到 Internet 的 Azure 出站流量、非 HTTP/S 入站連接和東西流量篩選(如果組織需要)。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "安全" + }, + { + "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": "中等", - "text": "使用用於 SAP 解決方案的 Azure Monitor 監視 Azure 上的 SAP 工作負載(SAP HANA、高可用性 SUSE 群集和 SQL 系統)。請考慮使用 SAP 解決方案管理器補充用於 SAP 解決方案的 Azure Monitor。", - "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", - "waf": "操作" + "text": "創建全域 Azure 防火牆策略以管理全球網路環境中的安全狀況,並將其分配給所有 Azure 防火牆實例。通過 Azure 基於角色的訪問控制將增量防火牆策略委派給本地安全團隊,從而允許使用精細策略來滿足特定區域的要求。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", - "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", - "service": "SAP", + "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": "低", + "text": "如果組織想要使用此類解決方案來幫助保護出站連接,請在 Firewall Manager 中配置受支援的合作夥伴 SaaS 安全提供者。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "安全" + }, + { + "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": "高", - "text": "運行適用於 SAP 的 VM 擴展檢查。適用於 SAP 的 VM 擴展使用虛擬機 (VM) 的分配託管標識來訪問 VM 監視和配置數據。該檢查可確保 SAP 應用程式中的所有性能指標都來自適用於 SAP 的基礎 Azure 擴展。", - "training": "https://learn.microsoft.com/training/modules/configure-azure-enhanced-monitoring-extension-for-sap/?source=recommendations", - "waf": "操作" + "text": "使用應用程式規則篩選目標主機名上的出站流量,以查找受支持的協定。 使用基於 FQDN 的網路規則和具有 DNS 代理的 Azure 防火牆來篩選通過其他協定流向 Internet 的傳出流量。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", - "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "service": "SAP", - "severity": "中等", - "text": "使用 Azure Policy 進行訪問控制和合規性報告。Azure Policy 提供了強制實施組織範圍設置的功能,以確保一致的策略遵守和快速違規檢測。", - "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", - "waf": "操作" + "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": "高", + "text": "使用 Azure 防火牆高級版啟用其他安全功能。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", - "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", - "service": "SAP", - "severity": "中等", - "text": "使用 Azure 網路觀察程式中的連接監視器監視 SAP 資料庫和應用程式伺服器的延遲指標。或者使用 Azure Monitor 收集和顯示網路延遲度量。", - "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/collecting-and-displaying-niping-network-latency-measurements/ba-p/1833979", - "waf": "操作" + "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": "高", + "text": "將 Azure 防火牆威脅情報模式配置為「警報」和「拒絕」以獲得額外保護。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "73686af4-6791-4f89-95ad-a43324e13811", - "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", - "service": "SAP", - "severity": "中等", - "text": "在預配的 Azure 基礎結構上對 SAP HANA 執行質量檢查,以驗證預配的 VM 是否符合 Azure 上的 SAP HANA 最佳做法。", - "waf": "操作" + "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": "高", + "text": "將 Azure 防火牆 IDPS 模式配置為「拒絕」以獲得額外保護。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "616785d6-fa96-4c96-ad88-518f482734c8", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", - "service": "SAP", + "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": "高", - "text": "對於每個 Azure 訂閱,請在區域部署之前對 Azure 可用性區域運行延遲測試,以選擇用於在 Azure 上部署 SAP 的低延遲區域。", - "training": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/AvZone-Latency-Test", - "waf": "性能" + "text": "對於未連接到虛擬 WAN 的 VNet 中的子網,請附加路由表,以便將 Internet 流量重定向到 Azure 防火牆或網路虛擬設備。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", - "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", - "service": "SAP", + "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": "中等", - "text": "運行復原報告,確保整個預配的 Azure 基礎結構(計算、資料庫、網路、存儲、Site Recovery)的配置符合適用於 Azure 的 Cloud Adaption Framework 定義的配置。", - "training": "https://learn.microsoft.com/training/paths/azure-well-architected-framework/", - "waf": "可靠性" + "text": "添加診斷設置,使用「特定於資源」的目標表保存所有 Azure 防火牆部署的日誌。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", - "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", - "service": "SAP", - "severity": "中等", - "text": "使用適用於 SAP 的 Microsoft Sentinel 解決方案實施威脅防護。使用此解決方案監視 SAP 系統,並檢測整個業務邏輯和應用程式層的複雜威脅。", - "training": "https://learn.microsoft.com/training/modules/plan-microsoft-sentinel-deployment-sap/?source=recommendations", + "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": "重要", + "text": "從 Azure 防火牆經典規則(如果存在)遷移到防火牆策略。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "操作" + }, + { + "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": "高", + "text": "對 Azure 防火牆子網使用 /26 前置綴。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", - "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", - "service": "SAP", + "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": "中等", - "text": "Azure 標記可用於對資源進行邏輯分組和跟蹤,自動執行其部署,最重要的是,提供對所發生成本的可見性。", - "training": "https://learn.microsoft.com/training/modules/analyze-costs-create-budgets-azure-cost-management/?source=recommendations", - "waf": "操作" + "text": "根據防火牆策略中的規則的使用頻率,將規則排列到規則集合組和規則集合中。", + "waf": "性能" }, { - "checklist": "SAP Checklist", - "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", - "service": "SAP", - "severity": "低", - "text": "對延遲敏感型應用程式使用虛擬機間延遲監視。", + "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": "中等", + "text": "使用IP組或IP前置綴來減少IP表規則的數量。", "waf": "性能" }, { - "checklist": "SAP Checklist", - "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", - "service": "SAP", + "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": "中等", - "text": "使用 Azure Site Recovery 監視來維護 SAP 應用程式伺服器的災難恢復服務的運行狀況。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", - "waf": "可靠性" + "text": "不要使用通配符作為DNAT的源IP,例如 *或 any,您應該為傳入的DNAT指定源IP。", + "waf": "性能" }, { - "checklist": "SAP Checklist", - "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", - "service": "SAP", + "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": "中等", - "text": "從防病毒掃描中排除所有資料庫檔系統和可執行程式。包含它們可能會導致性能問題。請與資料庫供應商聯繫,瞭解排除清單中的規範性詳細資訊。例如,Oracle 建議從防病毒掃描中排除 /oracle}sapdata。", + "text": "通過監控 SNAT 埠使用方式、評估 NAT 閘道設置並確保無縫故障轉移,防止 SNAT 埠耗盡。如果埠計數接近限制,則表明 SNAT 耗盡可能迫在眉睫。", "waf": "性能" }, { - "checklist": "SAP Checklist", - "guid": "c027f893-f404-41a9-b33d-39d625a14964", - "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", - "service": "SAP", + "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": "高", + "text": "如果使用的是 Azure 防火牆高級版,請啟用 TLS 檢查。", + "waf": "性能" + }, + { + "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": "低", - "text": "請考慮在遷移後收集非 HANA 資料庫的完整資料庫統計資訊。例如,實施SAP 註釋1020260 - 交付 Oracle 統計資訊。", + "text": "使用 Web 類別允許或拒絕對特定主題的出站訪問。", "waf": "性能" }, { - "checklist": "SAP Checklist", - "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", - "service": "SAP", + "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": "中等", - "text": "請考慮將 Oracle 自動儲存管理 (ASM) 用於使用 Azure 上的 SAP 的所有 Oracle 部署。", - "training": "https://learn.microsoft.com/training/paths/administer-infrastructure-resources-in-azure/?source=recommendations", + "text": "作為 TLS 檢查的一部分,請計劃從 Azure 應用閘道接收流量以進行檢查。", "waf": "性能" }, { - "checklist": "SAP 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", + "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": "中等", - "text": "對於運行 Oracle 的 Azure 上的 SAP,SQL 腳本集合可説明你診斷性能問題。 自動工作負載存儲庫 (AWR) 報告包含用於診斷 Oracle 系統中問題的寶貴資訊。我們建議您在多個工作階段期間運行 AWR 報告,並為其選擇高峰時間,以確保分析的廣泛覆蓋範圍。", - "training": "https://learn.microsoft.com/ja-jp/azure/well-architected/oracle-iaas/performance-efficiency", - "waf": "性能" + "text": "啟用 Azure 防火牆 DNS 代理配置。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", + "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": "高", - "text": "使用 Azure Site Recovery 監視來維護 SAP 應用程式伺服器的災難恢復服務的運行狀況。", - "training": "https://learn.microsoft.com/training/modules/protect-on-premises-infrastructure-with-azure-site-recovery/?source=recommendations", + "text": "將 Azure 防火牆與 Azure Monitor 集成,並啟用診斷日誌記錄以存儲和分析防火牆日誌。", "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "SAP", - "severity": "中等", - "text": "若要安全交付 HTTP/S 應用,請使用應用程式閘道 v2 並確保啟用 WAF 保護和策略。", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/", + "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": "低", + "text": "實施防火牆規則的備份", + "waf": "操作" + }, + { + "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": "高", + "text": "不要中斷注入虛擬網路的 Azure PaaS 服務的控制平面通信,例如使用 0.0.0.0/0 路由或阻止控制平面流量的 NSG 規則。", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", "waf": "安全" }, { - "checklist": "SAP 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", + "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": "中等", - "text": "如果在遷移到 Azure 期間未更改虛擬機器的 DNS 或虛擬名稱,則後台 DNS 和虛擬名稱將連接 SAP 環境中的許多系統介面,並且客戶有時只會知道開發人員隨時間推移定義的介面。遷移后,當虛擬或 DNS 名稱更改時,各種系統之間會出現連接挑戰,建議保留 DNS 別名以防止出現此類困難。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", - "waf": "操作" + "text": "通過專用終結點和 ExpressRoute 專用對等互連從本地訪問 Azure PaaS 服務。此方法可避免在公共 Internet 上傳輸。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "waf": "安全" }, { - "checklist": "SAP 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", - "severity": "中等", - "text": "使用不同的 DNS 區域來區分每個環境(沙箱、開發、預生產和生產)。具有自己的 VNet 的 SAP 部署除外;在這裡,私有 DNS 區域可能不是必需的。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", - "waf": "操作" + "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": "高", + "text": "默認情況下,不要在所有子網上啟用虛擬網路服務終結點。", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "a3592829-e6e2-4061-9368-6af46791f893", - "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", - "service": "SAP", + "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": "中等", - "text": "本地和全域 VNet 對等互連提供連接,是確保跨多個 Azure 區域的 SAP 部署的登陸區域之間的連接的首選方法", - "training": "https://learn.microsoft.com/training/modules/configure-vnet-peering/?source=recommendations", - "waf": "可靠性" + "text": "使用 FQDN 而不是 Azure 防火牆或 NVA 中的 IP 位址篩選流向 Azure PaaS 服務的出口流量,以防止數據外洩。如果使用專用連結,則可以阻止所有 FQDN,否則僅允許所需的 PaaS 服務。", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", - "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", - "service": "SAP", + "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": "高", - "text": "不支援在 SAP 應用程式和 SAP 資料庫伺服器之間部署任何 NVA", - "training": "https://me.sap.com/notes/2731110", - "waf": "性能" + "text": "至少對閘道子網使用 /27 前置綴。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", - "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", - "service": "SAP", - "severity": "中等", - "text": "在需要跨 Azure 區域和本地位置的全域傳輸連接的新網路、大型網路或全球網路中使用虛擬 WAN 進行 Azure 部署。使用此方法,無需手動設置 Azure 網路的可傳遞路由,並且可以遵循 Azure 部署上的 SAP 標準。", - "training": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", - "waf": "操作" + "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": "高", + "text": "不要依賴使用 VirtualNetwork 服務標記的 NSG 入站預設規則來限制連接。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", - "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", - "service": "SAP", + "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": "中等", - "text": "僅當使用合作夥伴 NVA 時,才考慮在區域之間部署網路虛擬設備 (NVA)。如果存在本機 NVA,則不需要區域或 VNet 之間的 NVA。部署合作夥伴網路技術和 NVA 時,請按照供應商的指南驗證與 Azure 網路衝突的配置。", - "training": "https://learn.microsoft.com/training/modules/control-network-traffic-flow-with-routes/?source=recommendations", - "waf": "操作" + "text": "使用 NSG 説明保護子網之間的流量,以及平台中的東西向流量(登陸區域之間的流量)。", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", - "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", - "service": "SAP", + "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": "中等", - "text": "虛擬 WAN 管理基於虛擬 WAN 的拓撲的分支 VNet 之間的連接(無需設置使用者定義的路由 [UDR] 或 NVA),同一虛擬中心中 VNet 到 VNet 流量的最大網路輸送量為每秒 50 G。如有必要,SAP 登陸區域可以使用 VNet 對等互連連接到其他登陸區域並克服此頻寬限制。", - "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/?source=recommendations", - "waf": "操作" + "text": "使用 NSG 和應用程式安全組對登陸區域內的流量進行微分段,並避免使用中心 NVA 篩選流量流。", + "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "waf": "安全" }, { - "checklist": "SAP 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", - "severity": "高", - "text": "不建議將公共IP分配給運行SAP工作負載的 VM。", - "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", + "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": "中等", + "text": "啟用 VNet 流日誌並將其饋送到流量分析中,以深入了解內部和外部流量流。", + "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", "waf": "安全" }, { - "checklist": "SAP 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", - "severity": "高", - "text": "配置 ASR 時,請考慮在 DR 端保留 IP 位址", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "操作" - }, - { - "checklist": "SAP 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", - "severity": "高", - "text": "避免對生產網站和DR網站使用重疊的IP位址範圍。", - "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", - "waf": "操作" + "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": "中等", + "text": "由於規則限制為 1000 條,因此每個 NSG 實施的 NSG 規則不要超過 900 個。", + "training": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "6e154e3a-a359-4282-ae6e-206173686af4", - "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", - "service": "SAP", + "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": "中等", - "text": "雖然 Azure 確實可以説明您在 VNet 中創建多個委派子網,但 Azure NetApp 檔的 VNet 中只能存在一個委派子網。如果對 Azure NetApp 檔使用多個委託子網,則嘗試創建新卷將失敗。", - "training": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-network-topologies?source=recommendations", + "text": "如果在虛擬 WAN 路由設計清單中明確描述了你的方案,請使用虛擬 WAN。", + "training": "https://learn.microsoft.com/learn/modules/introduction-azure-virtual-wan/", "waf": "操作" }, { - "checklist": "SAP 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", + "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": "中等", - "text": "使用 Azure 防火牆管理發往 Internet 的 Azure 出站流量、非 HTTP/S 入站連接和東西向流量篩選(如果組織需要)", - "training": "https://learn.microsoft.com/training/paths/secure-networking-infrastructure/", - "waf": "安全" + "text": "使用每個 Azure 區域的虛擬 WAN 中心,透過通用的全球 Azure 虛擬 WAN 跨 Azure 區域將多個登陸區域連接在一起。", + "waf": "性能" }, { - "checklist": "SAP Checklist", - "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", - "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", - "service": "SAP", + "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": "中等", - "text": "當應用程式閘道充當 SAP Web 應用的反向代理時,應用程式閘道和 Web 應用程式防火牆存在限制,如應用程式閘道、SAP Web 調度程式和其他第三方服務之間的比較所示。", - "training": "https://help.sap.com/docs/SUPPORT_CONTENT/si/3362959506.html", + "text": "對於出站 Internet 流量保護和篩選,請在安全中心部署 Azure 防火牆。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", + "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": "中等", - "text": "使用 Azure Front Door 和 WAF 策略跨 Azure 區域為與登陸區域的入站 HTTP/S 連接提供全域保護。", - "training": "https://learn.microsoft.com/training/paths/secure-application-delivery/", - "waf": "安全" + "text": "確保虛擬 WAN 網路體系結構與已確定的體系結構方案保持一致。", + "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", - "service": "SAP", + "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": "中等", - "text": "使用 Azure Front Door 和應用程式閘道保護 HTTP/S 應用程式時,請利用 Azure Front Door 中的 Web 應用程式防火牆策略。鎖定應用程式閘道以僅接收來自 Azure Front Door 的流量。", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", - "waf": "安全" + "text": "使用適用於虛擬 WAN 的 Azure Monitor 見解來監視虛擬 WAN 的端到端拓撲、狀態和關鍵指標。", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "5ada4332-4e13-4811-9231-81aa41742694", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "SAP", + "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": "中等", - "text": "使用 Web 應用程式防火牆在流量暴露於 Internet 時對其進行掃描。另一種選擇是將其與負載均衡器或具有內置防火牆功能(如應用程式閘道或第三方解決方案)的資源一起使用。", - "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", - "waf": "安全" + "text": "不要在虛擬 WAN 中禁用分支到分支流量,除非應明確阻止這些流。", + "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "SAP", + "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": "中等", - "text": "在需要跨 Azure 區域和本地位置的全域傳輸連接的新網路、大型網路或全球網路中使用虛擬 WAN 進行 Azure 部署。使用此方法,無需手動設置 Azure 網路的可傳遞路由,並且可以遵循 Azure 部署上的 SAP 標準。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/10-explore-azure-front-door", - "waf": "性能" + "text": "使用 AS-Path 作為中心路由首選項,因為它比 ExpressRoute 或 VPN 更靈活。", + "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", - "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", - "service": "SAP", + "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": "中等", - "text": "若要防止數據洩露,請使用 Azure 專用連結安全地訪問平臺即服務資源,例如 Azure Blob 存儲、Azure 檔存儲、Azure Data Lake Storage Gen2、Azure 數據工廠等。Azure 專用終結點還有助於保護 VNet 與 Azure 存儲、Azure 備份等服務之間的流量。VNet 與啟用專用終結點的服務之間的流量通過 Microsoft 全球網路傳輸,從而防止其暴露在公共 Internet 上。", - "training": "https://learn.microsoft.com/training/modules/design-implement-private-access-to-azure-services/?source=recommendations", - "waf": "安全" + "text": "在虛擬 WAN 中配置基於標籤的傳播,否則虛擬中心之間的連接將受到損害。", + "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", - "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", - "service": "SAP", + "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": "高", - "text": "請確保在 SAP 應用程式和 DBMS 層中使用的 VM 上啟用了 Azure 加速網路。", - "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", - "waf": "性能" + "text": "至少為虛擬中心分配一個 /23 前置綴,以確保有足夠的IP空間可用。", + "waf": "可靠性" }, { - "checklist": "SAP Checklist", - "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", - "service": "SAP", - "severity": "中等", - "text": "請確保將 Azure 負載均衡器的內部部署設置為使用直接伺服器返回 (DSR)。此設置(啟用浮動IP)將減少內部負載均衡器配置用於 DBMS 層上的高可用性配置時的延遲。", - "training": "https://learn.microsoft.com/ja-jp/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", + "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": "高", + "text": "戰略性地利用 Azure Policy,為環境定義控制,使用策略計劃對相關策略進行分組。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "6791f893-5ada-4433-84e1-3811523181aa", - "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", - "service": "SAP", + "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": "中等", - "text": "可以使用應用程式安全組 (ASG) 和 NSG 規則在 SAP 應用程式層和 DBMS 層之間定義網路安全存取控制清單。ASG 對虛擬機進行分組,以説明管理其安全性。", - "training": "https://learn.microsoft.com/training/modules/configure-network-security-groups/?source=recommendations", + "text": "將法規和合規性要求映射到 Azure Policy 定義和 Azure 角色分配。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", - "severity": "高", - "text": "不支援將 SAP 應用程式層和 SAP DBMS 放置在未對等互連的不同 Azure VNet 中。", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "性能" - }, - { - "checklist": "SAP Checklist", - "guid": "fa96c96a-d885-418f-9827-34c886ba2802", - "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", - "service": "SAP", + "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": "中等", - "text": "若要優化 SAP 應用程式的網路延遲,請考慮使用 Azure 鄰近放置組。", - "training": "https://learn.microsoft.com/azure/virtual-machines/co-location#planned-maintenance-and-proximity-placement-groups", - "waf": "性能" + "text": "在中間根管理組建立 Azure Policy 定義,以便可以在繼承的範圍內分配它們。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", + "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": "高", - "text": "根本不支援在本地和 Azure 之間運行 SAP Application Server 層和 DBMS 層拆分。這兩個層都需要完全駐留在本地或 Azure 中。", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "性能" + "text": "如果需要,在最高適當級別管理策略分配,並在底層管理排除項。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", - "link": "https://me.sap.com/notes/2015553", - "service": "SAP", - "severity": "高", - "text": "不建議將資料庫管理系統 (DBMS) 和 SAP 系統的應用程式層託管在不同的 VNet 中,並將它們與 VNet 對等互連連接,因為層之間的過多網路流量可能會產生大量成本。建議使用 Azure 虛擬網路中的子網來分隔 SAP 應用程式層和 DBMS 層。", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", - "waf": "成本" + "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": "低", + "text": "使用 Azure Policy 控制使用者可以在訂閱/管理組級別預配哪些服務。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "402a9846-d515-4061-aff8-cd30088693fa", - "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", - "service": "SAP", + "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": "高", - "text": "如果將負載均衡器與Linux客戶機作業系統配合使用,請檢查Linux網路參數 net.ipv4.tcp_timestamps是否設置為0。", - "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", - "waf": "性能" + "text": "盡可能使用內置策略,以最大程度地減少運營開銷。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "87585797-5551-4d53-bb7d-a94ee415734d", - "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", - "service": "SAP", + "arm-service": "Microsoft.Authorization/policyDefinitions", + "checklist": "Azure Landing Zone Review", + "description": "通過將「資源策略參與者」角色分配給特定範圍,可以將策略管理委派給相關團隊。例如,中心 IT 團隊可以監督管理組級別的策略,而應用程式團隊則處理其訂閱的策略,從而在遵守組織標準的情況下實現分散式治理。", + "guid": "3f988795-25d6-4268-a6d7-0ba6c97be995", + "link": "https://learn.microsoft.com/azure/governance/policy/overview#azure-rbac-permissions-in-azure-policy", + "service": "Policy", "severity": "中等", - "text": "對於 SAP RISE/ECS 部署,虛擬對等互連是與客戶現有 Azure 環境建立連接的首選方式。SAP vnet 和客戶 vnet 都受網路安全組 (NSG) 保護,從而通過 VNet 對等互連在 SAP 和資料庫埠上進行通信", + "text": "在特定範圍內分配內置的「資源策略參與者」角色,以啟用應用程式級治理。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", - "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", - "service": "SAP", - "severity": "高", - "text": "查看 Azure VM 的 SAP HANA 資料庫備份。", - "waf": "成本" + "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": "中等", + "text": "限制在根管理組範圍內執行的 Azure Policy 分配數,以避免在繼承的範圍內通過排除項進行管理。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", - "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", - "service": "SAP", + "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": "中等", - "text": "查看用於 SAP 的 Site Recovery 內置監視。", - "waf": "成本" + "text": "如果存在任何數據主權要求,則應部署 Azure 策略來強制實施這些要求。", + "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", - "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", - "service": "SAP", - "severity": "高", - "text": "查看監視 SAP HANA 系統環境指南。", - "waf": "操作" + "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": "中等", + "text": "對於主權登陸區域,部署主權策略基線,並在正確的管理組級別進行分配。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", - "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", - "service": "SAP", + "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": "中等", - "text": "查看 Azure Linux VM 中的 Oracle 資料庫備份策略。", - "waf": "操作" + "text": "對於主權登陸區域,將主權控制目標記錄到策略映射。", + "waf": "安全" }, { - "checklist": "SAP 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", + "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": "中等", - "text": "查看 Azure Blob 儲存與 SQL Server 2016 的配合。", - "waf": "操作" + "text": "對於主權登陸區,請確保已制定“主權控制目標到策略映射”的管理流程。", + "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", - "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", - "service": "SAP", + "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": "中等", - "text": "查看 Azure VM 自動備份 v2 的使用方式。", + "text": "使用單個監視器日誌工作區集中管理平臺,但 Azure 基於角色的訪問控制 (Azure RBAC)、數據主權要求或數據保留策略要求使用單獨工作區的情況除外。", + "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", - "service": "SAP", + "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": "高", - "text": "使用進階磁碟時開啟M系列的寫入加速器(V1)", + "text": "如果日誌保留要求超過 12 年,請將日誌匯出到 Azure 存儲。使用具有一次寫入、多次讀取策略的不可變存儲,使數據在使用者指定的時間間隔內不可擦除且不可修改。", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", "waf": "操作" }, { - "checklist": "SAP 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", + "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": "中等", - "text": "測試可用性區域延遲。", - "waf": "性能" + "text": "使用 Azure Policy 監視 OS 等級虛擬機 (VM) 配置偏移。通過策略啟用 Azure Automanage 計算機配置審核功能可説明應用程式團隊工作負載立即使用功能,而無需付出任何努力。", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", - "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", - "service": "SAP", + "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": "中等", - "text": "為所有 SAP 元件啟動 SAP EarlyWatch Alert。", - "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", - "waf": "性能" + "text": "使用 Azure Update Manager 作為 Azure 中 Windows 和 Linux VM 的修補機制。", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "waf": "操作" }, { - "checklist": "SAP 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", + "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": "中等", - "text": "使用 SAP ABAPMeter 報表 /SSA/CAT 查看 SAP 應用程式伺服器到資料庫伺服器的延遲。", - "training": "https://me.sap.com/notes/0002879613", - "waf": "性能" + "text": "使用 Azure Arc 將 Azure Update Manager 用作 Azure 外部的 Windows 和 Linux VM 的修補機制。", + "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", - "service": "SAP", + "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": "中等", - "text": "查看使用 CCMS 的 SQL Server 性能監視。", - "waf": "性能" + "text": "使用網路觀察程序主動監視流量流。", + "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", - "link": "https://me.sap.com/notes/500235", - "service": "SAP", + "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": "中等", - "text": "測試 SAP 應用程式層 VM 和 DBMS VM (NIPING) 之間的網路延遲。", - "training": "https://me.sap.com/notes/1100926/E", - "waf": "性能" + "text": "使用 Azure Monitor 紀錄獲取見解和報告。", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", - "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", - "service": "SAP", + "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": "中等", - "text": "查看 SAP HANA Studio 警報。", - "waf": "性能" + "text": "使用 Azure Monitor 警報生成操作警報。", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", - "link": "https://me.sap.com/notes/1969700", - "service": "SAP", + "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": "中等", - "text": "使用 HANA_Configuration_Minichecks 執行 SAP HANA 執行狀況檢查。", - "waf": "性能" + "text": "通過 Azure 自動化帳戶使用更改和清單跟蹤時,請確保已選擇受支持的區域,以便將 Log Analytics 工作區和自動化帳戶連結在一起。", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", + "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": "低", + "text": "使用 Azure 備份時,請使用正確的備份類型(GRS、ZRS 和 LRS)進行備份,因為預設設置為 GRS。", + "waf": "可靠性" + }, + { + "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": "中等", - "text": "如果在 Azure、本地或其他雲環境中運行 Windows 和 Linux VM,則可以使用 Azure 自動化中的更新管理中心來管理作業系統更新,包括安全修補程式。", - "training": "https://learn.microsoft.com/azure/automation/update-management/overview", + "text": "使用 Azure 來賓策略通過 VM 擴展自動部署軟體配置,並強制實施合規的基線 VM 配置。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "08951710-79a2-492a-adbc-06d7a401545b", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", - "service": "SAP", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Azure Landing Zone Review", + "description": "使用 Azure Policy 的來賓配置功能來審核和修正電腦設置(例如 OS、應用程式、環境),以確保資源與預期配置保持一致,並且更新管理可以強制實施 VM 的修補程式管理。", + "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": "中等", - "text": "定期查看 SAP 安全 OSS 說明,因為 SAP 會發佈高度關鍵的安全補丁或熱修復程式,需要立即採取行動來保護 SAP 系統。", - "training": "https://support.sap.com/en/my-support/knowledge-base/security-notes-news.html", + "text": "通過 Azure Policy 監視 VM 安全配置偏移。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", - "severity": "低", - "text": "對於 SQL Server 上的 SAP,可以禁用 SQL Server 系統管理員帳戶,因為 SQL Server 上的 SAP 系統不使用該帳戶。在禁用原始系統管理員帳戶之前,請確保具有系統管理員許可權的其他使用者可以訪問伺服器。", - "waf": "安全" + "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": "中等", + "text": "使用 Azure Site Recovery 實現 Azure 到 Azure 虛擬機的災難恢復方案。這使您能夠跨區域複製工作負載。", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", - "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "service": "SAP", - "severity": "高", - "text": "禁用xp_cmdshell。SQL Server 功能xp_cmdshell啟用 SQL Server 內部作業系統命令行介面。這是安全審計中的潛在風險。", - "training": "https://me.sap.com/notes/3019299/E", - "waf": "安全" + "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": "中等", + "text": "使用 Azure 本機備份功能或與 Azure 相容的第三方備份解決方案。", + "waf": "操作" }, { - "checklist": "SAP 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", + "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": "高", - "text": "加密 Azure 上的 SAP HANA 資料庫伺服器使用 SAP HANA 本機加密技術。此外,如果在 Azure 上使用 SQL Server,請使用透明數據加密 (TDE) 來保護數據和日誌檔,並確保備份也已加密。", - "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", - "waf": "安全" + "text": "添加診斷設置以保存來自應用程式交付服務(如 Azure Front Door 和 Azure 應用程式閘道)的 WAF 日誌。定期查看日誌,以檢查攻擊和誤報檢測。", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", - "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", - "service": "SAP", + "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": "中等", - "text": "為所有 Azure 資源管理器和經典記憶體啟用了 Azure 儲存加密,並且無法禁用。由於預設情況下數據是加密的,因此無需修改代碼或應用程式即可使用 Azure 儲存加密。", - "training": "https://learn.microsoft.com/training/modules/encrypt-sector-data/?source=recommendations", - "waf": "安全" + "text": "將 WAF 日誌從應用程式交付服務(如 Azure Front Door 和 Azure 應用程式閘道)發送到 Microsoft Sentinel。檢測攻擊並將 WAF 遙測集成到整個 Azure 環境中。", + "waf": "操作" }, { - "checklist": "SAP Checklist", - "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", + "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": "SAP", + "service": "Key Vault", "severity": "高", - "text": "使用 Azure Key Vault 儲存機密和憑據", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "text": "使用 Azure Key Vault 儲存機密和憑據。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "829e2edb-2173-4676-aff6-691b4935ada4", - "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", - "service": "SAP", + "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": "中等", - "text": "建議在成功部署后鎖定 Azure 資源,以防止未經授權的更改。還可以使用自定義的 Azure 策略(自定義角色)在每個訂閱的基礎上強制實施 LOCK 約束和規則。", - "training": "https://learn.microsoft.com/training/modules/use-azure-resource-manager/?source=recommendations", + "text": "對不同的應用程式和區域使用不同的 Azure Key Vault,以避免事務規模限制並限制對機密的訪問。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", - "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", - "service": "SAP", + "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": "中等", - "text": "預配啟用軟刪除和清除策略的 Azure Key Vault,以允許對已刪除物件進行保留保護。", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "text": "在啟用軟刪除和清除策略的情況下預配 Azure Key Vault,以允許對已刪除物件進行保留保護。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", - "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", - "service": "SAP", - "severity": "高", - "text": "根據現有要求、法規和合規性控制(內部/外部) - 確定所需的 Azure 策略和 Azure RBAC 角色", - "training": "https://learn.microsoft.com/training/paths/describe-azure-management-governance/?source=recommendations", + "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": "中等", + "text": "遵循最低特權模型,將永久刪除密鑰、機密和證書的授權限制為專用的自定義 Microsoft Entra ID 角色。", "waf": "安全" }, { - "checklist": "SAP 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", - "severity": "高", - "text": "在 SAP 環境中啟用 Microsoft Defender for Endpoint 時,建議排除 DBMS 伺服器上的數據和日誌檔,而不是面向所有伺服器。排除目標檔時,請遵循 DBMS 供應商的建議。", - "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/microsoft-defender-endpoint-mde-for-sap-applications-on-windows/ba-p/3912268", + "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": "中等", + "text": "使用公共證書頒發機構自動執行證書管理和續訂過程,以簡化管理。", "waf": "安全" }, { - "checklist": "SAP 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", - "severity": "高", - "text": "委派具有 Microsoft Defender for Cloud 實時訪問許可權的 SAP 管理員自定義角色。", - "training": "https://learn.microsoft.com/training/modules/secure-vms-with-azure-security-center/?source=recommendations", + "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": "中等", + "text": "建立金鑰和證書輪換的自動化流程。", "waf": "安全" }, { - "checklist": "SAP 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", - "severity": "低", - "text": "通過將第三方安全產品與 DIAG (SAP GUI)、RFC 和 SPNEGO for HTTPS 的安全網路通信 (SNC) 集成,對傳輸中的數據進行加密", - "training": "https://learn.microsoft.com/azure/security/fundamentals/encryption-overview#encryption-of-data-in-transit", + "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": "中等", + "text": "在保管庫上啟用防火牆和虛擬網路服務終結點或專用終結點,以控制對密鑰保管庫的訪問。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", - "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", - "service": "SAP", + "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": "中等", - "text": "對於主體加密功能,預設使用 Microsoft 管理的金鑰,並在需要時使用客戶管理的密鑰。", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "text": "使用以平臺為中心的 Azure Monitor Log Analytics 工作區來審核 Key Vault 的每個實例中的密鑰、證書和機密使用方式。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "4935ada4-2223-4ece-a1b1-23181a541741", - "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", - "service": "SAP", - "severity": "高", - "text": "對每個應用程式、每個環境、每個區域使用 Azure Key Vault。", - "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "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": "中等", + "text": "委託 Key Vault 實例化和特權訪問,並使用 Azure Policy 強制實施一致的合規配置。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", - "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", - "service": "SAP", - "severity": "高", - "text": "若要控制和管理非 HANA Windows 和非 Windows 作業系統的磁碟加密密鑰和機密,請使用 Azure Key Vault。Azure Key Vault 不支援 SAP HANA,因此必須使用 SAP ABAP 或 SSH 密鑰等替代方法。", - "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/?source=recommendations", + "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": "中等", + "text": "每個應用程式、每個環境、每個區域使用 Azure Key Vault。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "209d490d-a477-4784-84d1-16785d2fa56c", - "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", - "service": "SAP", - "severity": "高", - "text": "為 Azure 上的 SAP 分支訂閱自定義基於角色的訪問控制 (RBAC) 角色,以避免與網路相關的意外更改", - "training": "https://learn.microsoft.com/training/modules/secure-azure-resources-with-rbac/?source=recommendations", + "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": "中等", + "text": "如果要自帶密鑰,則並非所有考慮的服務都支援此功能。實施相關的緩解措施,使不一致之處不會妨礙預期的結果。選擇適當的區域對和災難恢復區域,以最大程度地減少延遲。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", - "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", - "service": "SAP", - "severity": "高", - "text": "將 DMZ 和 NVA 與 SAP 資產的其餘部分隔離,配置 Azure 專用連結,並安全地管理和控制 Azure 上的 SAP 資源", - "training": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/secure-vnet-dmz?tabs=portal", + "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": "中等", + "text": "對於 Sovereign Landing Zone,請使用 Azure Key Vault 託管 HSM 來儲存機密和憑據。", "waf": "安全" }, { - "checklist": "SAP 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", - "severity": "低", - "text": "請考慮在 Azure 上使用 Microsoft 反惡意軟體來保護虛擬機免受惡意檔、廣告軟體和其他威脅的侵害。", - "training": "https://azure.microsoft.com/blog/deploying-antimalware-solutions-on-azure-virtual-machines/", + "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": "中等", + "text": "使用 Microsoft Entra ID 報告功能生成訪問控制審核報告。", "waf": "安全" }, { - "checklist": "SAP 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", - "severity": "低", - "text": "若要獲得更強大的保護,請考慮使用 Microsoft Defender for Endpoint。", - "training": "https://learn.microsoft.com/training/modules/implement-endpoint-protection-use-microsoft-defender/?source=recommendations", + "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": "高", + "text": "為所有訂閱啟用Defender雲安全態勢管理。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", - "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", - "service": "SAP", + "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": "高", - "text": "通過中心虛擬網路傳遞所有流量,將 SAP 應用程式和資料庫伺服器與 Internet 或本地網路隔離開來,該中心虛擬網路通過虛擬網路對等互連連接到分支網路。對等互連虛擬網路保證 Azure 上的 SAP 解決方案與公共 Internet 隔離。", - "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/?source=recommendations", + "text": "在所有訂閱上為伺服器啟用Defender雲工作負載保護計劃。", "waf": "安全" }, { - "checklist": "SAP 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", - "severity": "低", - "text": "對於面向 Internet 的應用程式(如 SAP Fiori),請確保根據應用程式要求分配負載,同時保持安全級別。對於第 7 層安全性,可以使用 Azure 市場中提供的第三方 Web 應用程式防火牆 (WAF)。", - "training": "https://learn.microsoft.com/training/modules/simplify-cloud-procurement-governance-azure-marketplace/?source=recommendations", + "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": "高", + "text": "在所有訂閱上為 Azure 資源啟用 Defender 雲工作負載保護計劃。", "waf": "安全" }, { - "checklist": "SAP Checklist", - "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", - "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", - "service": "SAP", - "severity": "中等", - "text": "若要在用於 SAP 解決方案的 Azure Monitor 中啟用安全通信,可以選擇使用根證書或伺服器證書。我們強烈建議您使用根證書。", - "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", + "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": "高", + "text": "在 IaaS 伺服器上啟用端點保護。", "waf": "安全" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Azure 事件中心提供靜態數據加密。如果使用自己的金鑰,則仍使用 Microsoft 管理的金鑰對數據進行加密,但此外,Microsoft 管理的金鑰將使用客戶管理的密鑰進行加密。", - "guid": "7aaf12e7-b94e-4f6e-847d-2d92981b1cd6", - "link": "https://learn.microsoft.com/azure/event-hubs/configure-customer-managed-key", - "service": "Event Hubs", - "severity": "低", - "text": "需要時,在靜態數據加密中使用客戶管理的金鑰選項", - "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "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": "中等", + "text": "通過 Azure Monitor 紀錄和 Defender for Cloud 監視基本作業系統修補偏移。", "waf": "安全" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Azure 事件中心命名空間允許用戶端使用 TLS 1.0 及更高版本發送和接收數據。若要強制實施更嚴格的安全措施,可以將事件中心命名空間配置為要求用戶端使用較新版本的 TLS 發送和接收數據。如果事件中心命名空間需要最低版本的 TLS,則使用舊版本發出的任何請求都將失敗。", - "guid": "d2f54b29-769e-43a6-a0e7-828ac936657e", - "link": "https://learn.microsoft.com/azure/event-hubs/transport-layer-security-configure-minimum-version", - "service": "Event Hubs", + "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": "中等", - "text": "對請求強制實施傳輸層安全性 (TLS) 的最低要求版本", - "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "text": "將預設資源配置連接到集中式 Azure Monitor Log Analytics 工作區。", "waf": "安全" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "創建事件中心命名空間時,會自動為命名空間創建名為 RootManageSharedAccessKey 的策略規則。此策略具有整個命名空間的管理許可權。建議您將此規則視為管理根帳戶,不要在應用程式中使用它。建議將 AAD 用作 RBAC 的身份驗證提供程式。", - "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", + "checklist": "Azure Landing Zone Review", + "guid": "1761e147-f65e-4d09-bbc2-f464f23e2eba", + "link": "https://learn.microsoft.com/industry/sovereignty/transparency-logs", + "service": "Entra", "severity": "中等", - "text": "避免在不必要的情況下使用root帳戶", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", + "text": "對於 Sovereign Landing Zone,請在 Entra ID 租戶上啟用透明度日誌。", "waf": "安全" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Azure 資源的託管標識可以使用 Azure AD 憑據從 Azure 虛擬機 (VM)、函數應用、虛擬機規模集和其他服務中運行的應用程式授權訪問事件中心資源。通過將 Azure 資源的託管標識與 Azure AD 身份驗證結合使用,可以避免將憑據存儲在雲中運行的應用程式中。", - "guid": "3a365a5c-7acb-4e48-abd5-4cd79f2e8776", - "link": "https://learn.microsoft.com/azure/event-hubs/authenticate-managed-identity?tabs=latest", - "service": "Event Hubs", + "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": "中等", - "text": "如果可能,應用程式應使用託管標識向 Azure 事件中心進行身份驗證。如果沒有,請考慮在 Azure Key Vault 或等效服務中擁有存儲憑據(SAS、服務主體憑據)", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "text": "對於 Sovereign Landing Zone,請在 Entra ID 租戶上啟用客戶密碼箱。", "waf": "安全" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "創建許可權時,請對用戶端對 Azure 事件中心的訪問提供精細控制。Azure 事件中心中的許可權可以而且應該限定為單個資源級別,例如消費者組、事件中心實體、事件中心命名空間等。", - "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", + "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": "高", - "text": "使用最低特權數據平面 RBAC", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "text": "啟用到存儲帳戶的安全傳輸。", "waf": "安全" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "Azure 事件中心資源日誌包括操作日誌、虛擬網路和 Kafka 日誌。運行時審核日誌捕獲事件中心中所有數據平面訪問操作(例如發送或接收事件)的聚合診斷資訊。", - "guid": "b38b875b-a1cf-4104-a900-3a4d3ce474db", - "link": "https://learn.microsoft.com/azure/event-hubs/monitor-event-hubs-reference", - "service": "Event Hubs", - "severity": "中等", - "text": "啟用記錄以進行安全調查。使用 Azure Monitor 捕獲指標和日誌,例如資源日誌、運行時審核日誌和 Kafka 紀錄", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "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": "高", + "text": "為存儲帳戶啟用容器軟刪除,以恢復已刪除的容器及其內容。", "waf": "安全" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "默認情況下,Azure 事件中心具有公共IP位址,並且可通過Internet訪問。專用終結點允許虛擬網路和 Azure 事件中心之間的流量遍歷 Microsoft 主幹網路。除此之外,如果未使用公共終結點,則應禁用這些終結點。", - "guid": "5abca2a4-eda1-4dae-8cc9-5d48c6b791dc", - "link": "https://learn.microsoft.com/azure/event-hubs/private-link-service", - "service": "Event Hubs", - "severity": "中等", - "text": "請考慮使用專用終結點訪問 Azure 事件中心,並在適用時禁用公用網路訪問。", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", - "waf": "安全" + "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": "高", + "text": "使用 Key Vault 機密可避免對敏感資訊(如憑據、虛擬機、用戶密碼)、證書或密鑰進行硬編碼。", + "waf": "操作" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "使用IP防火牆,可以將公共終結點進一步限製為僅一組IPv4位址或 CIDR(無類別域間路由)表示法的IPv4位址範圍。", - "guid": "a0e6c465-89e5-458b-a37d-3974d1112dbd", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-ip-filtering", - "service": "Event Hubs", - "severity": "中等", - "text": "請考慮僅允許從特定IP位址或範圍訪問 Azure 事件中心命名空間", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "安全" + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "41faa1ed-b7f0-447d-8cba-4a4905e5bb83", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", + "severity": "高", + "text": "使 2 個副本具有 99.9% 的讀取操作可用性", + "waf": "可靠性" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "31d41e36-11c8-417b-8afb-c410d4391898", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-AEH_v1.docx", - "service": "Event Hubs", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "7d956fd9-788a-4845-9b9f-c0340972d810", + "link": "https://learn.microsoft.com/azure/search/search-reliability#high-availability", + "service": "Cognitive Search", "severity": "中等", - "text": "利用 FTA 彈性手冊", + "text": "使 3 個副本具有 99.9% 的讀/寫操作可用性", "waf": "可靠性" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "對於從門戶創建的新 EH 命名空間,在啟用區域的區域中具有高級、專用或標準 SKU,將自動啟用此功能。EH 元數據和事件數據本身都是跨區域複製的", - "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", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "44dc5f2b-a032-4d03-aae8-90c3f2c0a4c3", + "link": "https://learn.microsoft.com/azure/search/search-reliability#availability-zone-support", + "service": "Cognitive Search", "severity": "高", - "text": "利用可用區(如果區域適用)", + "text": "通過啟用讀取和/或寫入副本來利用可用區", "waf": "可靠性" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "20b56c56-ad58-4519-8f82-735c586bb281", - "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", - "service": "Event Hubs", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review 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", "severity": "中等", - "text": "使用高級或專用 SKU 實現可預測的性能", + "text": "對於區域冗餘,請在2個或更多區域中為搜索手動創建服務,因為它不提供跨地理區域複製搜索索引的自動方法", "waf": "可靠性" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "啟用內置異地災難恢復功能后,可確保命名空間的整個配置(事件中心、消費者組和設置)從主命名空間持續複製到輔助命名空間,並允許隨時從主命名空間向輔助命名空間進行一次故障轉移。主動/被動功能旨在更輕鬆地從失敗的 Azure 區域中恢復和放棄,而無需更改應用程式配置", - "guid": "dc15a1c0-75ee-49f1-90ac-ccd579376bcd", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-geo-dr?tabs=portal", - "service": "Event Hubs", - "severity": "高", - "text": "使用主動被動配置規劃異地災難恢復", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "3c964882-aec9-4d44-9f68-4b5f2efbbdb6", + "link": "https://learn.microsoft.com/azure/search/search-reliability#synchronize-data-across-multiple-services", + "service": "Cognitive Search", + "severity": "中等", + "text": "若要跨多個服務同步數據,請使用索引器更新多個服務上的內容,或使用 REST API 推送多個服務上的內容更新", "waf": "可靠性" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "description": "應用於無法容忍關閉區域中事件數據中斷或丟失的DR配置。對於這些情況,請遵循複製指南,不要使用內置的異地災難恢復功能(主動/被動)。使用「主動/主動」時,在不同區域和命名空間中維護多個事件中心,事件將在中心之間複製", - "guid": "6e31b67d-67ba-4591-89c0-9e805d597c7e", - "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-federation-overview", - "service": "Event Hubs", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review 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", "severity": "中等", - "text": "對於業務關鍵型應用程式,請使用 Active Active 配置", + "text": "使用 Azure 流量管理器協調請求", "waf": "可靠性" }, { - "arm-service": "microsoft.eventhub/namespaces", - "checklist": "Azure Event Hub Review", - "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", - "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", - "service": "Event Hubs", - "severity": "中等", - "text": "設計可復原的事件中心", + "arm-service": "Microsoft.Search/searchServices", + "checklist": "Cognitive Search Review Checklist", + "guid": "7be10278-57c1-4a61-8ee3-895aebfec5aa", + "link": "https://learn.microsoft.com/azure/search/search-reliability#back-up-and-restore-alternatives", + "service": "Cognitive Search", + "severity": "高", + "text": "備份和還原 Azure 認知搜索索引。使用此範例代碼將索引定義和快照備份到一系列 Json 檔", "waf": "可靠性" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "ab91932c-9fc9-4d1b-a881-37f5e6c0cb9e", - "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-ADF_v1.docx", - "service": "Azure Data Factory", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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 Blob Storage Review", + "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 Blob Storage Review", + "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 Blob Storage Review", + "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 DefenderEnable Defender for all of your storage accounts", + "waf": "安全" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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 Blob Storage Review", + "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": "利用 Azure 數據工廠的 FTA 復原能力手冊", - "waf": "可靠性" + "text": "禁用 blob 的“軟刪除”", + "waf": "安全" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "e503547c-d447-4e82-9138-a7200f1cac6d", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "可靠性" + "text": "為容器啟用“軟刪除”", + "waf": "安全" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "9ef1d6e8-32e5-42e3-911c-818b1a0bc511", - "link": "https://learn.microsoft.com/azure/data-factory/source-control", - "service": "Azure Data Factory", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "使用 DevOps 透過 Github/Azure DevOps 集成備份 ARM 範本", - "waf": "可靠性" + "text": "禁用容器的“軟刪除”", + "waf": "安全" }, { - "arm-service": "Microsoft.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "e43a18a9-cd29-49cf-b7b1-7db8255562f2", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", - "severity": "中等", - "text": "請確保在另一個區域中複製自承載集成運行時 VM", - "waf": "可靠性" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "guid": "aee4563a-fd83-4393-98b2-62d6dc5f512a", - "link": "https://learn.microsoft.com/azure/architecture/example-scenario/analytics/pipelines-disaster-recovery", - "service": "Azure Data Factory", - "severity": "中等", - "text": "請確保在姊妹區域中複製或複製您的網路。必須在另一個區域創建 Vnet 的副本", - "waf": "可靠性" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.DataFactory/datafactories", - "checklist": "Azure Data Factory Review Checklist", - "description": "如果ADF管道使用Key Vault,則無需執行任何操作即可複製Key Vault。Key Vault 是一項託管服務,Microsoft 會為你處理它", - "guid": "25498f6d-bad3-47da-a43b-c6ce1d7aa9b2", - "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", - "service": "Azure Data Factory", - "severity": "低", - "text": "如果使用 Keyvault 集成,請使用 Keyvault 的 SLA 來瞭解可用性", - "waf": "可靠性" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "ac1d6380-f866-4bbd-a9b4-b1ee5d7908b8", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#availability-zones", - "service": "IoT", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "利用可用區(如果區域適用)(這是自動啟用的)", - "waf": "可靠性" + "text": "強制實施 HTTPS(禁用 HTTP)時,請檢查是否未對儲存帳戶使用自定義域 (CNAME)。", + "waf": "安全" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "35f651e8-0124-4ef7-8c57-658e38609e6e", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", - "service": "IoT", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "請注意 Microsoft 發起的故障轉移。Microsoft 在極少數情況下會執行這些操作,以將所有IoT中心從受影響的區域故障轉移到相應的異地配對區域。", - "waf": "可靠性" + "text": "將共享訪問簽名 (SAS) 令牌限製為僅 HTTPS 連接", + "waf": "安全" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "4ed3e490-dc06-4a1e-b467-5d0239d85540", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#cross-region-dr", - "service": "IoT", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "在可能的情況下,AAD 令牌應優先於共用訪問簽名", + "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", + "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", + "service": "Azure Storage", "severity": "高", - "text": "考慮為關鍵工作負載制定跨區域災難恢復策略", - "waf": "可靠性" + "text": "使用 Azure Active Directory (Azure AD) 令牌進行 blob 訪問", + "waf": "安全" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "a11ecab0-db47-46f7-9aa7-17764e7e45a1", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", - "service": "IoT", - "severity": "高", - "text": "瞭解如何觸發手動故障轉移。", - "waf": "可靠性" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "將角色分配給使用者、組或應用程式時,請僅向該安全主體授予他們執行任務所需的許可權。限制對資源的訪問有助於防止無意和惡意濫用數據。", + "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", + "service": "Azure Storage", + "severity": "中等", + "text": "IaM 許可權中的最低特權", + "waf": "安全" }, { - "arm-service": "Microsoft.Devices/IotHubs", - "checklist": "IoT Hub Review", - "guid": "f9db8dfb-1194-460b-aedd-34dd6a69db22", - "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#failback", - "service": "IoT", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "瞭解如何在故障轉移後進行故障回復。", - "waf": "可靠性" - }, - { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "中等", - "text": "如果將客戶管理的 TLS 證書用於 Azure Front Door,請使用“最新”證書版本。降低手動續訂證書導致的中斷風險", - "waf": "操作" + "text": "使用 SAS 時,首選「使用者委派 SAS」,而不是基於存儲帳戶密鑰的 SAS。", + "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "中等", - "text": "確保使用應用程式閘道 v2 SKU", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "存儲帳戶金鑰(“共用金鑰”)幾乎沒有審核功能。雖然可以監控誰/何時獲取密鑰副本,但一旦密鑰掌握在多個人手中,就不可能將使用方式歸因於特定使用者。僅依靠 AAD 身份驗證可以更輕鬆地將存儲存取許可權綁定到使用者。", + "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", + "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", + "service": "Azure Storage", + "severity": "高", + "text": "請考慮禁用存儲帳戶密鑰,以便僅支援 AAD 訪問(和使用者委派 SAS)。", "waf": "安全" }, { - "arm-service": "Microsoft.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "中等", - "text": "確保將標準 SKU 用於 Azure 負載均衡器", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "guid": "9432621a-8397-4654-a882-5bc856b7ef83", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", - "service": "Load Balancer", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "確保負載均衡器前端IP位址是區域冗餘的(除非需要區域性前端)。", + "text": "使用存儲帳戶密鑰時,請考慮啟用“金鑰過期策略”", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "應用程式閘道 v2 應部署在IP前綴等於或大於 /24 的子網中", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "text": "考慮配置 SAS 過期策略", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "description": "一般而言,反向代理的管理,特別是 WAF 的管理更接近應用程式而不是網路,因此它們與應用程式屬於同一訂閱。如果應用程式閘道和 WAF 由單個團隊管理,則在連接訂閱中集中應用程式閘道和 WAF 可能是可以的。", - "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "App Gateway", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "部署 Azure 應用程式閘道 v2 或合作夥伴 NVA,用於在登陸區域虛擬網路中代理入站 HTTP(S) 連接,並使用它們所保護的應用。", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "text": "考慮將 SAS 連結到儲存存取策略", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "App Gateway", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "對應用程式登陸區域中的所有公共IP位址使用 DDoS 網路或IP保護計畫。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "請考慮配置應用程式的原始程式碼儲存庫,以檢測簽入的連接字串和存儲帳戶密鑰。", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "中等", - "text": "使用至少兩個實例數配置自動縮放。", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "可靠性" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "中等", - "text": "跨可用性區域部署應用程式閘道", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", - "waf": "可靠性" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "Front Door", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "將 Azure Front Door 與 WAF 策略配合使用,以交付和幫助保護跨多個 Azure 區域的全域 HTTP/S 應用。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "將窄範圍應用於SAS", "waf": "安全" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "3f29812b-2363-4cef-b179-b599de0d5973", - "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", - "service": "Front Door", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "使用 Front Door 和應用程式閘道幫助保護 HTTP/S 應用時,請在 Front Door 中使用 WAF 策略。鎖定應用程式閘道以僅接收來自 Front Door 的流量。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "盡可能考慮將SAS的範圍限定為特定的用戶端IP位址", "waf": "安全" }, { - "ammp": true, - "arm-service": "microsoft.network/trafficManagerProfiles", - "checklist": "Azure Application Delivery Networking", - "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", - "service": "Traffic Manager", - "severity": "高", - "text": "使用流量管理器提供跨 HTTP/S 以外的協定的全域應用。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "可靠性" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "SAS 無法限制用戶端上傳的數據量;考慮到存儲量隨時間變化的定價模型,驗證用戶端是否惡意上傳了大量內容可能是有意義的。", + "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", + "service": "Azure Storage", + "severity": "低", + "text": "請考慮在用戶端使用SAS上傳檔后檢查上傳的數據。", + "waf": "安全" }, { - "checklist": "Azure Application Delivery Networking", - "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "Entra", - "severity": "低", - "text": "如果使用者只需要訪問內部應用程式,是否考慮將 Microsoft Entra ID 應用程式代理作為 Azure 虛擬桌面 (AVD) 的替代方法?", - "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "安全" }, { - "checklist": "Azure Application Delivery Networking", - "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "Entra", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "若要減少為網路中的傳入連接打開的防火牆埠數,請考慮使用 Microsoft Entra ID 應用程式代理為遠端使用者提供對內部應用程式的安全且經過身份驗證的訪問。", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "text": "SFTP:SFTP 端點不支持類似 POSIX 的 ACL。", "waf": "安全" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "在「預防」模式下部署 Front Door 的 WAF 策略。", + "text": "避免過於寬泛的 CORS 策略", "waf": "安全" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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": "避免將 Azure 流量管理器和 Azure Front Door 結合使用。", + "text": "確定應如何加密靜態數據。了解數據的線程模型。", "waf": "安全" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "高", - "text": "在 Azure Front Door 和源上使用相同的功能變數名稱。主機名不匹配可能會導致細微的錯誤。", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "低", - "text": "當 Azure Front Door 源組中只有一個源時,禁用運行狀況探測。", - "waf": "性能" + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "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.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "Front Door", - "severity": "中等", - "text": "為 Azure Front Door 選擇良好的運行狀況探測終結點。請考慮構建運行狀況終結點,以檢查應用程式的所有依賴項。", + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Azure Blob Storage Review", + "description": "利用 Resource Graph 資源管理器(資源 | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true)查找允許匿名 blob 訪問的存儲帳戶。", + "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.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", + "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", + "service": "Logic Apps", + "severity": "高", + "text": "根據業務和 SLO 要求選擇正確的邏輯應用託管計劃", "waf": "可靠性" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "低", - "text": "將 HEAD 運行狀況探測與 Azure Front Door 配合使用,以減少 Front Door 發送到應用程式的流量。", - "waf": "性能" + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps 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", + "severity": "高", + "text": "使用區域冗餘和可用性區域保護邏輯應用免受區域故障的影響", + "waf": "可靠性" }, { - "ammp": true, - "arm-service": "Microsoft.Network/loadBalancers", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps 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", "severity": "高", - "text": "使用 Azure NAT 閘道而不是負載均衡器出站規則,以獲得更好的 SNAT 可伸縮性", + "text": "考慮為關鍵工作負載制定跨區域災難恢復策略", "waf": "可靠性" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", + "link": "https://learn.microsoft.com/azure/app-service/environment/intro", + "service": "Logic Apps", "severity": "高", - "text": "將託管 TLS 證書與 Azure Front Door 配合使用。降低運營成本和因證書續訂而導致的中斷風險。", - "waf": "操作" + "text": "如果部署到獨立環境,請使用或遷移到應用服務環境 (ASE) v3", + "waf": "可靠性" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Logic Apps checklist", + "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", + "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", + "service": "Logic Apps", "severity": "中等", - "text": "將 Azure Front Door WAF 配置定義為代碼。通過使用代碼,您可以更輕鬆地採用新的規則集版本並獲得額外的保護。", + "text": "利用 Azure DevOps 或 GitHub 簡化 CI/CD 並保護邏輯應用代碼", "waf": "操作" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", - "service": "Front Door", - "severity": "高", - "text": "將端到端 TLS 與 Azure Front Door 配合使用。使用 TLS 進行從用戶端到 Front Door 的連接,以及從 Front Door 到源的連接。", - "waf": "安全" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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", + "severity": "低", + "text": "有關最佳實踐,請參閱基線高可用性區域冗餘 Web 應用程式體系結構", + "waf": "可靠性" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", - "service": "Front Door", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "e4b31c6a-2e3f-4df1-8e8b-9c3aa5a27820", + "link": "https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans", + "service": "App Services", "severity": "中等", - "text": "將 HTTP 到 HTTPS 重定向與 Azure Front Door 配合使用。通過自動將較舊的用戶端重定向到 HTTPS 請求來支援它們。", - "waf": "安全" + "text": "使用高級層和標準層。這些層支援暫存槽和自動備份。", + "waf": "可靠性" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", - "service": "Front Door", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "a7e2e6c2-491f-4fa4-a82b-521d0bc3b202", + "link": "https://learn.microsoft.com/en-us/azure/reliability/migrate-app-service", + "service": "App Services", "severity": "高", - "text": "啟用 Azure Front Door WAF。保護您的應用程式免受一系列攻擊。", - "waf": "安全" + "text": "利用區域適用的可用性區域(需要高級 v2 或 v3 層)", + "waf": "可靠性" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "高", - "text": "針對工作負載優化 Azure Front Door WAF。減少誤報檢測。", - "waf": "安全" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "1275e4a9-7b6a-43c3-a9cd-5ee18d8995ad", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Services", + "severity": "中等", + "text": "實施健康檢查", + "waf": "可靠性" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "35a91c5d-4ad6-4d9b-8e0f-c47db9e6d1e7", + "link": "https://learn.microsoft.com/en-us/azure/app-service/manage-backup", + "service": "App Services", "severity": "高", - "text": "啟用在 Azure Front Door WAF 策略中啟用的請求正文檢查功能。", - "waf": "安全" + "text": "請參閱 Azure 應用服務的備份和還原最佳做法", + "waf": "可靠性" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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", "severity": "高", - "text": "啟用 Azure Front Door WAF 預設規則集。默認規則集檢測並阻止常見攻擊。", - "waf": "安全" + "text": "實現 Azure 應用服務可靠性最佳做法", + "waf": "可靠性" }, { - "ammp": true, - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "高", - "text": "啟用 Azure Front Door WAF 機器人保護規則集。機器人規則檢測好的和壞的機器人。", - "waf": "安全" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "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", + "severity": "低", + "text": "熟悉如何在災難期間將應用服務應用移動到另一個區域", + "waf": "可靠性" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "中等", - "text": "使用最新的 Azure Front Door WAF 規則集版本。規則集更新會定期更新,以考慮當前的威脅形勢。", - "waf": "安全" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "f3d2f1e4-e6d4-4b7a-a5a5-e2a9b2c6f293", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-app-service", + "service": "App Services", + "severity": "高", + "text": "熟悉 Azure 應用服務中的可靠性支援", + "waf": "可靠性" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "c7b5f3d1-0569-4fd2-9f32-c0b64e9c0c5e", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "App Services", "severity": "中等", - "text": "向 Azure Front Door WAF 添加速率限制。速率限制會阻止客戶端在短時間內意外或有意發送大量流量。", - "waf": "安全" + "text": "確保為在應用服務計劃上運行的函數應用啟用“Always On”", + "waf": "可靠性" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "a3b4d5f6-758c-4f9d-9e1a-d7c6b7e8f9ab", + "link": "https://learn.microsoft.com/en-us/azure/app-service/monitor-instances-health-check", + "service": "App Services", "severity": "中等", - "text": "對 Azure Front Door WAF 速率限制使用高閾值。高速率限制閾值可避免阻止合法流量,同時仍可針對可能使基礎結構不堪重負的大量請求提供保護。", - "waf": "安全" - }, - { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "低", - "text": "如果您不希望收到來自所有地理區域的流量,請使用地理篩選器來阻止來自非預期國家/地區的流量。", - "waf": "安全" + "text": "使用運行狀況檢查監視應用服務實例", + "waf": "可靠性" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "c7d3e5f9-a19c-4833-8ca6-1dcb0128e129", + "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-overview", + "service": "App Services", "severity": "中等", - "text": "使用 Azure Front Door WAF 對流量進行地理篩選時,請指定未知 (ZZ) 位置。避免在IP位址無法進行地理匹配時意外阻止合法請求。", - "waf": "安全" + "text": "使用 Application Insights 可用性測試監視 Web 應用或網站的可用性和回應能力", + "waf": "可靠性" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "高", - "text": "啟用 Azure 應用程式閘道 WAF 機器人保護規則集 機器人規則可檢測好機器人和壞機器人。", - "waf": "安全" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "guid": "b4e3f2d5-a5c6-4d7e-8b2f-c5d9e7a8f0ea", + "link": "https://learn.microsoft.com/en-us/azure/azure-monitor/app/availability-standard-tests", + "service": "App Services", + "severity": "低", + "text": "使用 Application Insights 標準測試監視 Web 應用或網站的可用性和回應能力", + "waf": "可靠性" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "使用 Azure Key Vault 儲存應用程式所需的任何機密。 Key Vault 為儲存機密提供安全且經過審核的環境,並通過 Key Vault SDK 或應用服務 Key Vault 引用與應用服務很好地集成。", + "guid": "834ac932-223e-4ce8-8b12-3071a5416415", + "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", + "service": "App Services", "severity": "高", - "text": "啟用 Azure 應用程式閘道 WAF 策略中啟用的請求正文檢查功能。", + "text": "使用 Key Vault 儲存機密", "waf": "安全" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", - "service": "App Gateway", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "使用託管標識通過 Key Vault SDK 或透過應用服務 Key Vault 引用連接到 Key Vault。", + "guid": "833ea3ad-2c2d-4e73-8165-c3acbef4abe1", + "link": "https://learn.microsoft.com/azure/app-service/app-service-key-vault-references", + "service": "App Services", "severity": "高", - "text": "針對工作負載優化 Azure 應用程式閘道 WAF。減少誤報檢測。", + "text": "使用託管標識連接到 Key VaultUse Managed Identity to connect to Key Vault", "waf": "安全" }, { - "ammp": true, - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "將應用服務 TLS 證書存儲在 Key Vault 中。", + "guid": "f8d39fda-4776-4831-9c11-5775c2ea55b4", + "link": "https://learn.microsoft.com/azure/app-service/configure-ssl-certificate", + "service": "App Services", "severity": "高", - "text": "在「防護」模式下部署應用程式閘道的 WAF 策略。", - "waf": "安全" - }, - { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", - "service": "App Gateway", - "severity": "中等", - "text": "向 Azure 應用程式閘道 WAF 添加速率限制。速率限制會阻止客戶端在短時間內意外或有意發送大量流量。", - "waf": "安全" - }, - { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "中等", - "text": "對 Azure 應用程式閘道 WAF 速率限制使用高閾值。高速率限制閾值可避免阻止合法流量,同時仍可針對可能使基礎結構不堪重負的大量請求提供保護。", + "text": "使用 Key Vault 儲存 TLS 證書。", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "低", - "text": "如果您不希望收到來自所有地理區域的流量,請使用地理篩選器來阻止來自非預期國家/地區的流量。", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "處理敏感信息的系統應隔離。 為此,請使用單獨的應用服務計劃或應用服務環境,並考慮使用不同的訂閱或管理組。", + "guid": "6ad48408-ee72-4734-a475-ba18fdbf590c", + "link": "https://learn.microsoft.com/azure/app-service/overview-hosting-plans", + "service": "App Services", + "severity": "中等", + "text": "隔離處理敏感信息的系統", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", - "service": "App Gateway", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "應用服務上的本地磁碟未加密,敏感數據不應存儲在這些磁碟上。 (例如:D:\\\\Local 和 %TMP%)。", + "guid": "e65de8e0-3f9b-4cbd-9682-66abca264f9a", + "link": "https://learn.microsoft.com/azure/app-service/operating-system-functionality#file-access", + "service": "App Services", "severity": "中等", - "text": "使用 Azure 應用程式閘道 WAF 對流量進行地理篩選時,請指定未知 (ZZ) 位置。避免在IP位址無法進行地理匹配時意外阻止合法請求。", + "text": "不要將敏感數據存儲在本地磁碟上", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "對於經過身份驗證的 Web 應用程式,請使用成熟的標識提供者,例如 Azure AD 或 Azure AD B2C。 利用所選的應用程式框架與此提供程式整合,或使用應用服務身份驗證/授權功能。", + "guid": "919ca0b2-c121-459e-814b-933df574eccc", + "link": "https://learn.microsoft.com/azure/app-service/overview-authentication-authorization", + "service": "App Services", "severity": "中等", - "text": "使用最新的 Azure 應用程式閘道 WAF 規則集版本。規則集更新會定期更新,以考慮當前的威脅形勢。", + "text": "使用已建立的身份提供程式進行身份驗證", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "中等", - "text": "添加診斷設置以保存 Azure 應用程式閘道 WAF 紀錄。", - "waf": "操作" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "將代碼從受控且受信任的環境(例如管理良好且安全的 DevOps 部署管道)部署到應用服務。這樣可以避免未經版本控制和驗證從惡意主機部署的代碼。", + "guid": "3f9bcbd4-6826-46ab-aa26-4f9a19aed9c5", + "link": "https://learn.microsoft.com/azure/app-service/deploy-best-practices", + "service": "App Services", + "severity": "高", + "text": "從受信任的環境部署", + "waf": "安全" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "中等", - "text": "添加診斷設置以保存 Azure Front Door WAF 紀錄。", - "waf": "操作" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "禁用 FTP/FTPS 和 WebDeploy/SCM 的基本身份驗證。 這將禁止訪問這些服務,並強制使用 Azure AD 安全終結點進行部署。 請注意,還可以使用 Azure AD 憑據打開 SCM 網站。", + "guid": "5d04c2c3-919c-4a0b-8c12-159e114b933d", + "link": "https://learn.microsoft.com/azure/app-service/deploy-configure-credentials#disable-basic-authentication", + "service": "App Services", + "severity": "高", + "text": "禁用基本身份驗證", + "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "中等", - "text": "將 Azure 應用程式閘道 WAF 紀錄發送到 Microsoft Sentinel。", - "waf": "操作" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "如果可能,請使用託管標識連接到 Azure AD 受保護的資源。 如果無法做到這一點,請將機密存儲在 Key Vault 中,並改用託管標識連接到 Key Vault。", + "guid": "f574eccc-d9bd-43ba-bcda-3b54eb2eb03d", + "link": "https://learn.microsoft.com/azure/app-service/overview-managed-identity?tabs=portal%2Chttp", + "service": "App Services", + "severity": "高", + "text": "使用託管標識連接到資源", + "waf": "安全" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "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", - "severity": "中等", - "text": "將 Azure Front Door WAF 日誌發送到 Microsoft Sentinel。", - "waf": "操作" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "如果使用 Azure 容器註冊表中儲存的映像,請使用託管標識拉取這些映像。", + "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", + "severity": "高", + "text": "使用託管標識拉取容器", + "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "通過配置應用服務的診斷設置,可以將所有遙測數據發送到Log Analytics,作為日誌記錄和監視的中心目標。這允許你監視應用服務的運行時活動,例如 HTTP 日誌、應用程式日誌、平臺日誌等。", + "guid": "47768314-c115-4775-a2ea-55b46ad48408", + "link": "https://learn.microsoft.com/azure/app-service/troubleshoot-diagnostic-logs", + "service": "App Services", "severity": "中等", - "text": "將 Azure 應用程式閘道 WAF 設定定義為代碼。通過使用代碼,您可以更輕鬆地採用新的規則集版本並獲得額外的保護。", - "waf": "操作" + "text": "將應用服務運行時日誌發送到Log Analytics", + "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", - "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", - "service": "App Gateway", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "設置診斷設置,將活動日誌發送到Log Analytics,作為日誌記錄和監視的中心目標。這樣,你就可以監視應用服務資源本身上的控制平面活動。", + "guid": "ee72734b-475b-4a18-bdbf-590ce65de8e0", + "link": "https://learn.microsoft.com/azure/azure-monitor/essentials/activity-log", + "service": "App Services", "severity": "中等", - "text": "使用 WAF 策略而不是舊版 WAF 配置。", - "waf": "操作" + "text": "將應用服務活動日誌發送到Log Analytics", + "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", - "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", - "service": "App Gateway", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "使用區域 VNet 集成、網路安全組和 UDR 的組合來控制出站網路訪問。 流量應路由到 NVA,例如 Azure 防火牆。 確保監控防火牆的日誌。", + "guid": "c12159e1-14b9-433d-b574-ecccd9bd3baf", + "link": "https://learn.microsoft.com/azure/app-service/overview-vnet-integration", + "service": "App Services", "severity": "中等", - "text": "篩選後端中的入站流量,以便它們僅接受來自應用程式閘道子網的連接,例如使用NSG。", + "text": "應控制出站網路訪問", "waf": "安全" }, { - "arm-service": "microsoft.network/frontdoors", - "checklist": "Azure Application Delivery Networking", - "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", - "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", - "service": "Front Door", - "severity": "中等", - "text": "確保源僅從 Azure Front Door 實例獲取流量。", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "可以使用 VNet 集成並使用 VNet NAT 閘道或 NVA(如 Azure 防火牆)來提供穩定的出站 IP。 這允許接收方根據需要根據IP列出允許清單。 請注意,對於與 Azure 服務的通信,通常不需要依賴於 IP 位址,應改用服務終結點等機制。 (此外,在接收端使用專用終結點可避免發生 SNAT,並提供穩定的出站 IP 範圍。", + "guid": "cda3b54e-b2eb-403d-b9a2-582718d2ddb1", + "link": "https://learn.microsoft.com/azure/app-service/networking/nat-gateway-integration", + "service": "App Services", + "severity": "低", + "text": "確保與互聯網位址的出站通信具有穩定的IP", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", - "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", - "service": "App Gateway", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "使用應用服務訪問限制、服務終結點或專用終結點的組合來控制入站網路訪問。對於 Web 應用本身和 SCM 網站,可能需要和配置不同的訪問限制。", + "guid": "0725769e-e669-41a4-a34a-c932223ece80", + "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", + "service": "App Services", "severity": "高", - "text": "您應該對發往後端伺服器的流量進行加密。", + "text": "應控制入站網路訪問", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", - "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", - "service": "App Gateway", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "使用 Web 應用程式防火牆(如應用程式閘道或 Azure Front Door)防範惡意入站流量。 請務必監控 WAF 的日誌。", + "guid": "b123071a-5416-4415-a33e-a3ad2c2de732", + "link": "https://learn.microsoft.com/azure/app-service/networking/app-gateway-with-service-endpoints", + "service": "App Services", "severity": "高", - "text": "您應該使用 Web 應用程式防火牆。", + "text": "在應用服務前面使用 WAF", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", - "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", - "service": "App Gateway", - "severity": "中等", - "text": "將 HTTP 重定向到 HTTPS", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "確保僅鎖定對 WAF 的訪問,從而無法繞過 WAF。 結合使用訪問限制、服務終結點和專用終結點。", + "guid": "165c3acb-ef4a-4be1-b8d3-9fda47768314", + "link": "https://learn.microsoft.com/azure/app-service/networking-features#access-restrictions", + "service": "App Services", + "severity": "高", + "text": "避免繞過 WAF", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "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", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "在應用服務配置中將最低 TLS 策略設置為 1.2。", + "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", "severity": "中等", - "text": "使用閘道管理的 Cookie 將流量從使用者工作階段定向到同一伺服器進行處理", - "waf": "操作" + "text": "將最低 TLS 策略設置為 1.2", + "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", - "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", - "service": "App Gateway", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "將應用服務配置為僅使用 HTTPS。 這會導致應用服務從 HTTP 重定向到 HTTPS。 強烈建議在代碼或 WAF 中使用 HTTP 嚴格傳輸安全性 (HSTS),這會通知瀏覽器只能使用 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", "severity": "高", - "text": "在計劃的服務更新期間啟用連接耗盡,以防止與後端池的現有 membr 的連接丟失", + "text": "僅使用 HTTPS", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", - "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", - "service": "App Gateway", - "severity": "低", - "text": "創建自訂錯誤頁面以顯示個人化的用戶體驗", - "waf": "操作" + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "不要在 CORS 配置中使用通配符,因為這允許所有源訪問服務(從而破壞 CORS 的目的)。具體而言,僅允許您希望能夠訪問服務的源。", + "guid": "68266abc-a264-4f9a-89ae-d9c55d04c2c3", + "link": "https://learn.microsoft.com/azure/app-service/app-service-web-tutorial-rest-api", + "service": "App Services", + "severity": "高", + "text": "不得將通配符用於 CORS", + "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", - "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", - "service": "App Gateway", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "不得在生產環境中啟用遠端調試,因為這會在服務上打開其他埠,從而增加攻擊面。請注意,該服務會在 48 小時後自動轉為遠端調試。", + "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", + "severity": "高", + "text": "關閉遠端調試", + "waf": "安全" + }, + { + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "啟用 Defender for App Service。 這(除其他威脅外)檢測與已知惡意IP位址的通信。 在操作過程中查看 Defender for App Service 中的建議。", + "guid": "18d2ddb1-0725-4769-be66-91a4834ac932", + "link": "https://learn.microsoft.com/azure/defender-for-cloud/defender-for-app-service-introduction", + "service": "App Services", "severity": "中等", - "text": "編輯 HTTP 請求和回應標頭,以便更輕鬆地在用戶端和伺服器之間進行路由和資訊交換", + "text": "啟用 Defender for Cloud - Defender for App Service", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", - "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", - "service": "App Gateway", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "Azure 在其網路上提供 DDoS 基本保護,可以通過智慧 DDoS 標準功能進行改進,該功能可以瞭解正常的流量模式並檢測異常行為。DDoS 標準適用於虛擬網路,因此必須為應用前面的網路資源(例如應用程式閘道或 NVA)配置它。", + "guid": "223ece80-b123-4071-a541-6415833ea3ad", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "App Services", "severity": "中等", - "text": "配置 Front Door,通過快速全域故障轉移優化全球 Web 流量路由和頂級最終使用者性能和可靠性", - "waf": "性能" + "text": "在 WAF VNet 上啟用 DDOS 保護標準", + "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "29dcc19f-a8fa-4c35-8281-290577538793", - "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", - "service": "App Gateway", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "如果使用 Azure 容器註冊表中儲存的映像,請使用其專用終結點和應用設置“WEBSITE_PULL_IMAGE_OVER_VNET”通過虛擬網络從 Azure 容器註冊表拉取這些映射。", + "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", "severity": "中等", - "text": "使用傳輸層負載平衡", - "waf": "性能" + "text": "通過虛擬網路拉取容器", + "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", - "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", - "service": "App Gateway", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "按照參與的滲透測試規則對 Web 應用程式進行滲透測試。", + "guid": "eb2eb03d-d9a2-4582-918d-2ddb10725769", + "link": "https://learn.microsoft.com/azure/security/fundamentals/pen-testing", + "service": "App Services", "severity": "中等", - "text": "根據主機名或域名為單個閘道上的多個 Web 應用程式配置路由", + "text": "進行滲透測試", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", - "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", - "service": "App Gateway", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "部署根據 DevSecOps 實踐驗證和掃描漏洞的受信任代碼。", + "guid": "19aed9c5-5d04-4c2c-9919-ca0b2c12159e", + "link": "https://learn.microsoft.com/azure/architecture/solution-ideas/articles/devsecops-in-azure", + "service": "App Services", "severity": "中等", - "text": "集中管理 SSL 證書,以減少後端伺服器場的加密和解密開銷", + "text": "部署經過驗證的代碼", "waf": "安全" }, { - "arm-service": "microsoft.network/applicationGateways", - "checklist": "Azure Application Delivery Networking", - "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", - "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", - "service": "App Gateway", - "severity": "低", - "text": "使用應用程式閘道對 WebSocket 和 HTTP/2 協定提供本機支援", + "arm-service": "microsoft.web/sites", + "checklist": "Azure App Service Review", + "description": "使用最新版本的受支援平臺、程式設計語言、協定和框架。", + "guid": "114b933d-f574-4ecc-ad9b-d3bafcda3b54", + "link": "https://learn.microsoft.com/azure/app-service/overview-patch-os-runtime", + "service": "App Services", + "severity": "高", + "text": "使用最新的平臺、語言、協定和框架", "waf": "安全" }, { @@ -5896,3101 +5821,3176 @@ "waf": "卓越運營" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review Checklist", - "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", - "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", - "service": "Azure MySQL", - "severity": "中等", - "text": "利用靈活伺服器", - "waf": "可靠性" + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization Checklist", + "guid": "a95b86ad-8840-48e3-9273-4b875ba18f20", + "link": "https://learn.microsoft.com/azure/architecture/guide/multitenant/considerations/tenancy-models", + "service": "Azure Monitor", + "text": "Azure Monitor 中的數據收集規則 -https://learn.microsoft.com/azure/azure-monitor/essentials/data-collection-rule-overview", + "training": "https://azure.microsoft.com/pricing/reservations/", + "waf": "成本" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review 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", - "severity": "高", - "text": "利用區域適用的可用區", - "waf": "可靠性" + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "text": "檢查未找到底層數據源的備份實例", + "waf": "成本" }, { - "arm-service": "Microsoft.DBforMySQL/servers", - "checklist": "MySQL Review 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", - "severity": "中等", - "text": "將數據傳入複製用於跨區域災難恢復方案", - "waf": "可靠性" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "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", + "text": "刪除或存檔未關聯的服務(磁碟、網卡、IP 位址等)", + "waf": "成本" + }, + { + "arm-service": "Microsoft.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "text": "考慮在網站恢復存儲和非任務關鍵型應用程式的備份之間取得良好的平衡", + "waf": "成本" + }, + { + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization 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", + "text": "檢查 40 個不同 Log Analytics 工作區之間的支出和節省機會 - 對非生產工作區使用不同的保留和數據收集 - 創建每日上限以實現意識和層大小調整 - 如果確實設置了每日上限,除了在達到上限時創建警報外,請確保還創建警報規則,以便在達到某個百分比(例如 90%)時收到通知。- 如果可能,考慮工作空間改造 - 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": "成本" + }, + { + "arm-service": "Microsoft.Insights/components", + "checklist": "Cost Optimization 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", + "text": "強制執行清除日誌策略和自動化(如果需要,可以將記錄移至冷存儲)", + "training": "https://www.youtube.com/watch?v=nHQYcYGKuyw", + "waf": "成本" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "text": "檢查磁碟是否確實需要,如果不是:刪除。如果需要,請尋找較低的儲存層或使用備份 -", + "training": "https://learn.microsoft.com/azure/cost-management-billing/costs/manage-automation", + "waf": "成本" + }, + { + "arm-service": "Microsoft.Storage/storageAccounts", + "checklist": "Cost Optimization 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", + "text": "考慮使用自定義規則將未使用的存儲移動到較低層 - 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": "成本" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "d0102cac-6aae-401e-9a84-de5de36d1d92", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "VM", + "text": "確保 advisor 配置為適合 VM 大小調整", + "waf": "成本" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "description": "通過在成本分析系統中搜索計量類別許可證進行檢查", + "guid": "59ae568b-a38d-4498-9e22-13dbd7bb012f", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/manage/centralize-operations", + "service": "VM", + "text": "在所有 Windows VM 上運行腳本 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 - 如果頻繁創建 Windows VM,請考慮實施策略", + "waf": "成本" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "7b95e06e-158e-42ea-9992-c2de6e2065b3", + "link": "https://learn.microsoft.com/azure/active-directory/privileged-identity-management/pim-configure", + "service": "VM", + "text": "如果您已經擁有許可證,也可以將其置於 AHUB https://learn.microsoft.com/azure/virtual-machines/linux/azure-hybrid-benefit-linux?tabs=rhelpayg%2Crhelbyos%2CrhelEnablebyos%2Crhelcompliance", + "waf": "成本" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "75c1e945-b459-4837-bf7a-e7c6d3b475a5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-groups-create-azure-portal", + "service": "VM", + "text": "使用靈活性選項(不超過 4-5 個系列)整合保留的 VM 系列", + "training": "https://learn.microsoft.com/azure/automation/automation-solution-vm-management", + "waf": "成本" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "text": "利用 Azure 預留實例:此功能允許將 VM 預留 1 年或 3 年,與 PAYG 價格相比,可顯著節省成本。", + "waf": "成本" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "a6bcca2b-4fea-41db-b3dd-95d48c7c891d", + "link": "https://learn.microsoft.com/azure/active-directory-domain-services/overview", + "service": "VM", + "text": "只能保留較大的磁碟 => 1 TiB -", + "waf": "成本" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "cb1f7d57-59ae-4568-aa38-d4985e2213db", + "link": "https://learn.microsoft.com/azure/architecture/reference-architectures/identity/adds-extend-domain", + "service": "VM", + "text": "調整大小優化后", + "waf": "成本" + }, + { + "arm-service": "Microsoft.Sql/servers", + "checklist": "Cost Optimization Checklist", + "guid": "d7bb012f-7b95-4e06-b158-e2ea3992c2de", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", + "service": "Azure SQL", + "text": "檢查是否適用並強制執行策略/更改 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": "成本" + }, + { + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "6e2065b3-a76a-4f4a-991e-8839ada46667", + "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", + "service": "VM", + "text": "虛擬機 + 許可證部分折扣 (ahub + 3YRI) 約為 70% 的折扣", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Compute/virtualMachines", + "checklist": "Cost Optimization 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", + "text": "考慮使用 VMSS 來滿足需求,而不是按比例調整", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.containerservice/managedClusters", + "checklist": "Cost Optimization Checklist", + "guid": "c1b1cd52-1e54-4a29-a9de-39ac0e7c28dc", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "service": "AKS", + "text": "使用 AKS 自動縮放程式符合群集使用方式(確保 Pod 要求與縮放程式符合)", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.RecoveryServices/vaults", + "checklist": "Cost Optimization 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", + "text": "將恢復點移至保管庫存檔(如果適用)(驗證)", + "training": "https://azure.microsoft.com/pricing/reservations/", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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 DefenderEnable Defender for all of your storage accounts", - "waf": "安全" + "arm-service": "Microsoft.Databricks/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "cd463cbb-bc8a-4c29-aebc-91a43da1dae2", + "link": "https://learn.microsoft.com/azure/databricks/clusters/cluster-config-best-practices#automatic-termination", + "service": "Databricks", + "text": "請考慮盡可能使用帶回退功能的現成 VM。考慮群集的自動終止。", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "cc881470-607c-41cc-a0e6-14658dd458e9", + "link": "https://learn.microsoft.com/azure/governance/policy/how-to/guest-configuration-create", + "service": "Azure Functions", + "text": "功能 - 重用連接", + "training": "https://learn.microsoft.com/azure/cost-management-billing/reservations/reservation-apis?toc=%2Fazure%2Fcost-management-billing%2Ftoc.json", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "27139b82-1102-4dbd-9eaf-11e6f843e52f", + "link": "https://learn.microsoft.com/azure/automation/update-management/overview", + "service": "Azure Functions", + "text": "函數 - 本地快取資料", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-compute-resources/", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "4722d928-c1b1-4cd5-81e5-4a29b9de39ac", + "link": "https://learn.microsoft.com/azure/network-watcher/network-watcher-monitoring-overview", + "service": "Azure Functions", + "text": "函數 - 冷啟動 - 使用“從包運行”功能。這樣,代碼將下載為單個 zip 檔。例如,這可以顯著改進具有大量節點模組的 Javascript 函數。使用特定於語言的工具來減小包大小,例如,搖樹 Javascript 應用程式。", + "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "0e7c28dc-9366-4572-82bf-f4564b0d934a", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "Azure Functions", + "text": "功能 - 保持功能溫暖", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "359c363e-7dd6-4162-9a36-4a907ebae38e", + "link": "https://learn.microsoft.com/azure/governance/policy/overview", + "service": "Azure Functions", + "text": "使用具有不同功能的自動縮放時,可能會有一個資源驅動所有資源的所有自動縮放 - 請考慮將其移動到單獨的消耗計劃(並考慮更高的 CPU 計劃)", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "ad53cc7d-e2e8-4aaa-a357-1549ab9153d8", + "link": "https://learn.microsoft.com/azure/service-health/alerts-activity-log-service-notifications-portal", + "service": "Azure Functions", + "text": "給定計劃中的函數應用都縮放在一起,因此縮放的任何問題都可能影響計劃中的所有應用。", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Web/sites", + "checklist": "Cost Optimization Checklist", + "guid": "9f89dc7b-44be-43b1-a27f-8b9e91be1f38", + "link": "https://learn.microsoft.com/azure/azure-monitor/alerts/action-groups", + "service": "Azure Functions", + "text": "我需要為「等待時間」付費嗎?這個問題通常是在執行異步操作並等待結果的 C# 函數的上下文中提出的,例如 await Task.Delay(1000) 或 await client。GetAsync('http://google.com')。答案是肯定的 - GB 秒計算基於函數的開始和結束時間以及該時間段內的記憶體使用方式。在這段時間內實際發生的CPU活動未計入計算。此規則的一個例外是,如果使用的是持久函數。您無需為在業務流程協調程式函數中等待所花費的時間付費。在可能的情況下應用需求塑造技術(開發環境?)https://github.com/Azure-Samples/functions-csharp-premium-scaler", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.network/frontdoors", + "checklist": "Cost Optimization Checklist", + "guid": "3da1dae2-cc88-4147-8607-c1cca0e61465", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "Front Door", + "text": "Frontdoor - 關閉預設主頁在應用的應用程式設置中,將 AzureWebJobsDisableHomepage 設置為 true。這將向PoP返回204(無內容),因此僅返回標頭數據。", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.network/frontdoors", + "checklist": "Cost Optimization 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", + "text": "Frontdoor - 路由到不返回任何內容的內容。設置函數、函數代理,或在 WebApp 中添加返回 200 (OK) 且不發送內容或發送最少內容的路由。這樣做的好處是您可以在調用時註銷。", + "waf": "成本" }, { "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "在可能的情況下,AAD 令牌應優先於共用訪問簽名", - "guid": "e1ce15dd-3f0d-45e7-92d4-1e3611cc57b4", - "link": "https://learn.microsoft.com/azure/storage/common/authorize-data-access", - "service": "Azure Storage", - "severity": "高", - "text": "使用 Azure Active Directory (Azure AD) 令牌進行 blob 訪問", - "waf": "安全" + "checklist": "Cost Optimization Checklist", + "guid": "7e31c67d-68cf-46a6-8a11-94956d697dc3", + "link": "https://learn.microsoft.com/azure/architecture/best-practices/monitoring", + "service": "Storage", + "text": "考慮為使用較少的數據存檔層", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "將角色分配給使用者、組或應用程式時,請僅向該安全主體授予他們執行任務所需的許可權。限制對資源的訪問有助於防止無意和惡意濫用數據。", - "guid": "a4b1410d-4395-48a8-a228-9b3d6b57cfc6", - "service": "Azure Storage", - "severity": "中等", - "text": "IaM 許可權中的最低特權", - "waf": "安全" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "a2ed27b2-d186-4f1a-8252-bddde68a487c", + "link": "https://learn.microsoft.com/azure/automation/how-to/region-mappings", + "service": "VM", + "text": "檢查大小與層不匹配的磁碟大小(即 513 GiB 磁碟將支付 P30 (1TiB) 並考慮調整大小", + "waf": "成本" }, { "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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": "安全" + "checklist": "Cost Optimization Checklist", + "guid": "dec4861b-c3bc-410a-b77e-26e4d5a3bec2", + "link": "https://learn.microsoft.com/azure/governance/policy/concepts/guest-configuration", + "service": "Storage", + "text": "盡可能考慮使用標準 SSD,而不是 Premium 或 Ultra", + "waf": "成本" }, { "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "存儲帳戶金鑰(“共用金鑰”)幾乎沒有審核功能。雖然可以監控誰/何時獲取密鑰副本,但一旦密鑰掌握在多個人手中,就不可能將使用方式歸因於特定使用者。僅依靠 AAD 身份驗證可以更輕鬆地將存儲存取許可權綁定到使用者。", - "guid": "15f51296-5398-4e6d-bd22-7dd142b06c21", - "link": "https://learn.microsoft.com/rest/api/storageservices/authorize-with-shared-key", - "service": "Azure Storage", - "severity": "高", - "text": "請考慮禁用存儲帳戶密鑰,以便僅支援 AAD 訪問(和使用者委派 SAS)。", - "waf": "安全" + "checklist": "Cost Optimization 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", + "text": "對於存儲帳戶,請確保所選層不會增加事務費用(移動到下一層可能會更便宜)", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.RecoveryServices/vaults", + "checklist": "Cost Optimization Checklist", + "guid": "c2efc5d7-61d4-41d2-900b-b47a393a040f", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-overview", + "service": "Site Recovery", + "text": "對於 ASR,如果 RPO/RTO 和複製輸送量允許,請考慮使用標準 SSD 磁碟", + "waf": "成本" }, { "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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": "安全" + "checklist": "Cost Optimization Checklist", + "guid": "d3294798-b118-48b2-a5a4-6ceb544451e1", + "link": "https://learn.microsoft.com/azure/architecture/framework/resiliency/backup-and-recovery", + "service": "Storage", + "text": "存儲帳戶:檢查熱層和/或 GRS 必填", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "92d34429-3c76-4286-97a5-51c5b04e4f18", + "link": "https://learn.microsoft.com/azure/backup/backup-center-overview", + "service": "VM", + "text": "磁碟 - 驗證高級 SSD 磁碟在任何地方的使用方式:例如,非生產磁碟可以交換到標準 SSD 或按需高級 SSD", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "54387e5c-ed12-46cd-832a-f5b2fc6998a5", + "link": "https://learn.microsoft.com/azure/reliability/availability-zones-overview", + "service": "Synapse", + "text": "創建預算以管理成本並創建警報,自動通知利益相關者支出異常和超支風險。", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "35e33789-7e31-4c67-b68c-f6a62a119495", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "Synapse", + "text": "將成本數據匯出到存儲帳戶以進行其他數據分析。", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "6d697dc3-a2ed-427b-8d18-6f1a1252bddd", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "Synapse", + "text": "通過在不使用資源時暫停資源來控制專用 SQL 池的成本。", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Synapse/workspaces", + "checklist": "Cost Optimization Checklist", + "guid": "e68a487c-dec4-4861-ac3b-c10ae77e26e4", + "link": "https://learn.microsoft.com/azure/virtual-machine-scale-sets/overview", + "service": "Synapse", + "text": "啟用無伺服器 Apache Spark 自動暫停功能,並相應地設置超時值。", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Synapse/workspaces", + "checklist": "Cost Optimization 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", + "text": "創建多個不同大小的 Apache Spark 池定義。", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Synapse/workspaces", + "checklist": "Cost Optimization 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", + "text": "使用預購計劃購買為期一年的 Azure Synapse 提交單元 (SCU),以節省 Azure Synapse Analytics 成本。", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "SAS 無法限制用戶端上傳的數據量;考慮到存儲量隨時間變化的定價模型,驗證用戶端是否惡意上傳了大量內容可能是有意義的。", - "guid": "348b263e-6dd6-4051-8a36-498f6dbad38e", - "service": "Azure Storage", - "severity": "低", - "text": "請考慮在用戶端使用SAS上傳檔后檢查上傳的數據。", - "waf": "安全" + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "393a040f-d329-4479-ab11-88b2c5a46ceb", + "link": "https://learn.microsoft.com/azure/application-gateway/overview-v2", + "service": "VM", + "text": "將現成 VM 用於可中斷作業:這些 VM 可以以折扣價競標和購買,為非關鍵工作負載提供經濟高效的解決方案。", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "544451e1-92d3-4442-a3c7-628637a551c5", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "VM", + "text": "合理調整所有 VM 的大小", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "b04e4f18-5438-47e5-aed1-26cd032af5b2", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-infrastructure#size-of-the-subnet", + "service": "VM", + "text": "將 VM 大小與規範化大小和最新大小交換", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "fc6998a5-35e3-4378-a7e3-1c67d68cf6a6", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", + "text": "調整 VM 大小 - 從低於 5% 的監視使用率開始,然後工作到 40%", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "成本" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "靜態數據始終在伺服器端加密,此外也可能在用戶端加密。伺服器端加密可能使用平臺管理的金鑰(預設)或客戶管理的金鑰進行。用戶端加密可以通過讓用戶端按 blob 向 Azure 儲存提供加密/解密金鑰,或者完全在用戶端處理加密來實現。因此,完全不依賴 Azure 存儲來保證機密性。", - "guid": "3d90cae2-cc88-4137-86f7-c0cbafe61464", - "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", - "service": "Azure Storage", + "arm-service": "Microsoft.Compute/virtualMachines", + "checklist": "Cost Optimization Checklist", + "guid": "2a119495-6d69-47dc-9a2e-d27b2d186f1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "VM", + "text": "容器化應用程式可以提高 VM 密度並節省擴展成本", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "成本" + }, + { + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency checklist", + "guid": "65285269-440b-44be-9d3e-0844276d4bdc", + "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-zone-redundancy", + "service": "Redis", "severity": "高", - "text": "確定應如何加密靜態數據。了解數據的線程模型。", - "waf": "安全" + "text": "為 Azure Cache for Redis 啟用區域冗餘。Azure Cache for Redis 支持高級層和企業層中的區域冗餘配置。區域冗餘緩存可以將其節點放置在同一區域的不同 Azure 可用性區域中。它消除了作為單點故障的數據中心或可用區中斷,並提高了緩存的整體可用性。", + "waf": "可靠性" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "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", + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency 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", "severity": "中等", - "text": "確定應使用哪種/是否應使用平臺加密。", - "waf": "安全" + "text": "為 Azure Cache for Redis 實例配置數據持久性。由於緩存數據存儲在記憶體中,因此多個節點的罕見和計劃外故障可能會導致所有數據被丟棄。為了避免完全丟失數據,Redis 持久性允許您定期拍攝記憶體中數據的快照,並將其存儲到存儲帳戶中。", + "waf": "可靠性" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "guid": "e842e52f-4721-4d92-ac1b-1cd521e54a29", - "link": "https://learn.microsoft.com/azure/storage/blobs/encryption-customer-provided-keys", - "service": "Azure Storage", + "arm-service": "microsoft.cache/redis", + "checklist": "Redis Resiliency 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", "severity": "中等", - "text": "確定應使用哪種/是否應使用用戶端加密。", - "waf": "安全" + "text": "使用異地冗餘存儲帳戶保留 Azure Cache for Redis 數據,或在異地冗餘不可用的情況下使用區域冗餘", + "waf": "可靠性" }, { - "arm-service": "Microsoft.Storage/storageAccounts", - "checklist": "Azure Blob Storage Review", - "description": "利用 Resource Graph 資源管理器(資源 | where type == 'microsoft.storage/storageaccounts' | where properties['allowBlobPublicAccess'] == true)查找允許匿名 blob 訪問的存儲帳戶。", - "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.cache/redis", + "checklist": "Redis Resiliency checklist", + "guid": "a8c26c9b-32ab-45bd-bc69-98a135e33789", + "link": "https://learn.microsoft.com/azure/azure-cache-for-redis/cache-how-to-geo-replication", + "service": "Redis", + "severity": "中等", + "text": "為高級 Azure Cache for Redis 實例配置被動異地複製。異地複製是一種用於連結兩個或多個 Azure Cache for Redis 實例的機制,通常跨越兩個 Azure 區域。異地複製主要用於跨區域災難恢復。兩個高級層緩存實例通過異地複製進行連接,從而提供對主緩存的讀取和寫入,並將數據複製到輔助緩存。", + "waf": "可靠性" }, { - "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", + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "guid": "6ad48408-ee72-4734-a476-ba28fdcf590c", + "link": "https://learn.microsoft.com/en-us/azure/reliability/reliability-bot", + "service": "Bot service", "severity": "中等", - "text": "使用一個 Entra 租戶來管理 Azure 資源,除非你對多租戶有明確的法規或業務要求。", - "waf": "操作" + "text": "遵循 Azure 機器人服務中的可靠性支持建議", + "waf": "可靠性" }, { - "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": "低", - "text": "使用多租戶自動化方法管理 Microsoft Entra ID 租戶。", - "waf": "操作" + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "guid": "e65de8e1-3f9c-4cbd-9682-66abca264f9a", + "link": "https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-concept-regionalization", + "service": "Bot service", + "severity": "中等", + "text": "部署具有本地數據駐留和區域合規性的機器人", + "waf": "可靠性" }, { - "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": "高", - "text": "使用具有相同 ID 的 Azure Lighthouse 進行多租戶管理。", - "training": "https://learn.microsoft.com/azure/lighthouse/concepts/cross-tenant-management-experience", - "waf": "操作" + "arm-service": "Microsoft.BotService/botServices", + "checklist": "Azure Bot Service", + "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", + "severity": "中等", + "text": "Azure 機器人服務在全域和區域服務的主動-主動模式下運行。發生中斷時,無需檢測錯誤或管理服務。Azure 機器人服務在多區域地理體系結構中自動執行自動故障轉移和自動恢復。對於歐盟機器人區域服務,Azure 機器人服務在歐洲境內提供兩個完整區域,並提供主動/主動複製,以確保冗餘。對於全球機器人服務,所有可用的區域/地理位置都可以作為全球足跡。", + "waf": "可靠性" }, { - "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": "高", - "text": "如果向合作夥伴授予管理租戶的訪問許可權,請使用 Azure Lighthouse。", - "waf": "成本" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "中等", + "text": "如果將客戶管理的 TLS 證書用於 Azure Front Door,請使用“最新”證書版本。降低手動證書續訂導致的中斷風險", + "waf": "操作" }, { - "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": "高", - "text": "強制實施與雲操作模型相符的 RBAC 模型。跨管理組和訂閱確定範圍和分配。", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "中等", + "text": "確保使用應用程式閘道 v2 SKU", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "安全" }, { - "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": "高", - "text": "僅對所有帳戶類型使用身份驗證類型「工作或學校帳戶」。避免使用 Microsoft 帳戶", - "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "中等", + "text": "請確保對 Azure 負載均衡器使用標準 SKU", "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "guid": "9432621a-8397-4654-a882-5bc856b7ef83", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-standard-availability-zones", + "service": "Load Balancer", "severity": "中等", - "text": "僅使用組來分配許可權。如果已建立組管理系統,則將本地組添加到僅 Entra ID 組。", - "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", + "text": "確保負載均衡器前端IP位址是區域冗餘的(除非需要區域前端)。", "waf": "安全" }, { - "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": "高", - "text": "對有權訪問 Azure 環境的任何用戶強制實施 Microsoft Entra ID 條件訪問策略。", - "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "中等", + "text": "應用程式閘道 v2 應部署在IP前綴等於或大於 /24 的子網中", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "安全" }, { - "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": "高", - "text": "對有權訪問 Azure 環境的任何使用者強制實施多重身份驗證。", - "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "description": "一般而言,反向代理(尤其是 WAF)的管理更接近應用程式,而不是網路,因此它們與應用程式屬於同一訂閱。如果應用程式閘道和 WAF 由一個團隊管理,則在連接訂閱中集中管理應用程式閘道和 WAF 可能是可以的。", + "guid": "48b662d6-d15f-4512-a654-98f6dfe237de", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "App Gateway", + "severity": "中等", + "text": "部署 Azure 應用程式閘道 v2 或合作夥伴 NVA,用於在登陸區域虛擬網路中代理入站 HTTP(S) 連接,並與其保護的應用一起使用。", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f109e1f3-c79b-4f14-82de-6b5c22314d08", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "App Gateway", "severity": "中等", - "text": "強制實施 Microsoft Entra ID 特權標識管理 (PIM) 以建立零長期訪問許可權和最低特權。", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "text": "對應用程式登陸區域中的所有公共IP位址使用 DDoS 網路或IP保護計畫。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "安全" }, { - "checklist": "Azure Landing Zone Review", - "guid": "8b9fe5c4-1049-4d40-9a92-3c3474d00018", - "link": "https://learn.microsoft.com/en-us/entra/identity/domain-services/overview", - "service": "Entra", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "中等", - "text": "如果計劃從 Active Directory 域服務切換到 Entra 域服務,請評估所有工作負載的相容性。", - "training": "https://learn.microsoft.com/learn/modules/implement-hybrid-identity-windows-server/", - "waf": "安全" + "text": "配置自動縮放,最小實例數為 2。", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "可靠性" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "中等", - "text": "將 Microsoft Entra ID 日誌與平臺為中心的 Azure Monitor 集成。Azure Monitor 允許圍繞 Azure 中的日誌和監視數據提供單一事實來源,為組織提供雲原生選項,以滿足日誌收集和保留方面的要求。", - "waf": "安全" + "text": "跨可用性區域部署應用程式閘道", + "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "waf": "可靠性" }, { - "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": "高", - "text": "實施緊急訪問或打破玻璃帳戶,以防止租戶範圍的帳戶鎖定。", - "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "e79d17b7-3b22-4a5a-97e7-a8ed4b30e38c", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Front Door", + "severity": "中等", + "text": "將 Azure Front Door 與 WAF 策略結合使用,以交付並幫助保護跨多個 Azure 區域的全球 HTTP/S 應用。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "安全" }, { - "checklist": "Azure Landing Zone Review", - "guid": "35037e68-9349-4c15-b371-228514f4cdff", - "link": "https://learn.microsoft.com/azure/active-directory/roles/best-practices", - "service": "Entra", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "3f29812b-2363-4cef-b179-b599de0d5973", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "Front Door", "severity": "中等", - "text": "請勿使用本地同步帳戶進行 Microsoft Entra ID 角色分配,除非你有特別需要它的方案。", - "training": "https://learn.microsoft.com/learn/modules/design-identity-security-strategy/", + "text": "使用 Front Door 和應用程式閘道幫助保護 HTTP/S 應用時,請在 Front Door 中使用 WAF 策略。鎖定應用程式閘道以僅接收來自 Front Door 的流量。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", "waf": "安全" }, { - "checklist": "Azure Landing Zone Review", - "guid": "d5d1e4e6-1465-48d3-958f-d77249b82111", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy", + "ammp": true, + "arm-service": "microsoft.network/trafficManagerProfiles", + "checklist": "Azure Application Delivery Networking", + "guid": "cd4cd21b-0881-437f-9e6c-4cfd3e504547", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "Traffic Manager", + "severity": "高", + "text": "使用流量管理器交付跨 HTTP/S 以外的協定的全域應用。", + "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "waf": "可靠性" + }, + { + "checklist": "Azure Application Delivery Networking", + "guid": "3b4b3e88-a459-4ed5-a22f-644dfbc58204", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", "service": "Entra", - "severity": "中等", - "text": "使用 Microsoft Entra ID 應用程式代理為遠端使用者提供對應用程式的訪問許可權時,請將其作為平臺資源進行管理,因為每個租戶只能有一個實例。", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "severity": "低", + "text": "如果使用者只需要存取內部應用程式,Microsoft Entra ID 應用程式代理是否被視為 Azure 虛擬桌面 (AVD) 的替代方案?", + "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", "waf": "安全" }, { - "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", + "checklist": "Azure Application Delivery Networking", + "guid": "01ca7cf1-5754-442d-babb-8ba6772e5c30", + "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", + "service": "Entra", "severity": "中等", - "text": "對於需要最大靈活性的網路方案,請使用中心輻射型網路拓撲。", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "text": "若要減少為網路中的傳入連接打開的防火牆埠數,請考慮使用 Microsoft Entra ID 應用程式代理為遠端使用者提供對內部應用程式的安全和經過身份驗證的訪問。", + "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", "waf": "安全" }, { - "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", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "高", - "text": "在中心虛擬網路中部署共用網路服務,包括 ExpressRoute 閘道、VPN 閘道和 Azure 防火牆或合作夥伴 NVA。如有必要,還可以部署 DNS 服務。", - "waf": "成本" + "text": "在「預防」模式下部署 Front Door 的 WAF 策略,以便 Web 應用程式防火牆採取適當的措施來允許或拒絕流量。", + "waf": "安全" }, { - "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", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "高", - "text": "對應用程式登陸區域中的所有公共IP位址使用 DDoS 網路或IP保護計畫。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "避免結合使用 Azure 流量管理器和 Azure Front Door。", "waf": "安全" }, { - "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": "中等", - "text": "部署合作夥伴網路技術或 NVA 時,請遵循合作夥伴供應商的指導。", - "waf": "可靠性" - }, - { - "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": "低", - "text": "如果需要在中心輻射型方案中在 ExpressRoute 和 VPN 閘道之間傳輸,請使用 Azure 路由伺服器。", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "高", + "text": "在 Azure Front Door 和源上使用相同的功能變數名稱。主機名不匹配可能會導致細微的錯誤。", "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "低", - "text": "如果使用路由伺服器,請對路由伺服器子網使用 /27 前置綴。", - "waf": "安全" - }, - { - "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": "中等", - "text": "對於跨 Azure 區域具有多個中心輻射型拓撲的網路體系結構,請在中心 VNet 之間使用全域虛擬網路對等互連將區域相互連接。", - "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-virtual-networks/", + "text": "當 Azure Front Door 源組中只有一個源時,禁用運行狀況探測。", "waf": "性能" }, { - "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": "中等", - "text": "使用用於網路的 Azure Monitor 監視 Azure 上網路的端到端狀態。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", - "waf": "操作" - }, - { - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "5567048e-e5d7-4206-9c55-b5ed45d2cc0c", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", + "service": "Front Door", "severity": "中等", - "text": "如果一個區域中有超過 400 個分支網路,請部署一個額外的中心,以繞過 VNet 對等互連限制 (500) 和可通過 ExpressRoute 播發的最大前綴數 (1000)。", + "text": "為 Azure Front Door 選擇良好的運行狀況探測終結點。請考慮構建用於檢查應用程式的所有依賴項的運行狀況終結點。", "waf": "可靠性" }, { - "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": "中等", - "text": "將每個路由表的路由數限制為 400 個。", - "waf": "可靠性" + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "低", + "text": "將 HEAD 運行狀況探測與 Azure Front Door 配合使用,以減少 Front Door 發送到應用程式的流量。", + "waf": "性能" }, { - "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", + "ammp": true, + "arm-service": "Microsoft.Network/loadBalancers", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "高", - "text": "配置 VNet 對等互連時,請使用「允許流量流向遠端虛擬網路」設置。", + "text": "使用 Azure NAT 閘道而不是負載均衡器出站規則來提高 SNAT 可伸縮性", "waf": "可靠性" }, { - "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": "中等", - "text": "使用 ExpressRoute Direct 時,請配置 MACsec,以便加密組織路由器和 MSEE 之間的第二層級別的流量。該圖顯示了流中的此加密。", - "waf": "安全" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "高", + "text": "將託管 TLS 證書與 Azure Front Door 配合使用。降低運營成本和因證書續訂而導致的停機風險。", + "waf": "操作" }, { - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "中等", - "text": "對於無法使用MACsec的情況(例如,不使用ExpressRoute Direct),請使用 VPN 閘道通過 ExpressRoute 專用對等互連建立 IPsec 隧道。", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", - "waf": "安全" + "text": "將 Azure Front Door WAF 配置定義為代碼。通過使用代碼,您可以更輕鬆地採用新的規則集版本並獲得額外的保護。", + "waf": "操作" }, { - "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", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "2e30abab-5478-417c-81bf-bf1ad4ed1ed4", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-end-to-end-tls", + "service": "Front Door", "severity": "高", - "text": "確保在 Azure 區域和本地位置之間不使用重疊的 IP 位址空間。", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "text": "將端到端 TLS 與 Azure Front Door 配合使用。使用 TLS 建立從用戶端到 Front Door 的連接,以及從 Front Door 到源的連接。", "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "10aa45af-166f-44c4-9f36-b6d592dac2ca", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-http-to-https-redirection", + "service": "Front Door", "severity": "中等", - "text": "使用專用 Internet 的位址分配範圍中的 IP 位址 (RFC 1918)。", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "text": "將 HTTP 到 HTTPS 重定向與 Azure Front Door 配合使用。通過自動將舊用戶端重定向到 HTTPS 請求來支持它們。", "waf": "安全" }, { - "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", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "28b9ee82-b2c7-45aa-bc98-6de6f59a095d", + "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#enable-the-waf", + "service": "Front Door", "severity": "高", - "text": "確保不會浪費IP位址空間,不要創建不必要的大型虛擬網路(例如/16)。", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", - "waf": "性能" + "text": "啟用 Azure Front Door WAF。保護您的應用程式免受一系列攻擊。", + "waf": "安全" }, { - "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", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "高", - "text": "請勿對生產網站和災難恢復網站使用重疊的IP位址範圍。", - "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", - "waf": "可靠性" - }, - { - "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": "中等", - "text": "對於只需要在 Azure 中進行名稱解析的環境,請使用 Azure 專用 DNS 進行解析,並使用委託區域進行名稱解析(例如“azure.contoso.com”)。", - "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", - "waf": "操作" + "text": "通過在檢測模式下配置 WAF,為工作負載優化 Azure Front Door WAF,以減少和修復誤報檢測。", + "waf": "安全" }, { - "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": "中等", - "text": "對於需要跨 Azure 和本地進行名稱解析且沒有現有企業 DNS 服務(如 Active Directory)的環境,請使用 Azure DNS 專用解析程式將 DNS 請求路由到 Azure 或本地 DNS 伺服器。", - "training": "https://learn.microsoft.com/training/modules/intro-to-azure-dns-private-resolver/", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "高", + "text": "啟用在 Azure Front Door WAF 策略中啟用的請求正文檢查功能。", "waf": "安全" }, { - "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": "低", - "text": "需要並部署自己的 DNS(例如 Red Hat OpenShift)的特殊工作負載應使用其首選的 DNS 解決方案。", - "waf": "操作" + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "高", + "text": "啟用 Azure Front Door WAF 預設規則集。默認規則集檢測並阻止常見攻擊。", + "waf": "安全" }, { - "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", + "ammp": true, + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "高", - "text": "啟用 Azure DNS 的自動註冊,以自動管理虛擬網路中部署的虛擬機的 DNS 記錄的生命週期。", - "training": "https://learn.microsoft.com/learn/paths/az-104-manage-virtual-networks/", - "waf": "操作" + "text": "啟用 Azure Front Door WAF 機器人保護規則集。機器人規則可檢測好的和壞的機器人。", + "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "中等", - "text": "使用 Azure Bastion 安全地連接到網路。", + "text": "使用最新的 Azure Front Door WAF 規則集版本。規則集更新會定期更新,以考慮當前的威脅形勢。", "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "中等", - "text": "在子網 /26 或更大的情況下使用 Azure Bastion。", + "text": "向 Azure Front Door WAF 添加速率限制。速率限制可阻止客戶端在短時間內意外或有意發送大量流量。", "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "中等", - "text": "使用 Azure Front Door 和 WAF 策略跨 Azure 區域為登陸區域的入站 HTTP/S 連接提供全域保護。", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "text": "對 Azure Front Door WAF 速率限制使用高閾值。高速率限制閾值可避免阻止合法流量,同時仍可防止可能使基礎結構不堪重負的極大量請求。", "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "低", - "text": "使用 Azure Front Door 和 Azure 應用程式閘道幫助保護 HTTP/S 應用時,請在 Azure Front Door 中使用 WAF 策略。鎖定 Azure 應用程式閘道,以便僅接收來自 Azure Front Door 的流量。", - "training": "https://learn.microsoft.com/learn/paths/secure-application-delivery/", + "text": "如果您不希望來自所有地理區域的流量,請使用地理篩檢程式來阻止來自非預期國家/地區的流量。", "waf": "安全" }, { - "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": "高", - "text": "當入站 HTTP/S 連接需要 WAF 和其他反向代理時,請將它們部署在登陸區域虛擬網路中,並將它們與它們要保護和向 Internet 公開的應用一起部署。", - "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "中等", + "text": "使用 Azure Front Door WAF 對流量進行地理篩選時,指定未知 (ZZ) 位置。避免在IP位址無法進行地理匹配時意外阻止合法請求。", "waf": "安全" }, { - "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", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "高", - "text": "使用 Azure DDoS 網路或 IP 保護計劃來幫助保護虛擬網路中的公共 IP 位址終結點。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "啟用 Azure 應用程式閘道 WAF 機器人保護規則集。機器人規則可檢測好的和壞的機器人。", "waf": "安全" }, { - "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", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "高", - "text": "在即將到來的重大更改之前,規劃如何管理網路出站流量配置和策略。2025 年 9 月 30 日,新部署的預設出站訪問將停用,僅允許顯式訪問配置。", - "waf": "可靠性" + "text": "啟用在 Azure 應用程式閘道 WAF 策略中啟用的請求正文檢查功能。", + "waf": "安全" }, { - "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", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "a4dd86d3-5ffa-408c-b660-cce073d085b8", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/best-practices#tune-your-waf", + "service": "App Gateway", "severity": "高", - "text": "添加診斷設置以保存所有受保護的公共IP位址(DDoS IP或網路保護)的 DDoS 相關日誌。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "在檢測模式下針對工作負載優化 Azure 應用程式閘道 WAF。減少誤報檢測。", "waf": "安全" }, { - "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", + "ammp": true, + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "高", - "text": "確保存在策略分配,以拒絕直接綁定到虛擬機的公共IP位址。 如果特定 VM 上需要公共 IP,請使用排除項。", + "text": "在「預防」模式下部署應用程式閘道的 WAF 策略。", "waf": "安全" }, { - "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": "中等", - "text": "使用 ExpressRoute 作為到 Azure 的主要連接。 使用 VPN 作為備用連接源。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "性能" - }, - { - "arm-service": "microsoft.network/expressRouteCircuits", - "checklist": "Azure Landing Zone Review", - "description": "可以使用 AS 路徑預置和連接權重來影響從 Azure 到本地的流量,並使用自己的路由器中的所有 BGP 屬性來影響從本地到 Azure 的流量。", - "guid": "f29812b2-363c-4efe-879b-599de0d5973c", - "link": "https://learn.microsoft.com/azure/expressroute/expressroute-routing", - "service": "ExpressRoute", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "43fae595-8a32-4299-a69e-0f32c454dcc9", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/rate-limiting-overview", + "service": "App Gateway", "severity": "中等", - "text": "使用多個 ExpressRoute 線路或多個本地位置時,請使用 BGP 屬性來優化路由。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "可靠性" + "text": "向 Azure 應用程式閘道 WAF 添加速率限制。速率限制可阻止客戶端在短時間內意外或有意發送大量流量。", + "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "中等", - "text": "根據頻寬和性能要求為 ExpressRoute/VPN 閘道選擇正確的 SKU。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "性能" - }, - { - "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": "高", - "text": "確保僅在達到與其成本相符的頻寬時才使用無限數據的 ExpressRoute 線路。", - "waf": "成本" - }, - { - "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": "高", - "text": "如果線路對等互連位置支援本地 SKU 的 Azure 區域,則利用 ExpressRoute 的本地 SKU 來降低線路成本。", - "waf": "成本" + "text": "對 Azure 應用程式閘道 WAF 速率限制使用高閾值。高速率限制閾值可避免阻止合法流量,同時仍可防止可能使基礎結構不堪重負的極大量請求。", + "waf": "安全" }, { - "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": "中等", - "text": "在受支援的 Azure 區域中部署區域冗餘 ExpressRoute 閘道。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "可靠性" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "低", + "text": "如果您不希望來自所有地理區域的流量,請使用地理篩檢程式來阻止來自非預期國家/地區的流量。", + "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "349a15c1-52f4-4319-9078-3895d95ecafd", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/geomatch-custom-rules", + "service": "App Gateway", "severity": "中等", - "text": "對於需要頻寬高於 10 Gbps 或專用 10/100 Gbps 埠的方案,請使用 ExpressRoute Direct。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "性能" + "text": "使用 Azure 應用程式閘道 WAF 對流量進行地理篩選時,指定未知 (ZZ) 位置。避免在IP位址無法進行地理匹配時意外阻止合法請求。", + "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "中等", - "text": "如果需要低延遲,或者從本地到 Azure 的輸送量必須大於 10 Gbps,請啟用 FastPath 以從數據路徑繞過 ExpressRoute 閘道。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "性能" + "text": "使用最新的 Azure 應用程式閘道 WAF 規則集版本。規則集更新會定期更新,以考慮當前的威脅形勢。", + "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "中等", - "text": "使用區域冗餘 VPN 閘道將分支或遠端位置連接到 Azure(如果可用)。", - "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", - "waf": "可靠性" + "text": "添加診斷設置以保存 Azure 應用程式閘道 WAF 紀錄。", + "waf": "操作" }, { - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "中等", - "text": "在本地使用冗餘 VPN 設備(主動/主動或主動/被動)。", - "training": "https://learn.microsoft.com/training/modules/intro-to-azure-vpn-gateway/", - "waf": "可靠性" + "text": "添加診斷設置以保存 Azure Front Door WAF 紀錄。", + "waf": "操作" }, { - "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": "高", - "text": "如果使用 ExpressRoute Direct,請考慮使用到本地 Azure 區域的 ExpressRoute 本地線路來節省成本。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "成本" + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", + "severity": "中等", + "text": "將 Azure 應用程式閘道 WAF 紀錄發送到 Microsoft Sentinel。", + "waf": "操作" }, { - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "中等", - "text": "當需要流量隔離或專用頻寬時,例如用於分離生產環境和非生產環境,請使用不同的 ExpressRoute 線路。它將幫助您確保隔離的路由域並減輕嘈雜的鄰居風險。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "安全" + "text": "將 Azure Front Door WAF 日誌發送到 Microsoft Sentinel。", + "waf": "操作" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "中等", - "text": "使用內置的 Express Route Insights 監視 ExpressRoute 的可用性和利用率。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "text": "將 Azure 應用程式閘道 WAF 設定定義為代碼。通過使用代碼,您可以更輕鬆地採用新的規則集版本並獲得額外的保護。", "waf": "操作" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f17ec301-8470-4afd-aabc-c1fdfe47dcc0", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/policy-overview", + "service": "App Gateway", "severity": "中等", - "text": "使用連接監視器監視整個網路的連接監視,尤其是本地和 Azure 之間的連接監視。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "text": "使用 WAF 策略而不是舊版 WAF 配置。", "waf": "操作" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "d4eb8667-f8cb-4cdd-94e6-2f967ba98f88", + "link": "https://learn.microsoft.com/azure/virtual-wan/scenario-secured-hub-app-gateway", + "service": "App Gateway", "severity": "中等", - "text": "使用來自不同對等互連位置的 ExpressRoute 線路實現冗餘。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "可靠性" + "text": "篩選後端中的入站流量,以便它們僅接受來自應用程式閘道子網的連接,例如與 NSG 的連接。", + "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/frontdoors", + "checklist": "Azure Application Delivery Networking", + "guid": "7d3df025-59a3-447d-ac25-3f5750d35de1", + "link": "https://learn.microsoft.com/azure/frontdoor/origin-security?tabs=app-service-functions", + "service": "Front Door", "severity": "中等", - "text": "如果僅使用單個 ExpressRoute 線路,則使用網站到網站 VPN 作為 ExpressRoute 的故障轉移。", - "waf": "可靠性" + "text": "確保源僅接收來自 Azure Front Door 實例的流量。", + "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "a66f0fd8-2ca4-422e-8df3-235148127ca2", + "link": "https://learn.microsoft.com/azure/application-gateway/ssl-overview", + "service": "App Gateway", "severity": "高", - "text": "如果在 GatewaySubnet 中使用路由表,請確保傳播閘道路由。", - "waf": "可靠性" + "text": "您應該對流向後端伺服器的流量進行加密。", + "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "3dba65cb-834d-44d8-a3ca-a6aa2f1587be", + "link": "https://learn.microsoft.com/azure/web-application-firewall/overview", + "service": "App Gateway", "severity": "高", - "text": "如果使用 ExpressRoute,則本地路由應是動態的:如果連接失敗,它應收斂到線路的其餘連接。負載應在兩個連接之間共用,理想情況下為主動/主動,儘管也支持主動/被動。", - "waf": "可靠性" + "text": "您應該使用 Web 應用程式防火牆。", + "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "0158fcb6-0bc1-4687-832f-cc7c359c22d2", + "link": "https://learn.microsoft.com/azure/application-gateway/redirect-overview", + "service": "App Gateway", "severity": "中等", - "text": "確保 ExpressRoute 線路的兩個物理鏈路連接到網路中的兩個不同的邊緣設備。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "可靠性" + "text": "將 HTTP 重定向到 HTTPS", + "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "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", "severity": "中等", - "text": "確保在客戶或供應商邊緣路由設備上啟用並配置雙向轉發檢測 (BFD)。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "可靠性" + "text": "使用閘道管理的 Cookie 將流量從使用者工作階段定向到同一伺服器進行處理", + "waf": "操作" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "ff353ad8-15fb-4ae8-9fc5-a85a36d36a35", + "link": "https://learn.microsoft.com/azure/application-gateway/configuration-http-settings", + "service": "App Gateway", "severity": "高", - "text": "將 ExpressRoute 閘道連接到來自不同對等互連位置的兩條或多條線路,以實現更高的復原能力。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "可靠性" + "text": "在計劃的服務更新期間啟用連接耗盡,以防止與後端池的現有成員的連接丟失", + "waf": "安全" }, { - "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": "中等", - "text": "配置 ExpressRoute 虛擬網路閘道的診斷日誌和警報。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "c8741f03-45a4-4183-a6b8-139e0773b8b5", + "link": "https://learn.microsoft.com/azure/application-gateway/custom-error", + "service": "App Gateway", + "severity": "低", + "text": "創建自訂錯誤頁面以顯示個人化的用戶體驗", "waf": "操作" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "f850d46f-f5d7-4b17-b48c-a780741402e1", + "link": "https://learn.microsoft.com/azure/application-gateway/rewrite-http-headers-url", + "service": "App Gateway", "severity": "中等", - "text": "請勿使用 ExpressRoute 線路進行 VNet 到 VNet 通信。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", - "waf": "性能" + "text": "編輯 HTTP 請求和回應標頭,以便更輕鬆地在用戶端和伺服器之間進行路由和資訊交換", + "waf": "安全" }, { - "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": "低", - "text": "請勿將 Azure 流量發送到混合位置進行檢查。 相反,請遵循“Azure 中的流量保留在 Azure 中”的原則,以便 Azure 中的資源之間的通信通過 Microsoft 主幹網络進行。", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "eadc3164-4a0f-461c-85f1-1a372c04dfd1", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "App Gateway", + "severity": "中等", + "text": "配置 Front Door 以優化全球 Web 流量路由和頂級最終使用者性能,並通過快速全域故障轉移實現可靠性", "waf": "性能" }, { - "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": "高", - "text": "使用 Azure 防火牆來管理到 Internet 的 Azure 出站流量、非 HTTP/S 入站連接和東西流量篩選(如果組織需要)。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "29dcc19f-a8fa-4c35-8281-290577538793", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-overview", + "service": "App Gateway", + "severity": "中等", + "text": "使用傳輸層負載均衡", + "waf": "性能" + }, + { + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "276898c1-af5e-4819-9e8e-049c7801ab9d", + "link": "https://learn.microsoft.com/azure/application-gateway/multiple-site-overview", + "service": "App Gateway", + "severity": "中等", + "text": "根據主機名或域名為單個閘道上的多個 Web 應用程式配置路由", "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "5fe365b6-58e8-47ed-a8cf-5163850380a2", + "link": "https://learn.microsoft.com/azure/application-gateway/create-ssl-portal", + "service": "App Gateway", "severity": "中等", - "text": "創建全域 Azure 防火牆策略以管理全球網路環境中的安全狀況,並將其分配給所有 Azure 防火牆實例。通過 Azure 基於角色的訪問控制將增量防火牆策略委派給本地安全團隊,從而允許使用精細策略來滿足特定區域的要求。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "集中管理 SSL 證書,以減少後端伺服器場的加密和解密開銷", "waf": "安全" }, { - "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", + "arm-service": "microsoft.network/applicationGateways", + "checklist": "Azure Application Delivery Networking", + "guid": "fa64b4dd-35c2-4047-ac5c-45dfbf8b0db9", + "link": "https://learn.microsoft.com/azure/application-gateway/application-gateway-websocket", + "service": "App Gateway", "severity": "低", - "text": "如果組織想要使用此類解決方案來幫助保護出站連接,請在 Firewall Manager 中配置受支援的合作夥伴 SaaS 安全提供者。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", + "text": "使用應用程式閘道獲得對 WebSocket 和 HTTP/2 協定的本機支援", "waf": "安全" }, { - "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", + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "cb26b2ba-a9db-45d1-8260-d9c6ec1447d9", + "link": "https://learn.microsoft.com/en-us/azure/logic-apps/single-tenant-overview-compare", + "service": "IoT Hub DPS", "severity": "高", - "text": "使用應用程式規則篩選目標主機名上的出站流量,以查找受支持的協定。 使用基於 FQDN 的網路規則和具有 DNS 代理的 Azure 防火牆來篩選通過其他協定流向 Internet 的傳出流量。", - "waf": "安全" + "text": "根據業務和 SLO 要求選擇正確的邏輯應用託管計劃", + "waf": "可靠性" }, { - "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", + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "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", "severity": "高", - "text": "使用 Azure 防火牆高級版啟用其他安全功能。", - "waf": "安全" + "text": "使用區域冗餘和可用性區域保護邏輯應用免受區域故障的影響", + "waf": "可靠性" }, { - "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", + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "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", "severity": "高", - "text": "將 Azure 防火牆威脅情報模式配置為「警報」和「拒絕」以獲得額外保護。", - "waf": "安全" + "text": "考慮為關鍵工作負載制定跨區域災難恢復策略", + "waf": "可靠性" }, { - "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", + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "da0f033e-d180-4f36-9aa4-c468dba14203", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "IoT Hub DPS", "severity": "高", - "text": "將 Azure 防火牆 IDPS 模式配置為「拒絕」以獲得額外保護。", - "waf": "安全" + "text": "如果部署到獨立環境,請使用或遷移到應用服務環境 (ASE) v3", + "waf": "可靠性" }, { - "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", + "arm-service": "Microsoft.Devices/provisioningServices", + "checklist": "Device Provisioning Service Review", + "guid": "62711604-c9d1-4b0a-bdb7-5fda54a4f6c1", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "IoT Hub DPS", + "severity": "中等", + "text": "利用 Azure DevOps 或 GitHub 簡化 CI/CD 並保護邏輯應用代碼", + "waf": "操作" + }, + { + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "ac1d6380-f866-4bbd-a9b4-b1ee5d7908b8", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#availability-zones", + "service": "IoT", "severity": "高", - "text": "對於未連接到虛擬 WAN 的 VNet 中的子網,請附加路由表,以便將 Internet 流量重定向到 Azure 防火牆或網路虛擬設備。", - "waf": "安全" + "text": "利用可用區(如果區域適用)(這是自動啟用的)", + "waf": "可靠性" }, { - "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", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "35f651e8-0124-4ef7-8c57-658e38609e6e", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", + "service": "IoT", "severity": "中等", - "text": "添加診斷設置,使用「特定於資源」的目標表保存所有 Azure 防火牆部署的日誌。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "操作" + "text": "請注意 Microsoft 發起的故障轉移。Microsoft 在極少數情況下會執行這些操作,以將所有IoT中心從受影響的區域故障轉移到相應的異地配對區域。", + "waf": "可靠性" }, { - "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": "重要", - "text": "從 Azure 防火牆經典規則(如果存在)遷移到防火牆策略。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "操作" + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "4ed3e490-dc06-4a1e-b467-5d0239d85540", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#cross-region-dr", + "service": "IoT", + "severity": "高", + "text": "考慮為關鍵工作負載制定跨區域災難恢復策略", + "waf": "可靠性" }, { - "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", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "a11ecab0-db47-46f7-9aa7-17764e7e45a1", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#microsoft-initiated-failover", + "service": "IoT", "severity": "高", - "text": "對 Azure 防火牆子網使用 /26 前置綴。", - "waf": "安全" + "text": "瞭解如何觸發手動故障轉移。", + "waf": "可靠性" }, { - "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", + "arm-service": "Microsoft.Devices/IotHubs", + "checklist": "IoT Hub Review", + "guid": "f9db8dfb-1194-460b-aedd-34dd6a69db22", + "link": "https://learn.microsoft.com/azure/iot-hub/iot-hub-ha-dr#failback", + "service": "IoT", + "severity": "高", + "text": "瞭解如何在故障轉移後進行故障回復。", + "waf": "可靠性" + }, + { + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review Checklist", + "guid": "388c3e25-e800-4ad2-9df3-f3d6ae1050b7", + "link": "https://learn.microsoft.com/azure/mysql/flexible-server/overview", + "service": "Azure MySQL", "severity": "中等", - "text": "根據防火牆策略中的規則的使用頻率,將規則排列到規則集合組和規則集合中。", - "waf": "性能" + "text": "利用靈活伺服器", + "waf": "可靠性" }, { - "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", + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review 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", + "severity": "高", + "text": "利用區域適用的可用區", + "waf": "可靠性" + }, + { + "arm-service": "Microsoft.DBforMySQL/servers", + "checklist": "MySQL Review 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", "severity": "中等", - "text": "使用IP組或IP前置綴來減少IP表規則的數量。", - "waf": "性能" + "text": "將數據傳入複製用於跨區域災難恢復方案", + "waf": "可靠性" }, { - "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", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "6d8e32a8-3892-479d-a40b-10f6b4f6f298", + "link": "https://learn.microsoft.com/azure/spring-apps/concepts-blue-green-deployment-strategies", + "service": "Spring Apps", "severity": "中等", - "text": "不要使用通配符作為DNAT的源IP,例如 *或 any,您應該為傳入的DNAT指定源IP。", - "waf": "性能" + "text": "Azure Spring Apps 允許對每個應用進行兩次部署,其中只有一個部署接收生產流量。您可以使用藍綠部署策略實現零停機時間。藍綠部署僅在標準層和企業層中可用。可以使用 CI/CD 和 ADO/GitHub 操作自動執行部署", + "waf": "可靠性" }, { - "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", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "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", "severity": "中等", - "text": "通過監控 SNAT 埠使用方式、評估 NAT 閘道設置並確保無縫故障轉移,防止 SNAT 埠耗盡。如果埠計數接近限制,則表明 SNAT 耗盡可能迫在眉睫。", - "waf": "性能" + "text": "可以在多個區域中為應用程式創建 Azure Spring Apps 實例,並且流量管理器/Front Door 可以路由流量。", + "waf": "可靠性" }, { - "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": "高", - "text": "如果使用的是 Azure 防火牆高級版,請啟用 TLS 檢查。", - "waf": "性能" + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "ff1ae6a7-9301-4feb-9d11-56cd72f1d4ef", + "link": "https://learn.microsoft.com/azure/reliability/reliability-spring-apps", + "service": "Spring Apps", + "severity": "中等", + "text": "在支持的區域中,Azure Spring Apps 可以部署為區域冗餘,這意味著實例會自動分佈在可用性區域之間。此功能僅在標準層和企業層中可用。", + "waf": "可靠性" }, { - "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": "低", - "text": "使用 Web 類別允許或拒絕對特定主題的出站訪問。", - "waf": "性能" + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "ffc735ad-fbb1-4802-b43f-ad6387c4c066", + "link": "https://learn.microsoft.com/azure/spring-apps/concept-understand-app-and-deployment", + "service": "Spring Apps", + "severity": "中等", + "text": "對應用使用1個以上的應用實例", + "waf": "可靠性" }, { - "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", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "7504c230-6035-4183-95a5-85762acc6075", + "link": "https://learn.microsoft.com/azure/spring-apps/diagnostic-services", + "service": "Spring Apps", "severity": "中等", - "text": "作為 TLS 檢查的一部分,請計劃從 Azure 應用閘道接收流量以進行檢查。", - "waf": "性能" + "text": "使用日誌、指標和跟蹤監視 Azure Spring Apps。將 ASA 與應用程式見解集成,並跟蹤故障並創建工作簿。", + "waf": "可靠性" }, { - "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", + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "1eb48d58-3eec-4ef5-80b0-d2b0dde3f0c6", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-configure-enterprise-spring-cloud-gateway", + "service": "Spring Apps", "severity": "中等", - "text": "啟用 Azure 防火牆 DNS 代理配置。", - "waf": "安全" + "text": "在 Spring Cloud Gateway 中設置自動縮放", + "waf": "可靠性" }, { - "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": "高", - "text": "將 Azure 防火牆與 Azure Monitor 集成,並啟用診斷日誌記錄以存儲和分析防火牆日誌。", - "waf": "操作" + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "97411607-b6fd-4335-99d1-9885faf4e392", + "link": "https://learn.microsoft.com/azure/spring-apps/how-to-setup-autoscale", + "service": "Spring Apps", + "severity": "低", + "text": "為具有標準使用量和專用計劃的應用啟用自動縮放。", + "waf": "可靠性" }, { - "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": "低", - "text": "實施防火牆規則的備份", - "waf": "操作" + "arm-service": "Microsoft.AppPlatform/Spring", + "checklist": "Azure Spring Apps Review", + "guid": "dfcaffd1-d27c-4ef2-998d-64c1df3a7ac3", + "link": "https://learn.microsoft.com/azure/spring-apps/overview", + "service": "Spring Apps", + "severity": "中等", + "text": "使用企業計劃為關鍵任務應用提供 Spring Boot 的商業支援。使用其他層,您可以獲得 OSS 支援。", + "waf": "可靠性" }, { - "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": "高", - "text": "不要中斷注入虛擬網路的 Azure PaaS 服務的控制平面通信,例如使用 0.0.0.0/0 路由或阻止控制平面流量的 NSG 規則。", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Azure 事件中心提供靜態數據加密。如果使用自己的金鑰,則仍使用 Microsoft 管理的金鑰對數據進行加密,但此外,Microsoft 管理的金鑰將使用客戶管理的密鑰進行加密。", + "guid": "7aaf12e7-b94e-4f6e-847d-2d92981b1cd6", + "link": "https://learn.microsoft.com/azure/event-hubs/configure-customer-managed-key", + "service": "Event Hubs", + "severity": "低", + "text": "需要時,在靜態數據加密中使用客戶管理的金鑰選項", + "training": "https://learn.microsoft.com/learn/modules/plan-implement-administer-conditional-access/", "waf": "安全" }, { - "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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Azure 事件中心命名空間允許用戶端使用 TLS 1.0 及更高版本發送和接收數據。若要強制實施更嚴格的安全措施,可以將事件中心命名空間配置為要求用戶端使用較新版本的 TLS 發送和接收數據。如果事件中心命名空間需要最低版本的 TLS,則使用舊版本發出的任何請求都將失敗。", + "guid": "d2f54b29-769e-43a6-a0e7-828ac936657e", + "link": "https://learn.microsoft.com/azure/event-hubs/transport-layer-security-configure-minimum-version", + "service": "Event Hubs", "severity": "中等", - "text": "通過專用終結點和 ExpressRoute 專用對等互連從本地訪問 Azure PaaS 服務。此方法可避免在公共 Internet 上傳輸。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-azure-expressroute/", + "text": "對請求強制實施傳輸層安全性 (TLS) 的最低要求版本", + "training": "https://learn.microsoft.com/learn/modules/secure-aad-users-with-mfa/", "waf": "安全" }, { - "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": "高", - "text": "默認情況下,不要在所有子網上啟用虛擬網路服務終結點。", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "創建事件中心命名空間時,會自動為命名空間創建名為 RootManageSharedAccessKey 的策略規則。此策略具有整個命名空間的管理許可權。建議您將此規則視為管理根帳戶,不要在應用程式中使用它。建議將 AAD 用作 RBAC 的身份驗證提供程式。", + "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", + "severity": "中等", + "text": "避免在不必要的情況下使用root帳戶", + "training": "https://learn.microsoft.com/learn/paths/azure-administrator-manage-identities-governance/", "waf": "安全" }, { - "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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Azure 資源的託管標識可以使用 Azure AD 憑據從 Azure 虛擬機 (VM)、函數應用、虛擬機規模集和其他服務中運行的應用程式授權訪問事件中心資源。通過將 Azure 資源的託管標識與 Azure AD 身份驗證結合使用,可以避免將憑據存儲在雲中運行的應用程式中。", + "guid": "3a365a5c-7acb-4e48-abd5-4cd79f2e8776", + "link": "https://learn.microsoft.com/azure/event-hubs/authenticate-managed-identity?tabs=latest", + "service": "Event Hubs", "severity": "中等", - "text": "使用 FQDN 而不是 Azure 防火牆或 NVA 中的 IP 位址篩選流向 Azure PaaS 服務的出口流量,以防止數據外洩。如果使用專用連結,則可以阻止所有 FQDN,否則僅允許所需的 PaaS 服務。", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/?source=learn", + "text": "如果可能,應用程式應使用託管標識向 Azure 事件中心進行身份驗證。如果沒有,請考慮在 Azure Key Vault 或等效服務中擁有存儲憑據(SAS、服務主體憑據)", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", "waf": "安全" }, { - "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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "創建許可權時,請對用戶端對 Azure 事件中心的訪問提供精細控制。Azure 事件中心中的許可權可以而且應該限定為單個資源級別,例如消費者組、事件中心實體、事件中心命名空間等。", + "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", "severity": "高", - "text": "至少對閘道子網使用 /27 前置綴。", + "text": "使用最低特權數據平面 RBAC", + "training": "https://learn.microsoft.com/learn/modules/explore-basic-services-identity-types/", "waf": "安全" }, { - "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": "高", - "text": "不要依賴使用 VirtualNetwork 服務標記的 NSG 入站預設規則來限制連接。", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "Azure 事件中心資源日誌包括操作日誌、虛擬網路和 Kafka 日誌。運行時審核日誌捕獲事件中心中所有數據平面訪問操作(例如發送或接收事件)的聚合診斷資訊。", + "guid": "b38b875b-a1cf-4104-a900-3a4d3ce474db", + "link": "https://learn.microsoft.com/azure/event-hubs/monitor-event-hubs-reference", + "service": "Event Hubs", + "severity": "中等", + "text": "啟用記錄以進行安全調查。使用 Azure Monitor 捕獲指標和日誌,例如資源日誌、運行時審核日誌和 Kafka 紀錄", + "training": "https://learn.microsoft.com/learn/paths/manage-identity-and-access/", "waf": "安全" }, { - "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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "默認情況下,Azure 事件中心具有公共IP位址,並且可通過Internet訪問。專用終結點允許虛擬網路和 Azure 事件中心之間的流量遍歷 Microsoft 主幹網路。除此之外,如果未使用公共終結點,則應禁用這些終結點。", + "guid": "5abca2a4-eda1-4dae-8cc9-5d48c6b791dc", + "link": "https://learn.microsoft.com/azure/event-hubs/private-link-service", + "service": "Event Hubs", "severity": "中等", - "text": "使用 NSG 説明保護子網之間的流量,以及平台中的東西向流量(登陸區域之間的流量)。", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "text": "請考慮使用專用終結點訪問 Azure 事件中心,並在適用時禁用公用網路訪問。", + "training": "https://learn.microsoft.com/learn/modules/azure-ad-privileged-identity-management/", "waf": "安全" }, { - "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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "使用IP防火牆,可以將公共終結點進一步限製為僅一組IPv4位址或 CIDR(無類別域間路由)表示法的IPv4位址範圍。", + "guid": "a0e6c465-89e5-458b-a37d-3974d1112dbd", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-ip-filtering", + "service": "Event Hubs", "severity": "中等", - "text": "使用 NSG 和應用程式安全組對登陸區域內的流量進行微分段,並避免使用中心 NVA 篩選流量流。", - "training": "https://learn.microsoft.com/learn/paths/implement-network-security/", + "text": "請考慮僅允許從特定IP位址或範圍訪問 Azure 事件中心命名空間", + "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", "waf": "安全" }, { - "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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "31d41e36-11c8-417b-8afb-c410d4391898", + "link": "https://github.com/Azure/fta-resiliencyplaybooks/blob/main/paas-foundations-playbooks-AEH_v1.docx", + "service": "Event Hubs", "severity": "中等", - "text": "啟用 VNet 流日誌並將其饋送到流量分析中,以深入了解內部和外部流量流。", - "training": "https://learn.microsoft.com/learn/modules/design-implement-network-monitoring/", - "waf": "安全" + "text": "利用 FTA 彈性手冊", + "waf": "可靠性" }, { - "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": "中等", - "text": "由於規則限制為 1000 條,因此每個 NSG 實施的 NSG 規則不要超過 900 個。", - "training": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "對於從門戶創建的新 EH 命名空間,在啟用區域的區域中具有高級、專用或標準 SKU,將自動啟用此功能。EH 元數據和事件數據本身都是跨區域複製的", + "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", + "severity": "高", + "text": "利用可用區(如果區域適用)", "waf": "可靠性" }, { - "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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "20b56c56-ad58-4519-8f82-735c586bb281", + "link": "https://learn.microsoft.com/azure/event-hubs/compare-tiers", + "service": "Event Hubs", "severity": "中等", - "text": "如果在虛擬 WAN 路由設計清單中明確描述了你的方案,請使用虛擬 WAN。", - "training": "https://learn.microsoft.com/learn/modules/introduction-azure-virtual-wan/", - "waf": "操作" + "text": "使用高級或專用 SKU 實現可預測的性能", + "waf": "可靠性" + }, + { + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "啟用內置異地災難恢復功能后,可確保命名空間的整個配置(事件中心、消費者組和設置)從主命名空間持續複製到輔助命名空間,並允許隨時從主命名空間向輔助命名空間進行一次故障轉移。主動/被動功能旨在更輕鬆地從失敗的 Azure 區域中恢復和放棄,而無需更改應用程式配置", + "guid": "dc15a1c0-75ee-49f1-90ac-ccd579376bcd", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-geo-dr?tabs=portal", + "service": "Event Hubs", + "severity": "高", + "text": "使用主動被動配置規劃異地災難恢復", + "waf": "可靠性" }, { - "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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "description": "應用於無法容忍關閉區域中事件數據中斷或丟失的DR配置。對於這些情況,請遵循複製指南,不要使用內置的異地災難恢復功能(主動/被動)。使用「主動/主動」時,在不同區域和命名空間中維護多個事件中心,事件將在中心之間複製", + "guid": "6e31b67d-67ba-4591-89c0-9e805d597c7e", + "link": "https://learn.microsoft.com/azure/event-hubs/event-hubs-federation-overview", + "service": "Event Hubs", "severity": "中等", - "text": "使用每個 Azure 區域的虛擬 WAN 中心,透過通用的全球 Azure 虛擬 WAN 跨 Azure 區域將多個登陸區域連接在一起。", - "waf": "性能" + "text": "對於業務關鍵型應用程式,請使用 Active Active 配置", + "waf": "可靠性" }, { - "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", + "arm-service": "microsoft.eventhub/namespaces", + "checklist": "Azure Event Hub Review", + "guid": "9ced16ad-d186-4f0a-a241-a999a68af77c", + "link": "https://learn.microsoft.com/azure/architecture/serverless/event-hubs-functions/resilient-design", + "service": "Event Hubs", "severity": "中等", - "text": "對於出站 Internet 流量保護和篩選,請在安全中心部署 Azure 防火牆。", - "training": "https://learn.microsoft.com/learn/paths/secure-networking-infrastructure/", - "waf": "安全" + "text": "設計可復原的事件中心", + "waf": "可靠性" }, { - "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", + "checklist": "SAP Checklist", + "guid": "4620dc87-e948-4ce8-8426-f3e6e5d7bd85", + "link": "https://learn.microsoft.com/azure/sap/center-sap-solutions/overview", + "service": "SAP", "severity": "中等", - "text": "確保虛擬 WAN 網路體系結構與已確定的體系結構方案保持一致。", - "waf": "可靠性" + "text": "Azure SAP 解決方案中心 (ACSS) 是一項 Azure 產品/服務,可使 SAP 成為 Azure 上的頂級工作負載。ACSS 是一種端到端解決方案,使你能夠在 Azure 上創建和運行 SAP 系統作為統一的工作負載,並為創新提供更無縫的基礎。可以利用新的和現有的基於 Azure 的 SAP 系統的管理功能。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-center-sap-solutions/?source=recommendations", + "waf": "操作" }, { - "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", + "checklist": "SAP 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", "severity": "中等", - "text": "使用適用於虛擬 WAN 的 Azure Monitor 見解來監視虛擬 WAN 的端到端拓撲、狀態和關鍵指標。", + "text": "Azure 支援在Linux和 Windows 中自動執行 SAP 部署。SAP 部署自動化框架是一種開源編排工具,可以部署、安裝和維護 SAP 環境。", + "training": "https://github.com/Azure/sap-automation", "waf": "操作" }, { - "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", + "checklist": "SAP Checklist", + "guid": "d17f6f39-a377-48a2-931f-5ead3ebe33a8", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/data-platform", + "service": "SAP", "severity": "中等", - "text": "不要在虛擬 WAN 中禁用分支到分支流量,除非應明確阻止這些流。", + "text": "在符合 RTO 要求的任何時間點和時間範圍內對生產資料庫執行時間點恢復;時間點恢復通常包括操作員在DBMS層上或通過SAP刪除數據時出現的錯誤", "waf": "可靠性" }, { - "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", + "checklist": "SAP Checklist", + "guid": "c4b8e117-930b-4dbd-ae50-7bc5faf6f91a", + "service": "SAP", "severity": "中等", - "text": "使用 AS-Path 作為中心路由首選項,因為它比 ExpressRoute 或 VPN 更靈活。", + "text": "測試備份和恢復時間,以驗證它們是否滿足在災難發生后同時還原所有系統的 RTO 要求。", "waf": "可靠性" }, { - "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": "中等", - "text": "在虛擬 WAN 中配置基於標籤的傳播,否則虛擬中心之間的連接將受到損害。", + "checklist": "SAP Checklist", + "guid": "b651423c-8552-42db-a545-5cb50c05527a", + "link": "https://learn.microsoft.com/azure/reliability/cross-region-replication-azure", + "service": "SAP", + "severity": "高", + "text": "可以在配對區域之間複製標準存儲,但不能使用標準存儲來存儲資料庫或虛擬硬碟。您只能在使用的配對區域之間複製備份。對於所有其他數據,請使用本機 DBMS 功能(如 SQL Server Always On 或 SAP HANA 系統複製)運行複製。將 Site Recovery、rsync 或 robocopy 以及其他第三方軟體組合用於 SAP 應用程式層。", + "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", "waf": "可靠性" }, { - "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": "高", - "text": "至少為虛擬中心分配一個 /23 前置綴,以確保有足夠的IP空間可用。", + "checklist": "SAP Checklist", + "guid": "aa208dca-784f-46c6-9014-cc919c542dc9", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", + "severity": "中等", + "text": "使用 Azure 可用性區域實現高可用性時,必須考慮 SAP 應用程式伺服器和資料庫伺服器之間的延遲。對於具有高延遲的區域,需要制定操作過程,以確保 SAP 應用程式伺服器和資料庫伺服器始終在同一區域中運行。", + "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", "waf": "可靠性" }, { - "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", + "checklist": "SAP Checklist", + "guid": "ba07c007-1f90-43e9-aa4f-601346b80352", + "link": "https://learn.microsoft.com/azure/expressroute/designing-for-disaster-recovery-with-expressroute-privatepeering", + "service": "SAP", "severity": "高", - "text": "戰略性地利用 Azure Policy,為環境定義控制,使用策略計劃對相關策略進行分組。", - "waf": "安全" + "text": "設置從本地到主要和次要 Azure 災難恢復區域的 ExpressRoute 連接。此外,作為使用 ExpressRoute 的替代方法,請考慮設置從本地到主要和輔助 Azure 災難恢復區域的 VPN 連接。", + "training": "https://learn.microsoft.com/azure/expressroute/use-s2s-vpn-as-backup-for-expressroute-privatepeering", + "waf": "可靠性" }, { - "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": "中等", - "text": "將法規和合規性要求映射到 Azure Policy 定義和 Azure 角色分配。", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "d2b30195-b11d-4a8f-a672-28b2b4169a7c", + "link": "https://learn.microsoft.com/azure/key-vault/general/disaster-recovery-guidance", + "service": "SAP", + "severity": "低", + "text": "跨區域複製證書、機密或密鑰等金鑰保管庫內容,以便解密DR區域中的數據。", + "waf": "可靠性" }, { - "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", + "checklist": "SAP Checklist", + "guid": "05f1101d-250f-40e7-b2a1-b674ab50edbd", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-s4hana", + "service": "SAP", "severity": "中等", - "text": "在中間根管理組建立 Azure Policy 定義,以便可以在繼承的範圍內分配它們。", - "waf": "安全" - }, - { - "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": "高", - "text": "如果需要,在最高適當級別管理策略分配,並在底層管理排除項。", - "waf": "安全" + "text": "對等連接主虛擬網路和災難恢復虛擬網路。例如,對於 HANA 系統複製,需要將 SAP HANA DB 虛擬網路對等互連到災難恢復網站的 SAP HANA DB 虛擬網路。", + "waf": "可靠性" }, { - "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", + "checklist": "SAP Checklist", + "guid": "d3351bf7-628a-46de-917d-dfc11d3b6b40", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-service-levels", + "service": "SAP", "severity": "低", - "text": "使用 Azure Policy 控制使用者可以在訂閱/管理組級別預配哪些服務。", - "waf": "安全" + "text": "如果將 Azure NetApp 檔案儲存用於 SAP 部署,則至少要在兩個區域的高級層中創建兩個 Azure NetApp 檔帳戶。", + "training": "https://learn.microsoft.com/training/modules/choose-service-level-azure-netapp-files-hpc-applications/2-identify-decision-criteria", + "waf": "可靠性" }, { - "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", + "checklist": "SAP Checklist", + "guid": "726a1d3e-5508-4a06-9d54-93f4b50040c1", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", "severity": "高", - "text": "盡可能使用內置策略,以最大程度地減少運營開銷。", - "waf": "安全" + "text": "應使用本機資料庫複製技術來同步HA對中的資料庫。", + "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/?source=recommendations", + "waf": "可靠性" }, { - "arm-service": "Microsoft.Authorization/policyDefinitions", - "checklist": "Azure Landing Zone Review", - "description": "通過將「資源策略參與者」角色分配給特定範圍,可以將策略管理委派給相關團隊。例如,中心 IT 團隊可以監督管理組級別的策略,而應用程式團隊則處理其訂閱的策略,從而在遵守組織標準的情況下實現分散式治理。", - "guid": "3f988795-25d6-4268-a6d7-0ba6c97be995", - "link": "https://learn.microsoft.com/azure/governance/policy/overview#azure-rbac-permissions-in-azure-policy", - "service": "Policy", - "severity": "中等", - "text": "在特定範圍內分配內置的「資源策略參與者」角色,以啟用應用程式級治理。", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "6561f847-3db5-4ff8-9200-5ad3c3b436ad", + "link": "https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq", + "service": "SAP", + "severity": "高", + "text": "主虛擬網路 (VNet) 的 CIDR 不應與DR網站的 VNet 的 CIDR 衝突或重疊", + "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", + "waf": "可靠性" }, { - "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": "中等", - "text": "限制在根管理組範圍內執行的 Azure Policy 分配數,以避免在繼承的範圍內通過排除項進行管理。", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "0258ed30-fe42-434f-87b9-58f91f908e0a", + "service": "SAP", + "severity": "高", + "text": "使用 Site Recovery 將應用程式伺服器複製到 DR 網站。Site Recovery 還可以説明將中心服務群集 VM 複製到DR網站。調用DR時,需要在DR網站上重新配置Linux Pacemaker群集(例如,替換VIP或SBD、運行 corosync.conf 等)。", + "training": "https://learn.microsoft.com/training/paths/ensure-business-continuity-implement-disaster-recovery/", + "waf": "可靠性" }, { - "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": "中等", - "text": "如果存在任何數據主權要求,則應部署 Azure 策略來強制實施這些要求。", - "training": "https://learn.microsoft.com/learn/paths/secure-your-cloud-data/", - "waf": "安全" + "checklist": "SAP 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", + "severity": "高", + "text": "考慮 SAP 軟體針對單點故障的可用性。這包括應用程式中的單點故障,例如 SAP NetWeaver 和 SAP S/4HANA 架構中使用的 DBMS、SAP ABAP 和 ASCS + SCS。此外,還有其他工具,例如 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": "可靠性" }, { - "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": "中等", - "text": "對於主權登陸區域,部署主權策略基線,並在正確的管理組級別進行分配。", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "56402f11-ccbe-42c3-a2f6-c6f6f38ab579", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-supported-configurations", + "service": "SAP", + "severity": "高", + "text": "對於 SAP 和 SAP 資料庫,請考慮實現自動故障轉移群集。在 Windows 中,Windows Server 故障轉移群集支援故障轉移。在 Linux 中,Linux Pacemaker 或第三方工具(如 SIOS Protection Suite 和 Veritas InfoScale)支援故障轉移。", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "可靠性" }, { - "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": "中等", - "text": "對於主權登陸區域,將主權控制目標記錄到策略映射。", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "afae6bec-2671-49ae-bc69-140b8ec8d320", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-sap-guide?tabs=windows", + "service": "SAP", + "severity": "高", + "text": "Azure 不支援主 VM 和輔助 VM 共用 DBMS 數據存儲的體系結構。對於 DBMS 層,常見的體系結構模式是同時複製資料庫,並使用與主虛擬機和輔助虛擬機使用的存儲堆疊不同的存儲堆疊。", + "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": "可靠性" }, { - "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": "中等", - "text": "對於主權登陸區,請確保已制定“主權控制目標到策略映射”的管理流程。", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "ac614e95-6767-4bc3-b8a4-9953533da6ba", + "link": "https://learn.microsoft.com/azure/sap/workloads/dbms-guide-general", + "service": "SAP", + "severity": "高", + "text": "DBMS 數據和事務/重做日誌檔存儲在 Azure 支援的塊存儲或 Azure NetApp 檔中。不支援將 Azure 檔案儲存或 Azure 高級檔儲存作為 DBMS 資料和/或使用 SAP 工作負載重做日誌檔的存儲。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-databases/2-explore-database-support-azure-for-sap-workloads", + "waf": "可靠性" }, { - "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": "中等", - "text": "使用單個監視器日誌工作區集中管理平臺,但 Azure 基於角色的訪問控制 (Azure RBAC)、數據主權要求或數據保留策略要求使用單獨工作區的情況除外。", - "training": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", - "waf": "操作" + "checklist": "SAP Checklist", + "guid": "1f737179-8e7f-4e1a-a30c-e5a649a3092b", + "link": "https://learn.microsoft.com/azure/sap/workloads/sap-high-availability-guide-wsfc-shared-disk", + "service": "SAP", + "severity": "高", + "text": "可以在 Windows 中將 Azure 共用磁碟用於 ASCS + SCS 元件和特定的高可用性方案。為 SAP 應用程式層元件和 DBMS 層單獨設置故障轉移群集。Azure 目前不支援將 SAP 應用程式層元件和 DBMS 層合併到一個故障轉移群集中的高可用性體系結構。", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "可靠性" }, { - "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", + "checklist": "SAP 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", "severity": "高", - "text": "如果日誌保留要求超過 12 年,請將日誌匯出到 Azure 存儲。使用具有一次寫入、多次讀取策略的不可變存儲,使數據在使用者指定的時間間隔內不可擦除且不可修改。", - "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", - "waf": "操作" + "text": "SAP 應用程式層元件 (ASCS) 和 DBMS 層的大多數故障轉移群集都需要故障轉移群集的虛擬 IP 位址。 Azure 負載均衡器應處理所有其他情況的虛擬IP位址。一個設計原則是每個集群配置使用一個負載均衡器。建議使用標準版本的負載均衡器(標準負載均衡器 SKU)。", + "training": "https://learn.microsoft.com/training/modules/implement-high-availability-for-sap-workloads-azure/?source=recommendations", + "waf": "可靠性" }, { - "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": "中等", - "text": "使用 Azure Policy 監視 OS 等級虛擬機 (VM) 配置偏移。通過策略啟用 Azure Automanage 計算機配置審核功能可説明應用程式團隊工作負載立即使用功能,而無需付出任何努力。", - "training": "https://learn.microsoft.com/learn/paths/implement-resource-mgmt-security/", - "waf": "操作" + "checklist": "SAP Checklist", + "guid": "1a541741-5833-4fb4-ae3c-2df743165c3a", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-ha-ports-overview?source=recommendations", + "service": "SAP", + "severity": "高", + "text": "確保在負載均衡器上啟用了浮動IP", + "training": "https://learn.microsoft.com/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", + "waf": "可靠性" }, { - "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": "中等", - "text": "使用 Azure Update Manager 作為 Azure 中 Windows 和 Linux VM 的修補機制。", - "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", - "waf": "操作" + "checklist": "SAP Checklist", + "guid": "c47cc4f3-f105-452c-845e-9b307b3856c1", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability", + "service": "SAP", + "severity": "高", + "text": "在部署高可用性基礎結構之前,請根據所選的區域確定是使用 Azure 可用性集還是可用性區域進行部署。", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", + "waf": "可靠性" }, { - "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": "中等", - "text": "使用 Azure Arc 將 Azure Update Manager 用作 Azure 外部的 Windows 和 Linux VM 的修補機制。", - "training": "https://learn.microsoft.com/azure/update-manager/overview?tabs=azure-vms", - "waf": "操作" + "checklist": "SAP 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", + "severity": "高", + "text": "如果要滿足 SAP 元件(中央服務、應用程式伺服器和資料庫)應用程式的基礎結構 SLA,則必須為所有元件選擇相同的高可用性選項(VM、可用性集、可用性區域)。", + "waf": "可靠性" }, { - "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": "中等", - "text": "使用網路觀察程序主動監視流量流。", - "training": "https://learn.microsoft.com/learn/modules/configure-network-watcher/", - "waf": "操作" + "checklist": "SAP Checklist", + "guid": "cbe05bbe-209d-4490-ba47-778424d11678", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", + "severity": "高", + "text": "不要在同一可用性集中混合使用不同角色的伺服器。將中央服務 VM、資料庫 VM、應用程式 VM 保留在自己的可用性集中", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", + "waf": "可靠性" }, { - "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", + "checklist": "SAP Checklist", + "guid": "f2201000-d045-40a6-a79a-d7cdc01b4d86", + "link": "https://learn.microsoft.com/azure/virtual-machines/co-location", + "service": "SAP", "severity": "中等", - "text": "使用 Azure Monitor 紀錄獲取見解和報告。", - "waf": "操作" + "text": "除非使用鄰近放置組,否則無法在 Azure 可用性區域內部署 Azure 可用性集。", + "training": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "waf": "可靠性" }, { - "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": "中等", - "text": "使用 Azure Monitor 警報生成操作警報。", - "waf": "操作" + "checklist": "SAP Checklist", + "guid": "9674e7c7-7796-4181-8920-09f4429543ba", + "link": "https://learn.microsoft.com/azure/virtual-machines/availability-set-overview", + "service": "SAP", + "severity": "高", + "text": "創建可用性集時,請使用最大數量的容錯域和更新可用的域。例如,如果在一個可用性集中部署兩個以上的 VM,請使用最大數量的容錯域(三個)和足夠的更新域來限制潛在的物理硬體故障、網路中斷或電源中斷的影響,以及 Azure 計劃內維護。默認的容錯域數為 2,以後無法連線更改。", + "training": "https://learn.microsoft.com/training/modules/configure-virtual-machine-availability/?source=recommendations", + "waf": "可靠性" }, { - "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": "中等", - "text": "通過 Azure 自動化帳戶使用更改和清單跟蹤時,請確保已選擇受支持的區域,以便將 Log Analytics 工作區和自動化帳戶連結在一起。", - "waf": "操作" + "checklist": "SAP Checklist", + "guid": "ae4ecb95-b70f-428f-8b9a-4c5b7e3478a2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", + "severity": "高", + "text": "在可用性集部署中使用 Azure 鄰近放置組時,所有三個 SAP 元件(中央服務、應用程式伺服器和資料庫)都應位於同一鄰近放置組中。", + "waf": "可靠性" }, { - "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": "低", - "text": "使用 Azure 備份時,請使用正確的備份類型(GRS、ZRS 和 LRS)進行備份,因為預設設置為 GRS。", + "checklist": "SAP Checklist", + "guid": "5d2fa56c-56ad-4484-88fe-72734c486ba2", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", + "severity": "高", + "text": "每個 SAP SID 使用一個鄰近放置組。組不跨可用性區域或 Azure 區域", "waf": "可靠性" }, { - "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": "中等", - "text": "使用 Azure 來賓策略通過 VM 擴展自動部署軟體配置,並強制實施合規的基線 VM 配置。", - "waf": "安全" + "checklist": "SAP 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", + "severity": "高", + "text": "根據操作系統的不同,使用以下服務之一來運行 SAP 中心服務群集。", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "可靠性" }, { - "arm-service": "Microsoft.Compute/virtualMachines", - "checklist": "Azure Landing Zone Review", - "description": "使用 Azure Policy 的來賓配置功能來審核和修正電腦設置(例如 OS、應用程式、環境),以確保資源與預期配置保持一致,並且更新管理可以強制實施 VM 的修補程式管理。", - "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", + "checklist": "SAP Checklist", + "guid": "ed46b937-913e-4018-9c62-8393ab037e53", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-suse-multi-sid", + "service": "SAP", "severity": "中等", - "text": "通過 Azure Policy 監視 VM 安全配置偏移。", - "waf": "安全" + "text": "Azure 目前不支援將 ASCS 和 DB HA 組合在同一 Linux Pacemaker 群集中;將它們分成單獨的集群。但是,最多可以將五個多個中心服務群集合併到一對 VM 中。", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "可靠性" }, { - "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", + "checklist": "SAP 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", "severity": "中等", - "text": "使用 Azure Site Recovery 實現 Azure 到 Azure 虛擬機的災難恢復方案。這使您能夠跨區域複製工作負載。", - "waf": "操作" + "text": "在可用性集或可用性區域中的高可用性對中部署兩個 VM。這些 VM 的大小應相同,並具有相同的存儲配置。", + "waf": "可靠性" }, { - "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", + "checklist": "SAP 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", "severity": "中等", - "text": "使用 Azure 本機備份功能或與 Azure 相容的第三方備份解決方案。", - "waf": "操作" + "text": "Azure 支援在 Red Hat Enterprise Linux (RHEL) 上運行的同一高可用性群集上安裝和配置 SAP HANA 和 ASCS/SCS 和 ERS 實例。", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "可靠性" + }, + { + "checklist": "SAP Checklist", + "guid": "07991f7d-6598-4d90-9431-45c62605d3a5", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", + "severity": "高", + "text": "在高級託管 SSD 上運行所有生產系統,並使用 Azure NetApp 檔或超級磁碟存儲。至少OS磁碟應位於高級層,以便您可以獲得更好的性能和最佳SLA。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", + "waf": "可靠性" }, { - "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", + "checklist": "SAP Checklist", + "guid": "73cdaecc-7d74-48d8-a040-88416eebc98c", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-operations-storage", + "service": "SAP", "severity": "高", - "text": "添加診斷設置以保存來自應用程式交付服務(如 Azure Front Door 和 Azure 應用程式閘道)的 WAF 日誌。定期查看日誌,以檢查攻擊和誤報檢測。", - "waf": "操作" + "text": "應僅在 SAP 認證的存儲類型上運行 Azure 上的 SAP HANA。請注意,某些卷必須在某些磁碟配置(如果適用)上運行。這些配置包括啟用寫入加速器和使用高級存儲。您還需要確保在儲存上運行的檔案系統與在電腦上運行的 DBMS 相容。", + "training": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1?source=recommendations", + "waf": "可靠性" }, { - "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": "中等", - "text": "將 WAF 日誌從應用程式交付服務(如 Azure Front Door 和 Azure 應用程式閘道)發送到 Microsoft Sentinel。檢測攻擊並將 WAF 遙測集成到整個 Azure 環境中。", - "waf": "操作" + "checklist": "SAP Checklist", + "guid": "51904867-a70e-4fa0-b4ff-3e6292846d7c", + "link": "https://learn.microsoft.com/azure/sap/workloads/disaster-recovery-overview-guide#storage", + "service": "SAP", + "severity": "高", + "text": "請考慮根據用於 SAP 工作負載的儲存類型配置高可用性。Azure Site Recovery 不支援 Azure 中提供的某些存儲服務,因此高可用性配置可能會有所不同。", + "training": "https://learn.microsoft.com/training/modules/implement-disaster-recovery-for-sap-workloads-azure/2-explore-disaster-recovery-sap-workloads", + "waf": "可靠性" }, { - "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", + "checklist": "SAP Checklist", + "guid": "1ac2d928-c9b7-42c6-ba18-23b1aea78693", + "link": "https://azure.microsoft.com/ja-jp/explore/global-infrastructure/products-by-region/", + "service": "SAP", "severity": "高", - "text": "使用 Azure Key Vault 儲存機密和憑據。", - "waf": "安全" + "text": "不同的本機 Azure 儲存服務(如 Azure 檔存儲、Azure NetApp 檔、Azure 共用磁碟)可能並非在所有區域都可用。因此,若要在故障轉移后在DR區域上設置類似的SAP,請確保在DR網站中提供相應的存儲服務。", + "waf": "可靠性" }, { - "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", + "checklist": "SAP 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", "severity": "中等", - "text": "對不同的應用程式和區域使用不同的 Azure Key Vault,以避免事務規模限制並限制對機密的訪問。", - "waf": "安全" + "text": "自動執行 SAP System Start-Stop 以管理成本。", + "waf": "成本" }, { - "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": "中等", - "text": "在啟用軟刪除和清除策略的情況下預配 Azure Key Vault,以允許對已刪除物件進行保留保護。", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "71dc00cd-4392-4262-8949-20c05e6c0333", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", + "severity": "低", + "text": "如果將 Azure 高級存儲與 SAP HANA 配合使用,則可以使用 Azure 標準 SSD 儲存來選擇成本敏感的儲存解決方案。但是,請注意,選擇“標準 SSD”或“標準 HDD Azure”存儲將影響各個 VM 的 SLA。此外,對於具有較低 I/O 輸送量和低延遲的系統(例如非生產環境),可以使用較低系列的 VM。", + "waf": "成本" }, { - "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": "中等", - "text": "遵循最低特權模型,將永久刪除密鑰、機密和證書的授權限制為專用的自定義 Microsoft Entra ID 角色。", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "9877f353-2591-4e8b-8381-e9043fed1010", + "link": "https://learn.microsoft.com/azure/sap/workloads/hana-vm-premium-ssd-v1", + "service": "SAP", + "severity": "低", + "text": "作為成本較低的替代配置(多用途),可以為非生產 HANA 資料庫伺服器 VM 選擇低性能 SKU。但是,請務必注意,某些 VM 類型(如 E 系列)未經 HANA 認證(SAP HANA 硬體目錄),或者無法實現小於 1 毫秒的存儲延遲。", + "waf": "成本" }, { - "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": "中等", - "text": "使用公共證書頒發機構自動執行證書管理和續訂過程,以簡化管理。", + "checklist": "SAP Checklist", + "guid": "fda1dbf3-dc95-4d48-a7c7-91dca0f6c565", + "link": "https://learn.microsoft.com/azure/well-architected/sap/design-areas/security", + "service": "SAP", + "severity": "高", + "text": "對管理組、訂閱、資源組和資源強制實施 RBAC 模型", + "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", "waf": "安全" }, { - "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", + "checklist": "SAP Checklist", + "guid": "45911475-e39e-4530-accc-d979366bcda2", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", "severity": "中等", - "text": "建立金鑰和證書輪換的自動化流程。", + "text": "強制實施主體傳播,以便透過雲連接器將身份從 SAP 雲應用程式轉發到 SAP 本地(包括 IaaS)", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/2-explore-azure-virtual-machine-auth-access-control", "waf": "安全" }, { - "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", + "checklist": "SAP Checklist", + "guid": "750ab1ab-039d-495d-94c7-c8929cb107d5", + "link": "https://learn.microsoft.com/azure/active-directory/fundamentals/scenario-azure-first-sap-identity-integration", + "service": "SAP", "severity": "中等", - "text": "在保管庫上啟用防火牆和虛擬網路服務終結點或專用終結點,以控制對密鑰保管庫的訪問。", + "text": "使用 SAML 通過 Azure AD 實現 SAP SaaS 應用程式(如 SAP Analytics Cloud、SAP Cloud Platform、Business by Design、SAP Qualtrics 和 SAP C4C)的 SSO。", "waf": "安全" }, { - "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", + "checklist": "SAP Checklist", + "guid": "325ae525-ba34-4d46-a5e2-213ace7bb122", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", "severity": "中等", - "text": "使用以平臺為中心的 Azure Monitor Log Analytics 工作區來審核 Key Vault 的每個實例中的密鑰、證書和機密使用方式。", + "text": "使用 SAML 對基於 SAP NetWeaver 的 Web 應用程式(如 SAP Fiori 和 SAP Web GUI)實施 SSO。", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", "waf": "安全" }, { - "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", + "checklist": "SAP Checklist", + "guid": "9eb54dad-7861-4e1c-973a-f3bb003fc9c1", + "service": "SAP", "severity": "中等", - "text": "委託 Key Vault 實例化和特權訪問,並使用 Azure Policy 強制實施一致的合規配置。", + "text": "使用 SAML 對基於 SAP NetWeaver 的 Web 應用程式(如 SAP Fiori 和 SAP Web GUI)實施 SSO。", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/6-exercise-integrate-azure-active-directory-sap-fiori", "waf": "安全" }, { - "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", + "checklist": "SAP Checklist", + "guid": "f29676ef-0c9c-4c4d-ab21-a55504c0c829", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-netweaver-tutorial", + "service": "SAP", "severity": "中等", - "text": "每個應用程式、每個環境、每個區域使用 Azure Key Vault。", + "text": "可以使用SAP NetWeaver SSO 或合作夥伴解決方案將 SSO 實現到 SAP GUI。", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/8-exercise-integrate-azure-active-directory-sap-netweaver", "waf": "安全" }, { - "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", + "checklist": "SAP Checklist", + "guid": "23181aa4-1742-4694-9ff8-ae7d7d474317", + "service": "SAP", "severity": "中等", - "text": "如果要自帶密鑰,則並非所有考慮的服務都支援此功能。實施相關的緩解措施,使不一致之處不會妨礙預期的結果。選擇適當的區域對和災難恢復區域,以最大程度地減少延遲。", + "text": "對於 SAP GUI 和 Web 瀏覽器存取的 SSO,請實施 SNC/Kerberos/SPNEGO(簡單且受保護的 GSSAPI 協商機制),因為它易於配置和維護。對於使用 X.509 用戶端證書的 SSO,請考慮 SAP 安全登錄伺服器,它是 SAP SSO 解決方案的一個元件。", + "training": "https://learn.microsoft.com/training/modules/explore-identity-services/9-exercise-integrate-active-directory-sap-single-sign-on", "waf": "安全" }, { - "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", + "checklist": "SAP 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", "severity": "中等", - "text": "對於 Sovereign Landing Zone,請使用 Azure Key Vault 託管 HSM 來儲存機密和憑據。", + "text": "對於 SAP GUI 和 Web 瀏覽器存取的 SSO,請實施 SNC/Kerberos/SPNEGO(簡單且受保護的 GSSAPI 協商機制),因為它易於配置和維護。對於使用 X.509 用戶端證書的 SSO,請考慮 SAP 安全登錄伺服器,它是 SAP SSO 解決方案的一個元件。", "waf": "安全" }, { - "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", + "checklist": "SAP 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", "severity": "中等", - "text": "使用 Microsoft Entra ID 報告功能生成訪問控制審核報告。", - "waf": "安全" - }, - { - "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": "高", - "text": "為所有訂閱啟用Defender雲安全態勢管理。", + "text": "使用 OAuth for SAP NetWeaver 實現 SSO,以允許第三方或自定義應用程式訪問 SAP NetWeaver OData 服務。", "waf": "安全" }, { - "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": "高", - "text": "在所有訂閱上為伺服器啟用Defender雲工作負載保護計劃。", + "checklist": "SAP Checklist", + "guid": "a747c350-8d4c-449c-93af-393dbca77c48", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/saphana-tutorial", + "service": "SAP", + "severity": "中等", + "text": "實現 SSO 到 SAP HANA", "waf": "安全" }, { - "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": "高", - "text": "在所有訂閱上為 Azure 資源啟用 Defender 雲工作負載保護計劃。", + "checklist": "SAP Checklist", + "guid": "c7bae5bf-daf9-4761-9c56-f92891890aa4", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration#connectivity-with-sap-rise", + "service": "SAP", + "severity": "中等", + "text": "將 Azure AD 視為 RISE 上託管的 SAP 系統的標識提供者。有關詳細資訊,請參閱將服務與 Azure AD 集成。", "waf": "安全" }, { - "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": "高", - "text": "在 IaaS 伺服器上啟用端點保護。", + "checklist": "SAP Checklist", + "guid": "e4e48226-ce54-44b6-bb6b-bfa15bd8f753", + "link": "https://github.com/azuredevcollege/SAP/blob/master/sap-oauth-saml-flow/README.md", + "service": "SAP", + "severity": "中等", + "text": "對於訪問 SAP 的應用程式,可能需要使用主體傳播來建立 SSO。", "waf": "安全" }, { - "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", + "checklist": "SAP 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", "severity": "中等", - "text": "通過 Azure Monitor 紀錄和 Defender for Cloud 監視基本作業系統修補偏移。", + "text": "如果使用的是需要 SAP Identity Authentication Service (IAS) 的 SAP BTP 服務或 SaaS 解決方案,請考慮在 SAP Cloud Identity Authentication Services 和 Azure AD 之間實現 SSO 以存取這些 SAP 服務。此集成允許 SAP IAS 充當代理標識提供者,並將身份驗證請求轉發到 Azure AD,作為中央使用者存儲和標識提供者。", "waf": "安全" }, { - "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", + "checklist": "SAP Checklist", + "guid": "a709c664-317e-41e4-9e34-67d9016a86f4", + "link": "https://learn.microsoft.com/azure/active-directory/saas-apps/sap-hana-cloud-platform-tutorial", + "service": "SAP", "severity": "中等", - "text": "將預設資源配置連接到集中式 Azure Monitor Log Analytics 工作區。", + "text": "實現 SSO 到 SAP BTP", "waf": "安全" }, { - "checklist": "Azure Landing Zone Review", - "guid": "1761e147-f65e-4d09-bbc2-f464f23e2eba", - "link": "https://learn.microsoft.com/industry/sovereignty/transparency-logs", - "service": "Entra", + "checklist": "SAP 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", "severity": "中等", - "text": "對於 Sovereign Landing Zone,請在 Entra ID 租戶上啟用透明度日誌。", + "text": "如果使用的是 SAP SuccessFactors,請考慮使用 Azure AD 自動使用者預配。通過此整合,當你向 SAP SuccessFactors 添加新員工時,可以在 Azure AD 中自動建立使用者帳戶。 (可選)可以在 Microsoft 365 或 Azure AD 支援的其他 SaaS 應用程式中建立使用者帳戶。 使用將電子郵件地址寫回 SAP SuccessFactors。", "waf": "安全" }, { - "checklist": "Azure Landing Zone Review", - "guid": "d21a922d-5ca7-427a-82a6-35f7b21f1bfc", - "link": "https://learn.microsoft.com/azure/security/fundamentals/customer-lockbox-overview", - "service": "Entra", + "checklist": "SAP 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", "severity": "中等", - "text": "對於 Sovereign Landing Zone,請在 Entra ID 租戶上啟用客戶密碼箱。", - "waf": "安全" + "text": "對 SAP 訂閱強制實施現有管理組策略", + "training": "https://learn.microsoft.com/training/modules/enterprise-scale-organization/4-management-group-subscription-organization", + "waf": "操作" }, { - "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", + "checklist": "SAP Checklist", + "guid": "366bcda2-750a-4b1a-a039-d95d54c7c892", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "severity": "高", - "text": "啟用到存儲帳戶的安全傳輸。", - "waf": "安全" + "text": "將緊密耦合的應用程式集成到同一個 SAP 訂閱中,以避免額外的路由和管理複雜性", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/ready/landing-zone/design-area/resource-org-subscriptions", + "waf": "操作" }, { - "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", + "checklist": "SAP Checklist", + "guid": "9cb107d5-325a-4e52-9ba3-4d4685e2213a", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", "severity": "高", - "text": "為存儲帳戶啟用容器軟刪除,以恢復已刪除的容器及其內容。", - "waf": "安全" + "text": "利用訂閱作為縮放單元並擴展我們的資源,請考慮按環境部署訂閱,例如。沙箱、非生產、生產", + "training": "https://learn.microsoft.com/training/modules/configure-subscriptions/?source=recommendations", + "waf": "操作" }, { - "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", + "checklist": "SAP Checklist", + "guid": "ce7bb122-f7c9-45f0-9e15-4e3aa3592829", + "link": "https://learn.microsoft.com/azure/quotas/quotas-overview", + "service": "SAP", "severity": "高", - "text": "使用 Key Vault 機密可避免對敏感資訊(如憑據、虛擬機、用戶密碼)、證書或密鑰進行硬編碼。", + "text": "確保在訂閱預配過程中增加配額(例如,訂閱中可用的 VM 核心總數)", + "training": "https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits", "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "32e42e36-11c8-418b-8a0b-c510e43a18a9", - "service": "AVS", - "severity": "高", - "text": "確保在本機 Azure 的標識訂閱中部署了 ADDS 域控制器", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "ce4fab2f-433a-4d59-a5a9-3d1032e03ebc", + "link": "https://learn.microsoft.com/rest/api/reserved-vm-instances/quotaapi?branch=capacity", + "service": "SAP", + "severity": "低", + "text": "配額 API 是一個 REST API,可用於查看和管理 Azure 服務的配額。如有必要,請考慮使用它。", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "75089c20-990d-4927-b105-885576f76fc2", - "service": "AVS", - "severity": "中等", - "text": "確保將 ADDS 網站和服務配置為將來自基於 Azure 的資源(包括 Azure VMware 解決方案)的身份驗證請求保留到 Azure 本地", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "cbfad17b-f240-42bf-a1d8-f4f4cee661c8", + "link": "https://learn.microsoft.com/azure/quotas/quickstart-increase-quota-portal", + "service": "SAP", + "severity": "高", + "text": "如果部署到可用性區域,請確保在配額獲得批准后,VM 的區域部署可用。提交支援請求,其中包含所需的訂閱、VM 系列、CPU 數量和可用性區域。", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "de3aad1e-7c28-4ec9-9666-b7570449aa80", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "e6e20617-3686-4af4-9791-f8935ada4332", + "link": "https://azure.microsoft.com/explore/global-infrastructure/products-by-region/", + "service": "SAP", "severity": "高", - "text": "確保 vCenter 已連接到 ADDS,以啟用基於「指定用戶帳戶」的身份驗證", - "waf": "安全" + "text": "確保所需的服務和功能在所選部署區域內可用,例如。ANF、區域等", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/migrate/azure-best-practices/multiple-regions?source=recommendations", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cd289ced-6b17-4db8-8554-61e2aee3553a", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "4e138115-2318-41aa-9174-26943ff8ae7d", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-resource-organization", + "service": "SAP", "severity": "中等", - "text": "確保從 vCenter 到 ADDS 的連接使用安全協定 (LDAPS)", - "waf": "安全" + "text": "利用 Azure 資源標記進行成本分類和資源分組(:BillTo、部門(或營業單位)、環境(生產、階段、開發)、層(Web 層、應用層)、應用程式擁有者、ProjectName)", + "training": "https://learn.microsoft.com/training/paths/implement-resource-mgmt-security/", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b9d37dac-43bc-46cd-8d79-a9b24604489a", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "2f7c95f0-6e15-44e3-aa35-92829e6e2061", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", + "severity": "高", + "text": "使用 Azure 備份服務幫助保護 HANA 資料庫。", + "training": "https://learn.microsoft.com/training/modules/implement-azure-backup-sap-workloads-azure-virtual-machines/?source=recommendations", + "waf": "可靠性" + }, + { + "checklist": "SAP Checklist", + "guid": "302a2fbf-3745-4a5f-a365-c9d1a16ca22c", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azacsnap-introduction", + "service": "SAP", "severity": "中等", - "text": "vCenter IdP 中的 CloudAdmin 帳戶僅用作緊急帳戶 (break-glass)", - "waf": "安全" + "text": "如果為 HANA、Oracle 或 DB2 資料庫部署 Azure NetApp 檔,請使用 Azure 應用程式一致性快照工具( AzAcSnap )來創建應用程式一致性快照。AzAcSnap 還支援 Oracle 資料庫。請考慮在中央 VM 上使用 AzAcSnap,而不是在單個 VM 上使用 AzAcSnap。", + "waf": "可靠性" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "53d88e89-d17b-473b-82a5-a67e7a9ed5b3", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "42d37218-a3a7-45df-bff6-1173e7f249ea", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", "severity": "高", - "text": "確保 NSX-Manager 與外部身份提供程式 (LDAPS) 集成", - "waf": "安全" + "text": "確保操作系統和 SAP 系統之間的時區匹配。", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ae0e37ce-e297-411b-b352-caaab79b198d", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "c3c7abc0-716c-4486-893c-40e181d65539", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel-multi-sid", + "service": "SAP", "severity": "中等", - "text": "是否已創建 RBAC 模型以在 VMware vSphere 中使用", - "waf": "安全" + "text": "不要將不同的應用程式服務分組到同一個集群中。例如,不要將DRBD和中央服務集群組合在同一集群上。但是,可以使用同一個 Pacemaker 群集來管理大約五個不同的中心服務(多 SID 群集)。", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "可靠性" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ab81932c-9fc9-4d1b-a780-36f5e6bfbb9e", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "a491dfc4-9353-4213-9217-eef0949f9467", + "link": "https://azure.microsoft.com/pricing/offers/dev-test/", + "service": "SAP", + "severity": "低", + "text": "請考慮在暫停模型中運行開發/測試系統,以節省和優化 Azure 運行成本。", + "waf": "成本" + }, + { + "checklist": "SAP Checklist", + "guid": "b7056168-6199-4732-a514-cdbb2d5c9c54", + "link": "https://learn.microsoft.com/azure/lighthouse/overview", + "service": "SAP", "severity": "中等", - "text": "RBAC 許可權應授予 ADDS 組,而不是特定使用者", - "waf": "安全" + "text": "如果通過管理客戶的 SAP 資產與客戶合作,請考慮使用 Azure Lighthouse。Azure Lighthouse 允許託管服務提供者使用 Azure 本機標識服務對客戶的環境進行身份驗證。它將控制權交到客戶手中,因為他們可以隨時撤銷訪問許可權並審核服務提供者的行為。", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d503547c-c447-4e82-9128-a71f0f1cac6d", - "service": "AVS", - "severity": "高", - "text": "Azure 中 Azure VMware 解決方案資源的 RBAC 許可權僅「鎖定」為一組有限的擁有者", - "waf": "安全" + "checklist": "SAP 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", + "severity": "中等", + "text": "使用 Azure Update Manager 檢查單個 VM 或多個 VM 的可用更新狀態,並考慮計劃定期修補。", + "training": "https://learn.microsoft.com/training/modules/keep-your-virtual-machines-updated/?source=recommendations", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "fd9f0df4-68dc-4976-b9a9-e6a79f7682c5", - "service": "AVS", - "severity": "高", - "text": "確保所有自定義角色的範圍都具有 CloudAdmin 允許的授權", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "76c8bcbf-45bb-4e60-ad8a-03e97778424d", + "link": "https://learn.microsoft.com/azure/sap/workloads/lama-installation", + "service": "SAP", + "severity": "低", + "text": "使用 SAP Landscape Management (LaMa) 優化和管理 SAP Basis 運營。使用適用於 Azure 的 SAP LaMa 連接器重新置放、複製、克隆和刷新 SAP 系統。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-remote-management/?source=recommendations", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9ef1d5e8-32e4-42e3-911c-818b0a0bc510", - "link": "https://github.com/Azure/AzureCAT-AVS/tree/main/networking", - "service": "AVS", - "severity": "高", - "text": "是否為手頭的客戶用例選擇了正確的 Azure VMware 解決方案連接模型", - "waf": "性能" + "checklist": "SAP Checklist", + "guid": "14591147-5e39-4e53-89cc-cd979366bcda", + "link": "https://learn.microsoft.com/azure/sap/monitor/about-azure-monitor-sap-solutions", + "service": "SAP", + "severity": "中等", + "text": "使用用於 SAP 解決方案的 Azure Monitor 監視 Azure 上的 SAP 工作負載(SAP HANA、高可用性 SUSE 群集和 SQL 系統)。請考慮使用 SAP 解決方案管理器補充用於 SAP 解決方案的 Azure Monitor。", + "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "eb710a37-cbc1-4055-8dd5-a936a8bb7cf5", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "2750ab1a-b039-4d95-b54c-7c8929cb107d", + "link": "https://learn.microsoft.com/azure/sap/workloads/vm-extension-for-sap", + "service": "SAP", "severity": "高", - "text": "確保使用「連接監視器」監視從本地到 Azure 的 ExpressRoute 或 VPN 連接", + "text": "運行適用於 SAP 的 VM 擴展檢查。適用於 SAP 的 VM 擴展使用虛擬機 (VM) 的分配託管標識來訪問 VM 監視和配置數據。該檢查可確保 SAP 應用程式中的所有性能指標都來自適用於 SAP 的基礎 Azure 擴展。", + "training": "https://learn.microsoft.com/training/modules/configure-azure-enhanced-monitoring-extension-for-sap/?source=recommendations", "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "976e24f2-a7f8-426c-9253-2a92a2a7ed99", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "5325ae52-5ba3-44d4-985e-2213ace7bb12", + "link": "https://learn.microsoft.com/azure/azure-monitor/logs/design-logs-deployment", + "service": "SAP", "severity": "中等", - "text": "確保創建從 Azure 本機資源到 Azure VMware 解決方案虛擬機的連接監視器,以監視 Azure VMware 解決方案後端 ExpressRoute 連接", + "text": "使用 Azure Policy 進行訪問控制和合規性報告。Azure Policy 提供了強制實施組織範圍設置的功能,以確保一致的策略遵守和快速違規檢測。", + "training": "https://learn.microsoft.com/learn/paths/architect-infrastructure-operations/", "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "f41ce6a0-64f3-4805-bc65-3ab50df01265", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "523181aa-4174-4269-93ff-8ae7d7d47431", + "link": "https://learn.microsoft.com/azure/network-watcher/connection-monitor-overview", + "service": "SAP", "severity": "中等", - "text": "確保創建從本地資源到 Azure VMware 解決方案虛擬機的連接監視器,以監視端到端連接", + "text": "使用 Azure 網路觀察程式中的連接監視器監視 SAP 資料庫和應用程式伺服器的延遲指標。或者使用 Azure Monitor 收集和顯示網路延遲度量。", + "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/collecting-and-displaying-niping-network-latency-measurements/ba-p/1833979", "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "563b4dc7-4a74-48b6-933a-d1a0916a6649", - "service": "AVS", - "severity": "高", - "text": "使用路由伺服器時,請確保從路由伺服器到 ExR 閘道再到本地的路由不超過 1000 個(ARS 限制)。", + "checklist": "SAP Checklist", + "guid": "73686af4-6791-4f89-95ad-a43324e13811", + "link": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/QualityCheck", + "service": "SAP", + "severity": "中等", + "text": "在預配的 Azure 基礎結構上對 SAP HANA 執行質量檢查,以驗證預配的 VM 是否符合 Azure 上的 SAP HANA 最佳做法。", "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6128a71f-0f1c-4ac6-b9ef-1d5e832e42e3", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "616785d6-fa96-4c96-ad88-518f482734c8", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-zones", + "service": "SAP", "severity": "高", - "text": "是否為在 Azure 門戶中管理 Azure VMware 解決方案資源的角色實現了 Privileged Identity Management(不允許長期許可權)", - "waf": "安全" + "text": "對於每個 Azure 訂閱,請在區域部署之前對 Azure 可用性區域運行延遲測試,以選擇用於在 Azure 上部署 SAP 的低延遲區域。", + "training": "https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/AvZone-Latency-Test", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c4e2436b-b336-4d71-9f17-960eee0b9b5c", - "service": "AVS", - "severity": "高", - "text": "應為 Azure VMware 解決方案 PIM 角色實現 Privileged Identity Management 審核報告", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "410adcba-db46-424f-a6c4-05ecde75c52e", + "link": "https://learn.microsoft.com/azure/advisor/advisor-how-to-improve-reliability", + "service": "SAP", + "severity": "中等", + "text": "運行復原報告,確保整個預配的 Azure 基礎結構(計算、資料庫、網路、存儲、Site Recovery)的配置符合適用於 Azure 的 Cloud Adaption Framework 定義的配置。", + "training": "https://learn.microsoft.com/training/paths/azure-well-architected-framework/", + "waf": "可靠性" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "78c447a8-26b2-4863-af0f-1cac599ef1d5", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "86ba2802-1459-4114-95e3-9e5309cccd97", + "link": "https://learn.microsoft.com/azure/sentinel/sap/deployment-overview", + "service": "SAP", "severity": "中等", - "text": "如果使用 Privileged Identity Management,請確保使用有效的 SMTP 記錄創建啟用了 Entra ID 的有效帳戶,以便 Azure VMware 解決方案自動主機更換通知。(需要長期許可)", + "text": "使用適用於 SAP 的 Microsoft Sentinel 解決方案實施威脅防護。使用此解決方案監視 SAP 系統,並檢測整個業務邏輯和應用程式層的複雜威脅。", + "training": "https://learn.microsoft.com/training/modules/plan-microsoft-sentinel-deployment-sap/?source=recommendations", "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "8defc4d7-21d3-41d2-90fb-707ae9eab40e", - "service": "AVS", - "severity": "高", - "text": "將 CloudAdmin 帳戶的使用限制為僅緊急訪問", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "579266bc-ca27-45fa-a1ab-fe9d55d04c3c", + "link": "https://learn.microsoft.com/azure/cost-management-billing/costs/enable-tag-inheritance", + "service": "SAP", + "severity": "中等", + "text": "Azure 標記可用於對資源進行邏輯分組和跟蹤,自動執行其部署,最重要的是,提供對所發生成本的可見性。", + "training": "https://learn.microsoft.com/training/modules/analyze-costs-create-budgets-azure-cost-management/?source=recommendations", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d329f798-bc17-48bd-a5a0-6ca7144351d1", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "04b8e5e5-13cb-4b22-af62-5a8ecfcf0337", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-test-latency?tabs=windows", + "service": "SAP", + "severity": "低", + "text": "對延遲敏感型應用程式使用虛擬機間延遲監視。", + "waf": "性能" + }, + { + "checklist": "SAP Checklist", + "guid": "07e5ed53-3d96-43d8-87ea-631b77da5aba", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide-storage", + "service": "SAP", "severity": "中等", - "text": "在 vCenter 中創建自定義 RBAC 角色,以在 vCenter 中實施最小特權模型", - "waf": "安全" + "text": "使用 Azure Site Recovery 監視來維護 SAP 應用程式伺服器的災難恢復服務的運行狀況。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-storage/?source=recommendations", + "waf": "可靠性" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9dd24429-eb72-4281-97a1-51c5bb4e4f18", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "abb6af9c-982c-4cf1-83fb-329fafd1ee56", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-management-and-monitoring", + "service": "SAP", "severity": "中等", - "text": "是定義為定期輪換 cloudadmin (vCenter) 和管理員 (NSX) 憑據的過程", - "waf": "安全" + "text": "從防病毒掃描中排除所有資料庫檔系統和可執行程式。包含它們可能會導致性能問題。請與資料庫供應商聯繫,瞭解排除清單中的規範性詳細資訊。例如,Oracle 建議從防病毒掃描中排除 /oracle}sapdata。", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "586cb291-ec16-4a1d-876e-f9f141acdce5", - "service": "AVS", - "severity": "高", - "text": "使用集中式識別提供者用於在 Azure VMware 解決方案上運行的工作負載 (VM)", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "c027f893-f404-41a9-b33d-39d625a14964", + "link": "https://sapit-forme-prod.authentication.eu11.hana.ondemand.com/login", + "service": "SAP", + "severity": "低", + "text": "請考慮在遷移後收集非 HANA 資料庫的完整資料庫統計資訊。例如,實施SAP 註釋1020260 - 交付 Oracle 統計資訊。", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "79377bcd-b375-41ab-8ab0-ead66e15d3d4", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "fdafb1f5-3eee-4354-a8c9-deb8127ebc2e", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/configure-oracle-asm", + "service": "SAP", "severity": "中等", - "text": "是否在 NSX-T 中實施了東西向流量篩選", - "waf": "安全" + "text": "請考慮將 Oracle 自動儲存管理 (ASM) 用於使用 Azure 上的 SAP 的所有 Oracle 部署。", + "training": "https://learn.microsoft.com/training/paths/administer-infrastructure-resources-in-azure/?source=recommendations", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "a2adb1c3-d232-46af-825c-a44e1695fddd", - "service": "AVS", - "severity": "高", - "text": "Azure VMware 解決方案上的工作負載不會直接向 Internet 公開。流量由 Azure 應用程式閘道、Azure 防火牆或第三方解決方案進行篩選和檢查", - "waf": "安全" + "checklist": "SAP 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", + "severity": "中等", + "text": "對於運行 Oracle 的 Azure 上的 SAP,SQL 腳本集合可説明你診斷性能問題。 自動工作負載存儲庫 (AWR) 報告包含用於診斷 Oracle 系統中問題的寶貴資訊。我們建議您在多個工作階段期間運行 AWR 報告,並為其選擇高峰時間,以確保分析的廣泛覆蓋範圍。", + "training": "https://learn.microsoft.com/ja-jp/azure/well-architected/oracle-iaas/performance-efficiency", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "eace4cb1-deb4-4c65-8c3f-c14eeab36938", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "d89fd98d-23e4-4b40-a92e-32db9365522c", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", "severity": "高", - "text": "對 Azure VMware 解決方案和基於 Azure VMware 解決方案的工作負載的入站 Internet 請求實施審核和日誌記錄", - "waf": "安全" + "text": "使用 Azure Site Recovery 監視來維護 SAP 應用程式伺服器的災難恢復服務的運行狀況。", + "training": "https://learn.microsoft.com/training/modules/protect-on-premises-infrastructure-with-azure-site-recovery/?source=recommendations", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "29e3eec2-1836-487a-8077-a2b5945bda43", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "5ba34d46-85e2-4213-ace7-bb122f7c95f0", + "link": "https://learn.microsoft.com/azure/ddos-protection/ddos-protection-overview", + "service": "SAP", "severity": "中等", - "text": "對來自 Azure VMware 解決方案或基於 Azure VMware 解決方案的工作負載的出站 Internet 連接實施會話監視,以識別可疑/惡意活動", + "text": "若要安全交付 HTTP/S 應用,請使用應用程式閘道 v2 並確保啟用 WAF 保護和策略。", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/", "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "334fdf91-c234-4182-a652-75269440b4be", - "service": "AVS", + "checklist": "SAP 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", "severity": "中等", - "text": "是否在 Azure 的 ExR/VPN 閘道子網上啟用了 DDoS 標準防護", - "waf": "安全" + "text": "如果在遷移到 Azure 期間未更改虛擬機器的 DNS 或虛擬名稱,則後台 DNS 和虛擬名稱將連接 SAP 環境中的許多系統介面,並且客戶有時只會知道開發人員隨時間推移定義的介面。遷移后,當虛擬或 DNS 名稱更改時,各種系統之間會出現連接挑戰,建議保留 DNS 別名以防止出現此類困難。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3d3e0843-276d-44bd-a015-bcf219e4a1eb", - "service": "AVS", + "checklist": "SAP 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", "severity": "中等", - "text": "使用專用特權訪問工作站 (PAW) 管理 Azure VMware 解決方案、vCenter、NSX Manager 和 HCX Manager", - "waf": "安全" + "text": "使用不同的 DNS 區域來區分每個環境(沙箱、開發、預生產和生產)。具有自己的 VNet 的 SAP 部署除外;在這裡,私有 DNS 區域可能不是必需的。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/4-explore-name-resolution", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9ccbd869-266a-4cca-874f-aa19bf39d95d", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "a3592829-e6e2-4061-9368-6af46791f893", + "link": "https://learn.microsoft.com/azure/virtual-network/virtual-network-peering-overview", + "service": "SAP", "severity": "中等", - "text": "為 Azure VMware 解決方案上運行的工作負載啟用高級威脅檢測(Microsoft Defender for Cloud,又名 ASC)", - "waf": "安全" + "text": "本地和全域 VNet 對等互連提供連接,是確保跨多個 Azure 區域的 SAP 部署的登陸區域之間的連接的首選方法", + "training": "https://learn.microsoft.com/training/modules/configure-vnet-peering/?source=recommendations", + "waf": "可靠性" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "44c7c891-9ca1-4f6d-9315-ae524ba34d45", - "service": "AVS", - "severity": "中等", - "text": "使用適用於伺服器的 Azure ARC 使用 Azure 本機技術正確管理在 Azure VMware 解決方案上運行的工作負載(適用於 Azure VMware 解決方案的 Azure ARC 尚不可用)", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "41742694-3ff8-4ae7-b7d4-743176c8bcbf", + "link": "https://learn.microsoft.com/azure/sap/workloads/planning-guide", + "service": "SAP", + "severity": "高", + "text": "不支援在 SAP 應用程式和 SAP 資料庫伺服器之間部署任何 NVA", + "training": "https://me.sap.com/notes/2731110", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "85e12139-bd7b-4b01-8f7b-95ef6e043e2a", - "service": "AVS", - "severity": "低", - "text": "確保 Azure VMware 解決方案上的工作負載在運行時使用足夠的數據加密(如來賓內磁碟加密和 SQL TDE)。(vSAN 靜態加密為預設加密)", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "7d4bc7d2-c34a-452e-8f1d-6ae3c8eafcc3", + "link": "https://learn.microsoft.com/training/modules/introduction-azure-virtual-wan/?source=recommendations", + "service": "SAP", + "severity": "中等", + "text": "在需要跨 Azure 區域和本地位置的全域傳輸連接的新網路、大型網路或全球網路中使用虛擬 WAN 進行 Azure 部署。使用此方法,無需手動設置 Azure 網路的可傳遞路由,並且可以遵循 Azure 部署上的 SAP 標準。", + "training": "https://learn.microsoft.com/azure/virtual-wan/virtual-wan-about", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "a3592718-e6e2-4051-9267-6ae46691e883", - "service": "AVS", - "severity": "低", - "text": "使用來賓內加密時,請盡可能將加密密鑰存儲在 Azure Key Vault 中", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "0cedb1f6-ae6c-492b-8b17-8061f50b16d3", + "link": "https://learn.microsoft.com/azure/well-architected/services/networking/network-virtual-appliances/reliability", + "service": "SAP", + "severity": "中等", + "text": "僅當使用合作夥伴 NVA 時,才考慮在區域之間部署網路虛擬設備 (NVA)。如果存在本機 NVA,則不需要區域或 VNet 之間的 NVA。部署合作夥伴網路技術和 NVA 時,請按照供應商的指南驗證與 Azure 網路衝突的配置。", + "training": "https://learn.microsoft.com/training/modules/control-network-traffic-flow-with-routes/?source=recommendations", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "5ac94222-3e13-4810-9230-81a941741583", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "facc08c6-ea95-4641-91cd-fa09e573adbd", + "link": "https://learn.microsoft.com/azure/architecture/networking/hub-spoke-vwan-architecture", + "service": "SAP", "severity": "中等", - "text": "請考慮對 Azure VMware 解決方案上運行的工作負載使用擴展的安全更新支援(Azure VMware 解決方案符合 ESU 條件)", - "waf": "安全" + "text": "虛擬 WAN 管理基於虛擬 WAN 的拓撲的分支 VNet 之間的連接(無需設置使用者定義的路由 [UDR] 或 NVA),同一虛擬中心中 VNet 到 VNet 流量的最大網路輸送量為每秒 50 G。如有必要,SAP 登陸區域可以使用 VNet 對等互連連接到其他登陸區域並克服此頻寬限制。", + "training": "https://learn.microsoft.com/training/modules/hub-and-spoke-network-architecture/?source=recommendations", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3ef7ad7c-6d37-4331-95c7-acbe44bbe609", - "service": "AVS", + "checklist": "SAP 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", "severity": "高", - "text": "確保使用適當的 vSAN 資料冗餘方法(RAID 規範)", - "waf": "可靠性" + "text": "不建議將公共IP分配給運行SAP工作負載的 VM。", + "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d88408f3-7273-44c8-96ba-280214590146", - "service": "AVS", + "checklist": "SAP 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", "severity": "高", - "text": "確保允許失敗策略已到位,以滿足您的 vSAN 儲存需求", - "waf": "可靠性" + "text": "配置 ASR 時,請考慮在 DR 端保留 IP 位址", + "training": "https://learn.microsoft.com/learn/paths/architect-network-infrastructure/", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d89f2e87-7784-424d-9167-85c6fa95b96a", - "service": "AVS", + "checklist": "SAP 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", "severity": "高", - "text": "確保已請求足夠的配額,確保已考慮增長和災難恢復要求", - "waf": "可靠性" + "text": "避免對生產網站和DR網站使用重疊的IP位址範圍。", + "training": "https://learn.microsoft.com/training/modules/design-ip-addressing-for-azure/?source=recommendations", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "5d38e53f-9ccb-4d86-a266-acca274faa19", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "6e154e3a-a359-4282-ae6e-206173686af4", + "link": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-delegate-subnet", + "service": "SAP", "severity": "中等", - "text": "確保瞭解對 ESXi 的訪問限制,其中存在可能影響第三方解決方案的訪問限制。", + "text": "雖然 Azure 確實可以説明您在 VNet 中創建多個委派子網,但 Azure NetApp 檔的 VNet 中只能存在一個委派子網。如果對 Azure NetApp 檔使用多個委託子網,則嘗試創建新卷將失敗。", + "training": "https://learn.microsoft.com/azure/azure-netapp-files/azure-netapp-files-network-topologies?source=recommendations", "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bf39d95d-44c7-4c89-89ca-1f6d5315ae52", - "service": "AVS", + "checklist": "SAP 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", "severity": "中等", - "text": "確保您制定了有關ESXi主機密度和效率的策略,並牢記請求新節點的提前期", - "waf": "操作" + "text": "使用 Azure 防火牆管理發往 Internet 的 Azure 出站流量、非 HTTP/S 入站連接和東西向流量篩選(如果組織需要)", + "training": "https://learn.microsoft.com/training/paths/secure-networking-infrastructure/", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4ba34d45-85e1-4213-abd7-bb012f7b95ef", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "91a65e40-be90-45b3-9f73-f3edbf8dc324", + "link": "https://learn.microsoft.com/azure/sap/workloads/expose-sap-process-orchestration-on-azure", + "service": "SAP", "severity": "中等", - "text": "確保 Azure VMware 解決方案的良好成本管理流程已到位 - 可以使用 Azure 成本管理", - "waf": "成本" + "text": "當應用程式閘道充當 SAP Web 應用的反向代理時,應用程式閘道和 Web 應用程式防火牆存在限制,如應用程式閘道、SAP Web 調度程式和其他第三方服務之間的比較所示。", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/si/3362959506.html", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6e043e2a-a359-4271-ae6e-205172676ae4", - "service": "AVS", - "severity": "低", - "text": "Azure 預留實例是否用於優化使用 Azure VMware 解決方案的成本", - "waf": "成本" + "checklist": "SAP Checklist", + "guid": "5e39e530-9ccc-4d97-a366-bcda2750ab1a", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "SAP", + "severity": "中等", + "text": "使用 Azure Front Door 和 WAF 策略跨 Azure 區域為與登陸區域的入站 HTTP/S 連接提供全域保護。", + "training": "https://learn.microsoft.com/training/paths/secure-application-delivery/", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6691e883-5ac9-4422-83e1-3810523081a9", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "b039d95d-54c7-4c89-89cb-107d5325ae52", + "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/afds-overview", + "service": "SAP", "severity": "中等", - "text": "使用其他 Azure 本機服務時,請考慮使用 Azure 專用連結", + "text": "使用 Azure Front Door 和應用程式閘道保護 HTTP/S 應用程式時,請利用 Azure Front Door 中的 Web 應用程式防火牆策略。鎖定應用程式閘道以僅接收來自 Azure Front Door 的流量。", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "db611712-6904-40b4-aa3d-3e0803276d4b", - "service": "AVS", - "severity": "高", - "text": "確保所有必需的資源都駐留在同一個 Azure 可用性區域中", - "waf": "性能" + "checklist": "SAP Checklist", + "guid": "5ada4332-4e13-4811-9231-81aa41742694", + "link": "https://learn.microsoft.com/azure/web-application-firewall/ag/ag-overview", + "service": "SAP", + "severity": "中等", + "text": "使用 Web 應用程式防火牆在流量暴露於 Internet 時對其進行掃描。另一種選擇是將其與負載均衡器或具有內置防火牆功能(如應用程式閘道或第三方解決方案)的資源一起使用。", + "training": "https://learn.microsoft.com/training/modules/introduction-azure-web-application-firewall/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "48b262d6-cc5f-4512-a253-98e6db9d37da", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "e73de7d5-6f36-4217-a526-e1a621ecddde", + "link": "https://learn.microsoft.com/azure/frontdoor/front-door-overview", + "service": "SAP", "severity": "中等", - "text": "為 Azure VMware 解決方案來賓 VM 工作負載啟用 Microsoft Defender for Cloud", - "waf": "安全" + "text": "在需要跨 Azure 區域和本地位置的全域傳輸連接的新網路、大型網路或全球網路中使用虛擬 WAN 進行 Azure 部署。使用此方法,無需手動設置 Azure 網路的可傳遞路由,並且可以遵循 Azure 部署上的 SAP 標準。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/10-explore-azure-front-door", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "41741583-3ef7-4ad7-a6d3-733165c7acbe", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "3c536a3e-1b6b-4e87-95ca-15edb47251c0", + "link": "https://learn.microsoft.com/azure/virtual-network/vnet-integration-for-azure-services", + "service": "SAP", "severity": "中等", - "text": "使用已啟用 Azure Arc 的伺服器管理 Azure VMware 解決方案來賓 VM 工作負載", + "text": "若要防止數據洩露,請使用 Azure 專用連結安全地訪問平臺即服務資源,例如 Azure Blob 存儲、Azure 檔存儲、Azure Data Lake Storage Gen2、Azure 數據工廠等。Azure 專用終結點還有助於保護 VNet 與 Azure 存儲、Azure 備份等服務之間的流量。VNet 與啟用專用終結點的服務之間的流量通過 Microsoft 全球網路傳輸,從而防止其暴露在公共 Internet 上。", + "training": "https://learn.microsoft.com/training/modules/design-implement-private-access-to-azure-services/?source=recommendations", "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "88f03a4d-2cd4-463c-abbc-868295abc91a", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "85e2213a-ce7b-4b12-8f7c-95f06e154e3a", + "link": "https://learn.microsoft.com/azure/virtual-network/accelerated-networking-overview?tabs=redhat", + "service": "SAP", "severity": "高", - "text": "在 Azure VMware 解決方案上啟用診斷和指標日誌記錄", - "waf": "操作" + "text": "請確保在 SAP 應用程式和 DBMS 層中使用的 VM 上啟用了 Azure 加速網路。", + "training": "https://learn.microsoft.com/training/paths/azure-fundamentals-describe-azure-architecture-services/?source=recommendations", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4ed90dae-2cc8-44c4-9b6b-781cbafe6c46", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "3ff8ae7d-7d47-4431-96c8-bcbf45bbe609", + "link": "https://learn.microsoft.com/azure/load-balancer/load-balancer-multivip-overview", + "service": "SAP", "severity": "中等", - "text": "將Log Analytics代理部署到 Azure VMware 解決方案來賓 VM 工作負載", - "waf": "操作" + "text": "請確保將 Azure 負載均衡器的內部部署設置為使用直接伺服器返回 (DSR)。此設置(啟用浮動IP)將減少內部負載均衡器配置用於 DBMS 層上的高可用性配置時的延遲。", + "training": "https://learn.microsoft.com/ja-jp/training/modules/load-balancing-non-https-traffic-azure/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "589d457a-927c-4397-9d11-02cad6aae11e", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "6791f893-5ada-4433-84e1-3811523181aa", + "link": "https://learn.microsoft.com/azure/virtual-network/network-security-group-how-it-works", + "service": "SAP", "severity": "中等", - "text": "確保已針對 Azure VMware 解決方案 VM 工作負載記錄並實施了備份策略和解決方案", - "waf": "操作" + "text": "可以使用應用程式安全組 (ASG) 和 NSG 規則在 SAP 應用程式層和 DBMS 層之間定義網路安全存取控制清單。ASG 對虛擬機進行分組,以説明管理其安全性。", + "training": "https://learn.microsoft.com/training/modules/configure-network-security-groups/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ee29711b-d352-4caa-ab79-b198dab81932", - "service": "AVS", - "severity": "中等", - "text": "使用 Microsoft Defender for Cloud 對 Azure VMware 解決方案上運行的工作負載進行合規性監視", - "waf": "安全" + "checklist": "SAP Checklist", + "guid": "45bbe609-d8a0-43e9-9778-424d616785d6", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", + "severity": "高", + "text": "不支援將 SAP 應用程式層和 SAP DBMS 放置在未對等互連的不同 Azure VNet 中。", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c9fc9d1b-b780-436f-9e6b-fbb9ed503547", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "fa96c96a-d885-418f-9827-34c886ba2802", + "link": "https://learn.microsoft.com/azure/sap/workloads/proximity-placement-scenarios", + "service": "SAP", "severity": "中等", - "text": "是否將適用的合規性基線添加到 Microsoft Defender for Cloud", - "waf": "安全" + "text": "若要優化 SAP 應用程式的網路延遲,請考慮使用 Azure 鄰近放置組。", + "training": "https://learn.microsoft.com/azure/virtual-machines/co-location#planned-maintenance-and-proximity-placement-groups", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cc447e82-6128-4a71-b0f1-cac6d9ef1d5e", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "18c8b61c-855a-4405-b6ed-266455e4f4ce", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", "severity": "高", - "text": "在選擇要用於 Azure VMware 解決方案部署的 Azure 區域時是否評估了數據駐留", - "waf": "安全" + "text": "根本不支援在本地和 Azure 之間運行 SAP Application Server 層和 DBMS 層拆分。這兩個層都需要完全駐留在本地或 Azure 中。", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "832e42e3-611c-4818-a0a0-bc510e43a18a", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "b65c878b-4b14-4f4e-92d8-d873936493f2", + "link": "https://me.sap.com/notes/2015553", + "service": "SAP", + "severity": "高", + "text": "不建議將資料庫管理系統 (DBMS) 和 SAP 系統的應用程式層託管在不同的 VNet 中,並將它們與 VNet 對等互連連接,因為層之間的過多網路流量可能會產生大量成本。建議使用 Azure 虛擬網路中的子網來分隔 SAP 應用程式層和 DBMS 層。", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/eslz-network-topology-and-connectivity", + "waf": "成本" + }, + { + "checklist": "SAP Checklist", + "guid": "402a9846-d515-4061-aff8-cd30088693fa", + "link": "https://learn.microsoft.com/azure/sap/workloads/high-availability-guide-rhel", + "service": "SAP", "severity": "高", - "text": "數據處理影響(服務提供者/服務消費者模型)是否清晰且有據可查", - "waf": "安全" + "text": "如果將負載均衡器與Linux客戶機作業系統配合使用,請檢查Linux網路參數 net.ipv4.tcp_timestamps是否設置為0。", + "training": "https://learn.microsoft.com/training/modules/implement-ha-sap-netweaver-anydb/?source=recommendations", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "547c1747-dc56-4068-a714-435cd19dd244", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "87585797-5551-4d53-bb7d-a94ee415734d", + "link": "https://learn.microsoft.com/azure/sap/workloads/rise-integration", + "service": "SAP", "severity": "中等", - "text": "僅當出於合規性原因需要時,才考慮將CMK(客戶管理的密鑰)用於 vSAN。", + "text": "對於 SAP RISE/ECS 部署,虛擬對等互連是與客戶現有 Azure 環境建立連接的首選方式。SAP vnet 和客戶 vnet 都受網路安全組 (NSG) 保護,從而通過 VNet 對等互連在 SAP 和資料庫埠上進行通信", "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e43a18a9-cd28-49ce-b6b1-7db8255461e2", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "ff5136bd-dcf1-4d2b-ae52-39333efdf45a", + "link": "https://learn.microsoft.com/azure/backup/sap-hana-database-about", + "service": "SAP", "severity": "高", - "text": "創建儀錶板以啟用核心 Azure VMware 解決方案監視見解", - "waf": "操作" + "text": "查看 Azure VM 的 SAP HANA 資料庫備份。", + "waf": "成本" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6b84ee5d-f47d-42d9-8881-b1cd5d1e54a2", - "service": "AVS", - "severity": "高", - "text": "針對 Azure VMware 解決方案性能(CPU >80%、平均記憶體 >80%、vSAN >70%)自動警報的關鍵閾值創建警告警報", - "waf": "操作" + "checklist": "SAP Checklist", + "guid": "cafde29d-a0af-4bcd-87c0-0f299d63f0e8", + "link": "https://learn.microsoft.com/azure/site-recovery/site-recovery-monitor-and-troubleshoot", + "service": "SAP", + "severity": "中等", + "text": "查看用於 SAP 的 Site Recovery 內置監視。", + "waf": "成本" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9659e396-80e7-4828-ac93-5657d02bff45", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "82d7b8de-d3f1-44a0-830b-38e200e82acf", + "link": "https://help.sap.com/docs/SAP_HANA_PLATFORM/c4d7c773af4a4e5dbebb6548d6e2d4f4/e3111d2ebb5710149510cc120646bf3f.html?locale=en-US", + "service": "SAP", "severity": "高", - "text": "確保創建嚴重警示以監控 vSAN 消耗量是否低於 75%,因為這是 VMware 的支援閾值", + "text": "查看監視 SAP HANA 系統環境指南。", "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "64b0d934-a348-4726-be79-d6b5c3a36495", - "service": "AVS", - "severity": "高", - "text": "確保為 Azure 服務運行狀況警報和通知配置警報", + "checklist": "SAP Checklist", + "guid": "c823873a-2bec-4c2a-b684-a1ce8ae80efd", + "link": "https://learn.microsoft.com/azure/virtual-machines/workloads/oracle/oracle-database-backup-strategies", + "service": "SAP", + "severity": "中等", + "text": "查看 Azure Linux VM 中的 Oracle 資料庫備份策略。", "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b6abad38-aad5-43cc-99e1-d86667357c54", - "service": "AVS", + "checklist": "SAP 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", "severity": "中等", - "text": "將 Azure VMware 解決方案記錄設定為發送到 Azure 儲存帳戶或 Azure EventHub 進行處理", + "text": "查看 Azure Blob 儲存與 SQL Server 2016 的配合。", "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9674c5ed-85b8-459c-9733-be2b1a27b775", - "service": "AVS", - "severity": "低", - "text": "如果需要深入瞭解 VMware vSphere:解決方案中是否使用了 vRealize Operations 和/或 vRealize Network Insights?", + "checklist": "SAP Checklist", + "guid": "b82e650f-676d-417d-994d-fc33ca54ec14", + "link": "https://learn.microsoft.com/azure/azure-sql/virtual-machines/windows/automated-backup?view=azuresql", + "service": "SAP", + "severity": "中等", + "text": "查看 Azure VM 自動備份 v2 的使用方式。", "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "a91be1f3-88f0-43a4-b2cd-463cbbbc8682", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "347c2dcc-e6eb-4b04-80c5-628b171aa62d", + "service": "SAP", "severity": "高", - "text": "確保虛擬機的 vSAN 儲存策略不是預設存儲策略,因為此策略應用厚置備", + "text": "使用進階磁碟時開啟M系列的寫入加速器(V1)", "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d9ef1d5e-832d-442e-9611-c818b0afbc51", - "service": "AVS", + "checklist": "SAP 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", "severity": "中等", - "text": "確保未將 vSphere 內容庫放置在 vSAN 上,因為 vSAN 是有限的資源", - "waf": "操作" + "text": "測試可用性區域延遲。", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "0e43a18a-9cd2-489b-bd6b-17db8255461e", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "9fd7ffd4-da11-49f6-a374-8d03e94c511d", + "link": "https://support.sap.com/en/offerings-programs/support-services/earlywatch-alert.html", + "service": "SAP", "severity": "中等", - "text": "確保備份解決方案的數據存儲庫存儲在 vSAN 儲存之外。在 Azure 本機或磁碟池支持的數據存儲中", - "waf": "操作" + "text": "為所有 SAP 元件啟動 SAP EarlyWatch Alert。", + "training": "https://help.sap.com/docs/SUPPORT_CONTENT/techops/3362700736.html", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "2aee3453-aec8-4339-848b-262d6cc5f512", - "service": "AVS", + "checklist": "SAP 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", "severity": "中等", - "text": "確保使用 Azure Arc for Servers 進行混合管理,確保在 Azure VMware 解決方案上運行的工作負載(Arc for Azure VMware 解決方案處於預覽狀態)", - "waf": "操作" + "text": "使用 SAP ABAPMeter 報表 /SSA/CAT 查看 SAP 應用程式伺服器到資料庫伺服器的延遲。", + "training": "https://me.sap.com/notes/0002879613", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "925398e6-da9d-437d-ac43-bc6cd1d79a9b", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "62fbf0f8-51db-49e1-a961-bb5df7a35f80", + "service": "SAP", "severity": "中等", - "text": "確保使用 Azure Log Analytics 和 Azure Monitor 監視在 Azure VMware 解決方案上運行的工作負載", - "waf": "操作" + "text": "查看使用 CCMS 的 SQL Server 性能監視。", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "24604489-a8f4-42d7-ae78-cb6a33bd2a09", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "35709da7-fc7d-4efe-bb20-2e91547b7390", + "link": "https://me.sap.com/notes/500235", + "service": "SAP", "severity": "中等", - "text": "在現有更新管理工具或 Azure 更新管理中包括在 Azure VMware 解決方案上運行的工作負載", - "waf": "操作" + "text": "測試 SAP 應用程式層 VM 和 DBMS VM (NIPING) 之間的網路延遲。", + "training": "https://me.sap.com/notes/1100926/E", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "17e7a8d9-0ae0-4e27-aee2-9711bd352caa", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "9e9bb4c8-e934-4e4b-a13c-6f7c7c38eb43", + "link": "https://learn.microsoft.com/en-us/azure/sap/large-instances/hana-monitor-troubleshoot", + "service": "SAP", "severity": "中等", - "text": "使用 Azure Policy 在 Azure 管理、監視和安全解決方案中加入 Azure VMware 解決方案工作負載", - "waf": "操作" + "text": "查看 SAP HANA Studio 警報。", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "aee3553a-fc83-4392-98b2-62d6cc5f5129", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "f1a92ab5-9509-4b57-86ff-b0ade361b694", + "link": "https://me.sap.com/notes/1969700", + "service": "SAP", "severity": "中等", - "text": "確保在 Azure VMware 解決方案上運行的工作負載已載入 Microsoft Defender for Cloud", - "waf": "安全" + "text": "使用 HANA_Configuration_Minichecks 執行 SAP HANA 執行狀況檢查。", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "25398e6d-b9d3-47da-a43b-c6cd1d79a9b2", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "18dffcf3-248c-4039-a67c-dec8e3a5f804", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "service": "SAP", "severity": "中等", - "text": "確保備份不存儲在 vSAN 上,因為 vSAN 是有限的資源", - "waf": "可靠性" + "text": "如果在 Azure、本地或其他雲環境中運行 Windows 和 Linux VM,則可以使用 Azure 自動化中的更新管理中心來管理作業系統更新,包括安全修補程式。", + "training": "https://learn.microsoft.com/azure/automation/update-management/overview", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "5e6bfbb9-ed50-4354-9cc4-47e826028a71", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "08951710-79a2-492a-adbc-06d7a401545b", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-security-operations", + "service": "SAP", "severity": "中等", - "text": "是否考慮了所有災難恢復解決方案,並決定了最適合您業務的解決方案?[SRM/JetStream/Zerto/Veeam/...]", - "waf": "可靠性" + "text": "定期查看 SAP 安全 OSS 說明,因為 SAP 會發佈高度關鍵的安全補丁或熱修復程式,需要立即採取行動來保護 SAP 系統。", + "training": "https://support.sap.com/en/my-support/knowledge-base/security-notes-news.html", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "f0f1cac6-d9ef-41d5-b832-d42e3611c818", - "service": "AVS", - "severity": "中等", - "text": "當災難恢復技術是本機 Azure IaaS 時,請使用 Azure Site Recovery", - "waf": "可靠性" + "checklist": "SAP Checklist", + "guid": "1b8b394e-ae64-4a74-8933-357b523ea0a0", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", + "severity": "低", + "text": "對於 SQL Server 上的 SAP,可以禁用 SQL Server 系統管理員帳戶,因為 SQL Server 上的 SAP 系統不使用該帳戶。在禁用原始系統管理員帳戶之前,請確保具有系統管理員許可權的其他使用者可以訪問伺服器。", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b0afbc51-0e43-4a18-a9cd-289bed6b17db", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "5a76a033-ced9-4eef-9a43-5e4f96634c8e", + "link": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "service": "SAP", "severity": "高", - "text": "將自動恢復計劃與任一災難解決方案結合使用,盡可能避免手動任務", - "waf": "可靠性" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "8255461e-2aee-4345-9aec-8339248b262d", - "service": "AVS", - "severity": "中等", - "text": "使用地緣政治區域對作為輔助災難恢復環境", - "waf": "可靠性" + "text": "禁用xp_cmdshell。SQL Server 功能xp_cmdshell啟用 SQL Server 內部作業系統命令行介面。這是安全審計中的潛在風險。", + "training": "https://me.sap.com/notes/3019299/E", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "6cc5f512-9253-498e-9da9-d37dac43bc6c", - "service": "AVS", + "checklist": "SAP 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", "severity": "高", - "text": "在區域之間使用 2 個不同的地址空間,例如:10.0.0.0/16 和 192.168.0.0/16 用於不同的區域", - "waf": "可靠性" + "text": "加密 Azure 上的 SAP HANA 資料庫伺服器使用 SAP HANA 本機加密技術。此外,如果在 Azure 上使用 SQL Server,請使用透明數據加密 (TDE) 來保護數據和日誌檔,並確保備份也已加密。", + "training": "https://learn.microsoft.com/azure/cloud-adoption-framework/scenarios/sap/sap-lza-database-security", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d1d79a9b-2460-4448-aa8f-42d78e78cb6a", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "a1abfe9d-55d0-44c3-a491-9cb1b3d1325a", + "link": "https://learn.microsoft.com/azure/storage/common/storage-service-encryption", + "service": "SAP", "severity": "中等", - "text": "ExpressRoute Global Reach 是用於主 Azure VMware 解決方案私有雲和輔助 Azure VMware 解決方案私有雲之間的連接,還是通過網路虛擬設備完成路由?", - "waf": "可靠性" + "text": "為所有 Azure 資源管理器和經典記憶體啟用了 Azure 儲存加密,並且無法禁用。由於預設情況下數據是加密的,因此無需修改代碼或應用程式即可使用 Azure 儲存加密。", + "training": "https://learn.microsoft.com/training/modules/encrypt-sector-data/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "33bd2a09-17e7-4a8d-a0ae-0e27cee29711", - "service": "AVS", - "severity": "中等", - "text": "是否考慮了所有備份解決方案,並決定了最適合您業務的解決方案?[ MABS/CommVault/Metallic.io/Veeam/ .", - "waf": "可靠性" + "checklist": "SAP Checklist", + "guid": "ce9bd3bb-0cdb-43b5-9eb2-ec14eeaa3592", + "link": "https://learn.microsoft.com/azure/key-vault/general/overview", + "service": "SAP", + "severity": "高", + "text": "使用 Azure Key Vault 儲存機密和憑據", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bd352caa-ab79-4b18-adab-81932c9fc9d1", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "829e2edb-2173-4676-aff6-691b4935ada4", + "link": "https://learn.microsoft.com/azure/azure-resource-manager/management/lock-resources?tabs=json", + "service": "SAP", "severity": "中等", - "text": "將備份解決方案部署在與 Azure VMware 解決方案私有雲相同的區域中", - "waf": "可靠性" + "text": "建議在成功部署后鎖定 Azure 資源,以防止未經授權的更改。還可以使用自定義的 Azure 策略(自定義角色)在每個訂閱的基礎上強制實施 LOCK 約束和規則。", + "training": "https://learn.microsoft.com/training/modules/use-azure-resource-manager/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bb77036f-5e6b-4fbb-aed5-03547cc447e8", - "service": "AVS", + "checklist": "SAP Checklist", + "guid": "2223ece8-1b12-4318-8a54-17415833fb4a", + "link": "https://learn.microsoft.com/azure/key-vault/general/soft-delete-overview", + "service": "SAP", "severity": "中等", - "text": "在 vSan 外部的 Azure 本機組件上部署備份解決方案", - "waf": "可靠性" + "text": "預配啟用軟刪除和清除策略的 Azure Key Vault,以允許對已刪除物件進行保留保護。", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "26028a71-f0f1-4cac-9d9e-f1d5e832d42e", - "service": "AVS", - "severity": "低", - "text": "是否已制定請求還原由 Azure 平臺管理的 VMware 元件的流程?", - "waf": "可靠性" + "checklist": "SAP Checklist", + "guid": "e3c2df74-3165-4c3a-abe0-5bbe209d490d", + "link": "https://learn.microsoft.com/azure/role-based-access-control/security-controls-policy", + "service": "SAP", + "severity": "高", + "text": "根據現有要求、法規和合規性控制(內部/外部) - 確定所需的 Azure 策略和 Azure RBAC 角色", + "training": "https://learn.microsoft.com/training/paths/describe-azure-management-governance/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4604489a-8f42-4d78-b78c-b7a33bd2a0a1", - "service": "AVS", - "severity": "低", - "text": "對於手動部署,必須記錄所有配置和部署", - "waf": "操作" + "checklist": "SAP 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", + "severity": "高", + "text": "在 SAP 環境中啟用 Microsoft Defender for Endpoint 時,建議排除 DBMS 伺服器上的數據和日誌檔,而不是面向所有伺服器。排除目標檔時,請遵循 DBMS 供應商的建議。", + "training": "https://techcommunity.microsoft.com/t5/running-sap-applications-on-the/microsoft-defender-endpoint-mde-for-sap-applications-on-windows/ba-p/3912268", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "7e7a8d90-ae0e-437c-be29-711bd352caaa", - "service": "AVS", - "severity": "低", - "text": "對於手動部署,請考慮實施資源鎖,以防止對 Azure VMware 解決方案私有雲執行意外操作", - "waf": "操作" + "checklist": "SAP 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", + "severity": "高", + "text": "委派具有 Microsoft Defender for Cloud 實時訪問許可權的 SAP 管理員自定義角色。", + "training": "https://learn.microsoft.com/training/modules/secure-vms-with-azure-security-center/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b79b198d-ab81-4932-a9fc-9d1bb78036f5", - "service": "AVS", + "checklist": "SAP 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", "severity": "低", - "text": "對於自動化部署,請部署最小的私有雲並根據需要進行擴展", - "waf": "操作" + "text": "通過將第三方安全產品與 DIAG (SAP GUI)、RFC 和 SPNEGO for HTTPS 的安全網路通信 (SNC) 集成,對傳輸中的數據進行加密", + "training": "https://learn.microsoft.com/azure/security/fundamentals/encryption-overview#encryption-of-data-in-transit", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e6bfbb9e-d503-4547-ac44-7e826128a71f", - "service": "AVS", - "severity": "低", - "text": "對於自動部署,請在開始部署之前請求或預留配額", - "waf": "操作" + "checklist": "SAP Checklist", + "guid": "eeaa3592-829e-42ed-a217-3676aff6691b", + "link": "https://learn.microsoft.com/azure/storage/common/storage-encryption-key-model-get?tabs=portal", + "service": "SAP", + "severity": "中等", + "text": "對於主體加密功能,預設使用 Microsoft 管理的金鑰,並在需要時使用客戶管理的密鑰。", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "0f1cac6d-9ef1-4d5e-a32e-42e3611c818b", - "service": "AVS", - "severity": "低", - "text": "對於自動部署,請確保通過自動化或 Azure Policy 創建相關資源鎖,以便進行適當的治理", - "waf": "操作" + "checklist": "SAP Checklist", + "guid": "4935ada4-2223-4ece-a1b1-23181a541741", + "link": "https://learn.microsoft.com/ja-jp/azure/key-vault/general/best-practices", + "service": "SAP", + "severity": "高", + "text": "對每個應用程式、每個環境、每個區域使用 Azure Key Vault。", + "training": "https://learn.microsoft.com/training/modules/manage-secrets-with-azure-key-vault/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e2cc95d4-8c6b-4791-bca0-f6c56589e558", - "service": "AVS", - "severity": "低", - "text": "為 ExR 授權金鑰實現人類可理解的名稱,以便輕鬆識別密鑰的目的/用途", - "waf": "操作" + "checklist": "SAP Checklist", + "guid": "abc9634d-c44d-41e9-a530-e8444e16aa3c", + "link": "https://learn.microsoft.com/azure/key-vault/certificates/certificate-scenarios", + "service": "SAP", + "severity": "高", + "text": "若要控制和管理非 HANA Windows 和非 Windows 作業系統的磁碟加密密鑰和機密,請使用 Azure Key Vault。Azure Key Vault 不支援 SAP HANA,因此必須使用 SAP ABAP 或 SSH 密鑰等替代方法。", + "training": "https://learn.microsoft.com/training/modules/configure-and-manage-azure-key-vault/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "255461e2-aee3-4553-afc8-339248b262d6", - "service": "AVS", - "severity": "低", - "text": "當使用單獨的服務原則部署 Azure VMware 解決方案和 ExpressRoute 時,請使用 Key Vault 儲存機密和授權密鑰", - "waf": "操作" + "checklist": "SAP Checklist", + "guid": "209d490d-a477-4784-84d1-16785d2fa56c", + "link": "https://learn.microsoft.com/azure/role-based-access-control/built-in-roles", + "service": "SAP", + "severity": "高", + "text": "為 Azure 上的 SAP 分支訂閱自定義基於角色的訪問控制 (RBAC) 角色,以避免與網路相關的意外更改", + "training": "https://learn.microsoft.com/training/modules/secure-azure-resources-with-rbac/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "cc5f5129-2539-48e6-bb9d-37dac43bc6cd", - "service": "AVS", - "severity": "低", - "text": "當需要在 Azure VMware 解決方案中/上部署許多資源時,定義用於在 IaC 中序列化操作的資源依賴項,因為 Azure VMware 解決方案僅支援有限數量的並行操作。", - "waf": "操作" + "checklist": "SAP Checklist", + "guid": "56ad4840-8fe7-4273-9c48-6ba280dc0591", + "link": "https://blogs.sap.com/2019/07/21/sap-security-operations-on-azure/", + "service": "SAP", + "severity": "高", + "text": "將 DMZ 和 NVA 與 SAP 資產的其餘部分隔離,配置 Azure 專用連結,並安全地管理和控制 Azure 上的 SAP 資源", + "training": "https://learn.microsoft.com/azure/architecture/reference-architectures/dmz/secure-vnet-dmz?tabs=portal", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "1d79a9b2-4604-4489-a8f4-2d78e78cb7a3", - "service": "AVS", + "checklist": "SAP 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", "severity": "低", - "text": "使用單個 Tier-1 閘道執行 NSX-T 分段的自動配置時,請使用 Azure 門戶 API 而不是 NSX-Manager API", - "waf": "操作" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "3bd2a0a1-7e7a-48d9-8ae0-e37cee29711b", - "service": "AVS", - "severity": "中等", - "text": "打算使用自動橫向擴展時,請務必為運行 Azure VMware 解決方案的訂閱申請足夠的 Azure VMware 解決方案配額", - "waf": "性能" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d352caaa-b79b-4198-bab8-1932c9fc9d1b", - "service": "AVS", - "severity": "中等", - "text": "打算使用自動縮減時,請務必在執行此操作之前考慮存儲策略要求", - "waf": "性能" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "b78036f5-e6bf-4bb9-bd50-3547cc447e82", - "service": "AVS", - "severity": "中等", - "text": "擴展操作始終需要在單個 SDDC 中序列化,因為一次只能執行一個擴展操作(即使使用多個集群也是如此)", - "waf": "性能" + "text": "請考慮在 Azure 上使用 Microsoft 反惡意軟體來保護虛擬機免受惡意檔、廣告軟體和其他威脅的侵害。", + "training": "https://azure.microsoft.com/blog/deploying-antimalware-solutions-on-azure-virtual-machines/", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bf15bce2-19e4-4a0e-a588-79424d226786", - "service": "AVS", - "severity": "中等", - "text": "考慮並驗證體系結構中使用的第三方解決方案的縮放操作(支援與否)", - "waf": "性能" + "checklist": "SAP 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", + "severity": "低", + "text": "若要獲得更強大的保護,請考慮使用 Microsoft Defender for Endpoint。", + "training": "https://learn.microsoft.com/training/modules/implement-endpoint-protection-use-microsoft-defender/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "d20b56c5-7be5-4851-a0f8-3835c586cb29", - "service": "AVS", - "severity": "中等", - "text": "在自動化中為環境定義和強制實施橫向擴展/橫向擴展最大限制", - "waf": "性能" + "checklist": "SAP Checklist", + "guid": "87a924c4-25c2-419f-a2f0-96c7c4fe4525", + "link": "https://learn.microsoft.com/azure/architecture/guide/sap/sap-whole-landscape", + "service": "SAP", + "severity": "高", + "text": "通過中心虛擬網路傳遞所有流量,將 SAP 應用程式和資料庫伺服器與 Internet 或本地網路隔離開來,該中心虛擬網路通過虛擬網路對等互連連接到分支網路。對等互連虛擬網路保證 Azure 上的 SAP 解決方案與公共 Internet 隔離。", + "training": "https://learn.microsoft.com/training/modules/explore-azure-networking/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "1dc15a1c-075e-4e9f-841a-cccd579376bc", - "service": "AVS", + "checklist": "SAP 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", + "severity": "低", + "text": "對於面向 Internet 的應用程式(如 SAP Fiori),請確保根據應用程式要求分配負載,同時保持安全級別。對於第 7 層安全性,可以使用 Azure 市場中提供的第三方 Web 應用程式防火牆 (WAF)。", + "training": "https://learn.microsoft.com/training/modules/simplify-cloud-procurement-governance-azure-marketplace/?source=recommendations", + "waf": "安全" + }, + { + "checklist": "SAP Checklist", + "guid": "9fc945b9-0527-47af-8200-9d652fe02fcc", + "link": "https://learn.microsoft.com/azure/sap/monitor/enable-tls-azure-monitor-sap-solutions", + "service": "SAP", "severity": "中等", - "text": "實施監控規則以監控自動擴展操作,並監控成功和失敗,以啟用適當的(自動化)回應", - "waf": "操作" + "text": "若要在用於 SAP 解決方案的 Azure Monitor 中啟用安全通信,可以選擇使用根證書或伺服器證書。我們強烈建議您使用根證書。", + "training": "https://learn.microsoft.com/training/modules/implement-azure-monitoring-sap-workloads-azure-virtual-machines/?source=recommendations", + "waf": "安全" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c5972cd4-cd21-4b07-9036-f5e6b4bfd3d5", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "4238f409-2ea0-43be-a06b-2a993c98aa7b", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Azure Functions", "severity": "高", - "text": "使用 MON 時,請注意同時配置的 VM 的限制(HCX 的 MON 限制 [400 - 標準,1000 - 大型設備])", - "training": "https://learn.microsoft.com/learn/modules/configure-azure-ad-application-proxy/", + "text": "根據您的業務和 SLO 要求選擇正確的功能託管計劃", "waf": "可靠性" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "be1f38cf-03a8-422b-b463-cbbbc8ac299e", - "link": "https://learn.microsoft.com/azure/active-directory/app-proxy/application-proxy#how-application-proxy-works", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "a9808100-d640-4f77-ac56-1ec0600f6752", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-scale#overview-of-plans", + "service": "Azure Functions", "severity": "高", - "text": "使用 MON 時,不能在超過 100 個網路分機上啟用 MON", - "training": "https://learn.microsoft.com/learn/paths/implement-applications-external-access-azure-ad/", + "text": "利用區域適用的可用區(不適用於消耗層)", "waf": "可靠性" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bc91a43d-90da-4e2c-a881-4706f7c1cbaf", - "service": "AVS", - "severity": "中等", - "text": "如果使用 VPN 連接進行遷移,請相應地調整 MTU 大小。", - "waf": "性能" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e614658d-d457-4e92-9139-b821102cad6e", - "service": "AVS", - "severity": "中等", - "text": "對於連接到 Azure(500Mbps 或更低)的低連接區域,請考慮部署 HCX WAN 優化設備", - "waf": "性能" - }, - { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "ae01e6e8-43e5-42f4-922d-928c1b1cd521", - "service": "AVS", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "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", "severity": "中等", - "text": "確保從本地裝置啟動遷移,而不是從雲端裝置啟動遷移(不要執行反向遷移)", + "text": "考慮為關鍵工作負載制定跨區域災難恢復策略", "waf": "可靠性" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "e54a29a9-de39-4ac0-b7c2-8dc935657202", - "link": "https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings", - "service": "AVS", - "severity": "中等", - "text": "使用 Azure Netapp Files 擴展 Azure VMware 解決方案的儲存時,請考慮將其用作 VMware 資料儲存庫,而不是直接附加到 VM 。", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "47a0aae0-d8a0-43b1-9791-e934dee3754c", + "link": "https://learn.microsoft.com/en-us/azure/app-service/environment/intro", + "service": "Azure Functions", + "severity": "高", + "text": "如果部署到獨立環境,請使用或遷移到應用服務環境 (ASE) v3", "waf": "可靠性" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "bff4564b-0d93-44a3-98b2-63e7dd60513a", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#avoid-combining-traffic-manager-and-front-door", - "service": "AVS", - "severity": "中等", - "text": "確保將專用 ExpressRoute 閘道用於外部資料儲存解決方案", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "17232891-f89f-4eaa-90f1-3b34bf798ed5", + "link": "https://learn.microsoft.com/en-us/azure/azure-functions/dedicated-plan#always-on", + "service": "Azure Functions", + "severity": "高", + "text": "確保為應用服務計劃上運行的所有函數應用啟用“始終開啟”", "waf": "可靠性" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "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", + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "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", "severity": "中等", - "text": "確保在用於外部數據存儲解決方案的 ExpressRoute 閘道上啟用了 FastPath", + "text": "將函數應用與其自己的存儲帳戶配對。盡量不要重用函數應用的存儲帳戶,除非它們緊密耦合", "waf": "可靠性" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "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", - "severity": "高", - "text": "如果使用延伸群集,請確保供應商支援所選的災難恢復解決方案", - "waf": "可靠性" + "arm-service": "Microsoft.Web/sites", + "checklist": "Azure Function Review", + "guid": "bb42650c-257d-4cb0-822a-131138b8e6f0", + "link": "https://learn.microsoft.com/en-us/training/modules/deploy-azure-functions/", + "service": "Azure Functions", + "severity": "中等", + "text": "利用 Azure DevOps 或 GitHub 簡化 CI/CD 並保護函數應用代碼", + "waf": "操作" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "4c486b6d-8bdc-4059-acf7-5ee8a1309888", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#select-good-health-probe-endpoints", - "service": "AVS", - "severity": "高", - "text": "如果使用延伸群集,請確保提供的 SLA 符合您的要求", + "checklist": "Identity Review Checklist", + "guid": "bb235c70-5e17-496f-bedf-a8a4c8cdec4c", + "link": "https://learn.microsoft.com/entra/identity-platform/msal-acquire-cache-tokens", + "service": "Entra", + "severity": "中等", + "text": "使用長期可撤銷令牌,緩存令牌並使用 Microsoft 標識庫以靜默方式獲取令牌", "waf": "可靠性" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "9579d66b-896d-471f-a6ca-7be9955d04c3", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-head-health-probes", - "service": "AVS", - "severity": "高", - "text": "如果使用延伸群集,請確保兩條 ExpressRoute 線路都連接到連接中心。", + "checklist": "Identity Review Checklist", + "guid": "503547c1-447e-4c66-828a-71f0f1ce16dd", + "link": "https://learn.microsoft.com/azure/active-directory-b2c/deploy-custom-policies-devops", + "service": "AAD B2C", + "severity": "中等", + "text": "請確保登錄使用者流已備份並具有復原能力。請確保用於登錄使用者的代碼已備份且可恢復。與外部進程的彈性介面", "waf": "可靠性" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "c49d987c-b3d1-4325-aa12-4b6e4d0685ed", - "link": "https://learn.microsoft.com/azure/nat-gateway/nat-overview#outbound-connectivity", - "service": "AVS", - "severity": "高", - "text": "如果使用延伸群集,請確保兩條 ExpressRoute 線路都啟用了 GlobalReach。", - "waf": "可靠性" + "checklist": "Identity Review 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", + "severity": "中等", + "text": "自訂品牌資產應託管在CDN上", + "waf": "性能" }, { - "arm-service": "Microsoft.AVS/privateClouds", - "checklist": "Azure VMware Solution Design Review", - "guid": "dce9793b-7bcd-4b3b-91eb-2ec14eea6e59", - "link": "https://learn.microsoft.com/azure/frontdoor/best-practices#use-managed-tls-certificates", - "service": "AVS", - "severity": "高", - "text": "是否正確考慮了網站容災設置,並在需要時為您的業務進行了更改。", + "checklist": "Identity Review Checklist", + "guid": "5398e6df-d237-4de1-93b1-6c21d79a9b64", + "link": "https://learn.microsoft.com/entra/identity/monitoring-health/reference-sla-performance", + "service": "AAD B2C", + "severity": "低", + "text": "擁有多個標識提供者(即使用您的 Microsoft、Google、Facebook 帳戶登錄)", "waf": "可靠性" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "3b7a56de-5020-4642-b3cb-c976e80b6d6d", - "link": "https://learn.microsoft.com/azure/logic-apps/single-tenant-overview-compare", - "service": "Logic Apps", - "severity": "高", - "text": "根據業務和 SLO 要求選擇正確的邏輯應用託管計劃", + "checklist": "Identity Review 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", + "severity": "中等", + "text": "遵循 VM 規則,實現 VM 級別的高可用性(高級磁碟,一個區域中的兩個或更多磁碟,位於不同的可用性區域)", "waf": "可靠性" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps 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", - "severity": "高", - "text": "使用區域冗餘和可用性區域保護邏輯應用免受區域故障的影響", + "checklist": "Identity Review 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", + "severity": "中等", + "text": "不要複製!複製可能會產生目錄同步問題", "waf": "可靠性" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps 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", - "severity": "高", - "text": "考慮為關鍵工作負載制定跨區域災難恢復策略", + "checklist": "Identity Review 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", + "severity": "中等", + "text": "對多區域具有主動-主動", "waf": "可靠性" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "82118ec5-ed6f-4c68-9471-eb0da98a1b34", - "link": "https://learn.microsoft.com/azure/app-service/environment/intro", - "service": "Logic Apps", - "severity": "高", - "text": "如果部署到獨立環境,請使用或遷移到應用服務環境 (ASE) v3", + "checklist": "Identity Review Checklist", + "guid": "6b4bfd3d-5035-447c-8447-ec66128a71f0", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", + "severity": "中等", + "text": "將 Azure AD 域服務標記添加到其他區域和位置", "waf": "可靠性" }, { - "arm-service": "Microsoft.Web/sites", - "checklist": "Logic Apps checklist", - "guid": "74275fa5-9e08-4c7e-b096-13b538fe1501", - "link": "https://learn.microsoft.com/training/modules/deploy-azure-functions/", - "service": "Logic Apps", + "checklist": "Identity Review Checklist", + "guid": "f1ce16dd-3f1d-45e8-92e4-2e3611cc58b4", + "link": "https://learn.microsoft.com/entra/identity/domain-services/tutorial-perform-disaster-recovery-drill", + "service": "Entra", "severity": "中等", - "text": "利用 Azure DevOps 或 GitHub 簡化 CI/CD 並保護邏輯應用代碼", - "waf": "操作" + "text": "將副本集用於DR", + "waf": "可靠性" } ], "metadata": { "name": "WAF checklist", - "timestamp": "August 05, 2024" + "timestamp": "August 08, 2024" }, "severities": [ { diff --git a/spreadsheet/macrofree/checklist.en.master.xlsx b/spreadsheet/macrofree/checklist.en.master.xlsx index 9bb2b309883cc86f44dd67a5542123760fd3ac54..8fd65efe1e9ef3d655b7c686e9c5e5939219b983 100644 GIT binary patch literal 439831 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�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 RNAM;Aj9^ufyY$EK{{X+Odx-!5 literal 471385 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%0DLxx9r39O~ZYxR-A&4v-im^k&iEoAuJzvm6+qBjT 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 ` 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

Y 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ℑ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
@>6?H%f+RsEZ-Eb$*jz= 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 delta 12491 zcmZ8|2UwC__;-6*+SJO`Qp?3#&Q#=0-?HH|2>x=oa;R2`JHpG-+j&vwRiuA-u;07lY@uO@7uTU*givh zxbXwiA17aPzm;-dr@1d1xV63q+|3j8!p%+A&&63MQirGUuhai<9xqP0LRYWczA}{c zvm@Z4lHw;DO`nk6K!YDqc(v)jKGt67G;Y4`tMINF8GNQgYhM-5gC@74JRUtF0z7eQ`s?&t&WAON_<5~kjcb`Q;MmJ2PE~A(XX{uw zfXRcDB}>9(JcI%dB9eeKfwC2ehq?DKL1!RX*a4_{>-J*?uVE%yN^8Q-VN zfE;~buPYLygnaj+{hd{J%Y*aSYFvr6|B!=d4gV*_%JbUFKY!E^JNzC_j6F}eO!!5w zU~BD5Y8I1Dm3AHor#+v9IExO7OWeKx_G|sbzy&GE=O{>TQOoXyypKyhQ$X|C=mY%^ zyG<(X#L!nQ_vr|OMm;yP)!(7lS6c5+79%MJU;APn zUop6~LBcVcaBX@}?_?IDx(*V&)q@;doWWPaqgs$;SqNqvVz~8Kk=bMs{EVX(7#I+! zZ0J9(_RDqac?OPJ?aSC?r(k!{3=^Nk3(PXp1>a#`LSP;Ml<8LhYSgN&xW>7;DU0Ck zbi2?Xi$>2m@D#@AtNbJvvu=9~`zQ8i3i z!7wa2igH8*Es^NUb}`=&yJ=mnQb$Y0y(FJ6IGkcP-#jNAI zj{ywoD7__YbU_AfdAA9XG{R)z=;DMpy4?`rrQ)-d$0#-_p|iw?T#Z#4lH0-2dM^Y{=fCnNAyAb2>A|mcQ zbE=eqEys~yusi}tBnruzT3Dk4rWu$aoB?ZeYLmT-Wt33A!obf*3BOR4-<+o|PrVNw zf3H6I-X2q$iZ1oD6Wp;CY~}vB3BF_4z39!rNBEp0+MXl2opTHkcWtb7ZbXzF--;+t z40tDpImIkH6;N}kO(dwu)4%BYZjeE>kZgKT=e;;`KV*v~1u2_w>MN7o?ps84RtE7^36 z1}8er0hS#uQS$Bh4+q$baDjiGuUvByTxQ&@2a9?oA2j)tv5wtkeB-F8%17n%>DID{ z6a#XkF?q~n2)og+Qw+@cLx-cPx9G=bn-;(L6)GZjy0!p7%}|bG0Nt&}i|7Ht0ndQa z-0Buv9>_+O8xX9kur1*B?zH)LVU35Y*YDlXeCnTmx+AOg_$mA zXd1bkyvfcwKSuNEk)Rxa@ckssFi1Nw!*?7i|J7U@%-G^zqkJ�jc}nXYYe-;UK`} zm)ndee(K%bSKEuYfB;wD0N1AUCR~u=3lt^R1>kIcDe>&c0CQS0U zQa-KSbISXr3m`D$5d5#EYrT;`Px;DlWyQu0z|IsE8QpluVQBei4UTUbP92ZpO9uk= zg~OXRGaoHLmQpx9zQFmabCGIq9t$6;LV_Bv1491uw;*7Vkhc5Rae)Bx@zF);vr)|s zCA=^2%pOa>Uv(tWoxyu8#_Ek?BrREOzn5O^qUt?t0GFj=cp{2T8O!3(Ev~3J`v)iL z@-g)5R4f_+gI8KZTWw9Lim$r`HB4~;1y2>%j zfK&i1QrKlsz&l|PTtcRJY!0qB73J|Fsk!Q^Mq1u7emnB28Rb}ZKSY5~J*dDA3md_D z@381^>?EToh~1tgIFw0)8-*jM+(D z$+mvFg0{#Q(MsQ77EG!?)~Xh@_`vlvhLCfWdeB?KW-s+-<%WzFW_>6=ooigT<_it3 z0X(Z^c$ss-o(O}bm1!bf13NXuV^QE8T=(3m5G+J?)p#llAmg?13Op!_5o7!k-^5=Z zCcF>jXd1%#N_@a*HKc@q79eJ9`Cs~yojT5?q)6U=c`SMHVs88>rwyeIbPa^pZxn=h zxh=YE?gZ+7I%{)a!(%e#^W5|)k3gFg@>&1qma-8!(xU!;&xOhSQ_|Q8?U)|&S!<+^ zUfLTwfIuiTG{h>Jtw59ED|*BC(&{U9EQfYOtpLAmYnpihjG0}9Ftle9OW11>v3Vk5 zfD7=Izm8>{zp%h4(83F?*A)Z{*B9e6VbhlJCWQ$M7Zc%X(UnT` z=-D~;n!e!#dv)z|1wG{b=Gr$PP?^2lp;tj|$mRWNN;9gY^f>xIHLN3l%4jzDQD>yq zLbQjAt`8#T@YbFezAV5B6^ny(8sbnkYATVZr5i|5*PZO20`o+x;!9}NQEgxAmuQRF zWR$>y-OSyVuVW9}&O}9CKXmJ!_}?qa&wQ&}`EJnRETY!u(uk4J&kxg1s*`4;ZI)(c zSf%QmQGrwBg~DDI{mjqW*I4I(&2V+*>L?Hwd4vUV4^qC!oC{Pl?uPmO{XH!VwEjV} z(fdQ78mJ5308Avos)p^U0v4V9qr3g1Hyr9t>Xlc-ArJdWRg}cr8l&RyrWh1)!YWht z!MYBnk64>eYSGBRkp?c;ufVrdo<4mRtNl3`B`dx_p5;fYl=UyDgX|&m0&jKF)LlW`XhHIQa6T6gk(oI8?cfVaz|JI1mE>DS{Nbz#@)8N>D11j#Zxg8MzFm?)Rr_8SQKa4N#qx~h-G*P4!uZWYfNIN}Ro7?-Etb)ID zvMaCC8~q7!Z-t4cid}y6;q#*bJ^7$#Ul*$%RzyccN=&pL!H7@1_yj4>eO)-Di|MlS zHz}Y14Oz8)sKHY7OVzwu+gKWs zW8oo&JT{|YSm(CFDeazUaIm<-BDJD_D0@%vf-nj{li9O5H#f68NNp$xivo~M*6z>v zwx`^gzEGNLvgv01kX16qs?E|H?ELfIe>USMs7~lxMT}N&`KGkOTBs6Fk6dcy^SBYa znTa?_bD6a(|8l$CxZiPOQS?yvqoez2{6}AL*IW3|0}&DVad5y6iU#c|7}&WANnM6o zmawVJxuQkwQGs^8P*w>HAa{|dEJR7~Sot3ICg^&gQL*~tP&8`h&fVkI{ap#oHceW&KJ)teq2HG#KVVL{+YUp zN=ANz9{sB_R8)$7a+r5mb$x}vG3Mk2PvB>t3J=-g=ZeOtQ2@Qvg|KW@ZQL`X%i6^R zgtGO@t!YlMp{rii@c2Ccq1)I(a?`KTtwS{HI<%4;w$_MQgJ(AsKgxb@PKB|gT84S@ zunToNhfPHr2eG|XDcpbs3ENEjNKY^k4yoN4hn5?}5gthiMiwv0h1wvr95y~V&t4r5 zq+VrsRxSg=tBT~;>z){VLl2~YvlYl%{{UeZG@-&mEk4^y84IJG@FP#mqy$DD$Q6g6 z7U+i)Nv=yC28-_uKCC!wR^wHdKL1vsCX~YBH>auDZ>nYerA^CR9fArY)=f??K`IQu z^ruzmuM-)va%FsEH~-+RdkufvkI$JlSndFaV^j{9i-sWJX6=B~?k215wr5jz(SHZ0gW;-r+2d^EzuVRJ&# zYsxrrVe&%ERHKc=qo;Qs?R2>6J@#Spcc^ng*@*hr0BEAoEso!WD3AARBa;bp3NTOq z@@sQ>%{88oFO_Ey|oboG}uoZnU+A5r)mdA z8_jRr%W1b&m@c?>A8M;}!W(^Zsv`JMrmW9crA@t7+4L1H$SSmUZ!=7ECSP;kH_VYZ)ExHt?lK zYB6+>@I+Hum_UgLKA=Z|A;sRNlytb0`E1b_lbD4hd5C7GZ(fqE(GhWB&Q+n2oBl?0*lD=WS*vXb%&O6j_Ys@n&* zrA3J6lHa1x)n)B^Kl+UqCd*O4#OQSUDgh^|7L31&1y+B)$_l>O)zbbgqqHCFn^`Co z*rX_5o;P%u)3{bqx!`ZB0FuE)6YjP+Kw{5}#bo=g_DP)DU97&iEr|c6m+(&jLB6R) z>V2uskkRQkJ?1c3a}@89gu`?x9~f}Js|ph2NDv2$K55<^ahG;;-m(HJd!PAGK*A@Q zEyCzVe1|c!oj(##UE{Rap7WE~%07ON#eeR#wV-g_or?jxbvi*0AVN6g46{Jeo_?NDdh6%}ZlAf* z^sv}> z%%-j%anKhA)TyF&z&4xk8p4LJ{q?Fm)EeiFPADU5@s5o>J#dtdI|q^Ul}lga$UpT{ zH$!tzSS>-I-&4j%JoctPgh z9M`?~Rod)_R7jMI@;%ef|BJrJ;oGdx_Hb#jp*SVS97@^rs5f#f{&gY1H|XAA;B+%I~h+V5~WiU8=|8 zx6ZH@48qXvZvN^@xzMwg?PMD05D7L4I_=%e2zritI5i4NA>f9_i$8mcgx+oQIV2UE z5a}_CYThZ-x{KBrk8P{Yphb*yXF1W4pDSsf9oxuW&$R6Cb_E1@fgOwIV#W5<3n=TB zn(_jV4vw@=jtu2|*P!vEisRxI$#JDgaN=xDRHQ-t&0CMfA3;dsIws`m#4;iLuZO)6 z5u)reLOeM;sM>Ye#T|_i_2EmNp8E+tewXy}Z&@MynQnAKFL`DUjXizUn(g0^YFeE- zk>i43WUt;c;PH=(wAx8Z3{IRtZy|4Nk5`90pgrFkRi zFN|hWf>dYR0bQR&4PDy2bYi(af`zeNWMo#rIq2S)1fsX|+! z)HW(h(AzzzzDut~!u#p21E8i5RkVV02QXS%V2^+aXgPgO3#gH7O{yzpwK@kaHVZF5 zF2W*am&a2)Pris3ECO0~RhiOodk`R4OZm?s>I|N7kM@GOff`MU~H$*Q0o= z+5(HuQVf8&72OQ-2%{E5&}CIwOsSTTUu@=T8by_6z~p=WF8VYm;Nr@Em2^{gFoG(k z&}XUgI5glar9>pB>AVc?NpV_&sVb=QIjC|(n*OvKs;43H36IpB3=lh8;rw`hkLsHk@O3Ro*#?V ziEp?b?O|i2+D>5jukkh(W=V`%R0|T_#4`u|6ImT%t_^sS>&T9Kos;+&h>x@LohVcB z6>|l{?N}~ zZ9Z?5dk-8+4GuqEQyLLzLwS3=MtN8LVmfSrIi7}aS@O}%>F6w^EtRs>f?0J<^ReY; zjuKio({yV=X^19p7#%-dqze=WLHHInn)b`b=BVHKFCO$UA`5=fTgNG1F4rj~*&Z5C zG^Rw%IFC>qWv2af+qnJq+;JZN_FNs!IIU7j962FX=+DHL?oO(k@d&&IQ~RrAqJZJey| zn!&OPuk#=4s4LOCJa)(R_BVy9eiF{xItnF66|H;Y5hmYMR z3xYUFwYaxAS%S&v+nzn1!*O|(U$vPjah*mEKc)qh?L&SG#?xaUHO@W!ZXs7N^YiUl zZyd9NJ%XYt3wb(rB08qio{{h7@2GyB?hXdFJuV^gI1D7QRo@%5iNY-S#fes{(&x#7 zk-dg&1>|FID8dnro>W_j^5!Ukx~O8s*vKFeYH8P_B_yz8L zaWp@Sh<;_pvEwKzp&zd`_-Vb$4${zYoEtKb+AtJA87-t2JH4|HpjWzh#-%s`&n;^` ztNX$uZYjRr!BcY-b-|fj%`ylW7>aQZ&qs16kiFTSMHwtEI8-@^ag~y{H&^aZ)ExRi z2_L7tLK4gQdNMP|TncmdSF8+Y(PM-H|NdI23W86*M}Iu`*cx|SuO5`9*Ju$IVT6+a z2h6fAC+$p1Rk|=$-KMHsd;!z;=R(IEL((HHFVOik1?I1 zR}TQt7^u2plOn=mG5D|;~Ayvksw4=H9 z!_{<qki}CvB4}fbMOA_uOb*{rE2ovvObikTxKs8tx z7-bhlzTH$fYn40u>C-Dsjhj!bZ63ayDWZkAqAEj{W0UhsTzcfZEac3qD@Jw@7S7G3 z2M>n6{S6BU&egqqmW%7g9xiQR|BZHUC#E;mg0#79w>gL;FGhh#eZ)(}zVuUyL*d(~ z4wUgyNnJFC+{p#vq z7uYweq_W_pYto!bvc0TyPp<%t9%wlcFNOia9Dja4{f8Y-K02t`Ds$xBUK~MRj}qyc ztVFcHrW&exhCJCLe(7d4^Dc5?V>jTIBPWiBU)Qh>2tUpoxO9~Zp=KtnR9vFSw2=bu zbQ&@3HraK3auE4ZKfbj+w!hJ9J>+R}aymt@$IIKGONI_8#ygofJ%I(}1_Blz4Icc7 z4fYZ`mo8N&-nqQT0(39lRw4Ld+0P8`!b4Z03%*veI_5OTKR%o%nT-u^{U8LPcPpHi z-(+yihea>I;THJGDE6A0KIk5uaMXKzYBF}mc%E;)P3x4HG!@>gjnz(;> z;Dj3?y>oI1|5_yPIpZo1&-_51RG^`$=$!|suY0|Ir-;WP4t|~WEvrLg546s*0frVX zxB(v&5ZE40u7iv4l5O0!b9RX9X=gKr2Az5vB#-;%Y=@=L9I&d#^3K*_OffqhqiuzA z_h{pE;+6gz!StsMM^?zNhV0!8y9|g6h3DO%&*(`5R+$U$8KcU-Eu+lyDN*Fn!Fv`N z1#=I}6G(M4LO594;6}Kt=*C?DaMuCXF&PGxb=t2tR@yf0#6|Sno;yj4;Dq!nRSH8? z&!up3%1!AD|DcA?^wlamk-a^xnT4Uzd?^1 zCL86Gas;8JeH75Qn=MySY@dM8i$b#+dmA}c;-}n`sxQuRwXFTB-8|60qBvzVKfOX3 z3VMlDk+t8UG20~Do=&%ZS&1N8nhtFvzE!Kf_=VbnL1-308miP}pF;AmHRB*<8d7s{ZXsiKaKR3?n%8vXTf z^!OCIf$^jP^i6V|Nl+r_8*x}&7K-!pZT{a%5Bm{;X7+&pUz15=yQJxtj@vWSo<%8^ zKg32R2pm*pG(X=FWqG^VzQiz1YhrufSYWz9PD(&B^=`bRV0Q#Dd0Jy|G|r_PJSsOb ztMoKUS^nMc7|nMi=3Q&I*~thlg_%!rY!zW=hk~X)v6JlBP6&p0@8<}r0)4$Fq4)C) zfNCb{U|*EE4geO=+oJBN-OcWIVsq{)>Q=c+`DXfz6+2gBZpRg)DJ>5?iGpx&wW4n6 z8MwCXtn#HlUaRfVoDET?wS&7t@ln_LfW^rZIaIlW(kzR`90E^hXLkZ`95-1Yo(k=B zRrvn7LQkt*Tj-`!NP3>xf~x`m((w*1GPFaT((Eb>EKW)bXQq5w2pn8Kvu&tgK`= zJ9)8lKqyJDtEbG1I?z|tBW{FzT-`TP1s?tIHCeUbySGe@R}1=fEbyE1eTpG+*QC zk<*b2RYnf9h)jW8+X9>TE}hgPn!jC(iJHUZ?)nz_v9SkjW!sEU>@OGV+I1F(#?i;Vj)Aw}kKPd1P279Z@p3dekLbVX*o(;I6|S;( zWCT+4I0lQ)p^Le42_N2W?e*Ks)*3WJ6&xD7Yg^uqa~&D4ur(hCzUA{RB+J@b@9;El zm8FW(yMVK1N-Vp70=KGraq5qaR{3>5nke6XS61;ryj2Y+ml{HG08(^<68Q9Rm6b;G z6OA$!4Q!5+=B}wGk3{Pq+HgQG`C_^2?c0h~{iTOQ{I}tZ2Y*>EbIuXYEJFyEY^>i< z7h*9_U|HLF%58`;XIA;J=duIIND^4e!U{Inw2jNe+Da*Jyg)D-CHa$c;M^RYKb_bE zoe)IX$E8Do3ycTSqkH@Ms=cmz^e`r9U@6`^e7u+|Co$$*RW~qW@~CA8$0>Hb)!b zusgeQvcghjjO!T9l!TTL9^$|c5;y#ecEN?n8YZSYG=_@+Ps!vEOxzLl0g+dz&j7>n z26wEe#StDTij`bFcFHn%PG4Xz@y1F3r@T$7FOs?5&^R~>TrX|EpvdvV8bLj8I|){L zKMO}R20Ii*#cZeznb^Ra|7rO-+V@EoR0HRyQ{ zk!|BXSn;&w>&K6@D-X9S2zaWFDm1K1_6*T93{)MRa$d+T6^t3?*uHmoKL;583I3-f zA`G}dkX#_N@;K`#_R%u8)fpaLb)nCf@k#cdS8}YMadp$X>2|(@=z9cI5mWBg-Pw3s zDmF*qj-4$()U~%5P4vqxPVx^5eNs|ZNjHZT31|H!ZGjPL<@Wk*X2_VCPR6D2Qkq#i&S4@&VVv)v zbemnxB*8e!&GZZIUMFnFPxvHz;T3rTP)WMBso13v3(!cinQ6SWnU8JV>@UMTYTeX- z>o>L5xtvz!dRv8?Jw=z#wr7=m)={Rgt^;@9$vw5MTh)$i@RB^?D_-TQd_my_k#qP_ z=-ktrPn>MjIu(i|D)X^MwS7?Gm#Vq(sPuS2c5O)-EBh&InrA#(Nr<%kBe|0FR1Mg!!U=wW*CJE8xIeSd zf1%jhth~@aKM6YHh_aQfK)ar&p;Z)3oES2KLbZRm!(Fh$ug=<*zG1F`dmtK(Hij>y z4A1%D$$qSt0qv=`Kt!dXbc(IS~O-Y60b;&uI?P90kn+o$dJT0((;o|h!=u-Z}E@^g^;ygLp{vZg(% z$&x@X;ft@rJ!4Y83MkkWgI=$J;P~=IgYN>>UY6(MR7hZk>t|wv{>-6(Ky!i-5~4se z7%pK*qGPrW5mPmtMI$H|)rnS_kz|wD9AZ*j@uDEkXN1lYw_rq^ z6q5Q49TDcBcUh_oe)~C>*OQ!DO0}>h1a-9$qe3IXq$k64i&)$;?e%H$ie9na2fC8Y zhjH7v*uGz=7e3=4;q#4YVN}9u-KH$8Gp0`F@BL0OyD~BdX6j?4WUubO6{91o2M`Lq zSH7;aJ+ZxN&%;~wk!8^xpAcF36V<#)Z8c5T5lDS>&tzhUwrCYgnXDRuraC3&sC48t zcSKwp^-#spdm25`D*duDxlwNMwcM?}DCdhv52vMI-B&Exa3vO;$U|nz_%KNgFUnyeMC2NqN@>Yoh`JDg>II*e>r695Op%P zXtat{QVh0A2;1#*yGduFDr2?z$XTU0>}A z3cyqWhwT@x5~fGt8F5iP5)vXl=rYfHIUkl?Kbwk?n;2DxMx&;wQKz6-*Qg$3!E!+z zoe>i;Iy~MK3~I;{-0-bVXuqy^s6+v#68^gGEWRZDe)K>Mhu4G_l8>9J`hq>zpw{yA zJU4WVZ4oZUKLs4!U$~4UCmErLE+?LJSx5m&O9S6LHFrCcxf1mMkacrUf@*2KW!(+SKBVF8|G1p&mWK-?Zy@d#i$LQGSVeGAw<1E>G`m3(M;hMId>`uK4ST4d z`R|-f=NRt~dp>GHWX{j@=FP&kXU$%!KyRMOqtddb@w2fx;5%l|Y9i5N-2lY|RePq) z?G$vV82apzrGl@JH5IiW-N^0r+t=QYv3s&))*b(mOKHMeG3CXRmIbxTZvyC+!Uc10 zYE=sCG79R8AcOe&MeeSQB*4pTBdR^;OmABLm_pk=W0?jzV*LDy)9s;Y1VEL*m(7@> zRTd_CD$CxfV&cq!B8->$A+G7dz_Ql_A~N{!g9|)AKwZUPk?inSzAW&sv{|=@zr`Hp zZ0=;4y!ilcoRgJA3CSwfsqXV=ODn8UAgOF@x<5Sh=a7Sxef12JU-KIGkmE^jbSN`{ z=gV|}6?v(OyN|pwblhdry&6WU8z(tVK|hU-1O5{bZoXhkxz|XXMD_;iG#11VGGxOr zcp`%a>#y=fo8<@W2FIi3=~?Fb!Hvhv+R$4MPO z|D(jJ-2KR5u3mP3$$RtQg|uPMOCl}8ZbWp_v$#jYZ2n!AfM@w+tjE{clP4a30QQoD zp+|BzH)ZVf_o#240VbUKiBK3r%w!ub3B)LBG+47KX|>?h~VCf&pV64oU(agoLpGPqq9YfpEG_( z@tf6J-s`qU^bjWVfcE8!?yk50;u>(Y^yPr<(LoC?+ahT}EAySY^q6z`mc3-gptoH=YdRom^=3? z=yAVh0yXEm<{vQ~UX_vACfGdk*W4icEXc>NC|SN|Cl0fOmvR=`QIME;P};*EX<=z8 z+S%s;9s4JRM-9l7Fmvg{OrSO)TKU`SGUt%=_m%l4@uv9Xg^?|3--2gpV&M^XGR~UN zuy?8nN1t=|0c~&a7JcCoJvono?;kwFU&Za=n}1t}d8pYzf3&I&chw9I416gIp@^~q zD%szRl6;oyhgfOV2wG-ZP^rMml7O=OL-Dhb)XN*-w1mhCuBG-CYMEwxog>^T8fmj* zH4iljmQ~crW{dE~l*(VT=`G+MX+7f$h3RvTt@D)}wp%j8K8orG#_kjQCrsZe^oZPa z<_+FR=P%O2mt*{*%KpUOt10qcGkqyrkT2Ue_dkArHnW+xL4m_7=Dw;E5Syb3kHu=4 z{9zuSbP)I$B?Z;}_;OE${rmU3lzS`wBYZFcLW-$3kODGDFfZ&WT!zQ=F4f(rM;9hi zu!6}C<`#IgWg)ti%0rucfU$H;;8w&59|nbJ!I)B_-*FwP67glg*sCBy9mmsm2gaez zEds2rt!YutZdDuv3x<0Qv`)Fs@r-RN5#Hm2rPQ&dNS9$8KJ7jkn4{T8w)vK_WySsX z14XV9z*hBY8)t1mp-h+(oD=2<{cp&yMYD~w= z%)5u!i7xm+D4CtoZ!f!hn3jb7*IbtqGK^n=Z5;h*&;HM!bu>6|lB$TGLP^3ld^hab zk;4Jkn1f3RbwwLV}kD27?5!{g#oeBw(Tp#C{Yb2L%I4 z$LiU74c`NiveM_gU!g0=-ibTczVU-F`%)_y3@1w)kZGu~gcL;0Y$w` z6X)P@n23LMLu{)Nq!VZ`MAtO{lEDzv@VzZ9{AvWEGZz&HGD}<4CKC(+-$J(0xcl=Z z(G@+?-y4fN*&~5AT2wc;F~}h%Zi}w21o89bRv{ruUUO@HYenCMHnH7UO@Yv z>HferdePzR?gD53|5uF7c|Lsb&|Wci`Isr+;oqNPD6oY;O+)|o?Ell0WA*D#Q?#}2 z{!{;}E%aZqV$^J}{2Az9+spfZ#RS-1`+dv* zt^og^8}{w{?^R(;y{*KRy|vn1`*iCrEbhUH{4c1LqI^zh4~0 zWOB!`j;Xg3`7`V^_p5vi!|v8^$T>5D#-iL={(ETOzH|R~P%h;CS7Pqjiyv{b*=zhi DH(_jP diff --git a/spreadsheet/macrofree/network_appdelivery_checklist.es.xlsx b/spreadsheet/macrofree/network_appdelivery_checklist.es.xlsx index 8db059259bdfc1d57241d45394a2d94107bd62bf..af69ef0923ef5b263e8bb8947a67bfa5144dfccf 100644 GIT binary patch literal 27209 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%0DpP#ti!KcPanB-vO2OIXRO5OO7@_<*4DA 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 diff --git a/spreadsheet/macrofree/network_appdelivery_checklist.ja.xlsx b/spreadsheet/macrofree/network_appdelivery_checklist.ja.xlsx index c9f818b427d0b10761218a4cd3f6cdcdf88d3e6f..8861563231af6c6608c06c8f4e81831ca44f6709 100644 GIT binary patch literal 28696 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%0A0D_&V}|M0PagdE#>Mp-@3`5#$F2I+;#0 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 literal 28495 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 H2R{7=woy!C diff --git a/spreadsheet/macrofree/network_appdelivery_checklist.ko.xlsx b/spreadsheet/macrofree/network_appdelivery_checklist.ko.xlsx index 103f60061acc585ff350e605f317c4c0db2c729d..5cc563c93a78bcfc578fd6f01ae00b5263e5ca83 100644 GIT binary patch literal 28185 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 H$5;Oc-C>Rp literal 28135 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 D5Hd^X delta 14953 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 literal 27553 zcmc$`by!qw+dirw3Q9;xg9?a(bV(~HAz{-YARPk&Lxa*?Dj+E#prq0aAyU#H%`glh z&CoN%FtFEv0gvzR`=0&oeeC^*!?EVL*L|JWd7W3>Yu4d?Mch*qCr+HeKk?WEq%Nyj zOXvk$eFFZS2mU<+8Qy;mva#dVx3S@Jva(bTQ$F{V=lt#cyK^w>Co30uFZQO5HM`0S z3q?GW0sHQ{J*o|dijVSyR8Y34*E2f``qgK8kT%PmC^;uvC)4wRMvj%%Or7y&hjTFb zkV!pD0bLXBQ%WWNj`&@M#bVJJ`bxoxYjfG9zOf1RG3LBiw_+^T!+ZxSnMy$0`gk?3 zcJS^W!&}mjZccC#0E%NDIO>NY93$@EY1CCI_A7^Mpc4Y`Tm zm310O%h{PEOk9$LF=}y1ZZq1bd^^j5uf6tVl_p?ONr^3;g8#cmxyLE_mnmoPM4goQ zgYt(?sBBA}ku_0abQjL_)BomY(AFSJQB&HPZ|K}>##DA8La3NR>Bd-X*>tm${P3V^ zJS}_{S+pm2;%zZsEvPBdOTae^G+ z&B>D6-qgs-=8Gc~u$<*s#iR^-WovqO8oq4I8 zG-K!KE;0pj_VVCfW7CReb)%M@I2%8PpF~7M66wRmq=6e2b_*n*8)c=Ib3XE$z-0=r z;i~b7t-)DV_I8Bt8nJJ_e9*HmnY&-^nY7(aAFM5l-3|D#a#c9&yj3hu=L?3-l|TWa zARnJIL_I1}8O82>nr9!pWsZ+r$Ve_9(SFLq_5QhAuijbFu!YBQikSCr_ms6WhdD)mdf3iJ}7KSi~Xg^+|!Audk^(gOAxH}lI;%JIMGavL{lLCOL2;ifRJf}|>zZqDAJ-)rS&-?t!@!)XqTSY6BcoJ{ zD@@Im>gT#IP3oLT@3<3n+b=<7<^1-G_4BOmDj^JfXD_Z?xoUvphlqj|x2`1aikNXA zuMU5`$}B;**3fwWYtwm2Hu51J&`VW*T<7hHhPla^%y3UB_q87ztNH8Y!c*4oOkclo z#qk{C6JvTj=-sY>GTP%dq0&mSrP> z?{q!zw38S<v#T6qvR`1G9}n01*Y8> zsoIWkHuWTs7TlXKoh0IiLYspY4!?tx%G`PV#I-9VZx)At+@@p5bxQX^5jRpWq@8SR ztcn*EkLQt?(>nR=4V}74yq0`uUpkZiNu!4k2TbV|eaJqaajJj5wWu;c)=6>a(u8x| za!6mq+?Q*a%I{r!nK(YYUU}9tudo<+K2c%8rb%p)8%b#>vhEzVN=e(i&7!RI0ZIL@lps>+DVUoLOE2T2DUVAnv znA>6PVT;SlSN>>{XhACqIW)CORO`p-&mXs?R0W+~w?9Xh=NNHWybV`v&1s?HKu5Fn zkxf^x(U9FG`SE&!A@YJG4r=e+Id3yIO3iBhxKmvT_cF(1>EBy<^Kaut*4}z?g-4k; zQJ-b{quke6o|Eriz0DTmteUWiAu>*Dn3#Bf1^;3>t^aomUSi+4gizIw*`*v&M`QiBiXo)tglQJE$p7O-Zg8}-#~G#U=$LrQ_DIajY&#KA8&Zt>g@+7Xy` zB&BZ2y+Dpj91x*sL5$ydYO^KCV$Qsp@=a@W--SE&Wbd{Eqm-xlorZP4H|H=LRaCPp znta{MawW}Ng8KGH8F!p~*xqiyv=q@lKLnCw9o@hA?SA&$hd0RHwT`fJ z*YWv!o;+VvZ9z`ECY@e*U|}@hQdDZ2-M-_0e%mTb)sVemacYp@HGFhJ@_97D_wGAj zkx1D#g*rD=h;kE0xo&Mu&4PyWwB1^5F+BSuSzy7T(KT zS47*pO-@K^zaCa|yP$bJ*E{#|jjA&4=r!&oBAjSv^=l3bQ!d#Lvtr_5UOm=*XC3mt zvlnsb7Q?Jut#e1+pV7))8#IfS$o&3+lKoC6#|=uc6uoS!k18K}?LW3_HknDrL1|U1 zw{&8Kr;0J$$6FX5*^DXt!HE-0SvV)C4_lZc=(&ZRsgaSr9rwYX!#-AJVF#5j$v~?K zJP~6zmV6h2e$VBediLf?*`8A!d84kEr|IOqN>YuwwNhJkFbgE|C$62)438)=ZC6SN z8-(ag$Xp>S4`^_s8dcien6ug3L^~?mRqiyQ9vg7A&1K@`&yWS!M+p~K zmuX?OCYN|d=hcGNSQ-7GA*i%Yy+r`m5L!z-f z@{!s+Dp@M7tlSKa3GPYi_H;h#u%X1XqVvo5o8uBml@RE){kwX9rff4MJn389MKLo}f$$KCh0d(@fs#S=}? zddvABi06VQp||8tj+H0KKWS>aq;xOVM##P6K5ac`&&oE%?)ZD)7tCK+ZyjgbKIt z)Y=K*Dhu5M{5v5XgnIWER)sh0METtma^>JWp<{$_o`rLlEwaDus0=37Wpm9XkZU|- zS^%Q$xMlC)xYu?~WN2@bBr}~)HD0VVQyBBTdZC)G4>h#_?IEdOZh~CUD-C7bUu%_; z8WmJqg&3nZ;}_7A_wvIKr1xg~NYV9Fl(RxYT;t+#!TT+*QjVPJ%prtVO4cLr1|?v&Xm?qHm!g73M# zGCu91mF&s!YB~dxTZvvbhtc1w`8ZGtdjAECs0eSw)4ex_EOLc;2xxMJUJ!UK<>Ag3 zK*Btc2;Z8e+vccbbj+6`7O32dmy__v{SmI0yfLCCv6(Wn;<6~yIgTV8ZXQQI*{ncx z*3#iv;IO{Dd*W3$!Orbz_k35Yq7M$#U1PgmBm<4{;O}loMX{LZ>iv738=K*DJI{7E z*q#VgRY(dg`*yP3^OQ7ODs>!S>WEqMluFpo1?~BFsZ`jUR*pZF7w&mBdDm+ERnyMa zs_vF{iOsbCX0CmN$DK9b8w|q~V0VZVK9f6ULv9~D(5T*Fb7xbb)i>PO5$W%!w!hpY z^yF;v-op3H{Yi(*ZkB!SZ5iR1QA?;Br`t;V*E5seTj)w%(NP5xf@F>uNk`0{_g1a> zxc4@94~cRfvS9zxMvbRI2O0QG!Pp77`@*2=`Mtrt1+lP!JquSbMdChDM?N%qxx$1I zmG5f2k@gz*0*R4UhNt;g0>qc-xPX}W0_KHYI_T!&dQI3&qU%)IXnASU)NrOuQI%v3 zBi{5jsK>UQDSxkI2lEkAw_Y_i5-=G*BYY>)eGh7R5BV|v)GpYuOhT8{zYgXIFF7Mt zlOhpom^f-Gnk2aM)D&tA*BvaL+~C%dy6aykvAEI#S@ar*19?u zK2nVQWd<@=~fcf*n1rk-E~ckPE%!$lHDS;rwk z$42x{i3fBs#LCXGax~dEJoNR3-aVHa^Df=VJ!v1{dIUKxH`ySUmZ7^aj`l7O5}~_2VAGxXo-}P9 zk&}J%<0GFQK8^-iGcnjlt&^h={C=UD+efzeS0NsqF9R5wQ>GS}8^fO;m4cG5W11!83#2ib8d zdlfanud=#3oK1pUg<-PM>qYHZOwUR_Ef}FV%;sqxn6nfFC8>nQe;Mx2E9OlQ6(ABG z5tBuL9Q~|7j;K4ljNRm%4)+`Sm~g?GS?J^OqIv&FC^}3sk1Lmit-L2Sm zbZ7gjAAo3k3Ua{4YReX_JXQmFr3jx9f%m*l{8o+$mm^-wvj-{_`n-R`nnTq_*4nfN ztraVs(lXipZeF_HFd>_$Br?Y!B6hu0qLbKLobdX70;_apRf$T>F6FmslMU{-C{PsN z1=qYtzND=JkCt~_(-O|IEoCCTVup`O$%9l+Dev?7^^699v zq6gIsx%z1cgVE5MPobzYHBS_BKcW(hONTTbCa$#?!J6MFr{8|4@XW;ss;O3j@lr#r zeX8DV(Y1C38!a$cJhuBh@?~e$q3?~FXyA_qoqh4VQBv^00vRPg!Jvg#RH2kK$J(jmX3 z8iF|Y*?4aCtegfJRT}rac^Tsguyks z*Oo_-6o9`|0R>6eF`f1!kINVzUg{4>cxosh1_JqdkXv%zYkNp+eC;x8)ZNQH*Qd;l zu5IEK_D+1_ig+L0X%c1jI%xazkG@RC)&*m(48v`A_W8Tt!SN1x{rlUkb)26*1kk=I zq&nM#u*{98bWY*#c*cIcPMM=;eslo-O^hQZVbHp|Y6CNW zFIA$v>){z!dXv6#RIn}M;1^2V?_tVWcG?iiQ`1}ML5~;=lbpBsh&WN=`bA=4Jtmm? zUe1DvJe@gDyDrY{Flh2^Hjy0?-z0KL$`9bMu@LTzp;BiLvUz{ejZ~YB%|ew_OohWv z6EDK{l>fjzy_%;R#dV4o`{ZA@@)LcQck5TGYk2F29(miCY0SUP0M~;T7ly{it0AGN z{Uojz;*(>Yamr;k;xB%t#gA6|8oCS>gAZzqj@m$($kHSUlCO@SA?}7^wJHLOO3=i% zD**?|YeJsXZ~4`=cBmeR6i>XmWaHdKcQbwPrZ4)OCPo)klUd#4s{NHqqI6&OxrXuD zIrld#{)G-R-A>6F*I_dzHNCn6D)GTpzH34LWMOu`nGl64=5aJCba;TBEvx&ZQ$xc}qzLuJoL$>iK zUiA?YVZZeC44dw9S8&eC+{lEXb@z?Ula&c zP9fR}l6_}?ePL!}L1UejiJv&K?`Bqh^rRKax=Ik$o!5S&x>#7~Wex9QMj&m|h&rmD zfA2RSO5JsxN@>NamtCWIV;j&T|%k<(I1No9$y%<8gj_ssx!p(C`Y z<@?#ohLd-?^LQO~DZVW+Yfrs6D9KSzta5#cQRleq)g}9Pz1-}3de2&ZLa3)9wiD;x z8xqONbuKKci``1U0#0iaVM*0D8jR4s-bBN8!`W|BgkOwKO~v%~CrUnp?3$q%b>5dc ztq7C+Sf|F2C6P0p;H6Kt+oz)5R28@xKs+;9%L+%)A(F3_{tuE%mIo7p`*vdfd72EElKa&M$SD_gW!R4j?yzC2xzNK^w- zA#V22KvjcK-0{XzIg|Adu*iJQdpIH0mnSZ+mD%~aY_xuvO|q$@BNTp_fiapG-gVX? zk9XRmOLbmDdVBn&s;xz3gurO{4e)qr(!GWCKLj$rNP^ zEXpy9tjsVKpT<1pH_*xPB{#b<0ey7ShEVPH8xWj9k|tbNutQ8bNC8PxwGcIru3MT^ zw#z3>tBV?P*(_svZr*_8kXOa6HG^fmsaK|^Enc|e2VE3TD?wCs8^^*t3Xxw`MFT%j z4&-0F7709E%23Tka-h!T>1jyzQ>FJ$?TL9CW$RIrX^#Jh{vm?FpAiwhA6qS)-app8 zowSEIWuGlow>pzhFp#T%-o8f`0=@dK{ezDAlC^UO-bPxl7-f5mLTz0+Iuhnzw<{1%2Y`|ihwl3JTf;V(8qMJI?R%^% z9)|%`+0iRPuhVd%!4JHL6UI%eB8L@}XU#_J%(a?2*E_^{n=xl2F+x zdBZJ@a6N-L5-?|Ja@B@Ea?8VUfBsRGa7VlZO(rZUgv1}^?n%4ZzB<@qEb>XoML<`~ zbn+uT3x})z6BXE?HMMW#CtD@BX{JjwsYVKDF;3M>uw!&2J~h0*@rj81U6wbuGh)j7 zKhmS|)TXX8DNgd~E#))a!Eh(ca(dT|@~14}!W=`M`i(0vMJ4g|Y+#wab?e70{E zfV_YB5(Yyr!ZV|FHDDF_XB3;=^ux(FtOw`zB1`6y(90#XHrMTNYT`dSEj?tHHmPdd z^m^3IN{<{Y9`Pti+iO;4={y&_u$j9flE5fqFp{)~u7t(Mg(UEOPxcRYY#d+OK_GKu zqr{aIOoQcsR-X8IU=dnBIpAj|>RJa=Pa$0@&0Vo^Oo4VNm!M=vh|GqUSXfgy85LL~ z&F+5x+yLb^4c3#4mc6UFly7!ABOz+%aj$O6-ZTBDdf%9$CkeBe-|$xNk1)IX8aXJ+ z`#+wR>v#rj%7VsxA$Cb~7vs~3gb5{&qPk_%DjTVvpWG!o?YyXIEd{+8{=vY}T@PeU zJE`*sP7hBEVnon|+*^)Y9}RUxcrsao_5@UPx49G(zz#Vef2j^JiJ-u`ruvslU_dvu zFl+0|VS;w6czzUJ9g&chp&R7N6;p0vust7S)`6~Dx+APlMO&_mVk zN^UU2mXK2aI_s$2kZJJdxQ)B(>mYvL&_)+5eD!5#gkvKSl-bp)h+G~fU{J2+Gdu) z!Uo-qElfY%1nN?(aZzHj(D0m~Y}CxXn1XJs{1=u6;2Gg&#F3BAhz>{QEaJ(zT8W^) zjEdzdtqnKdn}x{!5KJO!gmR>Q?-Do zW8?&vzUeA>x?OqwK^xO7{Qy2ej5*ghbyMCHs*qu_6#0NtNfNU;_I($%vRWqMRw+Rl z1_IqftxEmKl%f>UEXCqp08{j$JZ5(MmaUcQh7lHq*OzM5-cdZeWO+PU)7d$u637m`jB~a7n0k)&fsUP?^Tg4?a-iwl0>}%b81J zOP}w;L~Dk-2zZ9wPj0DR+`e^B`7XV^mxbFko)0%-Y`g#_XNFW(*w|R>yuHGNHx)_F zvC|hBGi!*P>tA$Xa)xFpUx9o96FM&U%Tko=Tp=7zW`|l0R~Ei{9_-z3d5CKy)upd_uUe zRxh8{)b8yd>B(Z*oC~cy9jt_dgAF6jB`48^N_^{N4uzob0oVu8D!Yn&Ygk69ciDgz zZ$d;wf7b`weYlmQVqT*&|dNx*M+c#VIkN0Jj z`8gG(qeHo!O|fX)orzAHN5sQ!mo-wX)Fegy8TNDw{l`M8%lmTMf=JE(cn2$M4okwXI+BKXYF0NW-7oXU-SdXOX0kZ|- zW6H6Q704r_r3RdDc`mJe5+Lh-PUqgY1@g@9Wp&=pl5KlQ?Lqhqn~-Jj`BVJ`U-DhGt)HPdI663(rXgHXkwIOLb4b0XoO@W? z8VN54q^|;l0AOB%cVX{KQXhRAV9^G+)RqhVrE68E+j4rk6%tUcRc<< zcsUf6m$%WZgh<{eU<`LVcExet;W5-q0J=`u2s zBq7e$s>cygpUsrpK&%-YnUjEL@rl7YHG{y)&=7>1){a~JX-GC@e3{mB`A#v7^K-LMCY8D8NWmb2QMf;UGi@4pjtn%<9yh7*Iz^@1F@7^2C%HXkfoc{_~Kah zV{I=8kG6?QvqyrqE;l!SHla2 zkk_7!2<{_SUtjJBr-PJxc)C~agPpAG1~F#Z@KH}EX@Pga1GlKSquvybO%!`6!#Ws* zWzk}V{MxRQbdkX6gxpUIWC#+1R+;+Pbu|PZK5gMD(yr_{SK$;B{yvgRU|5}k$OKoh z=KPSI*U~oiT5gPf^;lf>GI;%z9$!|LmSCZColW+1(U{15kD?kWB7{2=oYVP;a`ts! z0BhzO#T(BKIP+h$o2IK;85BhCOtyEIp$GSD;Q{?a13gJ9&k5qpv9WxVOV{_HtW;RG zP+}QLds_B~X43dTbUAN(;<9sUal@@goKa-h#?IBv*C)zt`cVgH>|EWZGHfwfZ~R)? zjGgoDN2<5*_IB*rg+Fhzr2OhV$r`()kB^XwwCIw}Cbj4g1X_v#PzX7eWOEZOg!~Pc ztwca^&+m#nuOQ%sy(6V+ZqeYG(6qj<)zKliI6O*cZ3>Y^6z>;q4li#v779mla4-l= zTs|DN={TA5*1cp$fYzKI-zhNS;aHO8Fl@L;UVAMx!}W*0Eor6a%6F8UyZU(;{PAj{ zb&>IMJbX8iTXVkOC`|S)Lafi~oYTX{Fh-udz5&|{jBG#NDXN*|P%T$zf6WcnX-hPL zI3&Ny@GBk=W-HW5PL4}km9um793E6qdP17PE`YfV6z>eUP62eOB>o$Z z3hR4LbVX8`?Rf;3xBCg>JPuX&@J+VSj)Pv;2E;9A>hb%Y#<>pmjsWTGcwu04`|>Cs z;{2M*9{Lr60dr+6?BA&3-t9&EJ>HO4F8=TV@=|O)FRO|BjB(BN6uPM{MpX7(Wu5hG zn4`C9xCdiDKWeudCu8r!Mx7T62JbGH%S*vV4_=4zn3Yq&M6t=SL|m0nF%RpwAvHLw zeYK+6or5*ojH;=*QEiSA}Kvr=FcN23Yk*t{Nk?BR@O^Y zI`u#2iMy?L7OUR{J7MREyG?gSbn|Y2H1CS86Ipb8o!*el^h_ugc9~cY;4Tu|uN)3A zE_vIZ_Dnd|V#n(BjKa+Lry-c1sLXeZ86$J({FvPM-mn{U!gwWg1*{-2-vJs7&erqE z>vtQ1;RMwBq%Cz4tygM%c6;ocylnCjp_$}?d!=~;C(me;EYE1sU}+EJz?nS#vUoMG z{UpMEC9mAmv22J2jdCZUQB5FJag}J!H#Lz3rqLYQr7770O8J@mVmmcpVHRW z2PwG3sEUEQR0`u&oN#?_r7XU7ZN1K6hn#o(H;AF`S<)Kt8s{rXNOTd$o>R=D_pcGw zRP*4t;l|~@*)RP(QkW6ErJi?650e_Bn~T1{s(dzSAkmOcl%y0}UzHUx0u2JrV+C_5 zv4dTV5(zO8z#qi$JvJdWLJJcUAwLaB*tn?2)7#UHLJ6>rym(`%Q)pTKToFvcK*m)7 z`@pk4!zdiA*TsmP6Y4Yc+bLDQNU1{VPMKG?&$+#Ccvz8=S&BSo!F1LJ^L{Yt-TKP; zuzh5WZ0Fbwok>`S6zqH18D9zL2V_o!o*GHAsooqTl2mqY%Zx$MWZhJ+L4R1Jr(dyW zXuD`7kUk*8BJmrS3Yts5qLFKQsdZ^q9IiSmQ&=^+@62`5qY{HgjQ8ZOc6!nZ`{!}; z@}}}b@0gSXcUU^szO{-&f~oo=$K_rQu$w!Ae5{|*pfXmqE|JN0T%jOm7A-tX9rCnj zeyIB`6X2X_EF6x_*Q-h5yUfMtg*=>w{fC9Wh87Fs z*fCitftV~eCnS5h;u?OMkBZh9alci#wFW#sju0T6i&2!{pHWxJoRMgz>s(2K#H=I% zsMfF>D;M=^(~LP}p1fhr$Ir#t>w=JLB|~WX#HSs`eS$OFsl`3D!lxoQ`_^Zh5P~ zm&(&zacz+~BY3a2Gpvh)4e|UCw_lDgjr156fur@8O0-(xz6eT|JUfT(XJLmujJ-%{ zdg)wTTTHma%f~7D(o7n;)kS`5+%o;&i3E!(EN+{Y$GQ=;ih+3@Yf`5$i0r_jy9fe~ zk1QKG%o^qAk{kwx212QvW!1$>#!K{E(@<%RJey%v4icrx2G7UwBo+?c8d7X61l%&g zy7f)BwTap_zq)8_joZI}A3@A%KX2jY9bLG>5SC}9b_m(`kir%PT(~jmyXRb}R zTlljnuGnSe0rNH&D%#pcb31ESPTJyfg5iBL%X~9SVIEe3-NrlX5(kY>p#xdewmEt( zZaF3#xtow}8{)bBNq0DWDkWKuS$no=jca@oIFO90ZLCUtOqLkTS0S)E%Nn|v;tiKM zBNg?gbZiV%^D;MzfZ4D{3h{_$sQ6Q0NwK~!q)QUB-$;-iGLz!XbU3+9nu%;xQQ5C> zGcDlI+^cKgq%N+0%(36v(f9rQi(e^Cgj=8(J59hp_9EN5IHM{+cH&o|qO1Ms2RsL+3 zrvUS=m*8yAp7I)9#d>6pIC^e(8kB2V3U`)8XhC0zc|xa!d(1Qa`>zb&5G%xxQmkXw z9X$P5kB=6EyWVo#!%7|=9nM=bH!d&3YXU=m{MZ4XO%dN^*eJpt|^$QjF-E zTeJ#7AkYl3a;JdTHzZN1qy(D9+|AH%xc`bx2|`;fTF#V4?(o+He9dUvWjxNw)~1Rt z8~WSSlO~-yvom@gIH)3OyONOO(v0rhoM&B3!XraUpp z+y3t9O!|~zbACDDZxg*ILPxRBDJMQ7&`bToM8c-@b;!#LMc`+KK4P8c+&V$SAn#cG zuG!GT^u#X;867=GTLp}myn^c1lg<80CFDK@kY)sN=gX=utRY~F&?PRtuQ3HW2l^V$ z6O7LDs1*#|vtZ!>)p{~ijE+J})t(m>bJiho2eNRX{FPSZvIyZuOUp-<8Qq?Tc3hM# zw)3l~HuSJMmRf3UDyt87<)(Q|w5AuH>^?ndB2g4$aob*mQ}?TJ7*`cnqg#@HKiwS$cB^g80_8?}sxSY4h&xy2`FBZ@(4_3F& zQ~cbWpRa4{l1~iQ4n4{ezg^uYk^0F~z%Yhotajv{_NpnQe{OSv(vtux2R#LA>}RO?ouLz`-9*{y8#;p~B|h4%hIO*E|9)*A-qxM$e~`sp06#da>> zoEFwOs`a()Hl3?^3&}Mzb!S7yQy)lmj63(4x57G_PU=qiyJYoA891z2K89|Hfu8OU zPLJ~jg;)6`m)>s&C%n^|?Qb$$?e0-=9I3?>QLtWs7qS(S4!;)kf+U1;=|92-zR;@0 zQyb18)h~?jnLzbnO3HJW^GI?FhD$6>D$!0VPwG-#co|YCX#f=tpBb?dN?AVBC^=$H z=m>$*L_)Xxs={}l+PS#gy$bif!@+l0(L~pZbH44J(~OJ>FV+_8o&{wq?{?FBI>kZm zo`JoB`7dTwp-HCR0@@tzm&v-%iZRm;sgD{t)Ac|4c69QXX6v z4pv)4u66>w5wzqfsZ+R_d9A*L7sUkX6w?k6zT;lhcUfcmT*>g$nMKs}hwEg0Vci~7 z!_D<2n4TfmmnKW}paJ#oeG6&17Y?f6#(dxBz8!AUY#qt|bvAO^CTeyf%qRLz1UqHb z9dMR!iCQ^b&?_RbMVRKelic;S0V%%sC}9g|v+PEZv%L$~EBXR@LG9Qjy{`g6I;|L! zcv)YVwJr<}7r#d9w}(F?r^YUf%kYVV8qsHlYAruBMqDF_E|Ro2SpXEj@)1V?QQzi1G9) zV+!s9C!PHT4c6pJm+qN>XH(F7dQ~0PkI=eeRm2RA1ABK%2W%0R7HO!3;ZZGJYRh_^ zfJ}r+p6-SS_UFbbmtwcDy>mOjyA}>FvmLjoVO1f!z$1se>PNw@eL8{bC{j4l=Cymv zJ35v4-JV(9-cuSIth@d|Ve%~5zrVw3Wdw3nunxb6NvKX@bXmN%)@=lU;4ULT$8Q-`=?jLM#BqCv~;L&<{_m zIUl)7!a&9~897>Bq)fz~HP(54ikQ{<@>fIBXmA%SHDOtq$^}N^Hl_^HSBYwHH225h z2&#C0NgyRzd4yqrfT=@9NqE+~m!_e?-j0BY1<1f;g!k+3?T|V)87J75eHj{!DP1Ok zEVzevjQaO{5A-;r$jhBF&@GqG9QCGV%wfcG_bR^oK!MPb*@xS}&je2(-$tx4S$Xk^ zY)jN*X#=E(EtK2LnE^w!A<6}0r?c5MbzQZRZjEN|=f!3nuW=U;x1-tHzJlGmh)DtX zSx41e(E9gn_prI7PDD3f?k$;(?7Iw2#AtD0PM%YVHV-hCJqD#HRMDf_KJ+wZ`msfN z{AnxA1>sZpQ0oA*vsKZwdSua8Vpi0#F&|=7ye6T{c{)=lX=KuRI8b5lRxoQ+-_4c0 zscOu868QS3N=&28!WDs3Oh5m8S2ly^%vLe8q`W)OiTB?%9Q2^Q?$7Fg^gn3>YFi8U z3+>@UTX8|0>kGW);=^6`?RiGWN)mN8#JKS=g(r3@N#E*>es1%a$?(XwDt=PKpma9E zo6>wRlWX36cqaRv68`K+?+wL~*}57ZLvlzox)W>}M3ABtGCBfdSgL=BH_R28vx^6v z5+c;L03~VnW=f|~iURKf4Y!U4(iSEzSbq(5OH4zM{Yr(;IsiBb7F?cP==vwu^&)r& z$>U~&>dsh~cYX*Zaom?vo3b*?3ZSo1q@R-!;uSmo8VxpX_r-GeY!bUIXCimz(xzfF zM65fV)h(ts8oPiODx4*iq`J<3Ani1IV^1J+pbV>k*THvdLh$GqgzgF zG&OqnTzTGlzat`RZqX~awItIyQoc7j=nDB_Bdq$=a>T}>_m*jiMysGz*-)U6{LhD{ z=|-Ez+T$e3Dx8+$>{*th$Fq+L_Vg0t@ajx&B+0bIVDK}dB$NYk?KesV-d zU^=22vlV$Ft+SNx%EL`9Mi`6lA{j~}OIZuEWDWD8gl;tG@IA5mCS{^roc$vL;|IF} z6^YIrWi!4eU~7IGETX9MwLVa%4X8dhmSu@O6{&(=-xGFALSNZ_S1tECK233sHd z6Ebz56rgTJYPj1hX3rGVJ3c4Eq}9YPEmlM*#s}pt8n`keKcf0oZlC#}Q8f3_nQk+A zQ*B5A>9nnu-^jb8=LS6o!K5h_!egsFW#3IXs4W!KVtDMRb(#7jG`iE@@z&S^Mflqw zqg5%K^ih@GKsm2g32&mA{56)F3-24du4hDyk@YJs8Ze4OU9Qc&+GGNS4KM+}=itN$b6V?F!i9U`?`!bm9{hVZj2g)_c$JAw!y zcjcB0e!UFZHvI_n0F;~rLNs-+G`HcDSG97ezMjg(m=%x#)%sZWmT;+KyV>&QtI+kj z@g?=(H=%PWY~{F!L}2hrAzwu)i?xny`B5b$J*F0bfJHyU=#u(89t?APnzo=ifJY1? zFHtJkM-1gMt)n!R@2arD{Kk-6(>-I7Un?qAmzH>Y*JE(6N<^1P#)fOG`g5n}rpijK zJfG*|`U0?9?50z>1)w68?uird7Qxtyi ziVLwOs{4hwU(MyfNEZ2rEHqK#7qiDLSnj;Ia+@XlMTjRTBIl4~nG7Rl!f%;Kjwosc zFP1w|mzr^(>sQG>JT==X{rT)Sa^&e|+QTyZOp`eKMJ314Ehk$nSQ@(G&hwGr(GAIu zUeq}Jt<6uV^)*=pWK4~PH|mr^5Q|LInT=W4fPByi7=gU%NfDf*EA`HI>BIUYTojRm zQxUjv1ZrtIPKDg+5vMBDR%sPT$8-n*_m}7^Z+(_M=#2y#Sq@B>)8kf-?D~Oy7g%ag zMcvGvPK!8V|B0K-$FG3q#c_mo}(_I&93BOljU9E1Nscl8fg8Dt$=(uv(zeeWh2vqD6=JRgg5z!V9~9qdQ; z`Bo%YV!2e|z3Ht_K|s9^Wyv%{I4mhV5UBFrTK9BjJj6QK_{ zbMR`=GtH@Re1OAWq6r7~NT=2$m-g$Al)tLDag>lYCQ{WSgyJNm zuHr4a;zO9tgi9*z*GKY8)K8=?=XhNFou*hzm$4sDe1J8-rT_o&s#g&j8LHcpyFwzS zAqKJpX|EqNUS*0nFDmP6zGAyVolD_DFDYvw%bIrgcHw#RH!>ZdwDShHd>(wgYV?}7 zrCyXLBq0#|(WWV>MmcITf>-78c1}V2M z0qfcIAM<^@EpRSHwfx7f(Ai5Dl&D!l9?H_Bx!p9t|74j;`&v4{m)tk~yuqB$gXS!< z?(069Q?J&cSAEoP>c8f>OJfwWb~5l%JztRdecI1EA^$ zKvjPO)jb4y;V96;L!fuCK+XREojL%jeH7^8AyBFVpuWF>#vA~BaSUk40Z@Yjpwz#C z8Xf}mI|`KV0BGz1P~!uj$}*;NPfV`obzBUh`9;%1d{WAfw=VevsGcRbbi2s-C!e|w zjT7^PsjG_5bGTCcsArB-ku0EV3YwLPP zA+7x}ErLRttM(#0&6CSD6oN&{5Efz&x4k$hL5kZ;CWjxT^Nu&pG$*Pv$D7T zLZ75%p8FB*zaxFJ?h~B_Xn!b=e<@Wk?SNN&q&briaNi$Z0U9pQ08;*D6nRqN(vQ#h zhXKGxwpR65 zk@6K5B0$(rU)Zk*sVNq_+<$%Z<4=cPzPrj}UBt-2m$$TVCv;hmFnM*|9eO2!Dc} zenUk20v1vL`L7TpY_wb^KF+L)Hu~lPY#=hfV54oyP%n?c#yN8c`^(EiRj^gz_}AeP z|5C*PY&G6P*iQ(5!G6L^pJ#9!_T!fau(_Tb!fsH=e>`sU0q00yChL*-hnknb`K5Uz zzW)O0G0o@69cmu<`lsfz1 z&#>D8L5ACuGaipDuVY{|5Ps(`AwQDNa>s$)52_Mt;UxIY;Y5Eti#g9ep{{R~h z&i@KK{9i=Y>EA?l@?S*uxcj^+z`ln$dnm|*$gThpIF_^jDYE|yMLjpRU6A<6$6TXe z1Fmt&P?Q^hbdJ*9`7h{p`!{sk{R_H}W1?m|OtuDW`u@)Ut$#!J%)g*p@|fEG4|M;V zL^?vzLE{W2mZW0%-8e~SDH(9MM1NNi=}VWWvExeZ&0ph+pRUoRu@;cXJa^_?V$?tNN5Y?-{UksW-VV(alK+&?D%u>fm=>0qBj z4FPVBT>^GII_gk5$$M=RrTrXXcs3}UzMZ8%O65~L#?Lr%zXO(pL!$BWI1gWBRLB1C z@E=TUVVT7F&E$Wv0~XZ(=q47_5hnfrViN23p&WXi-UgU7_}`d3w%|W8N%|L)xBtOp z{a;LeI>ux;5dLF|`oesi$-hkelga=4J2(NLjxza|o7gRnFe&#JlUPuPOul+Lm=TR5 zRijLNI_>9ygB>_A63TM;GM@4NZAJ6!E^u->&2Dpe#>%=ckG%jA;2n<1&+NkP66*Ex zY{KEO1zQJRp4A4DEbGg`5Z>;U^8QOFC=Gkd;joEKpm#WG2U{JUrkEsxFuGM6fr+g5G=EYVdr1i_ zD;797DGUY3rIE_jwjC)3z-3N^z{J(q!!w862p^N|h{2PPKTCW_<$#t*ZTqXJkuqVP zYhHIhQZNK2uDhRM3B94HcR0n6mdY`A>|8jK%)n*;Wsx1fpP{j=PwWmT47l@art}4z zC=4i8ufP0L0HI}Kw6>}re+{NUk@toqAiRbn=foB|2 zN8}jF91+g`gkJ@NS@L_r1q+oUH7WFlg-Wm>+s~1HC?H%QvmuWBn2ER^gZ99mty*Y; zx!vs3^zCC#Oc$x!{c<9#OyYZj&@mGsH-MS&Yrrp^hi=K+4gUoaOC@mE!9YmLWTp}i zVEV1{DA@$TOl7jwUzPI!X8T_-jgP}D{0pYWZ7vwDpK&kv8f?Xqs^B33|bejdIL;@yA1-OtiV>L?r6qkq)I-?B7Q z@&6}NGcT}60uLrxY`o?Q{z-(r{N-x>BQWiO_#KBS3Iyl~OoqQ;5(B~d+3>O9`fot| z5e+sPSc^wuOILczf~~c@VDu2E_4b zU@aa`9>C~P-2xVm>lW+zQ9=BrTP$}!AJNE-(3z=(A2mTHOAj24_3MvHM&d7~aItC3 zb}(oj#H;BqBA5fW{!~jKy$t_?36!2AFgO0vt;=ti2kG_SfB=jhmBe4g4r}yR#RhbX zwRl{&SffV-!T6UTu-qN$b}j%7v-``m?mG2!Q_AXPna}73I2Zy;#f4W7LPY+tkEO7#acYxq_LhK(e3HK1cBx5P`4S( zj9~&M-;SEV7RvV#K+Qa&>`Q+!by9)31Go$O6M|*ETpa(izleys?N)ab=3m8*@OYE< z`wOPbZ!&*G9TddJPy6uSgOAr8eKXq$gpB6bCa!hsD zLP>$GnTL<|4wwQ)tmDcSxriMXE*~7au?Z~u7ZJ=+0U+ulFq!{?NqQV+z+W)yf5ZH* zK^%_;*5a`y-GMdwr<9rWF0krQ*Z5D&6F_Tu_T^SbLwz-F(w{{$8 zTBx&fUx#AiVh0P=(8h02EW5!TFM}?x1+v6Av28;hW zKJp0L0>hLlbB$>Z9uK!4VR$w73X-PYa3_z0S$i$yp5t1XQn#3f%Aki?WO8>onmD_MZ_Kpnf5azxJ@5w?~y*Mwf1~|_$kelb&VV{pVp?f51cl$RwNm8o($|sT7|dq zg7eMFIHejy#s~#f3lF$lBH>-Niiwx39gtWPbXf>a1_kJW!-D4t21=g}eBRsRtC1Au&f&0Y& z_wKD-lYlH-%S^$E?+=;d0LbydOi`pABtVgSa{;W(u^#1v#eRrV&ZPO@~iW~q4r33sgQ%K2Q z=Eeyou8=uF#*?cNZWyGDIu9?zF+fo44g`zE2s(}RYPQ{oOq`26HilKV5I04wp2i23N zsF!&!c8c1c* z9DX>s$SLWjpjr=uXbX2eRLLkB>W4bgH-Ky&FZgWhusc}i6;jC6CV~RK!|&&TMv!ne zD};Ch3#ha@?6BeHL;tHL106MSR4isnLq(Mc56@tn4C($3bzQLmhke3(ht`v$Q2a*4 zSkW{Ej};yT>|Ebdv$Av;9HN$cwY?H>j=0Cm7)TED%SG_1!hQ0X zZ9YM5e--ZyzpLBW& zOObk!fzLrZ-!l$+d`5POB950R+ka}ldMoQEu<}P+7P~%QY8DB7vH@6hSEIO}9ZBxC z0cEJ7nR}mizN3Nj3(eR|9z{J{#hvSmtsT28F2kJ@#Hb zX$I<%=7E#Telp(`{8G1zlk7T}9*+;=Squ6g+GaaG#>fBR89%GC#DO$0CId`J-6^O8 zj}Tg^9Ho2Ch&r(e!yhSOR!}ApF%h@W-(Cf*ZnoQKZm!&Mk)9;A`e{g*45U z>q7Oh2v}6)m~lu#Q{G1?b{nwGs|yRha!4*^g30v@W!s2F z5Pl}ARM&T2{MMMu?Y1LneqY2xV}%Hb(LxVk;BuZEtTT3wYgH_X9rVV$eac~?8K%*hM%%LBk!OOvXBRwH%Y z@V&e`#(tTf$@;Dyo1+%7dHX5iTN=}XOAZp<)LaNGQW$f6rq~+QIpD9^I zvB4yrLyaK+9S_~+o*VX+pA>Cti*U*;le@-Ciy?r%-yV>TGJGHlyapV+bJuMVyd z4^n#oqHw8Sm6_Vl_XPrAoaL4N-RnKwD}yXBrQCx}Iz_DliPxi?bhh+6`n4FeTXz8G zTc7$g)#IM__?q?d>GKBOH%VTc_>3ibwf|tD^vN5kVDnRD>uf_lzO{9vZKf!HTX82M z#wV7Q6E?9#;Gc}wQ`V`3zdN3Mp+48&zHv@_)ayup8;vQDq`;xalFI2OSA@5|86exU zpM3p#rG|$+MI_*Xh;gCdUPAkkth?!L_N&c@XU@Hf_YXP%%?(?IOFoZBE#GnzIn+)- zx~DH|*;GR1O@=&$vLBC+P%SA*)557a-};D)gZ* z=Da6GMcU3ycbw^pd$vSixS}XHlrDPIZ@%lHt%Cj-uRxj4hs|uC=^x#)i>{1V<1C)A zS=bC+^R}xT-95|Y{dqOJ-fy9#j>lNVRQ4qGjxr~HLtX^BQ>{e1K)$Auw5iXL=}^bJ zn#&x8Jv#DXnYr`CxEcu;%F6-;;Zx-Lu1{*l1b<&ZX(h|HC6?k1iNgT)Y2(zSt(T7FgFSZW7-dBTJ5XFNX&XsIPVxGbirO7~Kq z5kL*FrRFR*Y>Hs!2V9GF4oP%{d!M=Z9NnPBLY{G(UpS_*l$PS#dFzbECVl&HHNfjo z#*ByK8Mi%0Seb5XFp_B1_%HPMN~K?%S9BaCToOOL@XrZVt@cWI6Hy9Ti2)n5#JjbJ z!xMVJoRb$w;}zYudW7h3t2&v39MydyykeJdc@x1O!5~ zj6piXn*%bQ`=m|0)nXJR^Bz#)B5Z?j&oUK}0ji2-O2_nJM;NbRb_6;^Tik|f^&rPO zyEL&YpCDBZJ~S*?l7rHgWIkOD^HKK@DIlSHqL*ecIjyW@^*CQDCnKD+kbEB#_?nE%h(-{GPlT3!Rc1!q=kx{WEBTy4V zDX(KRGk))_jgEQA?4uWbho}o#dWe3zFq$O+N4ymYP?~-4fabCzB+=KYK44|@2m9=D zrU$4nRrFQs8IFfo!DGftK|gah_+X;!59?DKt?fw;Jg(PUxf;fFnR!bQe8bUX>--e0 z`76FLzK06QNtFzSLyL;omq$1Jv<~PpF&X9+)`m=V3i_Mfqcv)kEA`ZFIp-Ao@3zZG zGzQf&7d5Kibx&rrfWSgN+eW}!ZGk#@MrPNX5zMT-Mvoy~v5K+vB zTgr$)2HuQp2d3~?yTO+ZzLvP ztj{O%eQ-tB3!Z&b2g0gxcduJz1Iu1mHWduxj$h)h4B(V1~pyy4lDlzrmryR5eyC+byR=!Apv z`OfJk>!!^bWIk(b?v*#-nETY(lWpXkOcYXP;SIXEy~Vd_4r&bp#lw50FC(M}@+vVJ zg!wKgVrmwIYW4E9==6#WY1!yh{^z&m&RjC(CKj&^aq{vj&gFpy*v-?y&C}Y*@2LaC z@>c3GB!+lKl$9eYhk~L4$*X9UkPR^ zI&83#mb+Rw=PLdA!sTaLu}V=*R>j2qzb?9WEKCBdgYJJ-InVENmhFjN>qRonydGV; zT<-HxkzxV2zZ%83dS*GUvE|(?jycO}V1<#JlN_uT&ZL>|afi3QRW%s_#8i6lr&-1d za!E!^)qg#6CK(=1ht6S)y$^g^KPi!jREX9i59>g zoKcHpP?t4Cd27nqek=Xfr21pRQS*MW=h#6!iHzd4Vq)!(kg|~d?;s>%qy9cZeuWMF zzgVQx=+m)8e_;WD5R&r0qyI0Y=rsIvI?o^YBJuVAlGSsX;B+>^e+ixyQ~f6R*QA8g zET@dw=b=r{O($jE7)(?8`Oo?6F${Y4Fc6vRj-0Dy*gh7wha(&^XJe*j|d BWo-Ze diff --git a/spreadsheet/macrofree/waf_checklist.en.xlsx b/spreadsheet/macrofree/waf_checklist.en.xlsx index 03f8673f8a1c7bf63ae3c39720ef292b692d17d5..4b9d773dbb8fdf50d4646a54d3c474e0172c3707 100644 GIT binary patch literal 176673 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.Kl$B!kmK_jPN95i+}Z+S6#DJ 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 NFoJeP(NgpP_&*%L-XH(~ literal 176840 zcmY&<19Y5SxOLMswr!`eZQHiZ#sJoAl>=11o5dsQ)R1VqPbX&XGL!4C z-oLBC!c|K_P`-`}jd?2Bf3{5%baMb?Q1gsmP4MXAoKp0LV{Q(04 zy!X$aJ|X@85RC1eO#fgANszYgXFv@8h`ioN-4{m=-V@gLq+~_4viKz{ku@;yNm$D9 z^q{IU9ATL+J~8ggZS>WSatU3pg3Z7Of{trck8^Z_jnCblQYe-{fGI6B82V67d&Jv) zm6s{nuZ}klb`LFaJHsF+pP7M?nK36ma7yCV^aY8KBM_gI@)A)Js?Cg7O-~cVz^(&)sl$pDSwPx4(n`U(3~s!kuM+0}V&?=@Saja_%lzjI)rOmWnG*Ch^C=~dRJRxMD~ zr@pU5P*wdwjCNnd4-PdyOEANnw8r6R5CEp=fGvYA(`a-*^gGmI$*SmP1|C^pJIXH^`v!!=Js zZh7-0J^2aK<4E#2w-Nd8U8CQ&vmrWu`-d2uDM%>Ci1h%l+lQwazSd%zff^Nt>4xlG z&p~rKc8ue=4k0;Mgw#MmMDT@0rEd1Q?ugUHwgo$v(&|s!9HFZ1 z;NMy4p%0glEnKaqH%eW+)%(-#UT_}O(*0OFy89q-9`)$8R%*UvZiM1I)@)d~eS6!1 z*5Bw^%2uN&v3&fT%#azwHZ7-dUpQ!$77t>c7JVg#d1tkW+aoG$BA?{wZ^sy^X@zLW|mS50r)fF9|w1cGQBHCC? zRW?pyZJzN$LzTZ;`4^Atvz6O0`CR_jx2Hn!DS~&dTrcGdxDi033tt*?$?9zG{4s;u6wD%`;DYD`P`1j_tS1)UmO4CFMO2!50+A-ZDO(0vN?U9 z;ZWj1uU(N}pa7X)o5_&i?_#?VK;yT~*!eXL#V+6A=H&aCnYQ|#IVB4056ibnkV2?xy z*2s-=;jB&CxR;E8@>^H|8$c}SY!1{Ey-h^DdRGcgpk6>gAm>Aa9@9PAT1U;A9+0P~<`sl}!%Y)>W&^kkFPPA<%57i? z5t^i1av{qDl&=c91HwK|h#&te9rv{q1jv+It6(0C~HPi&;APQfPG*8OTKer-#- z2K7ifX)R={v3?AfnXT#ZRhr6KXUu6G7A`QA-we|6UsE;w81{T+&Wk=Tr6S?3qYNb7 z5Aa3ciW18=c-ptj?m73if@4Q*X%P=Br!SHEjm#5DwP6&RpIweG#d3%|N@-nwQ2?9u zqrHRw)MaC^UkA=Y!?NG{S{RFru4J;vA^tqENm#WwVhoLUy7CG1Rq+_ww|UVt?oo~ z!Ea= zM%nA3V_K^e-SqsVIz9pv3e?z@ZztxPzT;77ASMIK?P{}{7qTuruq(tXb;}r|7KgIz zeH}1}yFpVF1V0WMom+JgHbii4$L8&ca4az*$} zuTo!OeVTFF8H!R+jccAw&1 zit-m26uqccFJ0lBTNUjzd#2>gRjFeuHtPOTDby-nisw9Tu^B=8$4|9{!sO8Dye7~f1I+J`1rlS>%9wEx_+rP z7z$InS-n)@>D#YQkjrj6;rC&!77kG& zT3#7>ro?p3GS6a0ik9nWfdy~$ann}C3XDjr`{`xIY_Jpaw_5U{1L4q2@# ztEcWoW#?9s6N!iWDxKzo9n;I49nOu*3YXf1+=>xx?cu%b`@oGFPea|ndAzNxYxoSk47d_O0O_AFb zk;h!$&X!>&T!L-!b}aD>4QOy0O-Ux+N>9UP;?=R5QwGdaU_ZEUwckq4>ggABT3$qR z-bjCKSNAD)OB|h1{90a0xSS)zzOv;w8UB_1#wE%sc6(f=*e!o_27%q3$9O_@w+V4BCZzkK-)vU2pd=0j@XS5s@`yD#`9X?0Ri9ynXz^f-*55JxFJ z2=TP#XIjo%{ZY++p>KcF{c$g?Eb4U-H<7Yi8(Z~yy+4Yh=;wwq!*G>b$+~KRzDtnsR7Qc?lQ!<6k-PdhSB2uX@>6#}BjLHgAr6pFsmx-!6)# z$M_4k?6$Oj73In*zn^(*5$A3Z<#r46`E4~_p7|(kyxh55CY@{+UyQDJ;CNoPdRf|g zd*r+Qp8k2{HgVLuB21F|G3|ZvJM)!%nm4=Ji(@0D{YN>Ggk}#ed{r z-8>B+I$zED?3l}>8~1%iNyW~8aP3RI6IB{x}tDpTgvL+`pcJrU@=)ceH87qvT1u(;c9rz zH$NvUd^LxorHjEK3j4!f8yvH!v1F7Utb!t(e#?q>;hB`>{l_gzs1*OTYHy-ZQFBIf z=xqH>{rw(a?FIS+m%bt8292dgySSa|6Ey`TZ>n|`-4%2ITf{VnCS2TGBCU^b9zGG3dE@$L7^iIMS4JMuSOsmayEW2uJ zd#F~0tnl);#_KbBRkt=LWg4+zCsfuAECIXrW3sv?9d+sVP1L8E-c~ke7fGs@ z)J=N`Q%)q8C-QGeC4VJ-4=lV%Ek$ zF!<&`6-~Xc*UhbC)!EkR_ptiBYk58;cs@0)F#pc*m2nlwH_h_s27ZXfKjWzG&2)Uy zc508*nHa~j$$ubPF>#h~6!}nLX|eM>&bE{5r9YXoj7GtsMe9T z9;?^3)-7`~TSjjFBZP*oAwtInE22CHhOwlfIX^0QiCTKb@d1anu;A(W+2Q$jT>eFx zBLpus(+SuMhKV3sx5}N?k{ztf#{~01-%3_qw~AkeF+iJ1%sDImH|VqUwnJl4mircs z7_AEtom!!;%spYJe;&@7m*<_gpb1{-QUL2Cj z3$x2-|J>=SZgh&&;slHJ1;wcJHVuTXiYsCYTBjY-!U0W~O-3J1M7q_V<{@rkcnQ{^y61b)~7~(VPVA=n4$mWZuh6gKV!S@jZE{bWnNx# zk~d8OUp#mvLB3C89Pd1voO21m2o%V7(^zU470r|6uD6h&GkO-8#`$Lvp9}})1>?Hz z-ic}K?EE`F8|Tig_?%L#%Y*Jz_^y_kJ6Bm|3+vP9aIK^N%mutb^nhUG+o`y zcouk2{1wS~ur~46KLA+&0k8^+M;{i@fMsj6#2mXavyh!oc;;{D-n18+nig}Su>dK| z&nJyy1~XM$u!4mP(R_{^ny#B}B4IRzNmQYW@FX>&A?9((NPG0f1Y7lSg&5RS_zNH( z&PWRv)P!+)8sJFNpOw$bBK*sqM_f1nO_^K43p=VJPd0;7IS);>awtc^rU)oE(~`{S z;EHnT))2u;{3Hpdin|aVJ)iO06!X?*pN{jkq09bvUHL_rA@v;L{09}hm==s{igzZa zSCUHa{M?lm?I&w{Gq5AEvboXC1+$o(i??aYR-J>CM_YUE(cmU`x#R|vbFXNALdgb& z53qcLls}6eL~=%sJAs`PbwvLsXbwRR=t}}BuxuQ{ylL#yVa-C;_JG-s(l=)eFm)N( zfrqJ$+GFU|^bBq=T}Q=lgQ7ENOa4{C^Kft3Po#&gq&Bqsq_ung97aEmMLFHPwc9`K z799UW(A+3^9BJ)OnVEZpbKTiQr)O;uDka04mCv!>DR${=PW|4cQ@Ndji*2~@a^6(o zx?8_TBE@<(0_U;qMh9J#j_urAG9*N0VQhARN;xQ+kBSkZq=S;&$AqnDD6bO@4+S@9 zkTAnQ2<2SJBkj!Jq+F?(ukder_A)_*Nb5Y3P^<+O;z5;l6BV&MQ8@G@r==?M3aNAp zC~c#@8Ut4VIxA`dF<0rmT7zeh23llRx|VZq+0bW-|K{Bu5Dh@V0F%=Jb?5`--$QZ> zPa7^hE=!Ca5Zq5BG>{x!_dl$4)$Ipf_0O)VLH;O90wl2YWtI&Qr7a_6de4w*jrMIt z{W#)WT^?R>oMn@+e zxUKsKapj}gnd#E#JXBLsa3iZ$z@>V+1hqHrJs#Zqk|Ky$gSD*~>SMz!Q`vSa+XmX#ZJw7qjp0l!bS!55K3CIGa&Av8-^s$J=BJs*U!CiE+P|vQm$WO^ z9n^JnnajG^5s6Y-wzk|Xb-%6PtD>eK+i0R@?Jv6>fRTCT4 z$3+Ky+5)aI9FdegoFV@@4(Jp1q>3=6ATLd4YR}l?;+v~dX{D?PqIOo%%o|lIzT@2| z)EH(Bq`hyexZG?Y3;-7MEJo%Q+6{KI3cufuw67r>Tbgl=Xw=TI`m!u(!Heu=*jo)4 zjh}ED7@6Im{q_o8W1?=@s{*?7@gFv_LkC>yF(0#%MIw?C$KCKQln;kwyl$36pK$&y zAY;%Y&XT`>$G8zdkVAN_pb=AeMcL#v9MjKpA5A>Z@wjP>hjuVL094DD1r;&(NGBQv zdZXO^s9-v#wCMQxLgN_Rc69vv=ZzN1Z+pNOt^MtoE(U2DIiZx_eMGt-k@ZFWDy`-P%vUQ&{u% z48#~@!MBGz?~B7W^l?vFqr)*&OJCr+ofT__=0jmRmo*x|ZO6yI2QIcyYV8$R#8?Yh zpV9oLye&CyU-u8^qa~F@UmkGdIRs;gwS9vxiYj3JH+dd-K5G@ovwMc1?4I?X$rZ@i z#P5v=4mxT#ZaylJQAE$1x=Op^hUcazG-J}UZ5OB+gIxBsCX;vE!CrK~g|A>VSsu>B zVA(HZ$fXPOs~x=WIJR$%w6?D2DVphxb+OQj8qPq@*fViJIHf=T@(sO=IUkPkqM4lQ zHl1oI-sUOOig7IDkk_9fETg$4o@CnfvXrt&cSJTtB8eu;A>c|LlG)NO;6V7Rlk69Q z9C6m9hI&TpbLlzxwlmnxREx0|PO79Yc>Ef2?bLO%tcTxA`(9|*G-RWK8zThI%$77a zl&LUUM(y_3=nSi;cmo$1;F`M((v4g5-f6u;IYVHSfWZLeAn-X7T-m{!K592x#1T9+ z!<|&FMH)G*)exVYG45Wwm=YuSFHQS<;dcXhKud3k`&m@Y7{-Bjf(58OGuDiBEZf(x zUIDGHpy<*{h&}?l^P;M8zn7~T>>0h2TEptzXVceEO@3)pzm;0|RMo!c^9g31bJKq` zYc?>uuVJq?Q{&zInMEDV?b+gxX# zIo{^iZ(RQyFf9%Y3H55Dt(p%hw>U$s$F?NcNJ~e36?j%jr1v_zp}qs4lZGc{%+?4+ zasMKkCPG0R4=DOAQ+*D)@E<2Lv!#5I%Xz*0EuA@$(~o3U36&L2#Ml&aeZF%B3F{s; zfiE_<(iM2VYj+7)i7Q)3Ra#SwdRXnlYSgkME|yhRt(_aKs^k`Fh!o!=q{2%e}_r7(y{` zBf;+70|0cKXqk>oI=KkOH4ylU;O@JEV zk`h{1S>B<_y|IXs`rfq^n0qPX@*UgV?*$hf%j&CTSr}_*ze+fsjVj029qg4dC}zi! zg0GN{WO-#V*$e&|?AOHD<~<8^y#5>v2q$=4T)Me5+)`>SCv4<{*FFRCpr2*ty~q3^ z^&7Qct{5wlD4hgOMa24@HZ?RRg$+6Fp=r#iVIxXU__x+8ILg_UtkJ&gbI~qMn6n#g zcj#X~hx%<)4SWxGe-M>I9TM~htVUFao#iy|Qp@7_-YC#aF&lW`$Lz7l;qAKXiIrr9 z1K)bO*j@`ndu8gfOu<+OeNpdl&;5wtxO!lswoYAX` zb@B`=3=x5YHeqC%)nD!c0)Y%wgYn*I5sT71M%!mR&NgujTGg%;l1KgPd$7Fmc66p0 zb@O6u6*j>a4D}8drjhy-we0hG%u9Wv*CuNG z_amuGTyf^OO^w4D;S6zm=vxbF8`oIvCa((nOpl&kw8-k{@Jn%6t^0RGFlt^S$LrP}jt=6=efmbiQn`fdJ*>b{dqffjVmDMT&u0^+e5AY+ z3rNnXxh3AfJj)Nfue6JYP@aF&;u@Y{<|v9Z#8Ii{dsFI8HRk_j;O>h1=FR~v+;3g( zG0Dqw{4}lHkR&~?Oj|5H{pF%SZO_y%V4Pn3HhNPdXGYjV%pQ8mf||$Mg0h`Y4%?X= z*7xfV>JXuA2m$JAv|~J?QCUxLJElUtGZ7kMOK<_H>~Kd*Lhw+-OcA0oIE*Ve>`-Yk;EbPL!{#g7DT`r7@{};~R}T@f z?1MCAY4W+Cko*Cce4gJz_D}O01Y3&CMR12PS6R+(ifm`GGxK8?r#mpPR%6!v*fMaS zwK7+~amYAjw`o^0xLKRA+Yl`?FQ#i^gtrfb`3_T_k z>fZ<`O8-j&9D)?2r^4A|8CxuW9!RhKVC7KmX@DWBOJX~5smCGXVqu)_L}FV?&#F_X ztj)&+l=50^v7z_S_`kgdUXX)}FF`-nSHc zi0%rMtM;LXg-6rS9I@v3zMQj{#8{o>1J9VC>&&GZZqi!E?2-gK4E9!Y#^2Y|;y-FW-+ zGVYaWEH--AxQ;sCfO?@>@baOm2SheZSk&pyJq@EVfNv|wuXh*k%r(%mGv{5tJakm$ zfl;ii78BTTXJ(!^FlM~yJ0dvDw*bOyU|OJA2x+cAa|Q`;6e#>j7F}F>Tu(*jh%eID zBPu_6OFEJ$V7*A$_s^iW8wf%irAS%0hKm3xIJ37|wqN6`DiD}j^^32qMjmu+Lvc>_ zMS&icTB)jPHtD#qV|Z+pmiL#AHd=u8J%H%2Q8KUu_y#RjTE@#xTa=xprav=1!*^6$ zL!bDfM{Sm4#F6c=MZ~k6%t$}(TxJ?X8L9YB4d$?e6_rTZIEESkJIQ|x)Bx+!pe@lw_VG$nHV=!rQ8<%lwmr&bT#ztS={$%*}hiGLWU}gFiwq?(4g=5k<_p>XlS<1Ru z7zJC%A%Y+zpp$BB>j3kc!rLV!cxos6#*>g6N2-%B4s)S0B|EUBZBY0fjlImgB+1L| z?2~vTDPe)nkT{_88b>ic3M|Q@g(@xc&#?Z^$6hIThQ)fLw_WQ)QAQ*HO^bnyxvnWskX9-l$iomugVvyp+9zb#o{1QkFo|E2q zkj){P{pgtO$USF9Tu52@FAt-&K&%vr8K2;Q$sD5X>`>K$VG2o64rAWLhd1xRys9eE z>_nMslBcd%EoZmCg`}>MZqJE6?K{hj31+t zimR5_3ZbUtgR79=*`~J85H(?#Gl+~!oS73z7A~7=?k*D!Qk48WQR$PMv6e-^PGckS6 zZo@MQOOxAV0e@*B<}hS*GdiRX0*HttQJR@Glu^69|IHbAy>1|Cak>(cFfHT(k+8q- z>RgY{MpXK}GKP^8b=0Uw4pg%$FA){%B-ym@h$q=B$S`#`_XSRlIQ{4RCLpxcmaaw| z-7~{{KvGL%)~~9z_Kn9_cwx;l-Zkz(ffZ6fz?xjE6u_`kais&x}rkgTok=pUMgM;I7HtkZM^1;@S3)QZm%` zHH06)#MERkohY`rG9Zq zxGe#z7LQ3LbTEhbVIr2_Jc;{;VrR*bb_q`Wt_>bA-pTUy$rCs`z}ng_)nx>A8Nz z3xe|q6FOShe8XypCjl6T46VqyEln42jSl5|*}YM>t`xod*|%}#?+db5867$6q3)68 z((yih5P$!`Ro3I*lQU= zL^ZY(^sb^!mWUQuwVw4k{2-qUt?0QO&E0=f2Jm^KK3^#w_p=KS(8QkothG%9Q(4x< z4-GEz6~N6|4X`~DJZ{%&7tTlcmwUJca9Ud7tDizM_h3djU}y!=Wq24j$N_ZpS1Qb~I3rxXNXJL; z=>E7Mj(T1>4rym0TWG_vjrd@_lb7{dB8rB^Durm!zm?6}0%3GNdksYYxfOQHHIR|# zqY8sG_DfPG(S^tsubR45`31@HE?vGJr-2G_uayzE7hAH zF7>qazd7H#@r`<=V@JB08(ShYP%-;KpYIelgvHI`cLn^;BdW*RE8qq;m468DGPpv< z@n$++gzzm?X+Be)|670wJH+!H9D|S@GxnIvKejM4hxH&PG4S(i_cWSnWZm*cNWje+ z{HTb+T;VO#fhzl*1*c(o>t^l=!`MBSi47f+jvbb{szLhYKaU80q(t5=lnA#M5Xzpu zUzb=`gQw!6G>;x|y+EYDwnz+f9JtRbh$ANYCw=qaL_}Qy`j~cBbA<6}jl%X;q15OV z{)&6Gw1SslwP$0+vKSFhh@%ajO>7grwUH>tzvbvGC-oj|ox3%!$@LeUQT7n@I7Hki zAJ$S9DL0=eb&Na5aFCR-awQ8gHr@oz#1tv~M;FvcU@rKL zGGz8oE=W2L=gm!4MPL>Th>#^-G99?a9ga#2hiGLZOpjBd{AZtIa7D^4D$CXLT_zOE zvK|AQ!!>KTafJ$Ay$PZ&R}?7;p3wCD^Q=AkYP+q?t?tlkb2n7&LsiRy&ARX7%SvNH zGMIa*KXsHhK1bok36)yIP+OhuWJRAz_4UfFakHkd8n4sYo8Y`l3}I~9XQuKlad%Y_ z%_5=Tm9ymDwvQ0oK9XdBfXfts(}UnS!YBA?VpMc2+lH{pOB)`YM81pT+G;r+QzUSQKeM+U` z8bf!NCIwM!nT|)k{*{cK4+Qa9!REJqQOJjyP2EjtSE~Aki@HmMU9i1}el07+(!6J< z(-`}YC*DX9ndhGes||NPrma@EgpWCgIqJK<_i{3KS<#xhnY1liGpkvfDR%_V%PHx4 z5EoK`waG}U>6#27OiXBMRr~qNyca0H1oz#1K=A`z^phshO3-uL1G@?|L8pXrhaJT} zr}ZfgWhX6<81;RRH!USt$>+n9@i&tCi)jlDwlDcJsF<-U*xc0*kcXw`&%%r;Zz11J zIV|EJ-CAV_mWkKcnIj8X7PvEb1X5GPzSeV&U^`ubo%=`J>Tb;6{JMRmU#@hWT4SqK zt(8>w!W?GVi55k1S4~l+#T|^4mM1eFYb4qqB_HhF$clSdjO2BWP-|R)>GAN_mo&vk zq~Ub%pH&7txb=EO9~1)_9Z2=6;(wzIGAa)S?n~|5$Mdr@oq-+}DkfdpXlf*4O7rkK z*b9FS9}`Bw7y6$9z7zUVGYE={t>q5M!nJfS{)QXm166XDm|i4jRT`p{Q3l6P<6k%$ zia+qg*Kjr;=T#_!6N5huVygUUwIHi!ayWvwcIBiG3YB=dzv;3VN;>WKi_+NCvkpd$ zGqnzw+rls?oDh`UDEkwu1c2mASt2_QLxtq8K;>&DA`SUu1xubB$!Hj#S){#uM$H%c z7aQ3j^Pyo`;#T$n`O2Ud)vTPtjI1ka0pW&>y6Jc{tEH;JG0?75LW8HO$ zZ*pWNZ@%WNr&koB2cv{{Ae{r;PUi~IIYb|g_mE34d^ef$#qINjOiH{GHVGS0B;(`j4ql3X5xWV z-!e` zuuDVUmdd}fT%XUQ6NGxYMJ77_Bkgy1;=RwHL#D39bKxyO(zYoJ*KXm5_*wBt)tBVw zD}d}u62Q={!;wz&jm*Kt+R*B0VSq}K-CeA2mEJGSaqAjEw6)c1KVQfd=EjIiTDY&8ryBN zXs2H%gOlfNWU!5b<$O*ljRi%LiGuwDB*Hc)Y3D!9JYPJMyXWOm6dP%eS#AzI#C0vU4uk~+Vj^vNE7 zxXg2V>@m*mcdZxZ>#S^b^Y6zV#ii)pY)055p*iRC!G0;6pjG>;;C0!bPl>}0Qrp>! zRYz8&HssXvf-DZ{rhnX;%@4-<>Fbxt*)LJTT6ywf00@l@6&e`p4WMDM^B64r`|<)n zz#HGz9c>I3s_gp%NbwT~OyMO1`$3sE;@h=xtG?;9^W`aEi*It7;>AHVNQBe3BjttP6TyEr3oumRd|7)&zM2dS zj~gs#_^ndzO{LeeYEX*l_0`$@qQ~Gem>d*c_Tol-1`wo^-cm;N#YW=>%G?WP2e1n1 zD1So>eKf7wO<)n37o-pG=3x7j?!fJ>19H9 z8|>Bp`t3}3vxF>FF1n-_CC961!2ZJvg`OwG$C1^{9ciUfudkK)`0LRW(qll9I18y> z>SOSshltTqQ^XV#{XOytm<)Fiq+<5J`{oW3};c4 zx!gPYzJhO*gj~~jeVVjex(-_+eVS0Mb?J~Tf+I($VzcljR{51 zt&BtDMB0rT9jJ07f46>R8=S(UrTxur{>txtTAwZhsxV=8Rdt_M&Zq4H;%HZ%dEj1DmOXa^_d6@}51K3en zomUAMVT~!2l^tvg7d1#7*4|HCNTj&Zx`^au;D9vh1?)w#H?+v8Wkw0z7;KnJ_^k@= zF1yU?qVc9t&}|mS)r>$LYucW>6+rnpj8qEa3|t+uPxep+n)}ON*q7+E@LVLGex=&z z0wEXHar654z4_ctd);k?(O5J(>g3Wwg8CFg5g#gzsrnqwU_vC-nYqbu@@HJS7mpHa1qnZAC!MqhYSQ`u^iduL-!%?7G^2k5WX z)I5t*jKBO1wCLNZ``D&5Zwgk3BF93(brumy&JSaSXH{g>O0ztJTRjA3KTU#&(p(GE zDxep%(EJ7SAROed;y_LJ2Ta(|P94CA)3ZLLf`&DPD5G#}r`L7j9W8gzfGFf~_jqJ?o&5)|^l)!0z$iDxFR2FG z9rc=IeO@Lu){Z(SWwFe==EkhP^FC!lq#nah&^x(e^zLCY1ZvBpOV@A1ckyh)Ev-cM z<#2CzxiZRAv(jyPdKJe*seVb~m(tFff-+90xJZEZ9F8#WuEsX{ACdXIo(U}vxjgG) zC9bS+pJAC(>cU4EgoBN#lL`)hP%9tE00|{KAV3#^N#=Ow)pcY_Gc6tiqX>@iR|UCq z1!3(tQhHf|YQndNsiVy3;&dwjJ#ww#RfpmoorxK^Ly%f*@TCdOm{@}%DJYLtK489a za#65?>i|a$jcmZna*{~m@Ysfr8eGY!ic-v`{D>}fam8?C?&UW`*l25MfMr{?fdU1! zitzmH;XOp9EFqT1D+*_oM=RKFOhhjQZY-A%Unhb{sqq{}*mFs0?uGB;`(wkr%(G(Ubm%wB~AiYCYyLcB}kHOC931Goa2bCF-qRO_?l@5e_M*86!w^Kgp^5< z%y3aOFmV&_DYspm<7*VAwEi!YM?xsB@2Ets0kt`DSaBU-WbeK?bg4+?bx?8Y{Z8V$ zgjVjhpf~A{9WR-T$X~`r7CP>~ydRu6{Po}oRN@OwD4caVIWO-Gx{^Y3B8-6U_};rs zytEXmLCszqQBJV0jDNunfZd-fzSe@{KR&>*qxr7EoPBX&h#R6v&mK1l9d$kk=q@p?;nVI6_5`KqlAn7+dsvXURz8;NR*=M=#B)-@W_Qdmy1R9H2V4SY#A$Kll(Bcpw@v4 z2!I7lPJJPVfJ}9?mEia*_P)gUr$CPTa6G3S2=|kC(ka8r^maqy!_S;c@TA13U&Q}1 z+SdRP5?>aq7s%+>9uCBHm9wg3Nw3AhB|6IF^m78X@p7lZQ$3p!<*fE5-(7F(@0nd> za1Gp~i|MBc%>Em9fYpLTsE|n;P3r|2U9Y^&-^yO=jRhsmVcBdmJSEI|=tGzAdvA>k7- z?llKy#TL+yHqeoYnJ9yiGZTmtW<|P)SF8Bu--0x)l4;ae zBl7pHo-IKk_Bv#LHsUcQBi*-fm48^1Ve&j7Nf~}4{V9_`P;K%vS_CfRL8Z(w5LUut zHhss|qtUB^!@kM&QEcdi-!d~Dw6aIU#6>6Cce};f&Q>~HT~z>ea`;G#{AcLTpR&ta zhj-!bWGDMJtzpR$vXJGrPxEIOw`HsBN$6N~L8h8BW^9(cKWauMLYqBgf)(wQJe zy)uh?a-iA#az@R#T*4o-BiSDay~p4SnEOA&2cs=q%8OHK**<^ID=e+GVEvCwl|bRJ zj{_+5a4~&abVO9b2QYX?f(m{ANu+qTIuPqDwXs~BlQR~f(1ZO~>R(m_{asklYS@5M zU%&UsTDf*|0>1~>8`FffzqHm^d!mm zqJMd8#v6Vg1E}i)K+Bl%#@@4{y%ZfVC`c#Bg!0gGwF9|pG0y#!EVdmC$6iR!svyaY z(jLc3+S-ZI$=Zs;%E>rE`@gB3%F7ngaivsi;E-_>&@!Y{g39KFfSI;gc2YqTT+g z$p?`&$XA7=Xz$X?eTAO6dAs@Dq0c#g+y%8~PUW#1++B=v8w=~x6sf7+?sE3B#|6r$ zyOhRBxZpRbq;W&J6Zh7|ZN;8{**eZEVGnaAw0kBs1J)}C@H@tX{n@`YkKch1a>LqO zZVI@!?d6~Say(o_cr6N=-GHU_mf1_d~7s;&f0WDn(PFdv;eO4@2~d z|0yGssd1In)(Vo8aN85~_Kc)?D>5QEx7Jp3$eH>bxGf(As7V6)Hm`V4U}6GD@;(+^ z;xdfnnR~XvT7*P4I9)`?vT?+D$ofM=EI1h1zoP?%SYM>Xlm#V$rV?j{Pi8^0X2Q^B z@^~_=R|?XQJQY1WHZ9C%gmMa~UP0&0v~_zg4JFLlZo^+m+lyOM_VmfrK4ny3n7doX z;2F|jL9rdD$qY0rvtmsGNsc`Gnt2}8gWxXVV^r)RR6>8oR(Br0+?5^)+@&^_x38l_ z`*%J-))f&AOSXs@sChE3xM-Htu8B1r6UcO+MUdJ`YK6$@>^qsOH8Sj0HCGpNKFSWD zye_S+Ur0*l(5ORFTb@y-DhO64Jt1H|*2+p24E7d^3ATKu38Ihr)uuGy5WIUehK=HZ z{hJw7SYW54d#SVVlZig3y;C{_(t)Iu5x;S88y`i)(NJ($LKYcMy^l73oB)W#-@4@J z>#pD@6CN~wUyVapooatH^2#CwURM<@ZH8 z=R{j=KZ;N?I#8(9>h9<}R|I{)AUOQ{tz6$oy=TUGpO;D*GA6JXFehHYS4b+>SPs5w zK+~2lf&>C|)GB%KIzX{L)J2bZCnc%X&0ruO7fF#42_gZ~>gAilieo;~GuSgj!rqP^ z(9P<3Abk5n?VIQM(Ivm4L^d`x#881La86%1u+C0K@IvjxeX6sYrN3DEQN?^S=n-)w zTsqxVfFcKmxWZIn?%?g-Q zJq;=51B`SlHuqW=p8g+G-yB|d^Sm83Xl&cIlg73h+qP}nZfrYg?4+@6J897HJ?-=R zw(sBPT-VOd&fIg)?9P06P5=$&S=)8+$`r!%#tM%w-S zP*^1L%E`?)Gwr_?WiH^pi0qi>XyWKxS;^xp{JfMmWkwSPB*T#g37iBLap0%{^%1}WocV9y`B0}+Qs)X28PcD7a4X@`6>TMBO;6-?Os`FQCUDsQSngdv0a4UHL2mjyMG^$l?#GoaU< zdF~1V!CI9Ko{?Wauiy+%g}?OWrK4YmbnRz7r?fw>PEB=$At%j^QzX~(3b{5q6UNX}&Yuuw`q z?v6anI=_*cgPX0V2;XBQlZvbIv%@|Bu zp^eSHx1D66mj85b*wE#94SFSRc&NHD8}xlfzv@w?MeDVIOU*?!>{r#b=2T5@SvYxs zfd#WTXXE0YA9CWb`GG&DX*7(HyzIhHYrS_vn&ODx8|+n9X~O#OcgU~vM~*IF_`$nH zT#e5ibW1@PkIor1%y#dP!`WPbKlm-{|8rmbK#mzVDsqcTzmk{FnQyUy!ZL%K;kgo@ z)(RI(*jsF?oYQZT8(&REe4Sc9)3EwyWt@f;rPs*FnxA-D zXZE|m$n$A}1=UC3G_?OY*Q3Pft#%WNeC1WNF&)S-sV52+%p`}ATxtM^M9MICI!ZLC zH*Zu81~x4lq747|QAGjd9|_33CIDg1k<`PYZZ+!LyOvU7H13NeTck}a97^G3(dJvO zfAXEt9<%<$88x+C_;9&0R^hOL^Qe~mQt7&`@N=19Bu7`;jKK0oMf&<<5+egAu~6xKP9sd8 zRT{mzlHFR6V42^l&xU=8cCf}lRX{(v=!({RtrCHS8m`6lVr=y7Vi^8;h64aGIX?r| zFvdLrFGB~F+~icMO!#9!QoTi(^B%2JH~=rZAP@@;_=p)%JKeDcZL-K>a7~^!aX!)g zg~yz5t_Ol$MIE+L@d;L~+F8PurS!78tVP)l>2@%(&Gh>LQKbYm5#uMn6HzE8&B zhvp0|i7vQnnRTPBy`%XBG;p?4(h_@ClWNb{_Y3jI74FFqJIMZFtnhYv)fdg_>-i+< z8okGJEA4n4p4dn4+rnJFcvJV7kJ`GgPCTFcU;G$yI|iJ2Qf?U}a8%b!DtZWD`+I3 zqqQ?HOP2lNjlf7jpJ{ekj7696!eKD2CR;>8?F4v*(=O)2uS1G_!9R2o%|kJBiE>(n zeQ+B^``u{6aE0ePFEeTM#a%aP&LjTWodVUB@GQ+qn>_+J4|y|#YuHL0VoGbw@ssyf zaap!#HCsbtx!M_+JOg|xT5IFHB)O~}LKZoF<}sKwtCkbU-ZqaRXZo=YMq>maybFB; zYvd(2VvYFgd8J9+(dn|n>+52BozJdH-(c+1q0h}-2maw=g@z8{xNYY5JAJ;zoO_r5`3{E z?{+TIofB++-qQ9n?@m%La?xk61;m&RLeV_NITSooK=zqv z4T_q&JgNuhSiMi+w&^}qbX()ZSN1e*OF-6jfs&{=JRoFC}Iyb^UQBLt1c=b1n%}M(~lCU>0fKEiwgBrIF8x z3Co6@HwN@lifAE}A~fJd=XT~XQqWo&7DdRBm_e(f<765?z?N-BF7D9`DVA_SFI{@{ z{pD^r4D?<^%F8vC)ZPHKy$qv|ca|+mTORbIj8iF3CAZ)$ow9z~RD`_z2w3MeC3U zo6{ywFOWr!|B3X1GcW@XY4r#!;kQT+<`fVi3;0B1X~Y`@brU_1H3j34D}^Srb*>2O z1)BnKanFeD;sclRY?I6DQZDQ%G5;;y5oy;UWZw9D=`06E11Hb~hujDsMkw(FFenL! z!zT%}gS;;;rR8dtt`vYvhyT>kfelvld+iM{8f(DXE~X%JMmhyo)IN;`_lI}8cF#Cm z!rSxn9uk)6s2@vRr5OiF>8GOlCXgRi3SSpKb!BX9c7M_6I7!Lcht;=%;%4-61Z%@A zw;E}#rsk6-ca62HEavRqlqIT~iVcP_Tz8tvPe3K{PlWC6ME~S!2N^ON1v!;L2)tf) z;5KOdcG#nd5L5icNHV}*WFt$#in#4czX>*GfW^|xl%3xT`SUhr_pDTxIZZ%li)nFT zT^Cf*HJ8LuCJasv{&02c2s-lm2pNl<{-X>B#a7V|Qy;w&!un640dB1Day2RC&3oW&a=vvDS2+vA=q&iOS-#0r#J1=u~#o^1`KyKCp|$FE2>=0kU?@5 zLt1xM#^Hhk7DSSVd_RaQDK8jU~ zB`rQHqb#eMxqE9o=Y}^BcVG`U=@99-431Y7JC?|ji*`k5AwL%xT}QKp>Isl&%2bT~Mve+eLoF1=;LfIYzyn-uClgH~Mn!ejUmW;iLhKPTW&aG_JzNaMFB}@b^&57KyNQVQFOe1`U{Z4!^kP~jF z12m&N)w(f`b^~z9e}j*5KLWQYlYwcu{-zP)Y^aPEcOkHct}(^%TEF9Kg&Buier%{? z4IfMRh@^i0U>!Lp*QbgWnygZ0)}sXDXtLAk-bUl=nv;ew>;yZ#r z2um6YIx39EK{h-b?}=`yj{*U4f&(fJ;XXmM7EI7@_kAOe5Ju9V&s#3)>nsXf*NF@+ z#EJZ0e^pXE#x;8KDmQ^F6QO&=>OvY+Yh7ZP%%_YtMex$n?VH!qbkCOEnl<743* z{ZK?xPt8&LQ8hSaU*bTHlbs21Y)Fa|>GE`cS=i~#&d4;9wHGxsJH7Z@UCZ~DrmYW(GfgO8Y9l*6=)O1%6HxM#QqGy6=BgmwpJzVL2!`B8=t4_v zh38ikl(u&Jpuh>a!MEwc6FPXZeqZDU$`WSg1-=9lbu=@xG?BzQ1A-}<*b6&Em?X@K z!6{Q=4@K1U6tOj!vDuD8Ei4n|0gmbA1c#B$?j&_j8#3^TUo)`SdFmr~i*ollH!yX= z!3q55pgg?{Fq7#~z3CPV?g8-xS!L^{jM{3F>_8mtBwc)+9Un9w3F96X@d#?bfUaQ0 z>ym;M!978X@VCZZjt=YombYNVu*y_TY`AgHN)OSL2fNwHpCsZa-0C)kLOqP!rbs47 z+iBT>hAuI{4N{yF>br+Q9y!OE%zR`&Oc`&Oh99(SJb7lo8&pv(X_1D{<^K!r2J!t2 z0538zE$=moCl=sVYE$=N*$(0CAZs~ZP(RJq<@3>%Dx;+l+aI)lk3z~f>?@L~`Jkv| z12*xq&T~ClVU_L(^Fd^CXA8ei-wO9C=Ckk|_@=9-f%h<;T4FbHZ?+XDHNj8k70Ek5gz<$wn= z3q^fy81c(L+k6Nm^qMpZno2w&Z48TE$#+T-mX|?1mMKyL%G;==?Kx{K5v1Q$PQB=4Hm7%XT zL%C9yT>Ca}qEsv#-Hx^IG3=#I?k1NOK!-n$7cX~q)o6NuHZMn=WQX`+6ffQ4)9jHsfaOa2F~YOskl4e@QjZXE{Fb;evoQYd z=vj6MR}`i_FKWTjetmK1MU$ z)>9$Tw0)vzmu9U9))Uea#I(!G9!6xHE-Zvw4RrpS<}@3r){vzwd3DcSPVYQ)G#|aY zx&-JS6pxTJABb)5OEKJyU$1tTiK+faLk;fxYsFld9?Z&n&F+au#gy7YysS##+Ru-) zWuwWkr?sNYRr5d4b2mHfxv%UNDv|NhMhZ4{sv#D+!-;K|n|)|@5ER?$bvEAZGyBA9 z^g9iQeU65;0;LJ&Q!3UR;(AMH=Zr{fRB29|wY5DbQwcj97&uNRFc=u-+V-0Zb<2OIli~9n*wZSoDr~ewqGLt3FFyShEQrcA_2bqJ`Y~R{MVx*c=8| zW5h7W1_wQ>%O>!^hwTO7!8@i7X?1H~?Y`pwQ>A|Y6Q3*72f*ozv1o9YUJ<6Ngm*Eyo_AltaX45cecjcUh$LnPS^G`Ig%VO7yVm39BSd z1m$qiAV`BbPpK2xBcmW&k3Tv5BOSv^|Bq$OhL>Os5w<6C3M;{?33d~2WG;S@*vkSSIMuc#r}l#--@xTl!*7;=*{S#gf3i?ktkX;AMVNp#bv z|BnD*4_&tvl~KkEJDGt8T~S+u zaI*%?6YHy)`eGh1yI_5_aUtO{d}WC$QAoLLa&s&t>qB*)4xWZqyGt3Nw=|oN(Sd1kdV@kqgM)fFVde&{lT)Tg` zorkkqa?L-%!ta*R**FVYUYokaZW(SsL9oZrKZ`v8X6ZU)TyDjQtAJOI<{VK+#Ze!@ zcdlBA^u-pUVjVs#c^4+{WQI=t#4HNI8c@hEteTg97D4vk;@m<~+vZ)9B$!xA>9nHq zbBwC?H!MsiHnd9kF@c%al?FcmJPsLMihIBlgpujN?(Z1&&rUKih8O{MA_|~q?2HM9 zEL+XE)A%!eOz)5tks4JHAer-0;J3if4@uU)ZtM?L@t4IO+QW&zEyC;+2pvum1F5^^ zMbt=Q81`_Oz5p79zWAqGsfB&tMVLEBC_uO&;)pTxaBvD?%n$|KT>-)i`YrA3dk*-K zY6F1QJO*k z6Z^mz70ejJ4Z*}8m&vozTD>4l&@ivkRJfE0SiOkqR%G<9sT8|e6^9q^`Z##kZs}WT z4S6|$I6%_r&nWr+Yv!HsoDmN&|1X2=$dKt&@FgCLjPMd1f?kIHboQGui%0k$CXQzc z;$aR(vWgFyRrdZ62R5nuP;_VNusYB`5V{SW^nw?@%R+jhu&duG*7r;5pPSJFU&T|5>#q%7u%OPY0RaP0-ePuPqW>_>=iNvazyx&l2;52;2IarAZ9iZxPr`^fB9r70c1 zLI={1shquY09C}risM`5f5>`tjr`1@hpGKO14i{HH}oJ@I+5BG_gMtluSD8F_^w1` zqY|E~eWAqRD-5UP$}3czBfY2lJnO#p%C^RQV=NDqp@1azh5S;X*|f^{#x4WpUj(A> zH&e7_lCdc7-PaZED=c={mfU2MVs_Y_lTB#nPvX17g_)?@BBA(-E4LTK3JvXh2~J^w zumGGr@h}1Pi|Ej9X%R=Zr}C>`RX?k`g01TL%4#D!_xz8Z?w-mWvx_qJ?73JIo~UXs zTQ9;?o)NQE1zX9o%b#hV*r`I?Ca7ROw-$6+kY;XT8+-l&VFMbt$< z>!W*pRJ=U)!Lo&8-p%RoI#(wg?t$;0hX^Kqi2p)yuPzE+ zYlmdl3LdsItjE7&oe zSr=+KD$$OkT}VzXsK^ymQp%I$-olWRwfq%$+X~0Iu(>1Ifq^{Wx(E1-O2-S7ZX62Q zgM`s5ZY7-QtugK3#8Ok*SdMHs)oj~2JS;r4oU;3|VRQ1Ue)EwXI50W63B3koK?#tOo(1voJty8ive|3I_`13c3sQC|rFqBK7I&_BESoVL8@+p2{@C>g$POFZ$9%~D{ma?5JO&JXeKbP!`OXh@j zqXV8Kgf*g&J-@bV)0h|RnrFn{d|zhSxy}5}+k$B+c-g6nND8O97IxRGpf>l?!D53U z)Bhj$dijNB&$8A8dlH`WWFgXS43~o|ax?9Tlht+)^MlseDy7I^GJ#at4JY+5=o2Mr z^VD2asLyFfyUjxZpx$e5cZin!U%eO46vOdM#>6I?Rcj26Y5T#$m6;>=?h;Yaq*Uov zuewv|CUgMv(V-=+ragMcroS*)J>r?*#H9h1hhCLsAE~6(=LM4RLn+;?(EKw^)9-;q zb?fY#bPD!7Ujb7%b7(Wd!r6vrE!{W{EIfo#amLKXQ2+P??pRQ3mgx)I8tPiyC6;1~ zE)QoEsqS}$y`9o3Q-13Lwp%{`DpNt+(1;a;M{zHdU%FSecJpX|4eExyUtZIe$-=U{ zw=sYbsfjh&GMw#!fYYaE6`9f0ydTJTo1xHs9EN}5gx|fgIe>;+EFRFUp8r77vqQd; zKyL|&qg<)KKfuN<4m*Fjt;RrQQKEbyC{c%)gKm(h&5^yg16F+!PVXK!14j2JkMM}I zmDpxtl=6NLME+$Uk(d-t@^bEfh0+5utCm06AFegUzyGX%4pJnjc-Y6dn}v8-8??_e z>BZMzetH6b>d6rwDe0)Cu|2Cuo$Z#WFI>%@KEk@7r=^J*zMnDH8wctTtFpfo8~PRp zs+@q&ruPlB0@^+4$n65J&NVBUl@-d+xO1kG2GG%%Foea8*EZL0t}?}6vC0zOI_16V zW-e&9+a7e_FXe@H!y@Onb{Cg}Rig5bu&iN;R(K?ut0=(^HHF2u0uTW>_m~zKCo`1? zg#J9X%+V^V$|cr~BaRx6#8O zI+YO>mSM%{SdNb>EnDxXIkCtc6>5l9si<{#uiNch;rSSwdy~zHL@u}pjR>D2wWkc( z9!$+&9p~ZAA8#_jE^W}(QWLtYQ6Vz{mX-yIDU(%*EwzCasM!}aZ8=_U+KqeyPE~0b z2R>G9XaYgxXtk57pj(6p9gg!O_W~sc7GA~B%odrSIH(V1FG8_>Z(MyVqO0fQJ%4u~ zKJ1(ZdYe1J#ej>+=<<_-vtr@;5Aon&l-=0Z z>Q8KBu<9)yGhD$Hqx#Y_!bK@gMpH?VLLqiHDQra;Z5+*(9sbscXRvFcOZ{(+#)hGIO=|H&AYJkf&O7p^n@(9+i6(rFM0QTZp+>9+KY?GjrDG0QYMv{|? zNIwa(WC|Az`qriz(I5K{(-z;$u-B@R8HC#bo8(M&Mw}D zmtgH^D>Vmed1&TXJJJxg`e2CVVW7Qit$qb}CB_V){FlsphA@Z_dH`)`dO|kQEva>E ziJ%HHF}cpi^!ISf=4Rjzb04}L81>$@pB#+pDG3rWmuAWlj={bq5ov~@gd_ZCBA0p? zLE_{>VZ~TcmwF_@0B+rt-Rb%*;d5M(;BkGmr)?{kJ6w~$(SE`QG1z`euRHWZEwF_I z-yxp^V|Nn-J}I0+|8sxCHDkB8#|GYtnXFR}*8qC+>NqE4ntGGT2A;7evsr0-a71^( z5QxmY>{&}eSr4IUnsCzq@yA11XG!wK0hKsy3q3)fuJ(9h{jI!2prJMAi#GU)c?k31 z{f;S(S{gR;f)p7M1^4<))pW=$$Xq?UZ%q@;*w0 z8M#xTUS${O^A2LpQJl6<;_2dw&ncer(JvT^lA|J@Lvl_;ylG;V7Ul$_E*X%ux;vVK zvPkzYI0t`g60$s73`vQyqMQKdVWWp&;lFxW#g_rws%&$l_P|>W=Pozg4_YrO#;Q#LW@6(9suPUg6^LYVM%(Ir48G z6jH>GhOh0Dc%b_wCjT>KXbjP>v!g};K0c?XPoil~#ctXDnuvk1wY0b~^@xBk4}~2@ zr!!xxOi2c71&X1}U3a|5p|3^=fv3vEjOeG(2gNV44HIKot^&pgIeJs6h%7ElWGXf@ zztdE$Y*ZhT&K0EbsYKD{YkuofNBZ|#@?ZL!NJ`qyvjWC4V=NS_+goTq(;ZeFy}hiy z^5mqUMUV$+qQtqEO_W@VysGzsOLk=b{0WKQ9Qz4MeIT(}j(ltS1j|m!8T{bPjHh(6S^az|8A{J6&!M;R9T7a>ZxVDO6)ZxjIJri2R#pEWrUbD6LS1jE^JNG8n*yn`b%)LVg% zZTRBJK7Ux_DYWp_qsR-@>$5z?7M`(R5^=@l)zZX6b!A16w4@9T(L3wGgn!EJF~i5q zSo3ND9aV+bs#^E^4_Dthf=P(=nkSI?)4Uzar^~{tkB?=~C9;-yQklCNy^^X9k_H&4 zN2wNEO{EjXP{%@|()qIb^z5c)AcT>9l*Da>LS=U=Yu}d;2m}H@m=fl|mChIaVUx+E zTT+nT@w2dT{M!MVqd6{a_UO$&KO|oNnk!Zp7-i2DQoO1#z;{Yutf5v_7?9f)KV^hd>YW626en9 z9Gy&X#SFY;lL0oKFKo)rMtJd&Q3pPJd$N4PMR0VMG^T$B{Uta=3pAn9iBU}@DN_%c zT|Ea%jFB&}SCaVs&a8iDcq^w~=1j8PRov>G!!vV^LC_22s4t9l^FL7;ZWGG%wbu>T1Km#EaRvPZsvWn1Bjiwul$6pMvo|+R zG9lb&DrWnhQC6fu&@xGru5sEvC?I$L{2a4EQbex^#oVmx>&f2g+eJ|6&_33Eg52?O zE2ne*uGu1O)yx$$p~yRk9$uBF-pCG3yMpy5X!ccBOtVYr9h{-m`;6TG$h~+WsT;PF zwJn)nmv9sgCEP@wG$R-X%{GC`D9%{y$bqc`RZLgGJY0&Ct}1HwM^$QG&CbFx^#Ta% zN-c?Q*_mGbjb=CG%}a-_80N|_{Pz9Vm^I(^5wZLCYHIwoSh(lBVvUKor5?1~uVMPv z1i1`$c*blx$2o_Ip>C?ur;WxtrOMZ*=Mi_F>`QTsBC(Y1x6XXZB0SC=)zTXZ*`<~T zZU?P%E#Q(aTR8B~-=uXfO_IQXE-Nc`7GRYp{Hf3(ewlXFgzSv;07rd6GXf7(s+~`@ zw>j3A>CJyrHydRm(vIhET5DQN&-T5(cyGMBCar5K)=Rhz@7&5kF(a0 z^cbrW`dn6)g4+f`-pVcgcvaEV+>nvHVud$rIsFm;O0PBW$xn}?NO@J*xN-AD9b917 zN@wf1OUVIYvZE7v+jL^`RAVxV$v>%C?@CQ$wB}-cklIRZ52W`aDkbz9`JidlMd?mY zk7P3l#xLU@<-35;mepa^%jdsx^Z4eZH|ume3uR?WhA>MMm42>?!9Lhy5-7MwmgGCLvpXH zLhfRiZ3yr8Igt2j4IcHhfOWgKoNupkO$odm(y$E1tqPpC3ug6kzRz{lMsDks_=};J z--06sqnHrfHI{dAVoj21wu9qn z-+nms6OZ2>7KF3U64_MUpXMa=ePOCyxt;_MYu63LvQ8#G98xzdmpXn{Fp|M4=mePO z;;L%gkX)rU)D!r!$FQ5q1u)dsW?4Df6rUyH&Vaoz!m#(`aFW0(37X(;AqoDX^(i>6WE^b>Wxw#_8SM_kTdpZN`a2gptssK=YCAxZ$1 z7A*zU)Eub|CSsmHI)f@Q?uZc%s9+W;)j>-Gvnbu39@MX(0$8v7(^zW?B!lxt$JIpp z>6BF8v`4>dN4n>uR=l0|E(mOPXHR%F0g&v)>ykN#lUk1ZN}yn+ zdPITIA;DE$uqN5MNZy zovrvfkFVh0V+T=y(5bM710T#K_-%>k02;j37dl?zK>K8px~gTvavXU7%KjzR0ps<- zl|nr)GoEitsO9*{VgnZy1AS<2O^^u;PbZTYO14$;>RF4Vj!bLjou<(UTS6zm?!ts( zL!be1*<%If)37=*h-sB#_2*dTQXaVUtpkdoNM!JP@^7!g>4S#@Hi$6|`Tsk4^|)3T z)9C6U^-;7*a44yiCj7pl!}C$QGa8}eA7?#`ncfu+ zT(7@4fQb3_W!jbEZbdG5)$JV2kP(ANlpfJ+q-@paC9}oZuT9ST$W9*Dlvv=r8 zW8*cw0@hzfL-iI`i2p4LoUFY4$;cJ?h8J!~(e^y+s%l2zYDTF-1-ka!8Cr^ zh>2pf3vi*r{3`iO`x$&ZPd3v6;0Z5=a1=$ApDI;g66cyW<&TbQeWO{pm`u-*xnq_f-`agV}Kpi+!IYG~9VhJFw zS2{8OxZi{h6wyLUF&~<(1bm2wESc`sI!2s>=r2_%Mx^Y5iI1)kH3C?KNFlV1ZIt-D zGXuqr$1~${CmwAg|L3FXugNaoBfd~I_&qr;IsI5Rs@spgvss(q&e+ka^@5_QuZG7p zEXPvb560OA%58`6k(LnR8lp=M$S^@2z6Xz(&-M6vtL?grXs~bc7Ru==&7ArC^GH3u zZR%%#MiAMlBM)+hfn_1;#gw2_N?v&T^9ORCM7O7qS%zdtFH()Nj2^g%zj~Sn-uP>e zq5QQbz6euDF-D2T-$+lxqAl7qq^eY<3_ZWo1MQ&~BRk;y@!?*O`o)&zZJ>m35>Ga| zYDf9cQHHdp1}V)%LFJ4WYrq!hejS~u;Vj-!J5}~r)sF{Djw7Z z!F$P}s3>PL{SjqP^UuT#R*lsxyjW8JCg##=9A2cjv)YxP^*1fOM|cjl z3$GA~GFi3v$mM6`dt`dTrdm3pR&-mFx7XGxmuMW&QiMTv>pAOpcwYRFXpdj*eCVW^ zbJR0?U#8ljM>}IWZZ^6nGL(oVL_ka1!yZF&?oWV1;iVpqJCVnPqYII2fsD?J0+g zk`*$7_r~pZpDeP{Ec|f{G;RmxoplMGvza1Y6d-)GunEeHrZI3kk^*^fC7-b*yS>d9 zD5vd_dfj~@;Q4&pcr~Lqhk%XBA1S&pG(kuHguZBK`uJ8it+mcCl8!?1adNm{%LG+} z@j|2F;nat~v(#ds3@~Sto^^WEDUnJakAKlrB_;^uD8izo8-mKx{EdU^R;^KLF*Rf< z0NaOKpm8@oZCBSj#=CUTW5{vOIkd{vr#v(5O!`#PelK04`S@JB*`M%IH7331g?j7S z=B(r0`u2?Fa4Zn)W-mY2ql!=1*W>HG%JMpmI9tPQU{7COfYWtcUcJGUb-CokXzfz1 znfq0hw<}ebaBu6E$J`N2W_LThO-WDi04+`j8Q(fHF_z^u)^9gxjz9Z+-CoggZKMUd zg?83O3zP&zr&I+4(U%*mKg5&Cm)6ry(x#m=3eeW+HQkS%6!`5`OcwezP zf;6dQ>b_L-YR$(synO#uuDnmVHb^RjC$?F0am6e3R%ugd61kCn|3$2{iyg_?t~uj5 zXi@~%viU#B6^=;nU~?1h&66~I$E3Ykr*N=$_?@MJ7rbr0fLs1VumDL3=`$2Kb&tn) zs};6|W95+lCu`mz(>JaztkPl)f+Lv}X;$|wSo#Hp>Q#(SNx$Syei7h}P|i{+*t1)l zrUcACl}{ytQex?GE%fn)MEQx6^sJbbKR$gQ&4?2H%~Gs!S_7gkMG+5*Ilo4!ZrIRN zJUT3bF>YIHj{Q3K*=UsSeylQM|47SibW@hV9O5Q9^z-YVV+58vyZHnfkrC`aqLxBZ z)>mpsFAJ2<1_6eX^N&{h*cYw?(Z&JyCgc`Z2O`m5gL-n%=H!@A)k?5IBVNEt za}TMobff|4vG6a%*3N3XG%K#E(K zJ|uirXZKN+2HTC){GM&M-*#T~`X6WDF@MAZm1G$PI4p{h8j*+-qj{La4pt!-&$96^ zhRm~qiZIG@{gnrnXZ32Ag|*syACy+W@%a585wa(m%Y-ntl) zd_Ly+S-9nS8X_ljLhTK@9J*z{JWfPrvF|_+XQQNxhX+|zXZk{cK>@qUaqK*`GfGbgv!s4UrPvJwDPUVv%ac{*AVRKLs{_UfXy;BWbO`EqYI zbYY4@dK}l=m=2~r2kLA;8h{S&k@+=7FtjrjbAiq#r=Jbu7hpNQ6-vi)eUqFntSo*W zuXu3I1?xPCm~mxytA}5p<>aXG>3lo5mkHf*`ZbP^7o*9WX8!z{@s_OL4uR}jl`P-- zf#_BaxXmF@h|ui3n6HThWnD<&f6Tb=IV8}%-xr%i35HPofF*pEViXBYB!0M$>a&^x ziGy%buwal*5?CImzHUI`*x!Re6QUzdPOOkHF8}0I?c7^6aTC~jS@G0`#+Q`*{(QOQ zN=}a&F@)<#-|a1sVvLOAT4WOo4^pYG`o|c!Muu^N`ir1|Qx~20KiMnPl~?u(_~bF| zGI9#SgD9vvV-U*eQ|&KOhHed{DN{Vc%0$B4hBaEKL4YKqGY#BO6L#jITZW7s7#@OH z?4h>dV(F9XO!=4x0=G+zV^GKy$X8N{DEeoA?NkHW!H$7Yy|BeT$tdQeYN$PqRQq&N zpe=d=R9>oFV@E}8mAV0rfq(URSU%p`yKi9=XW{RVOv)*)z0_gRc61;L)5Ic|F4m5k zzt#0~kFSKc$AQUcN0=v=*h5)$lDDD~k@wI3+Nt`qgNYrW{6~_@@Czk+(sjcUf{Uiq z5laa7bSM?+6jft@CaU`oIsazTjtjvH zzAx3Ut$;7_n6sCYA4wZebmaXmGA$}I+EC#zOF{nlG1d1itRl%>Wm`ZeEb2y*ghoO{ z>&gDWxXyixxR;Un??TKA#%byftR|vO{OMx}Oa;}^?O0&j}-7Qi2aC=0=Pq>BP0?fWa4biSVFj358Zd{`gvMn zv=@1|xjmkT_!(STqP+hli0O`W#PJCg5+voH96&db#Ph3Pz&p+om6GDLREVcWgdoJs zO4qVIkJW@&%zObw2=8N~R%bgGV=7EME_EDtAN6rD8JI{noxX@lzX%&0EmXWm&V)tk z-WAlpN^Fw#!0brSnW&bhm0xW81|fPTztkDnX#_O8P3yJ)GO>3RSHJE~p3AG9hpHDW z02ZLy{#nM9wR3JjUYUFngQ_V+X8Ly`Y))}{Iu3Z|cX4g9RGxGYen!@to^yI@$;0cAQfh5Y%g{rjb zNT=;HI@dqt>oltU0{cDMY8SwKT@OpJX{mmE9J&5N4^F!HG>tL2wzlSKyVd;?;)Yd1 zUpkp{*U0Ma|C=*w%IT)%Ukbp)Y_iE?Z#rx9$T=Td1+}bWqC0# z_#WxJKi~ua0gl3TP-#X0W#z}y6iU8|m3?eOlt5#xe`xUR^P0;V919IyFYf83_ zU*n^_AF1o>9^DEV%3eB|?HJGc{m*9C#8!hjyK;DDd8VA1`FvhxUWNO6W0QdR0x0Yo zBFHQ05+j21(PneI#=YX*71B^7;s^n=P2vA;lKI4VTg-#?>G$IE39sL(GnvCLcGRk{ zITezWM6Ddc3UKE)Cfg>lF8P1g4XV!UT8RgDVv_v0nc`7J)QY8z1SqnR(V{#BMt8X= z6Pd(C5Hp5yb)EV}kGAa~sQy$ynUA!Sh-)1a8$T&!OyJQILj04`k^wbtw>B*qh4IzJ)dfHNKH)5WwDf^F^=sc5G<_q;ODsvm=6?%6BWOD2^;a!8BBn+5FA z{>33Q8M=PW*@_#q`rw9{0VJEe>X&j!f2R{k@E;-vWYc)so10t~eJmt6K<@PWHHfDP z{3fdI&Xl^;M-`dmn_vBpbUZ3_KA=7nP5oZ5<|m(b1h|r^Vfcp;wW(xDSMZG`_yfQu z=jCnRwBl+_EdGd%O+qI4xJR{VtNf$IhiO9AON>2p@XR|5_`*~A}vEw>kNEj1X z_7}pjeKgskQ>>Gv`=u`XFE(;z_3pZ_GF_!|;(Fh&@VYAKCM0xMg^guTY?Q*VaF#pa zy@v|oQ!5FV?%N*ygUGVP^1qx;MW2|zMYc~e(d}?3(yt7WW~t34Q0gHJB&ZgO#03Y~ zBZkuK*G6W30*1~n4149bOC^>v2bn=b zlaeifz30kK1LDfFh`Z+yR+Y`|_2g-e_?iV>L54g@zc~`9AW1DKJVT)7P%p zS69fz-Oyz{L>wX8Y}I10;)oS0N!vuOsLZV=;K*PB*b}z$+ z3g%j49XGFwt2>cT^VjVEW9loT;%b_1A-KD{yF(ZV?(PIhuwX%hySoS1!QI{69fAge zdvJHV^CaI(?yp{J)|u7ab*ig&Rqg7tl}LheJMQ(2vS{Nv+31|(x%J!c({q4ml;$>= z_zDL6r=m;`65$s5Px5+YE;KiY=weBaj@(Bv6ub4%Y%MGbD@B#TQ$u6}+I5wy&Sn_t zp0#MOrpX&XvTN`R0(njQpg;1C6lVc_Lurtl$NbRndqvL5>B31Sj-QPb8wF|q>|_9o z(bai7rM>~MFWQmI#C8|U09&Y-@$$qfNHpx9VfAD7$E+MLpq|7+am$H#NKqF$_CFjMMqvg7NiRZiFZ_vE0b-<2Z1P|vF__RlI=HkW!1h& zV}l(NeZAJT9|s*CQqw@y)6>Q_EN`dR^IrxNFaVWX($n21fI9P}BO{*77C_J2>sA*D zfA)Zu(G>Uj-u6bJ;M~t8?v8H&e^2aBj;78fv?W!C=t67i9AmHl1nf#hye)jVIsvsx0TB*tBb+luy+jv*naVA*06 zL=?XHuXO(z6-$W8z^`D5pySvTEi}9h>g8$x?C=^E0I#j?J!<382XQ^VgGF0 zXXeCZ3(AYnUnlm_IqG!o&7Y=OXWOkb1l9n*!^5;5@~~>|0+uUpv6jxCH*5p4N>!Ym zzewF)5+ds;mNX6BPaIdC>XjCq8JwTs+$-LPK40AS9}?^x7T&I$oLIda4(cTyaCtx9 zFm-alAQL|1tujG-n#}*8`IQ2C3tP~(Tu83JPk&o^#*={!#CUL6*1WsPRxE#-x%*cC z%UK<*t{eB~k{rNbQa5%%s(rAla;Dpsro2Y}|1homg>1H=oBX>Ws3LJ+h^;bR?IjED0oKK_}X=X8wFe3MaB^bcE9*YmSU^dC+8Q{XR zBvM3A6NV_YVI=*p?Eh{`+@;WMF~RpYeA{L0QW^xBI;$#&nmLzBdPT(*d|s4NrT(X@ zdN<)xhSPL~-nv$aUtWl2bRB8l-{wp59rLM&-N5~i`y~>xelN1xe-&a=zChZ@?#9OG z|6|9#x=72_=?wsW0Smfzr8k1QQ*;85?@CbZUI^Vxt|C`M$Z`D!@$L_Q?3yc zQ(E53{}Ci~D8t>j!01Frn;rx@%&SuV=nk%`MA%g3QsZ2&U{E?LUP;Q+?W@@{3dW{W!9BhfCc?-$^ku3%F!_W(c&8iB5% z4@_EKC8P>DTpb-8Y*E=~C_sc>Bc8W&Xt@W+#d;Ed9$Y`XpPD;8eBPi9hDG`OLf)8z z!g=xF*lZnTH7GiCr!35&L%2U}LU?lPMZbKTED*N$R;!ZL3Ez|l)-=K0eGI@tOgVL^_>^mX7i)mmFgI5YDm|+I?ugX~g zi|3fZZmW6VRP3g)1^`lc666@Rg(iIiRAWZ@=ZNB5Vw-6Sg)g<&%H;nvw#*wXrdZc0 z|GJWtou#>b@j)$U(rY?v@O(=i-o-?4xQK0xhWG0yLj5V5yDeIT-$H_z(V3N2T()%H zTaN9_282HdPh0#cZU?{MDqSV500d8d?(h@3$5op$c%QEfqd889G3iD8%G5bL3h=o= z(Satt3vP3|NuBrQu(>#=dk`Z~G+}?Rh1bz^CQ)^CD{M6+6D-*ba1YY-`C^1>mr3=OlE4MQc zrG&9s7_VgU!b>>6KpD}E)i92HrohP|cn=MFs{d~d06ThGS*RtEEFa`cqK|M@E?U0H zdk?5XWMQ0L#*aP8YGj!&B;iq?6uKy{a?3L~OcPaql%-i-=a z9+fI-CfLHH&!gn4+SE##X~V4>*sU)e?A1Tes%vMk~mQ*NKJOpl)XRH3LORV-1eaFaD9bUitwMD)QH~Q|Up#c*-Ps=SIcE54LUA;zN z&ifCs%uJHElV`~tW^)o7ZXI|Mt|5-TmU>GG}aUdO6~?HCKik&Ye(mBcq+L~dn#=OgTfAeBT*a5JhEow3n2}=^jh|b4qPSv~{$u*K%vb8~x;VO4 zLLowl!6~U@2ok;4YZj2mK}FiGnh;6G$k>HFW4zW-*V2hzU$Hj;Z*K~)qY-ZApG-HJ zGV4jl^p|RmgCs?nuq_-&Ehqdc@`+XANLw9G6{wdN?q#ETD=?9o*)qrrp4T!v%@1Jt zt<#Ti5F~%nJ;ncB=$218zzi#&5j7`Z`g|H-y-_p5vRr~Le4IE`izIpbmbnw+{UQ5~<;mdoo1L|0u~p{C zq7}gIV4>HSzr=n)x5gCdC_DYXI*QKM=R;xk=J2eo8pcUo>4t)Lg;tSm&h!@TL1>>PZrJEYz_tkC zjW@Oo@N41o+tn({Ar2l~4S-Y>u9x@~)1<3y_DyE@$+rzXqRFhm*%E?k>1NYi)u~=D zO%T#&zpd>wJhiB^Xc32{HFZ*_JnmY;3q5U+=J&%HoTo01dxs=+3P4f(`U!Ym7DN9> zPw-i~BZGToiNRU00!hS-H*2I^;1Ft?OahC{2ULj@&9p+Z*)&5*SL?fM-L{`Z%MqkT44r_i_$XfzjHDB|EaCqt~W&_%AJte zqzFMOW1dAP(9QM@Z$_VsXb)9xPKO^1U2+&*Lk$|gsroGc3vALk9N3oYNw#(_am4KP z-m<99qXu(u4g^?kO@5g={KBb?1UkKT8`?K(eRpAjsaXnX{(0!HR|Cx!sjZPsw(G@E z1dyVRlRqVDC`hA)kFtP^4t0%?_{vg>b6EiD8;iJPd--qCaF@ z7!lyV_vfFgOApkNzyFvyjg$rqdW$I)2-sKz0z>&G%``+Fsj_8N zVhSO#r44lZU`p)O!4>cKM_RI*N@3qc=>)*@`>b&b@D#O(93ZAlc@OM;MexZ zzN6Pt+0sJ2od8B2KNSzZ0+#}+$~={#LpoXXByXks+}oTb6r9&I57okQTSt%lr5D}C zV`asWl55=r4ljpagI2Dc-x?0Rix9@3dz-OJ?Dr5&#>=z*)L8WajhkD`VTv{k+g2v8-cTgg;9Ts1UapB5~3Q8!gdxmc9+PN6^`+LgzQQwRJiyE&-tbJNsoF2aPt)3>zBQ#2KegtrUeD~zSIJ~ zf_yV-8nM)~*QRpfpW)KJJugf&&n=b-dT_Nu7K#@w0qsM%SpUA!r1h?l?+_FM;1R#6 z?6GHcp;Bg567R{4I$*y{GK|tPMH|Bt;{K~_CPnz5WsbSb2JU5kKMs^=rVgCua5KCa zf$9q>b_<_5x;lTYP}#{I?dO%j7o!2ucW3| zbbHS^Qk`mxQ6Hve<6hcrv9GIy3lmw=Na)+2BelQo9~jkNOtq{c8e8cXR?HdKL|ofg z12p7Cx=4}c21xksc7n%z4-q@k)C zf%$vlY&B2*Gk`aLk9{D)8Kp=qc;NI-qQyc`wE`)%gPTr0+|JC+{J0F7GNH}Ce=7WSW)+dPKtxquVeyFX8~Jp0_%-p0M_A}jp4 zgjEv9OKr8ltFegyP@#^UQ2uoJvFj3F6fd+jIk$y=v7$%1F>i8QcpEyvxzRja;kn+f zVn_T`nI97!z06=aR> zcz3~O7hBw)-*9pfHDQ`4wzn)=nM>7tqc;jjV1>CrAo#(c)T79J4CQ{*ASe2^+^%V!54F+u4|9&fbxArz2vlq1*MhSj2Uh_ymW3wLGSM< zl9MH7ab5yXi^vT0D&$c>nfM2pt>C_oKtE9XOtqylwj-rvRelIX7J|yaN|uRMEVUMH zp*mq&qHYJs8dYNzt}Fc|ulCQQLG8r_e#|8JR9UqA09;KrWUy_Aw`r9ah<)b+Y|fTc z`;6n=oLdOAXdi+(9HEIT1)qx(&Pr7n#pRdD_nPcH+%E%;osg9c3l-t-5YQrcx^tB2 zXVMR4=w3X;E1#*Ep`*XECc>TY+#^WvE4Ao;5(B(0l9s~9(R7(E3#_Y2 zMwV6_NM;Sa@e3<6@)c0)bbkGwB2aae%NlO*o^U8$FhDXyN!l;r&HcWEz!!YFK7-32 zHDUFS;;N(0_z~d#ULQ9Ei6n;<;}Zu>wkmTZa71Nu^R?j|l}L6z&*Q$<%2C|5x3hTaoW(IUXy zxF7g%6)hP|u_zcjKhMRKzO$8frBX9qw#v`5GV@UrXPM;A)sGi(MN#HIYY|fUscBZ1 z+ihQdDiiMHp8hzRr|RpsH4vgSSJr!%+96OipitNd>?>QRKZ*x!G&$e?Cr+DAQknNf zLt&Mp%d!EN%T+6fSXr^r0#8^wZPavFD6Nc^rYZR76KkCPQ`aS5C;c|(8gBJFLYucB ztTu$}-Dijzurqs#c`mHL%qar7dL*yaBZCt zRA@H2E#zb$Z(CjITBaGnj5Zm^OMFI+%`=Psp~#Q;!0{WfQgKaV*qQ#2u(Ne3{6l@R zQu+N#LrkVlaapJLZ;AA?eXl)t^*qZf&EF7bKj`k2>jy80chAg;)XHU@N3&4OEorp5 zUWj4L?epsPe5XRh24#RS$Q7Hu#icCijf#7}zn5@cG_MqN_4ZPzUpC!%#LQMrsf~i` ztOv34JtRD3%0>Nds|oY8rw#%Oj(iLK82O^~w|p37pO(*D8hle0-aIpoJZfbs^( z^FGc#5UbtlKHQGi-qR6)E`tjnpJ5K>O#lNAf-2ew9@{MOxo0NSg=;c)AkCoD?(qXy z@bJG~`$Xwq_%NxW)kkpQV-0C+H=6)P zy3N!;W$jwdbCKPjX6Yj3&bleC+hBz^Z_5}Hqc9h2qUGP_kQ1wuObIzaHYbn0)qr!( zO3t#(9i*Axth?$-_g*A?K{{yZcus2V?c~Y1BxJwtZuTmn*z+(Nzs~&wTO|QMN!CAm z3)wtdZzNiyOO{oTJqw|lGTMjBL}efd(u!|lRWvgz_}D+cL5|&Aw4WrO<6$rG1jv8o zdWbo~Tu(uXd9U(22pr$9_)ENR?y0`{^7Gqcon4g&dkS#9vhlFvL0*H=Pzvjv6K5LY zf<*_FOkmAZ-gR5KB%G(HqLGLHZPdsI#0$6rrv)HVJnatI6^cl-B2RA%FwNyv{)V>{wGM3r8 znm2vc!$wK3RWigG6DQvT7Vv5~%VnrlxEXqyHnDm-pa2>X|FiZc6$G~Z;NqJCKOM!~ z;}45YvMMN;j~WRD5#5cLfTsb4DQ-QXf>?_A4f8?Q*VJxo z548QB0UUX%!)I4A^xQ}~6C-tqTC~$X=Q8n(^se!FIj}3N9FMT3QvY;7k|Kz+smN}h z!vmxP_aGfOpxEqLmE00JLD0c3n7=Qew_UgJ!9y|6aTL0H+HWr)t_g;Ou#iIi6GSlg zaL}6%Z+?N5}Z5m-KD5uFZLN8lNS`vV_j9_Df^1rA_UI#O(t35ia zEaQ;8guh4J$e9&K8K;9Js`xx|fkZof{8(5ZRe|T~kyl>gRPL1Z9NE$S>K;Qo*ZfZ} zi$j$4!a5-n9*`peaj!S0Fm4Gf)7pq+EY(&s-{IF*zkdW<1{aRg)9odQQ!9nimcdB9h%5`PtF_w zb%SADFs;TDj-og*)gVB`3mp9C4BFN+wNEgFl)Rf|z!Xy1|wV@ec0GGuMVWVYSw%FA1*PL|N2Q*k~inX~S>b z4@RpzaUVJRy5UPSK>TNkYLNFATQUwzeL zvUHHeu+aw_@JX#@{RBTqTO^QP8_y;2mm({>fh!(jh)L$F+$6kluZ&eqJ^{}Y1JC}E zvK}ZOD2}heH|E#n5zE=f2LGmGwX?9fuzI+;S-*1au4A8t`9TbAY2)2?WudYWDt5u~ z#UumNR{6_?Y`GFkhkUYp+d#~80)mFBnj`td=UV&6`}9RSfT*zJJ#eQC5B`sZ)kZd@ z6#-_$!Ug4^ex_8WHq}z6V#2v&V=%uLG*Bs&#tKl@Og{7p1c?3rkZ=+ zjwKoVK@ZA^ELfiNJ@tCgvh5NTG(qdWnL3#B`0BZ7O&gH z*ZF9uKgr3+AW>{>cDzU*#_hb)i%o!00zR{e`cN1>k|uU@TjDFXgDA%&@n-bDH;-op zsTIJ2sHJoqBT<{rScDMl$y}{Lr`1~K7A>U23uE$mFuhj8v~J9`qTpDuTyz;>~CWHq)zWRCyIxl@23QQ!Da_P78rC8pt4_e1piS$rQI!WkFyglcN z_u6*|ln0z9O?QC9zCInb*9pF4a*Ky|e_A_VrjZDq@~Qkg3#Mn>gM33)$Pu(uy6_Ht z9-}duOmdi)tHL0N3w9kNU<+CP9X36R2XZ%q2S4-gnuDaR{=dRYY8R^yd6(7;n*F=8 z=oOkjU^$;m&^F|beJAPcC3rck{!wf--qAA!Ut*{!??04UCiLMyvsP?VL*6qS7DCFP zvSz={SoS&uIO7*#-D9SW^gbAbnSJwW|>3kQ45OzyfcKe0> zWR%k%N`dR125c1XwTLT|i7Eh3h2Ee=aO53m+WY^eHE0NdaWv@sy$~ipev*d$QHXSH z1LdWNvF_(R85z#|S^6f8e4|G!&%$LP^a=r{vW#c&st~zjn-l+oJ)TT0dy>D#4{yR# z3~-Bvwk(N1;!4BL8FynD=AY@a?DG_38S?}k09l%b zbr?r7#&o_#5r5-H;&>Iu$JA$%v$~#Te+c5)mC5Eo{IkE5ad(?8iXQOqAz*xM+Ii|| z5)rMsJtAPJGwfxWxDQ_O(8l92?c)1YnK%>B4JvC59%4_yGo)&-llPOU z(0>zyuQvFUJ!a7%S;B4P<(u)rj8U>SL^fo62wJ3K*g@G0D`u;yQ8xIH|3ehxPuw}e zIXDHvMK@Bfi_@gDfr6uKYbbyRszS{lLyF}PUF3eZ5`bRe71$M$@G>~$KTzoxBn^NZ zxE=!QM-gGcUF_!*ivK=Qbb+q4Hojka-$WWu-7J(*V;%CJL>G<3Y{XdPY(NryUrhxl zLKuXhRVOMatSy0K>u;?QwNP(>aQ(fW3_VA%EIS_!{fFn)9w3UZ&F&iN!^zheHN9}H zg@onOLocnFcn36A{yf-I{=6U_k5}M)}X8RuE?WG-YeBs!{G2tk>nOGW39Lr)pI?fH( zL)?jfn2G+=)W*fgRdnQcTpi7FltlcCd9>||^CP^hr)#9>}ovd}j_0FqS4Smp#2B+_JGIzI{*cCO}4&&)WTcxdTOUMlL+S&+UohTDL28Jc^ zzpw*0vL0L~jOG#lS_t_dn$Zy37INy}VE{P)fJeGZ487EdM=Ay}t?JlIT1Hj9u-*1G z+(L$bhT4dth1|=a#IQ{1DoK@FGYc3IWqA%RKTp(<%RGg_X!VVok{JSH{@J0-2;9)SKs>k- z{&%BPt^T}$BkkZ=rt{ai_I|T1z299gMUTFn_M7BRelI$jDw${cLPqG5kP_gMdhFPp`10wr8Aw7j>R%%Ev!>xPNuY5cOk zR*S*5ihQ6uEE$Ypgfub?|Hh$K`$aK!fbp7iDXu7toH3UYHinE8`QtyU#UQCK{?wxn zHAlQ7^QpqGg*D0ATup`(u(>un@$C>h@!dC+LGu;BX+FsZ!B9bzFG~l0gY|XgO2(Mm zoU%KLqBzTjgsEA)&J&;Je?b0m677Ma7;MP$eUO}JN#M5__rS{F72N)cSs1#4Y7?Prv`+P!dp~2K-@E4c-(&tqezr!`;vc1ZJ?}P zPvQdl+yvo2OvGc_r`*RfrmS?Fu9sXDNXy(}p|MoLGNnT=@C6v`2K=GQyL3bX1ZK6^ zObE^&{oU8Ie=UYK`+cxJO&9>Nh81BwyH^W$4t#V|ZleAGK;MMgkw$LM1Wf;@bgvN$ zAf;P`D`~%csfMCqZaLiNl;~V>&rhEg0Z zBIRYvXdti0cA4596lgJ;%5kaGu?2qCSmZ0)HDF|)_$?d_aa>Rj^p+rz>sYOg27up8yLI0`rt3LdzYPT~VAa*$Fn zjl$S>cx+f#v{hG&fuVA`6#<7~arYN~QO_a~$Q4of!+{dE=d5tOq$L#C7pUlyXR%l@ zr`7Z~ZB>jp^x}zh=!6~rwhsC@YWQ~G1_Eg7)OCR@MF?1Mw3*7|9V|Zp!@wo{k9%pq zw0f|jUL{(pVkU*_Ewhif1oFQ&;3?=R@$;K zV6Ep=rTm_*NyHM=Q=*_w8+mP6Y7YS*~iS9Rb z#y|!c!52OjXy2PZ$u0%2U7!x8WfhQ?k|cr-ocbpt*(lt|?La&vkc<-Rj5$GWbWd7a z`NWsrW6rqcL`A#v<$J|o!ulA@oa?gl{20t1H|iP8K>|17K?!-OT-b(O!f2$sBf6W? zXKaT1^TL~*MV4IfisG`4r90(cx7_7Q$i0+q@_p8?52qhKZTh#M5(lo>)Y#2ql|>Rd z4D{NPk=>s{$A;WAEQNnWW_3Kl8%pEnn;l#2F+eTx--Aw_XNCRCj0o%{g+unIghY%r zB4#P6)0cjy$c5%&Q^8=^hV4j&F31>wcPej#`wx&TbNLC!;sk*J$wccYHdHn`CdKulApj?vq|Hcb-U-7xe)@g|E@PU9?n*{uupw z90f;8z+4QfTJUMBvF1f`KO0!M^yjJ`7IJD5Z9Y)rElzQBn1!Dz(VIszsYIKL`7Ggh zm`N*cgOT);hWef3&W{G zMP@EEV@l49UsmL(MD{ew2e~h zzmDD}jNHt2*mkTSXd3x?1CDJQEpF_>oYtMs;w`wxvp->{?Bz&K3sV6|M6NHF&!$pQ z{-VT18v)Ah`{;mmQ87(OT|E2UaIi3{pTx3(gz_fFU9Nr4l-J{uDHuSMe+Ay!$h+um zc7bh?TC~U*lU!cW)X1;vwH0z#*1*2~&Qdp8on4XiJGczjLeB<`XaX5z?xpUMHBUh1 zJ-^ZfCy7UflZpBJoXk6=X?&``S(rJScrjV(QZ!mP#Q>H~bXrD5?ebl+tzx~Zpb6S;OhJZ{whmTU@}Mo*Z_7@^B|z z-i`7fF4oeP;kK-bPee>im7zvYHr2&bXWUk2lyuV~lXSBlA7L#Hlj}>M8DqesL-zXT zPxB=}ovCWmV3WIIhQz= zB7-`1f@bj5aH_?-X7T6$hPuNxniTy8k?}rUVIzBHgb8Ev{vm7@taluKy!*Eq(xp*H$F~k#McN;yg9sSBQXd?x%XaT`|6$7H`6gB$ofh|-6Wdx zVE+pPAaLoB_46=&(A2z+L!*a;GgBHvR0+HO*-4g2u!t*m zuq_c5khbdP@QS*He$9f(dKqnvq?f9R&zxv+?8C;spy%>_a9DQg$JlPyHuYW>DW*&K zrNiItP}92-l&08_2M7>$JQ=eSH%Bt~i|7mh0Wq7X5;8)##_#IA>AyGo=mt1KeKlCG zoo3opGRprXv0L|^4%y(J;Cm%dCEV}=Y_oeS$|Oacf*f!Yx^gCE0A7NHzT^Q}7GEpt1jO>0+*_V_vKxr&HGkVNC9?KZ$ zA%r(HWIq*BFQpe-pM_7MKl33Y1pjQNUn z6VOBdGzae+q(L4FoPkngI+V+BMsx)QKG@IniPSDFx%$z$Of|N&9Y5;5V9lVQ`x{#T zGz87uKp8ov{I@kg?x@q_?qf@=zvf9@8#ceTdO3I*`qJs4XRW$BJZpHs4OYNhBXVT| z#yH8BT7$!5;pJnj@A--L1A0Vi2?DDtrK`XbkH?K~6P8k*=yNYwK2!B@hYw<2B6lTG zTng;%JDguX2gdylk{5;;l>RU0R3JPwDyP8iDTvC*m@T5RanERj@m(?-CphDt)H!U6 z^3BF$b4mcDA7TM;a|`!bwoI}jTwutr)0yR34yG2wk1|J}l<6B$OxS{>5v;pdIsz%? z&AoF8{0ThE}WOl?%z8P84R0IPb*YjkVUqsGt$(!rB@ZGlfLJ2SRx;Ae2`~S?*U>0YHeO48p4# zteL*ljHguIM<5mtY-X1a;$VN}n9<4ZdYa3XcoKeWFW5 zxJg@jfNiG1x@e&AgvFp4!I)Ft>URJ5hhtCsWi^{!kCp54Si{S2k*dRYKO6$xKUHtB zmSuQA-3NVJx?jKFGOJsqiSh|`gGyd$SF##jbgQqJ^S=YTc5Wd&qE|;$Tje22Jc7R= zRqhdJl{JY3GX}hi*9rVHY``i>kP5L?_Ha6=Qj2Yl>Z1ij1jDIaTu-;qAJE#%+5@}L zNZ(FeI0gkIt-Ca2i20ERuqp918~^S{(KNsN^bE??&T1x&gQ!^nyQEq~jr)rkas*T~FE>dz$n+U4yi@O1ckN3uec zUF`jGL-o4%Go9wc#2VFUo!~Rx{k&>aUl>oAXhC&^mL{(dFE2 z%IRiilcvbL%Iw(rw)5Jm{ywntg*l9QsIA@e6>6TO>s0;c$ECe42m%r{?I1E`-p|bX zOb{<@+6K7LG`tNV*{pQS$CzKX%e?|icsK$s0KM_{5$w-@{gxNv+nUQkchvaQ3fdOdiprx$;w-n0HvbV}e z+k@j0NWIONH%tfU_5f1+(;nfU+YiDGKM(Q;HzMZUJuU9hR?C-qU(N>>g)>`xA?Att z%EY{FYPCgu@sOcRG=%>Q0L)}GCH(|jL7C?OSF@eks*>%?C3z2QDqCtXLQ`VN8**D( z)VI9c7_Z;E+N6MY#RC&**V?qv9Um|?a5H}h%5d|+n$9d2Pu=WEAUijDT+&LO4PgMA z`X{T*e4C)Lq6|^RyA% zCruB#FU+FW>>rzTkgbKw{DMZg$e>Mpon?SelfTSWZzKR8d@%Gmf?V5(5jf76As%&a zItJZ#Iyz_S$f0$9^is2Q24Puq^XhR49m>`R<6X^Nsfunhu`I@_ElYI;%}B1 z4%^pV1aqTPk5Mx^G93ZiK`}&M_0ao8>`QUexDz1afGb2@4M41On_N;J32+J_op z>pW9f<4dKlm!pH76N>v!H>Ci?$3$}kb?zSrv35jFc|Cn=f*#LsABj7TU3Em|@K=L8 z#<^CZ)L5FUL+ud*xC8Ye>I2CQw+Znp{Q%+5)u-5)E@Xxes(rT?o#<-bR)- zmn%EFLYbgPF`EBd~>SS?{LM<;Z`8&%pu9^T8#zPjAhWV1yd1bxJ%4&5aEnVM`eX zGN7F{kWgo6z{z8+Je)qkYW`T5Dp4a~p1gBPS?btzNC|SU8uQBa7hLh&LjT>ABheHn zJsSy=Ey3Y_j=@-3GQYl?u+UvpN^&qXnf+SSx)DcvdJiIp9*n2|R&JNIhmRlpSbpkY zQ4)1|uu@POpV#Q-^my$|Dy8s&@0m%FBqUYL$$ju_zn?AdGYhUWCklU1d>X$+ z!fdv^BMK(#hTWJ3-~KUK=dgXJlWGsN7Wtm_pq!AcJJ;3VrPBWLgVUYo!#4* zcHn`EEJ{vOexfCR$Y!E{fC=sLv75k++Rn}E!6+jUv2)M;=03kj2vmjO$GthdZ=EY0L9BB` zX8sg(cCdLTxi93BB;3;uhZh}!mTSC$PwI7G{YX{K@5UeNF}bYi`ifWGGk>T%&J&(9 zYN zMp|Cq?I}(iz6LisZ`dv^OxM4{v%zpw`!auOi*siM*my{DMp2C1Oc0NCcV|f@wm6n8 z&G$?1{qzP|&lrbxZT1fjtp1j*dg|3hH=lkM&bv)Gd!r0)ov_YyR=nPQ-+IaGsNFJL z4N@rI_v^?acp#Ue2^`9;!gR1)`CMP^?1AdtKaD7hm$>`U?8kY3dekXPpWfmKv$KaH zXoP>M{+tlVL#>sGJhHy-HpUjQcHJtcek`i$AWZsw{&-RcZo`~AT9l_{$F`M&6oRk&zWd6gV9VgO{Y-UBGwfU*@f0+#?ZE|#g7hY zfBUS?*+chG*#JD5)cn|kQad6It?zkC3YMUVuky<-whDPGnHAKiLyFRK5ba?Bxq2iF z

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 z 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 diff --git a/spreadsheet/macrofree/waf_checklist.es.xlsx b/spreadsheet/macrofree/waf_checklist.es.xlsx index 512fb7f968318a8968286fc5d1d149a0098bff62..7455b1500027ffd8233bb145c211bf4d1be8f16a 100644 GIT binary patch literal 187767 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

#ER+=hC8rP4pcW?ELOFlwMu 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

PgV6mvP@;bt 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 QIFR`-QzXX!8s9+vAB_WtqyPW_ literal 204120 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%0Do_NF?41mYRNQHsR<~X81y>Dnr5;^G6 zECt}&|BnRG@jQ)g6Zq##i4^QpOOCYu@8|+aFM;{YJDA^ zJ8f8GUg;uya>)o2m9JSGGAc}`DNJh>twb{r0z%P_G_-$zu;!X@zxJh)&+B5q!n&YM zx;vH<&YL&p1tJ2Sc_XJ0T(fz4P#smf7hZo=^S$zoV0UBAyEoiBXRTN55}L3^JAMB- z5WK^M0{B3ugCi>Oag{XlJ^F`NaKL(WMmB=1cu48dp+H4wE-4+%0=x5J;P4qAC~0&5 zU#R^E$Kc=zSPx+(MbsABsSzD9BuJsSB8o17SG14!h2?t_6<1Qx{+e#!>V5y?%>B<% zEKLl?FL0cuoXaZo&A&3EtTJf5NQ6gb7RwJC@!!BEBNmOE`rciy$xB5&H#P|`%g0L! z8i+CEMK5>`Dq={;O~ymUZZKPQ4*Zc-;4gthU3opZM__t^OVJ5s9RmW`7C?rS&ih`} z5ee!-@~Iao^WtlucWNX*vB;ic)T#D_=FXmt5eAj z8z+mnWi80nzF|4K2Hi6X?=9sGx~Eu^GaDGxxJ$Q(l1k%cq=aw3f%&gBiCIBWop+$KZIPk?uo4(mEid{tyCW+ zRvMdX-DXUi)QVC3K*9d`Zq!H?roXXD{LB2_Qd@=qclXS;<%nJ7yqWhhgCld^>Q*BP zGMh6kOOZ0ZV7FmPYJIbD#)fNN`xi;fk;1@BoA{rLDUeMyD3bX;nq^btbG3R7ap06@ zKdmEdF| z8Q5CBX#09vRZr%1BC&Z`M`__$FRW6=oG3^gV>kL++mFsBYp})q>QP&Uuwdx<>GcqaR-6bNzh(j86)1RK~I*J4D`t&gU;FSN|A%YBcwh1Ivg}B%p$Y?0NKPc6lh{~hS`@eg z1(hOIC{864=8*OZfgpc3J?OwE@PQO+Sq^ceoU2=_4!n*7DkYAX`i2gz)l;NH9#7eT z&6+bQ$k{pt8D+HW`QGBF+$`kAsCaI)r;L=*@ZseeO}eLu4ssgTC4&`~JX>#vs$rOQ z*j@r3!3_|A4b-&82)+}@NPT?g6tdia$DVCoOcseCa)Jnr!^Nbo@S!g z>6G1#D~HOd&ne2P8|$XSAsNdA9|u=?LR+p(ukuM~XfGj^3fDQgXMqR(#GXGoYAgD}|M>Ciwnf~aXHhdl<{Q|&< z2J%hAe9QNJy2KvdX^h>Lh>WYbaX!luH5_0+Jr3BIq?ZUjQ%xG42on0*(u0H;oUH8@ zt#;Ie563JXDJw&QoLNW0QZMkneU>eWpFCl<IATL2jVpob!bXvg zqRfJW9g5lHO6p$k14#_Od}5`brCo}R{1dbIHc><88wk=Tr|+fb=L+2`N=Z`kxb4cI zK~!)FK`4O%m9*DzNt}CfbcJkV8iI;Qs-l{MipW7p8)bfdsI~vwS7=AiP_qwA_VqhPh0(#R@C{lLx@puKPlao-45KB z*-Z6)cmo*j01MpB#Cat`N4y(IF{G`U80;bn?p)^KrPDJa>XESNtQW4+Zs~^z_E7y( zy99(rz_N1NyC0(!Q56;=X<%@tLfInQ0-o@Oc-k;U;S@?dH{YdMruMd;R5zS-Dl z6(4v%4A|e&6^l=FC1p6m7y__RTkkz@_!#pw@7R=yZ_x`Dy5)>L@h*K%Yzo@QKgS%# zX6dT}b}93TaYzsIsRMkgi7jE_X!YrMn2Dv6WKvy?eziTtDM&ClYccHJ+$B!woHa}; z4U(R&N6v0L(%w0#zLX?QTVA;4d;aV~JuT1FuK6+3%5D7a*r2&>2gtx5WeQhrU73pZ<#p0Q*9X_l$HY{kQReips+(XLGvhcRj)(kLWrBpb? ze@ut4h+p1dq$|L~TILyJ{$qPEqPKd_y5@SqMbtco?Ih#lB*(zW?30MZ?C^(;(T!WPV59ZvIsRf_2qPtM zW{gi=+9Z`Yt&^l4FEVqINm(sv7;!4yW)`egFn3#=Xo;szriPzgXekeAW|m>EBzG#A zrlU8OB)3s;N7IM9uElH8ak1sg2DIZtWmV6eL0p?uUfbIl;$v~jIW}r>+YW+jPVlGQ zq0xN(67D&#LbaJkxj?QsvT~U^A`h4z({z}dD5!NUeL1>pg}Ef;l_kWqeq@&@Ze8q` zL33W$H~9nw0;{f}?g~n^*y5AK%%}R!cZUf0G7Ks8%#J9RT@0h5VdyWHQ8bAO=&oyb zaS@C&__TLCR`}lha9QYRONJ+MW>J+2%aw*r6_ca8^>5x-!`C%#^m_}=;ohqiMcOW z0vZQBp--D+Le$Fh2V(-F=d(%3OO zb4cW4!_}jbxK}qa5&i1&!Ka<;pi7^J8ge`F9Jna<<H7?V*0Na-f}dahyTKnYdV&};6%{^#@U22AJFrskv zM*kS7T6z7^ok3d7WvCN_Eg6@}6ArW@o{F=@xqWy6JnV<6xjQ|)bvn9wMpTIrtxQ2k z=v7NrW=Km@gF*=TIrDEJS~uiUYaYD*gAkGd<#s^LSn8!c&JXNNx=i++2I45x!63te zPCJVyx&VXj=A`A0oJ&pNrf10e^Wo-be%@@S<1wjoo4n9d9?evobZoI$Sm=Y?`4<+J zFBJ7U?;c{Wa!(tSch2>$#>mZMgysP?3|-Ge2u>Khd5cLk(Nz8j=vg{7s1RjtP7`LE zlJ@1~k9~}hw;09^%1aNo&+98>sa9tYXHd8-9MN6qiLbW7?+=m+L^d+i zA}N|8!?fI6JgOznS58}{WclUQF@xWUK2|`HQn#b<;B1A$OCztbuLJ@KwIIpH#wi78 zdjz%7Rgr~&p(ZZ>ktt9DsKK9gCN5o~2)jlb$2CovJGF=3w5{}lX1Z;@15cE?bf@4) z9$P~30)NpLW78QZb;09};!s&j6iz)>@TQjyL{G-PhY1KF@m7)Z7xS1SiVv&B3gvLIVKC-W(A0P+1!T-yFJup|;4CFch5Ats5 zB&kk&^vi)f|Cy~#&2IMBD=J4^kT!dNkM$$h4k0(*5nt=BN%}>Cm6FNf8EL0#&e!GT zEi-7kghg^gv66`jsE@Q%hfsSfxs@TjevWm3C1HmfDM|RZX0>1Yy{+XkClYTR1;z$+E8|(jOb88X^Qe7o{d&GO_uAc z$nqY3_AOc(L{TFeewJWFanxn!ZW6d;%>b!VJTyBy_j3na=2#t!Z>oQju+A)D?r82; zp7c0{>L;^bRTyDNE3`b30bNur$!1c0_p>A6j3`6TPlP)nm;-d{^(yBOMe#Y6drWl1 zSZyD=Ub+MB2I#ObF9I4JOG2P8YPFnFWIvnd?vI>nZf`H(sS!_om*umMKav~K)IU`n z_YdBuSSfODb0Bk1Y|TK&=GYbPz@-Ao87WX}rm*Y30>gQt$I~Xxr#*3zsRlw8=03)_MV}olZ?fHI)FyJrcN*Dptl^j26DuexNfLZUkYNZ!2hcRl8h*8+-)1E zby|X5WmV(-nlxH$r;zslh6S~5<#aFMq*^}1K(Nw=oVOiEeul1%Sx0#$+8gOPWBV}j zD<3)5+(5@fW#(h!5P=s;b@kMP#v*bt_WMIlD%3|<2ycgF(%tK3C_Hr$u40y8D$IG= zI>On`wysYl{iZ6X_rxJ!IBmF(ryOr#_$R|R*C92Q1p`wR=rq!E*K*jWGAK@3Aus_b zeloc_PX-Obo;P6GE1e1`uy4O%*F|HoK#$fYEIP=HY;xNrV^}xO5q5YWG}ZBrT<1PTKd7+@DP_~{|je;&o70wu;q5I5m;AszDBQ6BdGkLsKVw1F^<8ZgDk4!`AZOincUZ_FjK~q4y<%}q;tFzDR-S$ypKyOAq!C2qRLW=skO$xM^TXN9 zkH6_BUZZhX{JO!pdoAwUI0w~3gZM{)6XcdM21cl2ekFmz)GmvkH*9m!-L_A=kMS*6 zkT&yEKs1OE4+=zx%OLPoY|nTEYC`2ms0V_%?(oEr+KF1M>1H`^jrO(KLvW1~ZV8VE z`6Gz%%991X91|RzmIbwk48sn$Fp^^$uK6sxzFArS+?x?L^I#34Eec(5_BUIysu?5` zl}#xA&4D%Ib?EW_AG_wI(k)Wopa;OjH~`t;@@!m8?|;(5iJUh9MzOjD33o(~hS*X$ zpyF_byDc#d7DFtP_99^f-)7rFM-?wnYi=<^e*fe9nhlTxFcIu3UsHTgjHy)H%?ETC zvmB;j87#XxG5(?Sq2mX;qnwNiV!`Q(hg~guH?Dlj!Kuy7$q9j}D>M2B`@L8(#IJ(= zsGIY^Hmk$temMQ$ZPmLocEV*Zjlvs`B_Rq^9t&A3C>0HzZIz6e_4oRw;wzcctA{3U zqbvpAoch9e={Z|vLC;9XK{jEH)gJgo_0^^PNC96H*^u|9k#WY(FG$hZY(#j2=4Kc9t&Fv1 z7RUAVYUxg+ns(petYG{yc>9UfyBXfM`WBWg3pUJJ<=O8I+3)zle{2`3Fw&Z#aDmDC=Tkd=Wl2=66kvsS zO#H8eF$NM?8>1eOvpU%KyJmUs#M`4lWHB$-3nGANb*RXQ1BN%S9?! zMKsoUCw>I?n@JBeT$V5ux<F5a>Q6a$Yh8zzSR=e&C#&W?}gz}oib&HV0#chEc`E~9D< zW#C=7P>PPC8mgcYql&S4;NzD_#qbD}Ma@_>MVUHghO<2QO7(xfG2~TB57BLdPU2-K z-N#y0-eP@3Ri0wRRv5N1#w1&lF!V-m@mj%MCA9%RL1u;ZEt7Wjr!q`Php*e;%%_!; zPNbsdb_HoMYnIM{AS^Rm2pXoBZmCzve|MT-w4j@1M1HHNoEqN3pSglIHg+$cGPM!8 z+cgg!(Sowf3`B@ZsP=aEPhav5WuJVBFLoywVvVMrb2+aMK(Dk1`Bw~Sg%3%#XzUKK z`G;yP>BLMfaM6&P*;X^5?bw+RF%LIy|YiEM>065A0MyFixa*qI6+P) z?$d}iQ#7FrD*!U)oVxy2Xp9X^gi8Ae{P(W>#KM1yw`g4U1A;bpR>lwM!AMpP>73>y z_||oX*rOQ*yvf}vp;=Y!C)5#^}!wv6_dxBa8qy{;Pk z+Qx8N$Ug#G6`L{V5?qa*AHs$a@?oy%*GquZ6@g2FJwPV)R1sbmUPH%qg}|NL3xfAI zI*z`Hq52`zY2*TKCITpZxS{IXK9?L?o@$+i#;fG44IYYh)*Le7$|!;O>Yn;{!POMc z_qRC(8y1&TC?g?HT+5s0{-G?I7_y4^U~5qy@S2=#_AT5ej3z(&iMlxJ?9w%U?H3_y z*G)5V>+xa#<$DTV@)V$s;v>QcMzrRIRxHVlvzwM5q==aL!TTpf^mljl2^xSEeu1&lB0%3f@-SVlnTmR`C3M zyqmo5E|pWtnFSqQ5snM8yRdp_(PpB|3zq>%A69)P>McV0J?cfW6!(=)pPLD5Yk~jb z^I%7nK==^@eNX^@0Idw*53;g$Is6j0oE%Ja7RTDadXajBuXzc%sNLtgn48@t1Iy*M zrc8FK4c1yD!qJ5~BaHej+|#d?lvyUYyBNEk8o6BifIpGfeSgz48!z6>Wt7l_oj)sf zs>hOjJRn9*4n{e-R}@fv(OQYu5;NVpWY1eeSYdSC+6~GETB)#m_`^9E)%0#)w5B+! z9wvI%tVeV(<6v`#J{!k_7fKnT4nyym$vi26*JF|?jvmt*i;kUo>q5&cK>n4+1Pp^p z<zMB`W7rxKS85=SDoiA4<88=tKm-4JpbCh}?k9Muy^@hAM zBNPZiKH)6rs;mO;Nf4o8oPy?fpHvdcCr%1!C7?t$8Hot~7O|iwXhM9NG9#`4Q~MoD z*nRbG+sMo9quok}w-*l;fiH#58A?euc4>`Tb&)#H;rCmU&`vt+c;XDyJLjl=5sHcy ziL9$)K&M{8p|SNcXQQE_T?$kbzfYf+Z;ZMFh);Fj3*>KQ-2W35Dw7<#8970ho576K32a!m94P^A4=Nn*( z0A-fsgDW1SFcqrNlfc1H$(>&bb~rs{#Vt{44?jpX^V1mChsWpQBNlWO`Lo-XO78-9 zk}KSM;D(g(oo)W_o355G4HeT0&`Yv{<03gux>i>9G54M{kjI__SPMat&gU(rX7|?R zji?K_{Gg5lyj{!CJ|<|<9Dl3@EU+9q5$XIgW99vY4m*TN<6Kw^r@SOuq*PLK#Nr&G zS{OfQ6Q5k~9neJf(rIGs*hazjh_|$(Je^BYL8_ z5jea!Nt``(dS5`egF5?E3ro4h;+~_a8O8a_EUvwAHW+fzHV!%O;{~N0VXW4)M&jU6 zPeD6;)7Rr);tpHhfH&jE>hfsKp2u6SYhH{OGt|DLQpTgyw=bt?_-eb16qUMMa$P7M zMZ<&LjI&syL8l)u&ZrlHa8ty4Y2z=f8^i$r+f0P_obGjm;dsbsoX$Zxuc&6S{+Vs= zBb6{+FH-6Kya3EJ4Yj16+bNa#AF|$_K^tS$lu2`m$|YJ=x|4}HTE*+$ZRrj=ct_8E z`QkPe-<0Y~@!#LCeU4zotnEY|QgC%JMS$^b0CV;bp`}uKZ!tWFKwFiKl0vDM7tcxn zLh6JJuF*a4znaUrLu=HEaVb^)i1&qN`%l#n1Q3*ZM9GcXhX6*wxy} zlU=t(y)n0>bK>ifpaV{l`Ahot3mBdc~vFp>}T5kicK>W5fG<%toDw5N1Rcn% z^t}sA*L3h=S{^pLpzNZaRJRc0{uV1HyPzfnL3_K%aLXihc}7D7Dp6rI7**r?QWAt; z?##z$sD%1q7qTop#RvQN%Wc4Irncq^tmq;h{aAL9Afe&sY4#+Ye1s)Wo&xOEbV=)r zG_ZTdV(-#wQ;oM>9*w8oej2&Z8#TpmK)-|0ep8xKV4Z(M^#Kj>S9YMIsHURI0ZSW? zi~eRSmp2dkC(&mpS{Omxe5ArqsBwuPyUm%}3Q{q16(cBd)wCNjuRz##N-#fBqJJH6 z{`{h-{

pc2T*$57I1hEQ5qz^vdw0=y#UxFL#K|+8QJ*cg&VW>Jw7khbSy+&JO8@ z5ZU6x*85lHTnyVJ?aHvZuuRFg!+di|VK~}Ki|e?x(i)Y7KIQzJczVmRm4p=%YJcVu z=xGyb>Z|xVOYfRSN5hw!xS9^cHF4lMwpytz_L}(9RNCid(1vp>q6McKm6jSHRC6LI zDh-2+|KN&^Zd8JgF_Qu+e-ShDLpUXQFx9`9<$ZS)P}E z9HDa%Kj61+=0tXu9=_5n{+_MP-u!yD+uvF9*#21Ses_QWmJ)5;i0`+WhSXG9xV7|* z{a75sl8kpussdWMfyZF3q75}EaDx8T$JP_i&v2sHbe1P<#LVJ60E`VqbrR` z7d>1XR2jLw#+FehGU(+s`BT*Rqok{k%B*l+#GS%d5;snMz%Z_? zoR?qYYOvZzvA)EUBd3QM&XaKLH9A{9FMF}luUGeLQFS2^pmbroDQP;U+6z`WRA*#d z`~~le-)6BQ(ncQ~Ilj~Q(zg2Het522D}1LpD$xOI6rIr7UpK|Ma(-#KZP>&>XR~ir zJGX6A!}Wbbi~IiV%znDv72T#|-GD8jsS`K66U1`6AEvUC6RmS>X5-S)c?ZjE(-m%w~j0F?aO(s%j_%0KC_rjM> zIEMW`?kKsyW^s<8h{rc1#1-`7pDo59opWnl#P&?CJFKh`G4LkC%WUq129NTmJT8D` zl^D>@)6;@QfqFUdIedLU5dIaaP1oSuEiqoyB@ z!L>d61~Z;`SbTN6M-9y8K^7WMEozQSQKbjnPiyl_>h!<={zJY%<;2QD7~_d8Vj36< zrekT3U-z#uJGQJ3u?LZo@8^8+8e}as4`qT6H-LnExCGv?Y0J$&v#&BX)C3w!E{lrR zk_=sX@V?^3C+r`aPRfP2JO=Fvtk)bR+PR={BK>BIVf(Wk2+!3T9yG7~2-d+G56=~2 zk>020wTGCRehuyR2NhfkD>lx&IC;E2Ty=#xJ~6<2uc9T^;YRAmCSJ%RB4*3uK%zj- z=O|N54`i}fgJ#_Ti|?6YDFnTIt6x}Tk!4D%7RdUMCFP_qZnL{wpVTjju1oLBtMr*!L2U=d=599A?1jk?CbE*p5$l4hA*e=z`+*Pf;~naDUvOtyR4=jZ#t=qqh5^?qSFof48G6h z_H{s)cD-(;hcnc(kETZFZ(qU>f{DQ;BT__R*gv~=2D?k%a2!=y^BPdlbv5GG?OaF? z-s+m%TIU+goHF~rC0iHdZ;?>cvK?-@`e2R|gFOe=F) zSs@Lg*-Qod7JqQ?c^7`Ppvr%=;a*hSkhS}AAxh2rEeY>W(+&d)qe{G8p9gP7Z?s9w zKaqA+VKH>rW!@f)SW`HX3rk2QF z=jxogtoErypdr)?jESZj9%V2Mgg|iXDm6@siBfgtpLOo!1O%)ObmFGCcMrnaL=n8~f{01|h|*OURVRSC2e0;} z34x)b&)ydJzP@K&7jj!~>dyd!o|5B}UbPli6Er90@V93Voh|XC>7lRW747wQ=s(US z^}$gQPt$6*TEjtL{*%=1I+OIbs~d>vTU!Nw2H_p(1dh3z0BXWDf2cJGL8B0 z#g(KixT}O=7Wcrzk6Fg+!3_c5@0vQ$_4k8$(Hy=sh5s~B7NDoI>}5ZAjglm~;kBf{ z=`tWnN*1W%tT_)As-o}D`8Nv;nN}f992xkx0loo?dh z)pu^B@3`Bu!u2@ByTH0qEr^b?C;H8O7>F$2H)71f0i|u+pVGGb73}?5|GwS^JEwl+ zxDH17yf>gyjFmwuaX|E&e|k448Huw3**yb+3I9Kp((4K4C5_&Mzg-L|dMYkIV-;!5 zaMh*ovSqz@Lw5}uEk)l5)p$~ZVXX#02Adm@X+N#w>BkO>P@)TQ(A}`x#?F(frsH1+_A{yc#^X(s564@+8sB@ej2yCLo z6d!M<<}A|aRGD>MJLC$_GQN(eH|E+2(+~H%%J*5ue6Q9wQ2#~f5=2GDN%JXC+CM`F zl4@*>TFhSQJC6~WTv{grk$;%>zw&IWQRp-r{Zl)ji)X@>H{s_VmrWwJ)%8W*5B+1~ z#S*uN$>B>D??=Xx(YL^2ug40z^xs_Gc?dxt0iO(MIIc)O4>S!rIGX_z4f3FU*j!?A zDLoWbU8ov()5GU5J!0g4+bpC8DJ*|b1i;!c+-y&iqP9k_<&?kd-gGtr&!qGY9lP52 z^v7GTaJ~~X6!x{4kJVz)LFLAenT^X(#~PI8-ExM_zRBEO(H$FRsCWNlIKu>~7gO%oGZ9S7MsQKvDpLgvXg@8lY2hX!dP8Ri}R%6=>0~VE35D5*Ej5f?PrUfJR zPIdpshylaF+z@L`bl61^dL2q7h2hUPg8H}TP!bl0^s?`CtvYq`#a1Q(nZdqK5zzbI zw@g7#`6e-&{XV5nUa4NA`WJ`eDxNuvkr5)&+r5@fA%9}-nP(Fw8>;Pdz_R4FYJ#Z~ z{GZLfD|Khz(DM8PpviANP8=KNNZzkJ2zX58ek4Pt+lpJ_9p<^fzuLP(D<+`bu{BD4 zJ~z2^T{$|RuURPql*8WYS@afF-xuAd10Y-Cm%Jm2d-|!-8vi(K@Ofw~_*GoxKR8U~ zt*Na4|BQyTs+XG=*A`OWqcF5V-}}|JgRf~-a@0?Yl@Ud{j3wi*%VeU)!GKY+lL}%6 z_y&oaXe|MjF~U+`zI4E>>-*;MA?#cxm!W)jJJS7@ zv9`AS*;eO+wbgvqRFMQ}998p~kb6O%Hmt)3B;oiFN3tr8&rh0kgJB&t^lOm_%I{q) zRA`#e@=^{t5;839+y(7VDD!xX_K6#+?=C5>peue@D;0w0H9v}&S5_jdt`bf$9!y`5 zMhT3gDS+^+?!P85V1FrZ5Il%o9a?~TtJFjPa#+zISbGA;quiaxN9O$TMP&KX$ zA+=*Gekqd`j8`pZ29RE!33O>7DPP6xMvZ?_wi@YYEemGlLZxsbx>83nM^jQx7t}?w zpe%-UmdJypeEok+U2|Yv&C_n!*lcXub{eO#lg3tKHb!GRX>8lJZQG62B;RfNz3K1& zz4z?dotb@}XXecQ`-s>5P+}19yq!PK(|H`3lFAs?B;juq6~n8uB=&E8_RVcx4k<~k8 zj@2umZp2U&(jZ(@L=`Tt>(xcsix_s57`X3P;A1ZQp2TMSDN%?RhBhD61VE-mMsop= znnoH}u5K>05fPjggIegm6SdkWA5`?3tj}W4J>q^yy_xY-Yd31rl);k`4r-EV+#UxF zl47pkrFHxsd3O$fNq9&DzIdF%^49K0j*6QUe=0_SzwLydQw$|UNHsL04nOJ6TF>b> z%~{VmXkN9x982ftuOrRB-gIAVsxqs1-j3xRP*;#om=^mgB(MqO@rM#3e9^TfL_0t) z)%AYLldEF;-Eusu3 zs9hr`4z_|EOcXp33v(IL#ngfOd#l&jGE6a(baxA6dGkIwd@3Cbvw-hpi`@}4`VEMg z9N`?JWc(So{14qCV=r@e9^OsJbltd5I)4KPCYn>!z@zNW-b10qlKQ$a{GxT~moaG} zqG#ulmkL@OOiketY>^&zisPmN$Spc`Zxep`*vbZeLnUI=!DM3e4c84qy?^gNpN)c8 z-7C@qpxK(^BUxWF4pT6WsWvD#zfqfSMTa4#ZS{nwXzLfyiU)S_|BRGR{a!+DIZH<* zz7js1k683$mY7u609#fiz^Q}gZmLY8stkIfJS6UjSv(iTPBEGyV}K=s%Tw@CgMO3t z#Hv{ljyvE4~R2UgCuo^aGS)aZkc4eC@Z9_+yg5<9%`O;g>)A#UDxY%~C z5HZ_5`b;+Se6x2K*w1%XbXgC@Lfn?p)~}KBQy6|0&$z+fuM_onM6ME-nBqI6t=ASa zG~#XuPHdcuH?VRaCag0G>aHUlh)T)7XzGlatCvPorV5Z(_YIAde{w}k-?B|B(oo(d zKqnkf&x=J%(7w|2(pSQMD+9ez^o65BqfKweB#fbtZ%=W=5ntM>C`na_t=1e`X`M^u zVz$;n3OjmLX>Q9Kw~6qf*y?0X&MhPeNVV*BPIu zRZ7$g@Jh<;sOcQ#=_(6K1DNAHcQMba~=lKj$J6cTm7zdrd)rPa7us(jpr&3|>}5WZx7PND2dX8`9&s&C45>wZ zxFPL;>Xx!8BoR4Gd%%G>$RxU~veOe5S;zkMBFbiG@0Zt0A=r=s>ZLWh{RI zkN~Nl${uSTNZi_*r8Gdr6d6+D#mmA4st-TSRd_*!8f9U!p0Z+giDk(oJR&(Ffjet* z>V8H}^xpS`;H|u+9O3#)K?%dN$ufh;gUtAM6t%_Cd1Dw=9XbAJ|?oB$D5Xw}#yFzcBwq8t{BU7AJ5l!E`)K8GLGA9nz48sty5YDj7c zAjV1ff!9JKAI6m#(??)u+lG){)Gkkv3Oz1_f&{vE?LDogoU^j-9AzovhJV&MT>kEg zVnV8ZeQG1Qk~2u`jPkv70axY8O)r*rSjne_H>szaF+A2uVSVr9T&TNS*{V&k^AN9V z1A?`DjXQ%b;_i|G6Y1f%Po81&qa=L_71k5DheLwY?+*lYQH!mfKuCpj5=*E03Z$B{ z>!upADuwe*ny|VQlI=~O4pQK;vC=w86F|F#<>37i5%|jmQU11~C>xIY+lp!@sI@(DWDFI^cYMZG?tPq%TS7yMl9BQ9@Pnu?ZJy+vtFl zs0t#)R=_6lo8bVP!l2j1c$XJ&JoWwQvFS)*05yp|IslP%bAEeguB}~YiV>#k>=?~N zxM@SD&($o))QmUzH(#(Qt2Y6MwiuRA_go8`glM46p2q4vuO zW!m^q>YK2MT=OU_be(ojkiMfIT*2F{g{8N_c-eWVG&h0ynYmAmt~rKVN$6+tj)LQZO&dkAoh|1cBR7ti`9Xa^?QJ9v$}DkYEV?C-_$qU{qsWhn68#?#Mu=Hp zgJ0rRfPP%IK>60>n0}ov2-PKJd1qAMVw6%x&I~b2fc`mRV+Qh1Qm@cn6~BGmPg$*t zliQhQO%?dkSpjxQSehs0 ztXih8x-TvVuU-CpkCb`gT0n6$n4W$X?*B{o-~vdCSCQ=*sNiG*N(o0k^QlS@yQ!rA zg+LM0>Jo-$)dqV5!{qqjQR};}h3BNe)fjn1EYi?CtYP-*$QEd>p=vg@o=8ts^tYAz zCy~Ux|H-1Eqb57GB<`I8(u8zlIWEoNAnxladA}@7P+!-__W?y)KQqF$te!a0#lPiM z#8J&6ZkHi;{|xn5PrWs(!ObhpHdE$dA{o?6ggNm{<`t`hg2edSKOu<>a)GLTa*j~> zV7oPb{(zzrEMkL6^wG@JGI*^`p8zI2;#?rAX>!S7RPBFkf{8j2rkErqtTue3)Y)QWPQWFMpftT_)=9? zzZpt?Ng^6Ot&y*wi(4T=W#W4|owmRA-zE;7voY3>`6oBM^yVy%70QM{1ZHNm2(ZOS zh6Le=x(w!Kw8_!XTyT;!Ic3r&!);sp~j~2^*}v*-BduU-13(P!tN9l6Z@nZ8doeWs>ztwCqpG#Vp6u z7_7?ASV|z79Nx9|*2JLm3DPNtM2lHQ61`mDz4R&R0k`bj7NED*ucj=w+4*LDIW7$T z3!w`E+mhHzYx(TDpR6Z4i)*MQ4Ri?yH0&Fd63Y)n3GnKhpkxu>9H42I#pQ>{e7$#b zMPOC2q1v8`?v~yOA?=>X5Cn~!z{6{1gM=Jf)CVQV+?uY?azv;r zNN@;X?|&ajZDoyLX<55vi1_`ek@CSKeDKwhvvGNiCm#I$8FGCp8$8eK4(Kbeye$Tj-_}bs}b zO!?$>MR_gzh9aQH%%}L8aU|2gr%OF#T$H6ij1r$Pxf(L6q7hgOQG@y*MIdPyx~OHc z7)w%$pt$I}S7iU0$5-Wsj0?T9e1Lg;O&@%=$GN)=e8p5x|9wAv%)1fC0w4XFmgh04 z1Px)^9tttL8-!xHW9>t|!K50$bxy2%$xgyS^Sk@S{&%8QQ69+fx!DKYk2C?|NJX9p z1KsyFGNT%NB~aAGACD=!t3F+T^C!X_cpAEYut7z_e{)8#4lv@5GP;4ndz%(Tz~y26 zg+;{*HxoIkv3wcULr<^QU^wuzuj6aWtizTXi(TJyhm~Rm@DLE`h`nv4r75E0>`@vQ zdDDp<^7la2mv~vK!jDq*$=Ysy-v?SC;eR+={jg}kVP|fZr>7wa>qDoy@L_K0Daroz z`Fz~)=Gxk0=?+QepzIt|ufq%di+P_|`7-|MPyn(Lw0Kp~3EG+T>M-k9@SavLa{G=< z;J|SF9fqH~U?b(Xzyaz(`Ws+Bh zetS5Fbh5?n5FLtb7Uqu1FE;ZM-rYEDgvo#%=F5d?mUPW#c&0xM29|m~5O+jZzRrZW z+F3_X*3m*2F`*@v{A?-VJ~62W9I|#Uz5e#C01D^E7jL1@2;VR@)Nch`YCY&@ z1X1)q+k+UK{OUbT`@*GV&USXCd!F=3&kxeznnTL}_wSL+xpW)9WznmjhZdr5AVx2zJScj!+RZNK!<&NB{h-;6QVr#$nb%B zSCC(GQMqLNr?4v+C?dC#uteSf$Axf)6X7sZWG?a9x=|QaidC zL3pn6;~gO_FSK2}MPC>kC7nY~xeQaBjpk(Wc_fr|J?#=HvwI30>}A_pzL4euWZd9F ziM=BXIJlqWQ#Oc5a&xhb-E*YJWKFr{j(3%Vz9mf2ikE$vXr2)+!){zzT=T)8;jzK_ z^jb~1_x1OW?bs#k8_}OSj@$YMct}ThF?mKhP{`-MwfO&Dhvvn6p} zSmpM*xNgT~2;5sX$X_)9nr@lc zYDM_Jb)mzr3Qf5*+cqljZ}2k7wPnf!G}6SwJ?|f76_fe~cK8!0xLLved50@CFyNAe z+RjGJE;GGFOUM&%E8~3pUj8{bB6+nGGCW<92fwTEmmMh87O5_6QJz62(Ns(y7v`_?h z7Cdb6;(E8miDhlg**gtQa=6xBzlcb!2s}SIIukk6o+5wahi-JDG`?Ttc{J)yC8`>Q z1DS4WbL`NAAL;}-Bu%|wV*Tgswl#G-+bZ06$0$LR4tn^XFMo9lEpqGbyM`FyuB6d` zoLM*&#fedgM91DB)m{o4+=(_Hl1VNWN-q=!keDGk8D~!b1wvtS`b4r_sh(M2($~Sw zJSW^eBOaew8Jw)9+#bF>MKoJ4uMxnHf7WoW^G$mi#^J{E_q^L1O}vthVVgw?GX>%} zb8W&D%pYaf$vj@f8SzY7rdRCzW?U@Rr0Vf%q>p$dW|K(?8`XS%0X7H1qDgF35BHsi zfy*pqp=46~43?S7?*@ImZG==y$#13ve9J1iyl2^k3bTS@_A}^56o}kGjUbS~}wJ z8aNS2tts4i+ga6R^G1}dvpcK&M*-bSdncq8AM574C`+1y^O>ycI}4e>z(&gi^tfR^ z2zO}MY3F#VY~`H>(K!hqGzPn1ou01oBYf1G-~tiA#`q<&Z%U{%+Vr#d4hmuxOb=CB zp3pFPZ?W*{^%E^3iLDOvyX9b;JY*RvDovweH~4FC0_F<>(*E>t!-1NPo3{F;{y?vm z`RgG+OY)5H`2c+L2Ys0uzoRt6Rz6PUizH`u+gGkS)#4N$<8&C_VIbx3#nK=W{FSv& zFBW<}<Y~P4L*g=OkP#_>7-xuCc*%V36f-2>wWv*E zg)Q=*vqv~nZx@78VmA6X*Hy%Ta|I&GZa5KLjQ9{xEs3S-G1)OfSt#8SSAZm_yP_N` z?LK_j8MoF(b>d|2W^MH>Wd~zZ7j4-AvmGK0kgTb90}-(I7C46iofIjEHJl!$aafKl z$>KniCJ{%^govJukFy+}j_r;!B(^esk2evt)Lhvx?8C~_y=bKUU-#*oAb!hC_qI{w z(Ine-9jJ^(+~J|eo79iPu2HTP3Go8c(7;%kK+hBv6^-RSE2z*A;H z4o^Qn>c>W7$eUe3rRE1lAE4r*XO*BQzC>EzTxH7uD2Oq*4^%`;;) z;|%Wzhj|VNHuYCmtND0KS4M?pP;92CKE_MhN2OOr2a2uI=L18gsGHQdV@GwUDXFV^ z5ZJ?KI9&Q1Thcw_n`X%E7)#5o-d+r0f`APQHAM%GmaY{azG@<&QCKDPn);#0ZJ0wl zTs5R566ZJVLbc-JFZdCg(&hj{a4oSeRfQ7YQHLk5{+B)&S76v-$N9)YbLu2y0o$?g zZ>ftbmx#1Zw-s5K6RJK%#%dW!KOvaCNOj5VKBgpFI|T~J$%&>^S9?5ZFDurDVLVDU1Yq5+{?gkVsloRF8|AN$K z{CEWcu$_itNCW6s!9SZKyc)a6*8y)OloZ%k$wdll+kaw3l)NR6zC0b+lWt6tyMGhJ z8<1$GHagTY5{hInTpM%IYc;Fv*G00mX-%dlp2Zp!l-;_51)+!c zHZu=kiQ~K!2KlIYkFpV3cT*CgAB>A~2s|WY>In`3esm2}pZww26*ndj{kU%{W9KL( ziduX;>LzqPas^h(3M&=<40f@^Y%(1=jymSxi#B!HvQCB5h3)uUq2frrV`(XwxNgT* z^0=bT>OW|)F4~fcVYMg>6Z*$yf;8w4(!BAlAWckV!#GJs#UrIySr945#d0M?mP$ru zDaMJ5b>Z{6YHQv@qHRcSt`ghSRKOC?_oTkWQagC(>@Q?Q)e;Nc*fsKYSkr@YzT+Qd z`LL#WwAI0qc0dxPtmqLaty8M@p_vDg@eZ`ta||7Qv2Q?(^x_CzPJ{@&Z8La7h`nc_oOn~EA(Z9!oSw4<@&o14aI5#vijN89 zl$vctz?ZXiL#FbVsWVE_!D3Uf19{@&h0e-DMMKBPNVgl8O8utW6EBJ9R#_EG$1=NP?P-!9!&}=!+FKDW483&(SPO@3ZdF&@5amxrUP$$NwWLU?RCYv0 zad9PMicP~f(ou>`Y9T>+&BDN5SlgrS|3ab^iN^ppqq@gd? zzEg4Prwu8TW3wK4RkX*mpSFVl*Dv;tD|^)T*8n-wIyk&$KDSvqKIJ_FxXtfjD}>~` zBzuce4m{_Gd`OXK{Rg>Zva7Q}$GfdmIDACqRESs@&0KECj1RIrQ>M*R%LaSz-3&rjY#Rkt>G zQtbY7`?^o7&uL$UN`oD}8`yVrV$jwSL$y3#*%%HqicdU}`bT`#dau0r@SPMed3m{n zip~NDJTxgE3D@)zKaPcIj)FJ?4*2A&4{)ta6R97$0awocsN0?`nJ>5s4I<4KPBW2F zjIXgwQ7n?^yf$jm_4;V@-!ZlgWOmVEIdjzMxb6HkO`YeyIj94_&M39n($0k=Fi>1{ zJ!;3wd1pY7!`PSBuc}%iz4`=OyOMeIWF?JzFu=7-d2WLsaEF^pR43&6*{OGIk5lKT z5fTMmarQ@@)8mNoh}^oXuub%PwzRJlJ6JEMY|GaY7yi3!G8iIRb(z_4roM8?cd*ST zEtw=6D+}P%Vd}szpq0#Kkn{*WQ$UjZv~Da`6p+J|bEPayGD8YeBIXWi`DO^69e+l? zzlOf4QRTHIH4xx6R9(|Z@b8;vIY4QZLYgBLK4?a&U1~{2pIf6p*kW>L$+>v+xCI5* z*G0~6|B2v#76Rrrzyn$}G^U+%{IiHUP!-V?k_zE8+sY z77O_DK7h$#D2`ZZH6K1&Noc5sFS~d+^@kOvELH_tgB8XOU|_^wK(Y<4YujzPa{*X_ z2Hmt1z)sphhFx+Gw_^kz#5U@)0k5w-pGul%_Eh`9ONLq?q=$6s%+s`A6I*~AF~a=P zMW0;?69H`SxjW1-CQekELz8FymuZq#fpxgZc>^@RhWXy`yq5k`B#C<_Reo{}h=Yqa zF++KQ|MJ3R%R zQ|;fot$A|PZfYj5zDJ8hYmy_MjG%eA)&Nl+UtQql1l-4j;wYjO9%`mTzfKh$_ErfN){+w5P*cj)6)ryx+eu}n> z!u|oFQ;Y+3lJ8C8T$DGCZb|XbQm@~kGgNHBg;W49e7`Ym?){!sFo_NI*$F$d(m zrco+wKsUYvn%2@5>7B>H6=NJszP-9z1+#a^op^H&4z?M?Sv;G{b^M zIq)xORaF(5jEZ+V*B=azfelY3#|qXkD;yS@c7W10=|+~wnX>)AdQy@rGFKnv2v}F5 zV+Z-uppfxgu1ETL>Vp6SFbckDl5-{#{A)1U8OFUxZ!ubfFFz3-LgGg;({cRazONTe zHJZUCsW7OQiK-9D6*zM4k$kq9L0d9?n+~?WSw1YNts+0yYP{SeaF}Cj^j@;08#cBFabc79AHt_BaydYyf@5id8$vQ%pkMC>H}%8BJb8T_Si* zZ_B3T-LqZSWeI`cby2q8?ZXF|&?4p7n$oYLowdF10G8oLE=?ZW6k6a?n0{>B(v|~T zuJQA@13uo8&0?#WCoSKcW%bipV1J$aS^A@$Mn?1F*0aa+{jY1Aqt{^$6X z556C{o)(Gu6fIU;o7_$(X8j)v2+lf`Mi8ytft)O|j6~g<*${eg8j_Q?%#1#LVJdDa z`;JB}M{rTIFttV{bIe#_JC!Ih^{>tp zTkB+eT={A0sg4QFejM@Tj2+}4NCYxaUD%2Xht_Gk%W7!fh(B#sD2yaGt||!;%DMx< z&@>wDonB10A9N@Ep5i$y^KZ)0e$BhBM+`@5m^B@eCR@F6X+S-66ALJV0sl0OaN2y8 zMtNaVj&N!dg5(8l6XkMja1o%{M}_i_tz@frOp7r!Wj~E&+6359h8+p%yQY-KQPL?$ zGYtDNIqK}j?Djl&@}~vcA1`*}1G;D~-H6;+;j;x8-`Al(Kegb_7|47pZHyt5tT$mD zkgok0UdLTwshk?g2>6(05ygKew zJ{Fuh$u$}Laisc&>6Gbdurb-uPu!Nlt>-SohDZ0SvA;bsBG(_djt|}|a)N?hIqems zl}B^h<|##ljGW`$w!MYAVd@Qsk`f068wu_o4ouf^*B zNhNZ!84`%G51efg?IPng=fd`*23z81I~GWp(R zG>+49nrXNfbwu}i$PS!u^JwdsJw#E-pZ4Nx-6_=Lh|3vOpEK4t*Q1NyC8kG6z@+AVtx=A@5wzS*wx3*`LqXZHqZw6v6in>U}5!!Mi9Z_v&FzkW1Tqw2&UYRUC* z)Je8S89*j9Ed(6}lV*VGxp{o|D7l}x^Z9I3$AL>}YtJ2Q^k8K($DcK^7X*=vHhpLx zkvKp(<@+gw+^6Kieu5ZYToQ$AG-t0#2F4Dxnccyv`cM{+U#a$VZP0;JoMeVtwStODDI{N$)mP~Uz#6cz z{ogdkez17#)HN|UTr;+CXyu_!BHA(qYX`(}HF=6@`;!s&P$~Sc@-t1vQFcd%!CWn& z7FRjD+6|d4wbE7zvR|VQE4rQSX%9*GJ_C&}u%MN#hdWat=2QiHVx8^+RJp>9M@v|N z9Ha?rwki#{0c0|c;pPuQGtmVll#ns2L+Uw{nS{RLVDr}R@cc7nyl2XqSUV12K8ngm z_1)<06&V(0@&W__n2vVMB33FQN#)Ta6=|omZZ0)ESe4?%IU&G+w4oH=BjC0Ro%PDA z8`Qd?Mvm4EsJ);FA|Gv5IoiL(23@nUgdj*8cxYF&2-)0F=2G)kiAO{TW%L{2G$&Ua zWvOC-#lzN+;eWpS?a*Is$k35!7eL5#cPup0h~1eWZ~!{%&FcEuIJ(RVQSI;p%)SeB zZHzv<_IZIoqtM)f9T3(TKSM^h|8P%5eP8ZWuISiv9u9JZV%#AJ3)gPZTHD!Ol6*d& z0GZTAqkv1@{1?3u@Tp$I^ruYrSj?9Vbc^Q->FZ5^lnf4Bfb0)Y4}Z#_1J`+eqFs*7 z5ThF<%!g7&(}@@lPBxG+5Bf+`ML1MY*T@OORcaDWiv5>p7RR(CfLof z*3BUdfkfq3iHUtR%F>K+$qeq=x#H;ukNesW(LuF)Xqs6}kO$J=meJU4YVSl1$hlz~ zA9Cz;u25h(UuI=Ej!ud~n6YqECDL}!5*OT$oMFVfc7h~VyECqlzO4u!g}-rLY}-Pv z?%XqKe24ky8PDG27^~T$AVml90}At|sFd3*>cl@I-jBN-6Yu$;3@$8k)mz>1v~ zE|{2AiNYtqb+>4~8)Xj&kOC*{=my|1DsWgkg;Q<@1Y|2ej*ht)B@ndvxOqOK+wrrc z4;;mAZr%N2tMHR%MQqRhqhjeHYyKXyx!{5hTCa7FxrWNMij&}=C?+LSiu>X?RIL3I zv>KAu^Yi;DB29h4)f{yX(DkrWN>JL%0oO|SQZoj4EgErp;eE5ms;m0u8o&g1QnSD=A=8@nd&p#`>t(nqe#+@SrMZHLMe$hlq1}BEJP`7+%)(N zyLvlC#`$-vaqyI^gjCeO4Sa-?Y5v!bU zaJ5_~Q20I`T9&?~)rAP8L2+gWHe}w6fkVq#VzFGM5lHDh2fWO?ybwJ zG_2&0M&GQb5cFxUlFP%7BlmNJMy03en~!Tj3Dx+j3&QIme+<$jar;p_;Mh%#f1S#p zmvPP@r)(Pea1T**D7-8<+Hy{@XwwBGBZ5hDJ>)+*V~xK4y7ff#aSd>qbi3!av7O~< z^UO7yV%&;+xcPOXaPFe!UUt=^qZd6(p*5d(uG>(?wgpSO;Uj(B`p0X18a~Y5F>0<4 z13zk)?vu4nBm`9riYKw8?zFhUnx@@x>Lfzjc+kE3facdjx5cpQ)=bAh|E{@@ZB#cM z$GARrp!87N4cL~VQXIZcMg5uZj2=7{Xh+g@=QuMR(PA6N5r#LJtF4W6?XLi^<*su+ z6ft_%fBR7RG!GBI{{8#w#gmp3(Z*@#jCZk9HyyW8Tt%=e`ddsk+&I#L6^KRraxUQ_ z;Y{(V>nKly#Gr-LP-#}!D7vtw#7rdW7m&*NKluwY-Zf!Wto4ul6kgv))x5wn^eO-*jWdKDp~Ipt zO%TaDGc~#NoBo)Mzc(z(Ht)p=8EJ&Np^JITO|^qMgnX}<?~=DiePaehNXZh# z@UmtKV<`AjZDB{sBpyL+q08`R5qfBVz)ZEE zqw1rhLK(${lN97h$Rv)c#y-uao5T>BV`&Qf_|IW+>s6uTJ&C|f3s%{!)C%!ob+B;) zs*jqrNu>K#N)(smRU%B-Sj>=W6oybp-Df{2ceWdoo7;Udi%Dy?HR(J zwVjN7N;L9DYmKW`9T>CKGQa2Po0uSVRepTpo}A4*LbAW6eDr)WGmbu z%vT=j9CxQ_TnJ7ze`&|!>d$*OPfkRyxkG1D2L4Gg5qV5-qUtfQ3q#jflqsm$5v?*| z-`hN>Q-J#&Y7p1geEgS4UDe;133b4+DMwj8V0M=EaK)yy-==0vMTMgssN)qTX%?rN zGK)-`8qtgxG-cld9d3x4tGXuo!Wm~^oLr4vr& z?!vzbsIvMoBi;T(!9lX9B#YRZa&YPl*CgbGXd6oBKVWtl)GvR3iACZ5CsE+6OzAVv z0~+Y8%$@>ha*h64`80Yrt~0o!W1llqjf8_1>*3DvqWY>}jC+1;-`I{tSaLRgxuero zTTZNJvUNp25Kn!Z^{=yAH|K2@|+pA`bvGzsiB#i*X(NhxPZcf#DdM$B} z+;-`GNCxX*97-0%9HZi;Zb0h@+I_f)APkvR;jyqc(Okh6psC@@zz#Gj#TV5z+Y!dF zk_kEj>8nx6Oi_=f_$lQh%j-pMfBVN|*=M8euCN9h|4dpzWvFo*w<}Rn@2%^|j; zy>_^em8QsP#Rf&{&qmZli&#~128(L;4DXCkyGR;#u>K2vnzV@VI~prumpEp3q?$-A zn0}I7X=xdh$t7LRw}s97f&G_Hm3!4_-;PUf87}rmg!GC~%k)w-F>-3)K|MLN`~p$*U= zx7{@3_2t+7dh>HbwIv0@0cz5EU@B*b!YNSJ$oD`~$a$+kzPzARH$CK0);E~R*~PL9 zJZ}-=Wu#%)STJ2jz*yRpNT!5?vzzMV4PR_Bcu6_FnfQ4l+49|e4hE(yLamKopz@N~s5(1RUZ2Q8XN=maHpMVpsZEyZD19$Vn_1>_V^GrwU?s}@( z%gl8(;}1gOf!=;4mrRupus0ZYl9C^YjXtI@i5#iU89!QQBBwg{VWpvJTRR_K0q3W0 zHGBn>bNkIv-XjE^&M7FG`2Psm@5Y;pMm-`WbbSk&DE=V_ETD3V{KDn_m%`uXR6@Se z$YJK@#49R`yBsN%(2Hymy1uU(`4G}%2v+dHpH<6J{&AMg*~~20`B?jNAF)dDrEHnZ z)|Z!0V4B5Hiz^x%e6R8TN?8BdGbQcp<_cRrU9H*N=^M8x&e@KTjbx>%S%4$zX&{$U zQV*d;X@>3@arKU!7w$CihHne@)jUg`8=7=?Nw^zgSH>NZ@_J8<*BiZ>wUzbh;DIFE z5T9rR$vO%^Bv2A5A}xlfRdk>)-cAR7pR4NXC2erkd$*?Q~r@ ziEAPY9Yq(+kP?Y)hlTE^wFRS7RBpZ6D#!wH@ zOi($@* zf<5tj*Nx+IAXcCdUsB@{rb*)=-nOjAPlFKDDi{Gs((kBGG-D%`IrnI8hua#^Qck9b zvlwe>r%2Jp62x1B@XLQ%G!f}A5`mRLFhs2zmY%w4u<9LxC#>G5-2nyhB|C32bAN7J z`G_qQg(^qKpcqppf6pEmm}x(IonQ{`PE_XCi^9WFP3_77TX9(hhAL#(N)#&#i0>Mb zs%FT(Aa5Dv_%2vDU^ez3ug*-j#^3{94Edp$16Vj0bg|v&871X!+AJkf8=NwLA@4;K z{qpgh0xJU>2mnY;T|2dbaEI_C5dQ9lj!FSu28A)-$NSsfMF?*`%Z+I*Ra%o<^ljZ@ zTuMBU!z!l)%lTpshSzDy<~>wBykC1g$w+N**oQZ8ZMVq^3@b2#T7fvxGAg-99vy2b zC_D`4Cx^+g&vY`4IY*LODYU@~{Js~7!&QhuSc?#Xr=o@@5RP#ASxRg-#WXvFS17cZ zUgNC>-CCfCcwN8}i#^hRO;Fy3%{u^J0xeYkzMSUKL7{jsZw0P>#Tet<$qXWTi33=AE=O0`%(zbsWAMB!8(|#$8{B>gQ<*PM-`6~zUUoB<_RlWrb|dIsWuNYU|GK2Jd_8Y}T0MV( zCdJqMjpu1631Nba{Nc?2fV-qWP*?$rfslIDj27`eGag>i-95B|$~n*sa3q+;)2r=O zY*F<}e|SGG5F-tN#jFj0A!@Nc^HYgDZ-xjZ{_4z;!PZS)Jyz`8QEIGmxq$F`Wq0AnvGrX8ZIY^{PnycaO zfI3R`=oX---U65g;G&~a+_r|&fjMCMtM-PNE|QJ8BsyrP(|R&CrK%=(q5>M^eqP{? zvC5MA?A8cKWYRS-Y6&5ooyGD>?Uyh8! zrUjFb82#`Chfwn78x-ebQz|)T9<=5o_C*W2FiDD7#v3o21gG_ou|2f=6v=Du!gRRn zv3e<*BOGTbZE!c~aNc?}>p^e1F=hPjKqlSMy!mX=yny^jc37PJ-mhMLQ*X(K8XNTA+Mp04feq8rW5+`#$K3w5otE|2Q#;| zD~}dkzHbs>z&rKm2aRuIYmI7S1MoHEl9}TGfN1$%(KAEy^7?BtlakN=PJWJ$9m=g0 z`A3`u{i07T?i|W&7&K-{81xr7AFa7^=XrFfdKLU>cza%;UE3uW|5&&=_BF}nKED1V zQ(dldtG+KWcl?hojJ2au#=3KG(CZc-aiYerq!LkFhb2rgvT_@nr>5La)Ct*nRIR%Q zhv5;gG&i`JC}<7fB2q{y7f1z--oiReD0Gs7=0GaA-^e3>$hEovVbd%Rg`^8-2$*5Y zur?(G6FsfLzpRfp4S}625dlCCVh7izkb=|seW{kv%KU?;<7GXjGBKud^+~0@-RRn7J2a#`2ynrbannUPe0>Y`9 z`vmVlEi!v{D` zzfd|yOPXWP9#;yRrP$|Z2$*YOc)dQdrVq9!tmJ|LG9=?$m}2cD8TjP0K#VU?Rzy2< z0$p+kj7KP=Br;SdKG@jzs7i%t1o+Ln>PDMl5D&`H90dwUuA!uWas^h1uSk0{__l-j zqV;_%4*V2Xt{`QkRRz=RH{@D{5yA!^coRG$+0|K3pT~R_FSCXgW@~)Eqt^rBC`#N) zGM6HG)$kOuhV*Scvs-@Cnu_qorY`sd^AAA$!1X4@oa_jCowz8XMQgJN3v0~@vlNl+ z@7Q^qadd8k3S-i`{WE|x>P0(8qD6oK=nhz)puw)e^cm?^o@$07Lm?sX;9r$SZ78FB z+2FS}{aD6j#i2u9W_5)S>7!-Mf;HZss`8byvv&k>9B{P+D@3p7)i(O;aV@I}s(^`_f#W855VaZ)04a9n;uy z&t$p6{?SdmsP>CHMxZ+KZo(21)etmvceR0>HM6m^99D`n9mnDdC*#_bV+)XFl{E5E z>WY@qE>51fW)aTCs_?`PDU#)1xgl7xhDkFk4UBjxdy?l+*+-l%VCcAQ&X+KL5{K7o z*e3X2)|lB;yrvpUyyg!wB~_7V>P`bQL$v0PnHEsv`+;D5GUsR7lh)Zv@)-n9aR8Hf zFV9P`>~4tr!g$Yd=44_N1uSaG`p&Yk1vM&-dqg9}r2S2Zxj-v>23V&C!KqUjWznNu zy@X@2NG~SEY@rV0R8h#)qa|&_7wG`=_J0~SjpS3>s@M~Nq_MWt%2VNFLIo|Y> zU@1qmHY~#&>#{g$-%R#EfZ7uhw$_K|w2C^`Zg8)yu5*^Fb4W(#GW(kMb&vA|7_mKD{MQSs6$XiS?TeC&~h*2vURc24|q_n(W9rI;F&vH#^e zTL9i5#6(rQyE(S@!$|76P}s#VNjQ(Kw_lo|RR7vOBEc+5ef}cN&M4+caHyx3W4Vbn zU^7*G*RnN9Slk>vqFvA1Ig!WK!{grWhwixa_03xlUO=9oH*RR-g+4g`{A4Zkh{Py- zEn*-s)?~P6@ahliidk0vFR8#oguXpyNn-YP&?XNmKWD zS%6^n9_e_o&)MV&T9=c{nI0gr>yKol4xYV4(lj$sx=Vak5Jy9Eqj>7hl9uZLP>@ww zHw*oEgRmvv^m+vLQ6ZO5$%^hCK*frk_4jkCfEwUjn0wd6?|yqZW~JcugN9(r3wt%` zkAJXkxjswLKZrwLpq!yIi&CzrB*XR)#+4GyLyeL{m`x0u2q4}T??dC!hxw?Z5C1IQ zSL$Pg_0hC~@)|hL+hwmu@jYx-k^kX%H9h^&{j(7osT z*B4Y|n->uLISU?}z%j{iGUDBUl7DZ?;AI?$CkT(=?H;vVvc$x-#m>YP2nI9fxNnEG z!0o_(`pgew1G!!V4iHV@DwVCzS41Xt!_il$t87A$%SdHijBpR9bZPG_XEvIB*Zg?W z>zh>6YjKiKoR{&DlPe*uYZoDFra%6eZje8{LSZV(BFOs$Yu#4=&Ol8Ua)`ZJ?Jp{Q zP4urv22bllRYlB#$t3k_3wDLP@QsMIx^>3kS*mpOBF)=4H${hxV^{l)QO#X6tToLl zKe*TMRh=%H$VJ(%>}@p6mF{5wzaE1iJ3PtgMY#)KBoV0w3Hm0o zTzWo*>mIS6!_c-PdH9Vv|6NJDl90%M#UhbUpES_4O?sovNQ~g`X#U~0nVra+dH zpi+fvvO---tcMERwBo6_3(75NC! zX2PW{SEA>}9rg}VtUfPTlX_z_f@rHLmi$Q|`K%8RjQLl7Pkwmn_Dkb&u!yusQl%_q zigBt|l7Z4xRPpg-%Us0eim5Z76oT3MkZ9j5zVi?x(*YYpQ@DEW$iS!=+W_`}b8+E< z_rGDk5={ApB!6C1#1tJYO17k@gLB<^&P=qG44#x`sm~-N7#0KDBl5>?w@|o_qf+1m z(`WG#4JV)G$Ea#FhqQyOE(3->u^x_@)cm9`9S%!TXfK#aa%+GJjK5>W2yIocUrLOF z)ugH`F;kyRBXe6onsgyd^@xmKzqFY6wC-_z`~c`tWc7_j+C66=3hmpn}$BflO-4EZGhFiB34) zMql(RIPnps?<4mLzawbxWpf|G^iKA-&g9VTQv@3|$&HFP8I`Avzj<1!Z~|m#c9NM{i9oLEOg~At;I8B4&UHw)cQ&1Hkef)KDfuyZ zuUNzCbFmkg0}>cRxF$@L%1a&$5J)LmWB*863)% zM=OQtaJ|BmRuY@(2nYKV z&p#L0eYu04tW~$5!%($f8$57B)JtRi#Diy84Zf7yfRn#|NC@Guf0DLP3c%n_?FKlj z+6E1}ix<~~OlbK?r`XT&tmUT5jymMx31}{2|Eb|AApPbZ z3@2`Fyd_#F+RJywI+9`5>w#JIb!xtMp7V#<(OJ=mrILNmHjQdZsgT*?InZccTW8Eq zntK=#Hvh>hzcH_feX31N-+nmYedBlvo zhyXi+>RKjwP&-_02tJ+kA0I>3)~Q8IK_IGsS4$NPwQ;V-_f*Ca$sD)H^wO2U$3bb8 zSW-qg@4#f30#rbPwHQ*l5n##nv)!g2A`Y?)MXYfyi9{X;YVMZsKzM9qBe>AFge0ft ztKdd2)SD7Z8DJvp$HPGu1S2P>B!#}-ZM;_6_Py6!$S&-l&CZIrxDUzfsknRB6q+S4&}>5>=%{ zCOfT_p<2?XjQ1iN+7NH=Z5p|N@5gh40l(L7Q4(3;ZiB-J7>*D=J$SAeTdl?ovKFT= zYsa5$k#_A>p8Cx=%y?32IQuJeq@HAkt$ZJGn@eG~q`)ziI9`45I!B8xT&l4aXeCqF zL`|~s`0-F>3t;^LY@H*OlglqL5Zi$Q5wQW28HIx2)LNEf@w(XOk}z{FFowTUU1b7I ztz{z^?rmt|(@fIfDFJ|o7P}`2C49Gm7iY==b3t-!m-eyMJuIp4tIF*1a<-1zZ~Qb% zVJ1$vc+jvn0%2D<9BQ^WG_sYxgup+U>FR`CS_o(^wEeyoU#A6)m1j}ZSXogeO2yT( z?c*BCY0O-HDRkW*ke{gk=UokDG*gE-#S7P5dt zq;Dd&)A2*RgI7u`0}QnYNIKEX!t7Hhfa@CL$tOxq0Z>_MaC^L9-i~3^lx^zo>=&QF zM;mEXVu$}(&+95hl{eHeG7(|v1*p+V?e+2~N6VOYsR8But4P%>paJIZY#Y(GZ3J}# zp_z0^ii6A(j>_~egVBDgNe;#_k(B=Y1dJP~3sTIIS`zksGu|xJ0FZ8^=wHEZrdf5f zj~{e0M#*ojW$cn-KEX~p9vSlO-Dx?|%ZA(u7u7S6VxL82`^1=IswC&I6$JD?j-ODI zP6G)PFaU=YH4Az)szO~qB<^>Zqg#XKsE=O=3JI4iP|lTw<;DPnP=AM5K)4hPzACsw zvIQ1eE8m8f(g~Kf`j#BL04EwqewLS*E;3mtawvy%TYY$&5BV4)q3;l>H;+0e(LRKn z#4 zgENR4!^QKv6qv9CzKG+ha|SwrI#Fg(7y`9Er08mBCm~r$u*Z?3T9tCdQBT=kL|L#cOS`{RMlrvzW;Xm%fm+ zb2gt0^jKlnd9f^*T%50M*O{3b3k#wSC82N&I!po~+x#Z0WSgJ`2aCZPMrf_Y2>eu8 zpix?bT$oBB*F5Vs>wAV0P*kGVwWqdDi6z9#0e+75ZG!qxlC0H4_LEM*HJW^$yl)St zii)J9UgQky@KH^>4-ke?BToAX=CwJOQjvhN6Ye1sgEXCM_@_DMF`Ez-D-swGyBRuc zpsl&YsgA&Gkk%s6m9ajXwY)9+)J~mW85Ze+V^KXLS7LTN?)T_0O*G=J^u!mEz8wDY zfpZSe$sJAi1Okhi96^t`1r4HjXEBpRb{ka_06|O|fH|jcb9yD?_xc5srwX}$W2lda##g|?z^BV^z3r_6(OOM?XP%K|*C5MgL%tQ^@|b^4 zsQOFBidoerbsd=L2Q^ZS(Lp|~a{YX~IwUF)1=O^R8p(_rbj7Lk<)T_>>6^V5kJdvd~0xa7_3|2t9NNIF;IomMcDP?+Al4u`w zkcF8xJ?!yu)$8_Kmdx$7^-qO|3vi{6zTM^YkPxvUmT+n{liF%kh~L0zJh4>Fn`x$& zq734|`>?AyXJ4hC=soC?-6iFrV8EN1 z3OgtFglL`ZB)GH%#@k&w9fl^`Km3BKdlXV51zj)-+QhFo4z2&a(r1Ps@5V1R(TuE} zn|O22AvT@^cPqlL{|XZPEL#yBvxmw zWv^U$F-!%0oNfoN>Q9?TciR?yJX>C0LUt)?4O~<%kl|tgY882|m!F*D{bjQ18F@Cj zRtAw4gyvn3y^z42shBu z9Q5G}r@UDzTIvoC^&yv(eN&BZ7r}pFJo%LEcXIL{eZRpk3f>TzlZoru{qlKUUkB4y zhFmm1d)!Aj{cyHor3Aq+Ct7hlbzYyYQ?wc$S?30bd9;EFVyYt!*FIGQs6r6%SWy$F zE1|74uLdyY+ZV+zQW05ftBktb@;+}-G@jgTl!9=t@>xp!uGd!SoI;R z4e3z$JF!6F;8`bimUoDVXkAa>2OVC4Evv{R26$A;>VN@~^DJ#(^m zz>GCn$4hrw;;9_@7)uK5JMCr$GplqWuC)0AzPGMwf(0WUjEmKZb01w?tVtF+kDKi? zB|g>#X~OJCFWIBK6eo4-rhoeg1|6{0C2`vgfuqnTh~GY@DQacO5U8=y@b~Hd+?1LB zEf)TR4JWaOEXll%4Rr;c`ktlzVv`J5Ob!2Eao z<#VxGxE@dwCRIW78E1g+LJ!g|ia}_#261LBPGe7&&dZ#28&;6_`_~@ok6k6d*cxfI zwS7f+UdS7H4KH^=*rWM3O6r+^+UM%~bSs;cb=L+>Or}F0LackMB;s?-IPJ2^2N>R; z)X`V?ys+&E#q3Nv7^pgw%#o){vDQUP0YMIQtm7F{ydTykPl(xRKLx6Sb197zl-$(N zl#P}b(U;j3{Uw=}89EC%{>NcuM^)d%GH8K1QlNJ!0G%xAv`>;uXZ9PFSI#smzg{BW_PSU-VQ1}>kHwee0;7S;=iB8DY$BZv zJ~rClY)Bz>@_`BkW*jFcd*NZ z!g2`vq)G8RO|!v`K58J0(m_VDS28Y1ZDpsx67SD>3Eq1XaQC2p({t0WQ&|tinzM6F zoP`Of$zPp!}K zk%vv#s{E3fjdZOZ1}97G8qyC%4(=44ub0GPGFgZ-DkChLs;R7FU-=Et8!~*xfG6!A zkVuA8^@a?(^-U30Q|3M;Q&*lxr3MpM2zwb2Lem5vC~g0grB!ABxjPt`z_d=rUtpyY zb}((rP+tJfu9lo;5B~q`YDqmiqXZk8G-^;`!iS2;+8V8mK>>tcub1n$J4#JDRacW4 zmnYeSV_!3lWpPIX;vGav^bj^8qFiZ?YBZ+H{iK_umL%gN0C*-8PU|x2>~Ytt4xZJQ z-U36(nQlj$Gkr8&(tFRp5<~WE3_4n2^wuzqDJ!Mu>a`4lnUI90gVS<&Oua{}kz&K! zPDlh|8wq|H;lxTOkrheU=Q>H%zRzKsMhp`Ae@+&{`U1>)k<^^r656A_upbQ^KC|TJ z2z6@;i#Eyj{WizvR5SN~T#)KTni`~|HS_XuHcPvsL3Mex9!)|nQJ0SP9GykTTyVu| z)(8|GP|laJ&UK}Oyx}Te8rdt0`qICJz=HU%wZjU9DU$6loNjJ2k&BpUX6QkS9_y*- z@vw_X$L*TQgo5$++pN5oHcKWy8C7o?yx!bHOKQCEGviMjMR}rI?Ym zbA~75H-6_1fAs9>mfFQ$-0Ns<2z4OZo`S0`wOoufC4k}t+m_;=TtcG^d}v%O|L!WJ zl(>^GaRBDY#o=bGI%&4X&bOY92>W+6<((|$o>0;ovp9v&2B1z8m>{ zrD2fsq-X>CO3`=yQ0z!|E)Iz-{&>xg5q0Oche?EusfHo2XxKCE+-wA`l{zu4##xmj z)f=?z_aDcgQo}9ry@wx3S}B&0l|;7%&<95dN{0+wPQQRO{Xud|qPToU1yzqjh9pa8 z9}!x+Ak%Eo5<^XmA~4XkRhLY+(=gBr^(fW9DoVSKKc&q}oUJ@a%lOX-Z`F`X&T7>u z?6kQ^!X=VK$g}i7fBb)Py5VITmZeILhF@D z=U^9=;WaoLs~8zM;`n!0h*l&sbWG~>#3+N7u@Jd$^k$-}EZk4KUU%{uRxfqdIWY~* zJqVd~{U5G1+G-{N(9?U9Sk^(W2Y8k1V_f>tdFlBtwyhh(c2}j-L@j!{(Nic4ea+yn zY@cW>5s~;dc_Wf(mCoG1EV8nuX*Q~GR0=d-Wzs-6d;7V-P1_neO<*5hNS)>ye-=MU+sr@x#fWnmF^ zv`(qDlbGl>ELsOH3p99EFMma8&|4Ed+K}ItdOvDYo&LGpP`z2sKGl{X;z`>89o-zN z33K^$>=Yo?#HugF8l=nF(v;H zsm#@h(cn*w{^wJrJ)O9s6Jo4tJ(TB;r>0I$z~p?}4y!v6t*S1hFyN$O)s&n7XAzhgH^d%Vt+m!G(H< z;t*8qM9G)%-wLqxX0GsEhHl`Gj75pGk`R>(YAxleKeyzcR66h?nW0y={z)4}rprQh zAxmqm^t!`W=&i5#V)xi;mA2T(xXGk_Eyyl0EpRT3bX6*hgdzL4$@0B8haI~S$wu70 z0%o$jD|Cy50+?wG7jGmZtJ@4VGR2==bKhh9r5hu>)(FGhD-6RGEbozjodN&SN-KTJ z&85;mJam0sI$2rbZ*X$i*Kwxr<@Z77SL?*b)qfq|biD?YLRmK<6kuX}R}s67;#zl4CBDY<_-xbgqk8tKOOq4~xJ8I)`?Qviy*xQkU~XPdwe5m%YzJWfG>vY%)mB!miE5 z3H*!jc;N+oe61X5A3;)xuF9Ukh_;>4C3JEax{Eg33QXVH{IXc~T8?ZTpdMc4wAM21 zr?b!#c1sDYGu#;V5!@T`G3s++Ttr=I2&4|5R)8bc+J{W}>hvs?okXw5x!nUd&>rt> zATU1f{xoeG02T4E2tiW9rQYxOHc+9ZrB7phVAa%!?&n;mz%r^jE|TPJ@3L1}YVUh3 zcBCT4fQm^vGoB2tZIapw=H+Y)o^Mkx42;O4DCLa|2y|wVaO%m`_x?sh2_%m32_zV@ zRD#v{pMAQ()Dr&2+X5ZmSAH%zwb6^`x6Fjn7-eIrpedgN$|l?Re$R|Jg4TXU?jn5s z*Ag5VROvuzG3)pao|oE-nR`J&+7zu6%9s}qKgH< zJ2PDqR-qx}dS@-a?(~z;2A}AWNflG$dNI z8N*2%don|L`dKvnGeu{6+Mqm^-`sqJPWmZA!9ZuiRHlv>^d~xNqH4lbvLLt~#gy?f zg%mlSf13jE@hgWi8tQQ?!D8;Dg!1*n;;(Ini3RNl$XWO27=X7c;K-8-JbH^6d^~sp zm|th8q`Q`zt}U%b(j%swj1|wjmKfm~q6ppdA=(!-`WJLsSRo0>GkZM0Np!!eNj6o! z!tq5dN6>d#X&qL2o^Ox3nT}>06cxhmNIqW_zuG!^Jm~2$huXiqprBl-IIoWgj&y?NO<`+vfiHo^Vm^=I4 z1Ut0+VJHI$UBW2}>#Tc9=Nm)M7~pe~l!+d)3E>CieKXkbkM@5~oa^AFU_B2ue&GG0 zUs{6tM)f`yGQaw4-J`27VRFiMd4-jGd@XIH@Q=yx zY(u}gF#CYI@cB=XtJ0q$7-N5%EZ^(JcZEK;mnDU=S%}Xth+Y)t_$y1;lm_Lo@>rn0 zY5a+_#QIR{w0g>EbTRRxjv!0HopkNsNk@-#~YX_ zyv)dYL6~_&=m$sp-bbeTdEMR)plqKUJeMrWs@%O>ie@>X9zfb&0MprL1r6ucP;Ms> z>9C4X?{{jN^bj+tGP%G$$>D?!i3if~BK};}0{&drf17?+VqCEA_sfg&D_f-o<8|{- z4zC8d_A`sl5~7Rv1^;IS*+@1{5={W7h=SB3(kClrd@xRWO_qF{4|I1CiuK6&6?*%o zg$e_2VMw&Hwr(y*cNuNY-p7!?wBH{d-AQmY0fcWDpZ0*V8+tGi=`m8Of!T8pK{sL# z0VF3f9H_9578ScxpZo&oJaj~Neb<>j$&h?W%CIJF&Jf7nUl8;>eRC< zHyxClI15LsbakJi(kIvmrid7*jx#jTi4Ji$uw#Ut>X*ITH&Tj8uY3cq^r80%Z-ib> zXbq7ay;+lf zoiFWx;dNvJb33^9(Pt zev^+2pOMM|puy~*P|iaB(o8d%Zlnlxd7KKf`BwwNv4vF?a>}TLc_G_eeyuw>UP|+8 z3DLws!I8-#ek{~|h=jMZKpDHEL*uTUe_Kl8ohC^$7tUIJ++9ixjeD((&G zQK_&b*edFsKw;QyLiygICp{tH&PziMxt*`QP;|V@fEwo1g^2x%IoBawT&0_m;io#H1T~%H+YBx9#s)Z#u z1|E;Yv-U1Q&B=r1{Q5WD34Ek8_ezOwm?yRNJM#kGIg3XuIzRqYwj+<>CfOJS_d?z* zlev8aLwtj0Yv{9hLe>WyzI}F!9*q-lmtsU^Io|N{mK2X~a2v&);11Wj>51R{@38Dp zxxjBQyT}0R#3K)R?&Q)i`A6q_{4CW6roo&28ApWa}s8sF<|yC;E1&xi)Q#y`z_ z1=pBY650)ZI^J}O;ew&xP}YIBg`@FQKxX>>=5eP(shJkDGRn?M+|srv-R~bDkQd3~ z(Lv0d)n!baj6DA~1ppM8^?_FabCQ-tvc$FU{F(%(SDzV$ks@Ew>FELwq4Xv{mCLh+U^SizZNs&>owC^ES26S z&&Q`{6Zz6{BIbu|zyq7@gVaL#K;wsKslpQMm1dB6?7%=i+rzCtx$Rei7YSX{?r1~O z7%U)6k=IzxpKIPQZn91vdOKEe40}XJD0&Cfc)nd^@0}K7=?(}ZZlGDcE{jxvs z6j)=+$b&HVp?uqkM;;4=?o=(1OBc($KnailKK2+d=L=7=k>?tgDghV0q-|S122&io zX^oh~?8(vF3zsUL?t#z6-Jl(5HI6?D^kaf?$ zlGaJD(3S>fj5cfmtc?!8BV*-DwnLtZM#X**__Dj|{jTS`N`M(cqQvxOu<%-Rveh{wca(Sl6I}5OG##vAniG0Q2@(90a5mEljghV!SvRrcwpn; zni)G@0S;-LGR36x>zC5}Sj~j9w!os;x6#{Z*G!661E<9QIg^qrWJo`q^fHxBfNU_S z-`^{!s$vc{ho(ci^#q3->>Z?y6&e&e9e-W)z03Nbt#>dtn+v_dlXPr5GFNr-wQ|X^ zOMyBs-p^a!89-_Jdi}KOu$wK@mJ&16G#$}Tmo?!W@Z^cfbFE`yxG|Z;a220#n;pQ+ z;7at>69(A8Jbzqz%PtFJmBB8E%;432d1;_fv~<(pRQ+&0<+I3EWC7b&k7`>DoxwUT zz0mlb!}ZVC0rW@is>-4Os>fzIo@>Z!%!%5OiF+4#So-x;^7WRfJ-|L-J^?!m7^Zjs z{UuNcjIt3S^HY*o7AX7Hs}aWv1ZTA?kVvgOr^gljEEx=zYHGj*DU#>>k6sWf_FGBZ zpTd$j@LffOOtnZ7zTWosrgcNd<@uHC$X8_^M=Wu4Xt!3hG?|68EHJ|^j2BPZ?dmM> zrNP^H;OEB6RF#lrPAxTp{%AZMt#lxPdz4P#N-y0NSFVw$PPf#+!R*Q62Kkz2w|UZ)`%* zy*-|DStTBmS{S3|0NY_njjNyJ`31xIMncwHmAHUgC9J4WyF(Ge-ZVs)$xa9wr%&pz z9hSMibkbX`mk9XuTu0Y-B?=S|cy9Vx2umJ<-h27VL@T)PG&e&nmHK}g*OjO_msdlW z)&+@2ek^UVpnJQrh=1v8oCcDe5H2b!F?c55{Qmyw)PS|M>r!i2?*c$oik+1ku9cV@ zzW#3$MnNeNIC#iaDIt}f5n4kdF))=eZhfw;!X)8Fx-JJVEB|ImXj2*$6ziuK7K1Gb zEJ>}*+%MBz7?N5N6zCpUA+67=qP5YD9d)xJt*Vu;M;zv$;mu?B;Xobvh`h>nu?;TU zhGAV0+kkGs-w0fruSwMeN;iTZBHIC(vf}Qi^)~Y`U2<~rAz89Yr83i*Npvw+h%w!O z|3$+H>A&Gv{wc(<1PlATYX--%Yk3?Yb{!#GQ0<#nm50~ejkVwVDvM>yUb84D05_bo zlLQOj`E+w1y*57|4{t1J^ZE9csP*>d>TJqjnYV>#ucV% zP>MmjK3#%1cJ~H3K6wI_N78#vMbhWY=I&%S(P^dmkhCzym+0`l>{AOO2eUFF@(*6D zWA`P4ENoo)*5u(pU31w0;=Cw^UH^qP@AD^7`UJPZ=|O@ejwsTLIT1ZpL>_bDd9{t!0ISXOuCU{*KyAwIYXH6L#{Qr*t|xoq|zFo zqQsXO+AI-L463OlG)Xl@RySop!tYwVEEK3W<7j?FGW0i;^#l8|(yYAD`Q6zixU>`K zA7ye1rYOE7(oWm)2Y5X@T@7cFOlkgzeFnL-^1mn@uVA>GkzpM{*I%ec#i!fjRIU~- zEN^e@;vo?AxZjrT%lVwvN*9G7mYZlkakkV z=hGkGybNLddH4t%{5}lT{Q;!8{}+59&_tfSndC`Wvtr0;%^+cuAYq-w16% zgEdy&C0wz>7y0zjyvNf9B5p) zxUYZG7t4i%_j&Lxx~VwHuyxhUk?pz6I@*vvdr4Lae|bEZqPRr-^>TOl48|G#gB1t! zv7dCj*xxcEbI{Wh@jT35YRO}tzHD%Iq}AL&wNfzT={lD+GTLza%d;^C{Vlpgo3~cT z5S`xT+KDlnFhI55MvjyyL8NUcoLKO=zTZ$WQOS|$-7sYn72?}aMXROtc-B6s4^e*2 zLuDoBpESfk9BsgNI-p@M#A+76rnH^-3?;1O{y_>2&J{X&T*Oo}Pf= zToy%W{r!T4?qLOM(gYXZ>P^26$?BEiq-fj5sNK!bb0#iz8wCG7!C3-4hFPE|q&p3g zsxu~O_FY9-6GFdGNz5p5O2`7|duTTjW^5B3qdkV-bXOkEkU?)AqE?9Pai8jAL>t;> zqIy5IA{EK8&V_8eLL&i4Xl>24ea~2rB%CsmW^BhH)-;(nLG5y8WyR^bAkmmz<*}j8 zah{(Q?{sc!ewuZht&7cEcXB8lfx7ujN)hOhcf<9wBH zMof*oBfJZB-(?V5b1o%`XqziAPP=|*1RxUEzGk;KTE%U#O+vp)u6WA1q{AI_T6|6t zt<4jbA4DG*HgsTVEX(AMXtbOyZ7nS?O~dHxJ!zyTA?1M-=tK|gH;wgZATlnlpg<3E z{k{1yg#U!(n}rv~KmmYWE}7M;)k>Dt&Q!_z(o2oOcJri6n;K@_n2tsp zqoWQ~i00SJfGWm~OhABAMg-~tyqm>maF zU0Dr*`kC`BRS)WRiAn;Ia0h~Cisz+Y!BsaN(ZMmv!*}-LU6vl*8KMK~00aGEFv5V; z6M`C~Nmk%MaV8+Ca7#Z5g+RwP z3JWd+7ej!4BbnrP$|8l7@u=^Ww_2hJ<6z8`S%Q?GsD)GV>Q5bqKLve3 zjMRCmV%?lrsp+RJr-Oaa9PfIr9X^pFZuIQM?$Svk>!QLrXb}Vgh*epnp_c|w@h?sc z!(ZF={IUJG)`;w@V{n6%X>OHx`mR-i}-8F zm^VL2EpEeL;WZ3Vslq93m?XGz+E@?!e`-q}-&N<3C}B<}kT^nC>T_v!$^2_o!L3M^>#NwnoxEH;hL_xvj&1=Oqr`m=mbREfd4g7e3N!eg{4 z#7`5Y01;(HA(3(g+W06_!<2Avk2e|Rkx*0VkktoD|Hw^%zSGGF$JDe;2}i?)94)gC zT%ra%#_QKAqO9#`6;*+$PrO}SpQ_D2j7;|anxQ4&4!*`1Do{=HGE-s`?XiRJc7miD zW4zDMu*}60FlmJ~rTw(w4&iqQBP>iWcTrQWMk{V{f{a=^7|K{!uO~V`*(Rs97`&+b zL6iO;Z1=yDq-44eBdmbc1N}vMVC1!@#P)Yja0x@!9^Ji>35OfA9A(0-_NZ;A{=Q0H z`AqpV-=o<#I*gH@kcUE_a_FNUm)WpFVA2f!wDV0SB)=gRVd+A7RulQT$hvYppNXyTy)?y11~)#{ zL^*P?uB|5Ne@qd_?i@vwi_q0Lv(S9DAh_=A$)9If6fa=u177lzBG>UnqN_GBh#h7B z{79PqMrB;+Sah;HZhO0>@9dm)@f~n@SMCQ{!o77cb~Q(zy9awI%~9r%sz zwwWzpSkqovx26xmkNZ(H?%5BC<}9R{6jA*(#cSB&_$q;bq84xYM)~4_>(8v&UK8kg z>(REcQwv*GH8y%;jm_1GKlwPYsAv}pEtTyN)MQ}A@Ux;gncTeBV|lqaH+%dK$$Q8I z{ZKxE-3SZisOT8vQ+^(w>yvegh=tf$V!zl&OB5xc1WnZ;uNY0|=nj3VqqZ<5STOwh zNBvQxl+!!-Y6sy`QgypRb@(pF6%^vb;DiJ!g*lv}Z8eoE&5(JV{PXxR{m}J((y>C$&5@90*a>j+?Zee&NWZ1!WZ4RmBDHF z2ftaS18S%M(w~~%QFv!76ziiyeB>J96|g9Q#9DiYksBWRPRy(vVSwC>lR2GLYb$@F zj^vAtl6HNK9F1nW@ERokn`8^%&ERaeL?JW&aQuQ7vmWSqPX(}g*N?8+L9xBtKJR9C zqJ6{eoKvt4J*^FNh%uM`l86KRsk5aW1wuXVOYKCpM<;;$=iSttknca*LJL4d+vW(s z)CZes)g#G&V#Swt`7{`GPRI59VJiuiQ*eU|?d{#0AEd-c*e7GVd*`P!zcKBfsmrEX zv84KYiDr_@>?h%+$5?IGu-%}+N+(epWsBEDYydAz_miA}E8k#c zCb;2SLvkp!G7Wqhc_gis&-P6}uxL28bp65WmhR8!&HMSvZX=lU-R94+Kx-2Ee-&T- z`UPaz5Q3qw_B%AlN%C8?*g2$NMgt}#${QTm1x?Yb?`=Cza|Sz^~3S8~p7IPWikk8b>{#3oCcD}N%E zMiL{^(KIpRs=P5%;(%MkdzN5Zgq6IBM|k4`1t&Jd7dp^!U_yBMCqQHfdcAazL)9r6 zkAMx_0s3vWrNhXPWAO%r^fxUnB&`$Ox=n^0XDL=ne^y?YaX9|@;W0A+dk|EBfM-(v zu&G(b#-xuMth?b<>B*Me*^Ap|p(8A{+!W|BDcFvNa^QIwY70ujkG5hGDVurXnq?Vq%*$<<6TGeFTInQp zG3)%8dRo!UL_qIHq z!(b0pvirQ(>)Gv17XD)2GP}zyQTF2U&}qzSo1`QbY`am@pvcqXE8Qwwg+jaOK+zt!+b~c^GIUOUHRAwee8EflM?1 z(<;|M@ShX7T%y}a8f}hoAT(OSFqLkxjo59m=Q)ruI>?-*B<+F5NVzdQ_-~JY{3L(% zRF*`YqqIFKfud!G6>y{6J^#+~+}c%9rmW0}$gO9r3ELHBXs63#p?rN-=7O}ZfP0=z z=~`lDyCenp!-348q7`dHowJws)+G6mJzf4gVRIrv`Gx9LZP_jAA~m=a9vT z1F+wb=cB6 zu4v-(z%9-nK_aI4D?e*4o=4v?IUw=o{E;D&S;a8}P36eSzn)gjW7+#@RM9J1;oC3q z<3GaglnCg1Ihchqny5)P?(?DD}mwaeghRnX2Tr8`lNDHqWqqN`0j_47j0yUd#( zp9@N<^${!F>Xql!4j6(q1{vPgOrD$+4uD-DxTp6XC@EA+9uKEz;E5SXy_Qq~=ihLg@;Y|y}v z8)?l6vxvw@W>G850F91RRaE|usjrTzx_iD>6hyka`_kQ_bT^mo?oKH|K)Sg!NK1F8 zba!`mBVF$mzdxS$FVE0ZkK0 z;nh7+tzlCh*0GNfX1oLzoVJh1Ux?QOcOwcyF{SfyNQ@@TU>*4#=al@6-AK7&w$zAk zYwMn%|L^eI2MMa(kyb}NQL)RQ*wH3RMRKlJ{={|sl;$h8LfGm9e8hhkk?e&+91HEi z)>Gs7LB+;6IkoXlGZsyn-`*xp5b3P3PFE*`9hvxL2coHTSKr9LK_h~}gmJ}k0tnHd zja3*4F?NTQj+rX}w}T8D=(o5Q2SwIM$X*wN6h_i7n;nI?t9uW#hk;f})4m*xUg1u6 z^t^p@5`Wn$!2f|wv0p9~1~gdy3P~mj9$3>?@w-|F?dk^>bgGgq8@QPkv;5)v>1Z2q z_kN)7ll>A#SFwGd>310>q0pImW@i&)9*DB&Nj}Em=xL1n&mWG9w{!! zyrC^}%{xu{I>@}i`}}@D!6$ZCl6O+OLi?(}|4&p^V2HO+cZF9=XgHe<>Dk7Cs5T%f zMJc!)D0H?{>zBzckNnSaGi}kMz`vxKf@U`M@w4G<1r@Rc$`M_+!l zUKgVhMy^~YaYv5nYf+*>e*M?D&|9ChuRn@{Y_-BlK+a7_s?WY$l?%K1?Z9xWYWr*5 zk#OkalpcC58vGlDI&N{{N%8u#w2_9@Y)PmSlx5Db^+Ec%)nJGDE#Du1zxkWk!?)W-^W#M| z%8vo>L^gOQDE5`7d>$;ZE?2mTF$uZ)%0oK#xOGG!$j?WZ<#A|qiom7*MGJ_E^u3N>3L zolqMj4&<6Js6MDbaD7+luv({|`a@n1KILd^e+EP$AfyUbjqo#{GooIR-4Y8LJR@ig zsW%Qj04C;MKSvt{e<6PxbDd-OcoV2v>*@syE7Wo1LYj(?->AK74hinp`0gWvGq01N z6$u#J{Y5|;>-KN`2OyP%=;hG58)=OMU6)`;?8hQ2N^mmcjB}_98-x@%(C9J$K2`oV zg_^2O2y@c@no=R!+Qr`OMy zre z;6yAYp%SKd#gSti_Oir}^|mxVj1F4eDjaL3oy_m_G+y~)I zmoSZxqTMipOx3?D$y_okg(^Rpnjh$_3i_q7eMIm+0xdbL!0-|6Z0%sNO<>DwC;b zDaXye`EgetNK*7-+^GtwVCs~~LR+>sV3K$@P%w{ZGb%3!N)9*wt^P)K)K0Paw;S3_ zli1%&AW7_Hvvioe#!wU6GNo$#o}JLMH8^L^4x{*8VEpq*I`F<3Lcqk+Yn8F4&=2Ov z_C}FP?gD+r1&{XQMFzO#kQi%7^ND(#mh(c6!k5(W7#UVu=~DKEH>bt}%GtH`kvMcntjq(2y9Ns2|T&}6(Wo2?*Tf3D!g}ra}jp76y%K z##GRA%1dm~ZB?rwh$+39ad`!TC4gQ!PtlgB7E*SZXn-nn;!l7W?&`qR;xflk){#6e zh16il84Mwww8zf;HMaV)}Pz-xE0ZYpcbS8*dXq&TLsK z{K|yYz>tm=RCBWH(vIY-r@1D|lfxO}Xv=pk6`q4+z7g1Xp>qbu5jn;YGfr<3<{*L? z#~Mo;1pk~>C#)XqB=6e4crx)*Mq6-~6Bwi>SV#{~`LPd82hjW# z7FCxY4q?&+ea zU(~jP66vpF0K!MP%bIqzL$q1VIVoP0Y@sn5)H!~@gyW8#g9gVzVe3NJLxG92lUgTWuX`WMkNkOW{wEC&rYk8(&y^=tj6 zeg_2^a~mPSaeA0&ox5V%!cO``=5YYBizni~R$x@#@{-Ja{9$4fER0cLOoHkVagVUz z*^i`kIBOCNffw(qxT>FlhY7odTrQ_JNoy0F1g#7d`b8i1OW8joWW1@xWY`ILn7rSv z9O?DoG5M2Y^mCxVc6Ez8K-r+fc0t`t#P^)&4&3ZKo`o>r*+9Vz!?UrvJzr4=b`GDv zDgA2qGZ)%5VmJe5;-NyFI}J89VSyTRq!F)~N%l>UTWuu6o-OiVq2hw&8u0cuhPX7p zG>m(Inc?tZNMWjU`HEN<3NB?B zj}5TA)5LD8OdkmCD1n~tl=cSz2m29WMRIXB16P{Kx{6_vMLxP}iC)K)+i0tYY79{t z;fESBYR6!=%JuQ8ZC!V&+XAjv>ux;d`}1>zpLkA$SWMQ&&o)UcJE!6p%>V;`aFe5f zjoJOj1hefPa|$o%c|HmW7Dhlxkk5!4Org-PA=@)Pg~J;=7#q>K}FRIr*et^(4H`C?;$4yA%qfR3^+3E?y23+Uat(iYyDL)c@oKonu-X?U%`~$SHhO45c3h6!$lEI z#G6(%BnZk}mY=GdW@~MGM8JtlXiMU=TVb)AM&a76p$xV7m*lt#EOI2uiQAc!hB$4f`d(k+Gfq;H0e>ao;q z(dA}rq~_~DxPawRLs1*{Dc~ZEwDPa zQtA0#`HwrK!QG}|9e14KNc9Y=rUR#L5bJVi;vg>2XSkYIt_L~s zk+~4pjW6b*50o&3ZJWRmfTFL(i(-n1+E)UWueelw^Gy}5}7(<3!k!g?u?{m{+VS*a9 zJbuTdZFF7d?M66y8BNQd7r=bwwHm@I>lE4F@3Zhj`tHur?aPmxA(_%_`%(LWPE4;< zI@{%iX^^J+o#XPxADW(|nPoZ%MvwgC`Zy-p`xouDg!v3|bU(YrL0^k=J)n8Vq1=euWa0__b?M}vf49B$f}m=X zrAM1R-QH=Up7$Ls$Pr56F|&2w&K`{ghPi>9(4E^@OYj6=V`{I8Sc9*mTdLqi@@fEb zf!NzrTq2HSw;Ek|PHUZ?@3vfEsZSjHj67zQ=IWp1ga)5@IE}o>A&7WOyCx!4LN-sv z^-$T<20Oo!^Y5uHF?8}aaweyYwG_6w*2VXxbBrRFI0v_K0UWD>`ak~l5)jFs(C!AH z{p%=5^r$VgrmLvLG@SaXt5{hl(6I9dKvUJzle|NWGpi^R|5+lAWP3J8G$Z)t*+|kL z7dca-y(ER;w}HI#I4+hf&7o6&o`gs7Ukcm$`gTF5L5Z~zT z^%LVY9?7DrQQ8U{ffwl{w22h!iN$+3Ulo{KUCs+8LcH?|-IdRqGhsZ6aabx7byBoX z{kd{S6wFL7_9stQ@^+#QN=lSfcRyuDO)GA5QDS2{QCPG;7g=cAN{>L3(hxe`z*O^H zz$*Y(vM_7=BZ5;l%lQa1)Qr9nn1QAu!=YK!dj@V(#4Xhq^%f53>FM%(WiZF%PJ3^8 zebupXv9Waj8yzmcd)tiIYsiNfGUgHhO5vY!t|~X_90+Bw(;Pzc)`bnH1;4?faI696 zRjto$fv8`I*#j@PxnPxd8p!KQc!W*+8lIM8(bV{Xg%V4oGYHsoT8|Yr?BuM9-(B;HFTXfj<0mu zRdjK(s70m1=hs3aMm}p2H|!NTNU_3U(qM0vDz5EJo-4>XxNBda*9=`@Z#~FFaK(8> zfjk~kS#|7Aa~e+87G?%cbh&nMW}v!eM1pOqgD9Y10E}PAKmaQ}?l|%sQVw?EfO-_Y z&eEZyhA=f9mKixu@=S{J-o9RYmyzJ>ffB6)S&G?^;r^u+>T3G~P>g>&KHDRFaM!~A zijf;jbeVvjbiF`DZNK9{6`{Q}Jml@72g%EtdG*n`MGquRrCi2X$7nR~&mz@?e?w_B z$Jn?IlkTTt>!Z;aH2xv=2%My$4GHmKrH2|vWt=7m7m<9C~ffD zWgJ-7Cwetg12svwYz~xnU^6wC)9CsFHdC$hi-wFSd^3IFeOc}6iO32KhWF0viqY7a zyJ8Qi`8KD_Fj~&xf}h5sfER#6Rm7lUsW1eGqCN;{U~Fx&oQy)cFA=~$TPC}8Y5jhU zaQ4GUSkX~05^E|6LQJ9_>1#^Ot@^1L0yi*wkN-@K_8&2tU}Gdec* z==iliVGCi*HK}6T>|v#LDFlceYrq~A(#I|%vfE#Pn*n8T0u!okQFn> zjUE_3Nl+6}C-=&~ogZeAqmAQ!^asPPxgHIF0r2FuU|ail5_sXew3vq+uHC&*ax{9? zj7SCxHI6Z+ljtLGd>XnJXsVM z`qocU&2{1b4e{5^IPzYYqfoisUEDdWiiH-Ko->!lXk&mnx$Bt?m>r%ti3U^B|v^|4+jh4ZkgVM%ugG}@{9=OG} zmF;Ba-=Ox@xy>W7gO(k8%4#}^+*2DpLGhXpSAc)kaU z>k&Nug6v~?|1zu8O^q>OHlkB57*v4@rHtzlw z3;idb*otf)&qKrAQv{EIn$r-RuHz!J`t}}uaCq*V=mWDY?FfSgNoAv9$qoId{#vE> zkjP;7TZH`1bno^vm-3)r@Bg05xNL}bAH*PkzR3q`RXJF42U5~TvU9YGrKoWg&KyK= z=C-*k-dnjPD8Xnd{gtZzOTuUC2T25n36X=ZItW=w3RLYsfTKWVWyz~+0)y3sft7ma ztGn@SzdhJCbPr8BTY{&45_m1Dq%SyV`4MkKu?MA=7KF998lZEjhJ?IZvN@!gN*7nvOn(o2P#|*g0l;Cs7ejQ6n!WsE1n6RE$ZCmulev_bQhQFsKlZ&(akf3UE-!liBAZ1+?z9>ea0FR$7sOD2=3XAO z|1Uv%1%U~LUdQ+=5c)e+u|=YaZ*1m1dj%`F))8b>!=%$SJ+SHH0<0$1e}wB*I|>v! z?#J(cPe_P{Kfl?#hnz>Z>zVV7#vRD^4w|dC2qeZ+r$>Vl-8}`MwUn$c!h#-sHt{A0 zKs7wz$|HdripsTPL!G+DskYNoT`4m|q}!K@w@%xiYQ7`XOtdKMy;Hw5n}N$#(<}*& z3U3ZBGRtr8J6WLrllgV)XBj4azJcVd@#=Zb&ACiDc5-k03%<5svGrH)SxqYeevpc* z=tx!RK84v&(@Fb2X9mB)Prhr&fgSJAwK9y>zaZ4@|3U)wcNl3x(r-|cFw<)Rz+xa& z>XC6d0va*mu;e0*sVaB_w~0~4tuVfz!XJDb!DI4Wl z+gJ8R6q5LL_osfqebv&sk~~S>OljB%FCbzF-B*Om=KiXU>?)~9T`N%fy!HIJJw&t9 z6Tf9PJizL!i(b=R=8r&gLn_UwFaDiFED1()9L@Vy!PN;Bfck=o-O%Hi(d%OK1H}^G z7cv7~!a~n8i88^|(xh5si3-cF>yD;i$;AHx0u?%dVtG_77&qdSE>jx?!@r5@a9iqG zYb7f6F)v%~Hd}x{s4!_t;#D!fKExX*i23F{Wro=S~KzTs46mcnGu9m$NACX@i<|Z0kypFx;5^% z$KQa&Gowd!(DnW)Mu{r=WaB|b=UBwmZ&Io(ou3a!NKK?Tlq|om*H?ZgSNWzr$|py8 zlOo(v^h1(koxv35z=~wUTRuB%M;)I3_6s_IMsmknZa?`3XTtKm6Zx%|@vT-jN zx>i%2l3y)Acr`?WPm)vemf8D(VFr!VwI5ckfhL_Muuk_G3&&_;xc;@)E+}K^OZIaP zHFG)POF%~YFWs>AQoNDu2dHmwWp0|`=HPeQAD^c34AT(MAfRylp!W6A{4E4f(qtPN zie`myeTSXFN#=s~YT`Hkzo;|e&0LqjH4Mb#SEc>T$@7)S#irPsm`VlWSMYPGHF5v* z!AeGEg27=`#9(PcPJsp+!P%Ve!f!Wr3|;&u9^=o5k_%>={l9RY`AlyzK<`rM260vd zKtDx={oOUGd!XiRuVIp@F$j6u=R^q0{JK?rx+{AXaVa&K^*FSAC-$LgdO8i4$0A69nm#J1RTQATLV<$)PhSS0j{@JIImkh9 zy}DxY(=vm~>z1mq)7d!{W;a|174scR!IFlroBl(>h+W*U;kg+yPNZipS^`s=TPR1o zva7i%gEHL#ZXmcNfNh}Kwq3iDS-4Wd0LeebJ@IuG}-ZjU!<@WkrlP(=J!8x-4 z*Z<~e!>N0Gc9ggT918yY{Gw`$bR9{bl?Y7P=9Rhr6lx23-nQngq{+UDlHjuk#5!h3UtGWjcpjsj$OP7l36$?!5`(N}#YiG1-_ZqwJ zPXAJ?jaTxXZP5PHUP6Rzi3)LZV3S|Yv(i5NtR_m`zL?uuKh;9Fef19cq zimF?~_=vcNOAU@ze$fOXoL%!c`2t!b8%Sxl zzZHUB(rismB}Gmx(*5p^DLOxD?F}S6$AS7Dt0s7DP)5_fE}YXzezWGfzlkFu_z|Z~ zNW}J_w8tZg7fU*8>v=;9G8xLE>U*>iN_|2gE)W$llOEG-pX2MOH4J}myeJ>qM`>@s zcB)DS+XD10q#pRFA}#C}Yof5}PlCOpsWepo%Ytmy*ZB9wE05#9h2d`%14)R#GsCaP zVfn=tn;j1PPKp2tRT*q1c6w4_;K%6r?ORadFej|B$nQ4(C&7y~yMM{4 zv-Fx9n`DohUCvg7r$(j-zCG%mhikh&nCq3ta`4>=>*t?kZ~qIDbqQZ(mlLm07Dlqy zBRbNWar!w)e|0)7%E)t!0J7GmdBmThhH|ltJf%`tpNDVZ5qfALcXd=pgi44is>n$> zA+LZ&!muPvu*;NRBEx)KSpiE?tezI>2h5QA>rV0t0B8l~C@emKjr+Tt^`NtCU4OkS z#N5(5dAM7C(8${%={xl`ADkKs1$?{T5evjolJt=jbOy^28h>mbK1J+CE3%?q7gh3g zGJ2Qx&Z=T`oOGIc^#9GHqSp>9R^BHSe1Ui#l)gHs;5yDgTa@ezX5~OL(1xrV!t&1w z`tz}L7X@a8B!eLRFPOF_O_BpICn$n!GFjS37qV0=C*c@|eLI`AFmSZQORjK4VL*3J z1dFrx+*IJxKU>rUsM!wr;kB0 zjxkl1FZVpX9xq+;y4f6SG-#>!B4-gM-)$y8b1W7Odt!5(q%;R8FW$-jd!pj?eSytK z4YN7Ntg1t>vJ~ON)^ye3?wg)RIbPOj1{pUsSp&HDnjya(C0Bpw9<6>+t;XsfMbT0*E3VY@O zWT!a4nKbKAp@UnAxx<=XK$l|o>*yo&iev4PV!_YA+*THsT9+Pcf81YDkK~etGi=TU zaX_{wM-evv$$>*P9`9N>;2XE$T;=-xm19u!p7qTD8{SvrtHocMl_(`yq0C7`aE&dc zfJ-m_R6eIC}_}=$@1=pSS zdmK2EP)Pqhais8oN0hge@2Q)fxJ&x{08IXaQ;xx|UZ1)y4$R0}`9{pCVYMQ;O}dW^ zon#7%*8GB~IT%cU2|L&n!n~~nukrw~vHsFLallSr_RYtN!;NgL+cBE#gjo940Cij8 z#fpm?aFw6s1n{$6dJFKM;`5U7d4)92f0vtrTG+6T{uuEB>?(eDP z#kr4%f`m>3q67zK$Qt72g z!<8O-#8XbeNiGx6ACe$}xib?S-=1-?@pgS$TiZ}fo;+qtMLdN&0~ewVaYdM9i@=CCwQzu}9;G0hlhiJQ6LAk$wF z$2_xBR6L>w)$TC%pIP`6X*wpwrlk&k8JjdHsqmt)QIilEQ*j1(9OTLt@3U!X48Y~_m!AGs9x#Pwa@3S9E)$;mA z%I!I{@8V=)ZM#!pDmyIK97Y)^7b(9^BQq^VjnNE-?-2Oy{H7ZE8F4L~M%Ni=f~?(f zQMDoa*?)$;Z$#u}$fd$9o)Te zx^caJxHu@Q4aob}C@02cn!<9y9htNRkL+8WT~rV~SwEN`E3AetW(yO03g+wG4LW_G%+>mm0NulDhb{pot$*vx|I2F;Ys{U{0@ipFBWrtoBH-=)BR4*Ow$wRt=H~8e ztUwf`)R#UZiH}l;sg=^UI=p_TZIi9i?W)U#VVXC6>GHYsuBRu8K3sTvki|%2#i7!< z&W&5zC(~r2$pygC(l~a!*QdD(jV)L%I%|S(CEm6TjG}o52N%yt*3_^kT5pLO^zP-J z8~U=jkdNR-$eb#+5{U+|F!;c@-E)abo0*OjM-6Vr;TLZ-0V%@ESiE_IKKa~|e%I7{$`09cmAjtWNQ~|>K`8Y{6*0boK>MKi zElIs`MG)^14Ow_F3NZ~P8NK+f*F4>USwuB2+)9O{K~Q4rQl`yN(IZB-Y2VS|c zy~Jj{d=t5fiB(LD(B+ak>%;*=J5z$^XM^1q>jN;$I|yHY>~2Koc>)I5I{hUnQPQ4$ zi?=AoKfa`!P*gV;_TD>-FEE9p-!is@PRKY&O!M!;#haA{N`1$%(dN)Z$saM!OWX-X z6VCaV6qZX2(1r-1w^mpL_J(LgbsvDs+2Mrx+Q>O7+XSXUG+zZ(#9Dz-grS;PgCTd` zg9F$&5#u{aJojIz@Hd}4KV_C@(rf$M1H#tzL;S9---cO})ckv15hl`-Dw8!qaQP#> zu!ko^(7U10hQRA<1Kx5~1a!oDKLUolbDK!4;}bD*w;-AS8PZ1%1byp=j^R&m7gQyO z|0xm)s$=mj6^%qKt5^xNiYEg-QRTmcrs1N&_%I83mFAY?A!mmO?nlQPPQ;VrD3=g3 z@-aL@L6WkxK0T3@e%|7s(51!i z4>+j5Syn7t-@p7o_U*BW?K{y2GQQ0Z*j);+0U(|R)VfnKpiQ6} z5#kV*Pq)yDr9+u*+Y)#UqD_9&)*~$_(WBwg4fz&>o;$tMM4~TCH~lCK>FckMdQFPL zW4LtwOuqeU=~|@8oZLIGXZKqbN;vlYov6bwOzWJiagj6^ld^FE8jH;o(8MG@IWJg!7_zBCA+IbP&^6 zvosm~5M^qH229p)ivm}Dw|bK235RFy8B~f$5^7?BD(8KN8v6HN&mJlm?bfOD{X|>Z zb{2%_{9kxGh%gVH)Gx_bd&ftQorymwiDb7gJ*-zq+9B#HkeozV)w(Uun}A7ZO(9{E zO3}ePu?d&N`J5pQT%?mh78U<_9Bw*kj0L3_bns}oRV*s>S2_y>7v;v?cD#_CrzdX( z>>a|&R}=Gw2%D#~FP;}lcF$cX2?#FK9}VgkstW9`TX7LvOaQk#aiF_=_c;6Vtbs+R z!27HKx!{1AStHgAYg%37&t;~A@Nernseu{sR^QbrkIfz6=RsCdvlPr+FJ~X8YRJfb z>j&b=@qUG*h&##A=d^_$03fWb<}H(To%yi;_JyUPpvD;WcxpCE2CfWD{z!J8LnQ*u z5`K0-7;Z_@tL#8?qnmCDZ$*g>6PK>9t_$k+p!UdNw5H3uIcvaYnT3OM6_etFIo5?r z^F}9A*}em^{R5|69H!o|;2%C?7e>!Hnn70b0uICg@e42a4FZ*b8lE+WZ(TFU3-s_g zSk@&8t9(*FxKWoY9QQYqcjsSpcjBq#HhBsrGgfEE^~LFZp7#$E9UCh_w|zb1hwu2N zN3_rriB#H+AnV5cw^1#efN@Ur;(3%5nN&0i3Vq_~D+@W-`?eJydmyb|jl3rg^fSzc z+B75#q=ZPp4m}*lM7{{FK!c-kw*>Aul7ZIWKHq~M^>}%6w10BNaZ%XVbCq|#)R@|V zFS8m?5f?P)c|XJ896qsE-9MpEwCusfluJGe7vAcPcc@MVDldwF*eg%FVh$kS;Iw5w zIB7y5GuDG;em|~D8Yk>vF5wW#px zOd8$1d~AGixtEADj`DJ)p3Q4RB|9RQX~!DRm=>6I*wpCCw<31@y@PLfkvnejD8hRG zPeS)wCa*lPQ6TYRybfQJog$^er;Tq;`;<_(#G2c-_sxMK=59}p1f5g1XEWsfA2{SY z{-s$y*eG{gYF`ksVQU%-LYir_lz49-KjNY{Wfp9wg1e{wsv+_3ZS+NIpmL&6&FaYa z$D3(=eQ-oDrGCfJlK(`!EoHAcgJ-6OZZcYo8NZ)A`fCT3$cLMu|0%!IUl zkc2==-o5&#-OO>7r3j}va1~OUsZfpws-YU70+?W{iM0Bd?8lzdoW>^I(6_lX)qcFf zdtMX3!A)*|1Ng3^H@W}=}ycZ247hS&LNGJQLeMJ)uVPU#pt8STLtvD2O7c8WGcuDk0 zy1Istg^wtFS?2h4!%Ltc<5yAnN zj?d}Z2{snR_R8w!wWCdv+SH_FOvB2X~gAXMv9#g|-}zLwCog zGd2U)N5>8~y(h;*pWkxx)$BBStNy%XF`95xcD?EKK5odmIg7t*^;%kP^?b^>zx(0h zGQwcBTMI74q0@AS`*?i@H5+s5alKw4bccSv4Xz65)p0mA^lj_068p|*^@I1t@onXZ z3$3?N%lP7_Pb*7^n7m$0r@XD3fMO1B-G^N&-_(3B7h_ zgs;FAxt{!KBRTk4KZ~nTnAO3gWeyhAYqRI{r`b5$!tzf0G>Ey;P?l-We5U3+-X(k{ zhzwnq%@Op2z;OGmHcukcz}xm7XY9_{T^}de29uiP6?t=X#Xr8&1~Ze(pX#>WTb1P_ zxt~TOJSv~VHs!i)+7ac1#WnIanWX5w|ozwZnf2)2&=K z7yA0p1>4nh07vB>UaokX07J$_BmoiXTszJF9#VythUugvd=_~%ZB+h)q}aL0%-m!V z2~Ya=E9m(1*JGCUsUq9MLlK~3S>=^svv^B$l~t!D(cmoSkv{b7$_$sI{1kSLCApPnIyZIn(G zo<@K9aJ4D-K9Xo0w?R+`#nXjhs8%No$p4_qVWP%|2JGiWoRj?aW&|r1Z$nR=K-sXZ zSQA&t_t22Ty?*80k@h%TiMjb{?xGv|aaJe?$RT_4f_dNPQ~bq!@=p31O!rNLs=h9} zJY(ix+Izaql$Qzv87bhqe!Quig6iR8gkaS`umU_GE^m&(g0pk}y-!}m$x3{L%k$VV z-yd&q%T#R$iTLLhkLp6N9+J>R|iAdO#=EA%fTWwKApM!upXjSY^)CWWDXOKS;y=V`s@pi;tX zGzg_5Ci)GJg0{$tfRrT5mbCqD;Vf4&2Bs`^lwhQW`2ZS0rK;q3mq_V{}gK0yRF1uW{w!T{~K7(-_11R&} zibjELhh=T@=CHraSU9RfR+Hn^57o0$&@QFSDsg~!FQ{Ap`%hNTc^8}A81F>$y(mk( z)&samHj%4+_H);*&$oGZ*y2v9&Z9iL&IfHO`}vuStX0{0%sYn0CsYsDuZf-^)}Otc z2-5_6KiU9!CsZsmBmU_lkvrPnl0faMteMSImVDosO|@4St$DV&Y3z_MI&c$dH6$Es zalbyD&`FK(v>Ow5QMr5E=(z$$P8hh94gQ`v2=X-U_{#HJ7}(Vn1SBmZO`%qz-v;!Lhd}fV^mF{!7a>`;JchEPw~Mq{emILz zP91l{S*E)A7L4I|UhZPK6Tq5%U@Zu36!%d#__B-f7Z$G-==%?RM7_h7+jT@)E31{8 zZ%0iOGg-=GVSInuyTSbiUR4W;hbQB-y#7RbrCO{aiz7@gt9G=|D;r zyM4L5EM{#1>1{b4BqUoF^F>j@!{SSUNr3_K3dZWF{TG#%K)QVgPG@>sz<)liyoP)W zHCf_TKP#u)xoA!^wwm;vs>fUY{Yi)x#R+NE6Kmu&i@ur0_=6$;M;c-lru+)xQ!B_R zmHpoMlz`#$J`>=Nwp>Gd_8`c{EZbAB+Rx!oZ{UzTiodyWx`!{^H$ZEWCX~ToARSSt z^Z&z_M7xS;Mwcl5`wa*Vi5dp#>`_%qZZdYbqIQ`K#fn zeEd)F8=^tYU!E_)$gYkP($lahtj1fewj6ySr}D9~425d6B%1|$fZT*>$CAnuZfb#U zhfUgW2ta7Q8DT&Z>PK9He|*eah_C~UyKt2gxO%WB==AqGyQU)dtq5vEd;#wdE)E7Q z8q{zfH3g|iaN6msiwm1X8pbVz7zMv2v6<-OXRA=#m`gM*<*jo^gLY3@*QB@M3TyX91PUoR@&1}GYR}t8NcFr`2(NsmltGf z+2?L=gMnU#k_k!IbJ&Mk=|5jzAlX)F^8NWzrw;PcN-_WTT9ftYT+^-GbgIrVb~xeR3`Qj*ZwL#)L|v@oO}5Dvn7S+3MP&pxIzJf+98-k&@_ zx;%?J7(ZP^KS@WeuRO;*(j7c?JcGu(y`6kQ5ZEQ>AD&ehw2zvI9&dOa{o0w%dpmYa zx>z;_kf&Mu6Y|xg6{bU}x`!2%3M5tFG^jNH1igk$82u=o!P3I%Ww~?wJ;& zg}9N7Ip{n_VdT#4(R zRsc9>C}ETu@#Gxc4@H~tc)8N#`DAILtknyBUo*|pb<7|VTTxEg@219HF_o>{K<>-V z1&Hkr(rcGUF^d09)iI5z(*J6iX_u9;75a)fmX=jjMd{Trvwk|@hZ)J~f}uv#{f5{4 zDd+h;V9^!XA0C*{sh`~wkQ{nT2!Tf>&*#ojH100(6^aYXU)CxH{qo{;f3imzWd40Z zJ^jUsqUVtNf?iPfkif!N-6_P%}Rc+C7IGal4` z$ahB)a9B7NW7KPbCz%_4<@65YKBl_+!yuA1g&)Pj@_!(lMSS9#6FyrKLv-o8Fz9GH zP8qwcd`|XXrn|r_FYX*-V$&qT@eYaaoMcB1e7O}tK{gnH%Wa)?%t}JB8GjV`7$>q1 z7<6}4VHNDPk%3#>xD7Qw60uYQURRO;Rij_7JfE4BU41_2iy>01S`2-c9VI5d!!T^X z;_#rO{xXE^Arp+WMHbuWRb+{@;A2+l0U*cN_0#kju4}-didGTbJjDn=fgE0o^)7j}tk1 zWp0vv8>b+WT#=1jip)XQS~;|^UT6kbaP3bn0Ql`IeWB!Es*fEu8Amhmzr&E*tzaB1 z9hX=>#uqk0cq>22+LaUHUsr{`lOq0UCq4mEP1V|cSKE>nqtf84F49aHrLd6r>b$XL z?y=ru8K1A}+QzGn=QHVX<%|dIz(ocnLT}cgZogRmsFdBL>Fp4D)Q@;&ZU-+KlPN3^ z1!!Y@%5R5|K?%SfRrF$NAbYz$>Mz6up<+B{g%U%_px)dqp|T_t!9ZWrf(nn_c&u%H z&H2~y*7H))ndL1i&12&p#hmIMiZT&MHU5eE^A&x#EikkK*6b|w8XegoCzaI_l3Lu< zp9fzxz$oL3Xl*{Pm6@cuNs(NvJ|7~d8v!9=dJX=DG|uK%iH z-+F#sT~DBkZLBUQ`h~muBO@_#inM#`ExT-+fGrAz&o8%^0u24-JF2R6Qiax<93v|} zVe>ID5+zTHI5(hJOk5L4Ez5!IR%%`0^XuiHaR!={wWhuVQwTNdU$^YGnxq7wRaCT6L$}HiD^V5p1JR9H<$sJb0wfm<7Es{9#Ma>;zRo#tT4AG4 zddd}y_XF9Pds{uvfC+{%^jn2JA1>xSZck4+flI8U2$VH+8dM$ zCJVJYsSaKI=k|}D9v-iIW|lBmSM#*YzBg!4OK583diR50{$>fxKmhIoW<8|#)XgJp z^>o^4>f4B{NKRj7P|QCsw#vaONcS15+iYd&ah8t+#w5t%-cV>^rus7-Y)3u` zNAhOLJz#G>J-X!CEEyAisE~Iszpm!LNpMb$U-d~>dx9sy$;J%bpD!MdvOY<0tN+#C z*_%3jA-z9+A|gsuKN*GFM61{>K@H@%BT&L`V}dEb3$phv`j(>;A|?n4vxWuJbl2+b z$v8^IrKW;u^RPVn!MF}R+&}4aq#Qw4|2ziDj0ib+RW9j2Se{zLhScB z4>u7E=buF}jv}TS1u-a1XtL(%*7z!l;_D}J?p;5Yzf<`VQLxDOS$oFbNwD@Yo^#kf z+U1?{ST(|d@RhymHB@RAf|}N%`E`%i()Em%PJ>;W)3>u3-mUi*sQ5%Lve2*&hJtso zD78q){AxRClSlRBtPIp7hVqdGLpbB;RR{ZXY@s9=5SX#A@obuZ*?S{wHQ1fZ!Dbm_FC!7K^o|6>kdmc;VeZ)V zPRA>xXBS?IH<+hqn;IGSDs8f%lGs?F=gMgo{`bTN&D?BiGgrMDob*dtoF(G)&!yT@ zX4^UVO4>Ja*nHja$@3?p-AN60ts9jEAeB4Lr<0TtI*WO1;B8e!&{q=uugGQzE{b#L zS#BUi=75xI%TaKdNpGEFM8z0t7t^w>x*<(_zQOng{%E8RI1WUO#i2j7TuSt3Oe*t7 zoOu^6xe?96J`HObEwV7nHIQzPBM8Uye};g1>j@gKjI*V?HKbu6ww#02`B_(({vPUr zAZ<%-a!!T<^{>uw`EW8qT2tqB zTcZOT1`I<2(6YC!L_s2N5vyG<*n+@2iH1!AnI;Z4u0}__L3l#N27wP}KPYvjfqe8W z^ha#aITpe!4rcSq#MfD2PsV+wb#AtsSMAk^;j>9E>Hn8)vSBUhXR&RzOH6?Q$4ppA zOMH{WG#MDSo*=oOXj;h*u+v^&RBy7Ou_vwdtVV&iT$I13`}9UGm!Sr} znzv=(UAm|CJf{!M|5?H4bBiWi4kE!I2hu{_T&lHbWmuIi0$PD$2dR^`vYXihRVAd# z1hDe)ml?H(Qd6`4-dL(h!;;qCVO=qV^;&Bh2p|ECz(RGd{9OHkr>+Q56~Z22lW7{X zc3?zI57tk>w`JrU!8}^U$&u&kC~YHtM_8ZDwFg}cY#^CW>GZuxos(H=&k8j|v%Ij=(>noA=!=I`bAIt;t$A8%y2hL~PKOWG1 zU{fj*9|d|~;-t+$kE~lwqr{%Hn-Sy|LY9G7LQt8Uf$1`ZcU)2`L{AifIM!>nV=&u^I3KjiBP zjl8o?(>+Gp48Wgc`SvKWP1O?4wLsa&GdoOU7-L4M)S4V)+ejoVdi<#H%-%ST02xRUL7(&AMwtAcl3Ddr7J=t*dGc!z=}^qjL1;Z zK$OcuD<$WSZ;M%Xm&H;#q^HRp2%UR|Dz;v5ve+b`BUYp)mf!sqGg|D}k zDZ9fHzb8*-FtqSwGK4c$*UWi2k6vo+y#;kJV8j);JoH)RGkff!dLxp*7 zTH48%3oH3yjDISl)p%##$$LHmo)@O56i?)Gh zl|a(f6=DnR)$Mgw>-PD!Z}v7{53hZCxrXey>0|jvptO(6V#f)#zV;dP%{YS9>yp>R z+sudS(Ha1*0z;DhYV;u@!tceCQ6AxO_Aqnwy`%kP^QBTyFJP4W)t%W|25+;Q4)5|k zKa=O<`Sk{mZqTQ5MTs~4N8bbO&DLbzI82fF%z|c`REW741vycjnW=PZ8Fqi~13U)z z-&T^W&U(Q~bA@RKU|uTF1l%i+WZ;#t*w>SAr|mQ+F_GJVfIz)EN99Lk2hg*w-V#qn zsjA-Zt=H+@#5IkfEEs<-NwVx2TV0&{Rn7@#esIno2f?sl$FJ$I}$t)&+qxlCR^&MMKi=s;39GUk)xm?a$@tZ!R881ZV4IG+FpC@Qi zL%X~Z4;VbU9dZuZKWL?}NUQgej9)Jrhk~yNu0;IdFku|)8=jqE0#4JF1UED4mFtpl zz7#k~jlC+y=Aoi7w5zN@Yl~|IdDu~EZbtkiC16dD)8~s`4wg(;8FlvtcVICuTgd~? zz86m$X`A0!B^5~YyGlY zP0Pa962z|em71O}-8A)2XP=ic9lnRzYZ|6 z^Hm}z<`Sg94qa#--RU{#4sQea;WA8MRfhfa-SbHaE|?t57^=E;_`=gobN+2J3}-dX zG5E^l^JXg(#0J41f|PlCG5~HMO757j4dMB|(jQQjZ3v;yQ(ZA7`HWY8d!jl-V!xj^ z%}!_k!?6$*sp1&EVm~z{P?nMc+DmzxmI_+M^{=sh+th%zX)NvK1k!t(gN7@Zn{;OU zY1A62tDrf(!?a`Onr%OOk(!%izwSy8Db6k{WMPJ1aoqbaK9ZF3f<@7sk>4DHR4qDU@4+SlipN9n_io#>i)WFOQX#u?>p;0~~Sc2%V zMHS~S)Jj=Iwm3`=Yc$9QkQPqKTE?*54)m{-Z3TAj)85G*$`AJvf>k-Nn?@35L-bO( zOT{ba^hMOM?9tmNcP`GuWdh#g;s?vkE}GGjhIPSJ!J!!x%9KFt8#kDnAEMaxeFv;u!^BG77j*n2?Q?598D*DZ zZ#kX&<#U&mWYN`x3V)am8T_vm4|uz6(`#xBMF<7-aiAo_>l9dA3khoP7nEQUY3Za? z(L`9|Ah8&<*kb-&;8+R??gT3u{Gjk@GBt6jKsPtt7uZ*q&B^Z)T$T^kXoz%JJ#jF6 zEp81~%3|Q?x;n~3(^$@ISw@_!WeC{MvEm6Ga{?yUb&XN}&4`5AdL+ToKmJ7|$j!*Crf2avDt7JHKO0+GI zXki7=hi{L_|FsbV1_`w^n=Gs*{WfH{ZxanI1!!>roV)7x6L{frtC9 z*7`R*Jns&RmBD;YgIm3)2P%#ER+}@;s0-(D@9|k1?+%~$T_RnXY@PQj`zagm4LIL| zv<#}M=u}kvNG)OPrpf-Yn#=qW zcd0g%FA=q{kVI?ztj#S?|BYE? zEG062jES-^yP^9^IKy5A8QF~|akfVqCi@4^tqkjJ@hSOf?p(MEQmAG>w<^_<9yU#c zkQ<6QuFe(6wlY6njE#JOlG_sh@mKM{JD?OPHf5+lNrZniQ+_f4g>Cv69~@CND+V8U zTN6dtfjp;upy*pN!>p@0Q4*gKaWA@qZ~vLa@d{NJelbXEgQn8)n60r8y7%xKT2nRU zDv5+x*^-c4@DJMXqsZtXH1C=>>zC0^MNzTvnl|LsS{R!>Y{FRi81}peM6W;mlI^#C z(HODKyz#WR4ZeI(8|v<4o7haAZ(neZ-DX-~E<%8>a`!o&rPFLen3(bT3=aT4X_7v< z*?4$p9We-;DErd|QSMa7`>FL+@94Cte|2NK znHKJ2uD`lj#ObnSH*z=M5#vGW`J(h(9Ab@o-N*CsVx(Ay;KD=EK%7Z!F)hJJ19`eB z;fRAyY?*#{;c&l|w(t9hy{19f-($9Eb|&Q@-CWWjzi@d%qcI=&j0Z)hU4w1;3m&!1 zH72qV`REIap@PH0ubNi=F|c1n3Sd6YK@2Q7!2x(ron4_819Wh%;{a?A-hmTI4xxkwG0b>~P?7M!a&7&%__jW!r2FyD39w%o>BLH8#?}VgppCqg zPI4V?8gZD&(O%%kplMCfV`y+E&5!2R%*Mj5V7~0avf4hwwd9c>Wq(4wYOfuVyU|8T z-XM)p`x)L8x`+O!tU!ys!NWFKSmP!Ly(%g-%D*RwMnXimn1KrHWj3AAr1+Iu(l>8v zuL&Lgcj?YEalHrW;(GrqeHaMHI9qjnbyH5`xcb)URVGEj@05l+g(Kp{>K)i@*uLO- zv=b>n6}zo0SnUvg!7(}-I6i(8xs8O<&K$G-W%(AVfy}llNFV+O_Q<#Ypl_f5 z96vD3lt)z=vFbQcK&oV?ELhS;fHn(95f)*5k}>}l5kpo*CG;09+%z~AJ{Psk0MWu8 z78bE|R_tf*kNIReAD=}{W<}#cwXRjK`>Q8~XV=!>bgPH&lhxEND_lCJwjPym8aa1) zlM3EQZ=a^`H+9nVzU>N`yQMp`W4P;qbb|xvCX-u^nBU`QwnwD|i~lWbjp7IvYh07i zay#WdpH0wEnUS!|9hMQ~DYKUr(1s>SX&)LXXITh-`u~%>WV%KY?)h|a8DMO?HnNN% z*P+GQ3Id^OX>T^0i8(i`i+E^X$s1b7rgHGXa=-;xwSLw4X_ta1a9hrR)wS6)OTfbf zc$X)1#ETLLfU=SC#He7E^Zl1c{siQa$q?~@nfE6xQy$L3u#pZ>l2VOdq4W!JNA(;i z;!LsGiR5(-E%mJfXgPm-!$f?OKoo7tK1D_@)b|dE9oFJSq8$AE?3`>coz)k-wO&_w zM-%x<-2D_OX*8y^EfaB)$aCF0?ERWwfq*B$q5N4@+@yt&{+*Wk>hz8@jPKv{a)quM zGQa|6T3rxnXwq$(MNL?BfNFOUEe`d(m7pw#G2TRN#-Syrd;rbwKS?Z-2xV=`AR{6d z9D0PowG4RCi|dCz`2Zf`20`XET4(xFgAoz8R|(ZT=9;3tI6GHrBpkSyt5(B#b4WDn zL#+}1;C#*7(bEUuZ)cI#vzR%v+qO*PDa1l^qy!w574+XFZ#yVW*Ms7BfM5J=^W&EVNRkYzvjE(3_wRO;Ci2aC7!-+^mC4c=*GVdoF5Qho7!<3I35sK^8z)b zPq2OXnb`L=ak+!-)Veg?LoVPDBMNt7X7H%M4P>kx)L+PNm+(uo>g2^(_n6K2jXp(S zc~`^zg=0lO2#+mmxz93twyy{s1i06Nh+h3Q#LEeVtiQ#zTd;qTR)7Mcqn0>}G9I2sAt^ku`eQ6k_;?H+)FPkgHhyBKm7%x33pP83f+|g+sgW6b@-bEdOQ=SLP zGfZDLHVL>>jALY`AclknGB;t6+)S%c78FOu+RL@$9;sQ;H-dO@^j$~Rx3e^gqxly= zXI|C!0U9b#D>B9vCAc*i5ailE0!Io^OHh&fvj3(lU%*6~C*;QzB*27Dib zx`)pOzS&2E}bnfkJW){MtA@v22e$(Z-%5$+sd;!x<%kin{*{2OJmoR2Q8xa}XYnE*T zZ~x8fq%+{C;7k1aBKHpCq$Vd~xeplp%n{=le`Md~-USL)wk)-np3}3p%7gzZoaRwR z%?>iZe>!C5ACs}5v%bi1kMHbBFFFayQ4*tQe|IdfkQHe|cPc=QBuyR=*3uzbD5>e} z0k8aP8zywrKgu^0r?7$TN7{m4TCM5iSDGf=;o)E_-YUgX@Q4wTadp(O^vj-VA^~Y? zm|G@^oVPe2akwl~*b`xOvhA@^n`?2qr)NEmn+sX+RiV}cXWJL$v&ozAudPD^j?2GN zTU)$2xxbRvZm|Gv9_hNh>S1{J!9DI$%%CsanaWZfkj$zfolh{rD5#@59(TzPk$${y z6?QI?d5Hw&DAjV8N#*h%;XzQ7(C)6VZw+MagYg-MoPzO>-GzmDc$zLRdAfA$ zsFyQ|w0T5I9mQPq_&iLfc>0UwU%iVRFlap^d23KFRs^rY{_t!UGi)wGb4A%n?QPN( z2R>ZdBk*uGI~52P0kwn}va=Pj4czhdZkglg!Yl=4BN3QYBP(s=_5?Td2HW;(f1#@Z zwFGTBYvSlXy($$ztHYu?cIU#AM~Iki4*L0%jL8Mgd?gaep6xCsO9LVpx4vmfp}Jyy z^K6_?wD9UO-v70k7V&qGBqYUBh*pLnbHM&Q9{k_%eaa>>)!|=7P^TUmTMwm8_#@s7u#noC$#fkS2 zZCZ*(Ol`5hm2yddK=>|5^$; z8Bq2--02>iy%SC9mmMZWT>R(yz#bVUTaU~q0OQ--_sI7r$46V1o8@HrpmQpfil!EnjQb)RxYDZm2j#4a-hq)QUX<( z73TR|?e%$K9avJWlwt@UC0fP~TE~ZQfZ@9LkPe|i$ohtybDMzb>a>IQxku@9XZQj^ z!hC?Do0>Y51?flTSLhbnyAX)_qO)<&15cX>OUlb2k7(AS^p;xbMzqFB0%!yjdz9iC zDP&rlsOnzS_=ZqT%sH@pU)hXSl-NTLmbnEBwB!=B-`p59bD*bSzhFYEv$*$B=k~3WR6TYZqaPRbm zb+W^`vvJdz^O&`zq%R)DzGJDlMxwk13d&_O?-i)zr{7Y(l0!D68!$4G$tQ|G@#EQA zK25YXd%eu@u=~7nKCej)?b_&cb&MTc?%g8z$T2-1t7)~#cvo%U7{!Np^TanV{m<9$*M|?s{q@k)6T-GP z)$dQhTeE{>LABlj=WG}qzmB;AAhxn7}=j-)Bb86CA2)bmKfmiX=+VQDe9h)GS zF&*N3i(f7yx6Oc4Beb$(>r$)tn^bW&*q>8;jh@tV0Z{OdO^2!k&Lz+@Dq@ z3t-y-9{Vnht8ezr{qULjbmGuSP}KYc#n|OhFofm5SrD5_-x@40s2$4?kZdV};y3u` za>IV@h(QU!F8v}nqX?S25OmCD_a$*ks2Za3*SB^ziG$~3$HJRs21tC5mWv>g09cWR zWXmyMO9G|bC<(RBK#o`B7#+4jKI<$DjV~fc{f-^Xi2e?g0o{w>jE1qq#UM+ol|c(% z3|S8qTZEKJw;Z7fW2AF?+!W+j@RbcohIwD}7VHVAu;x*q(*t z$$Uy0TQbKqGT!VScVkq~oDJUR574%wj;5=()6D>3Ej_eZ61szKPZ}Z1!{R$^5FV}b zQ|j<~SJKLDBi)NGb=J#Gb(G##W9uMr=h-W}$CqDBHHBHEk|`|S;>`-Jysu==`&Mt; zFLnX&;ZOkg+j5m|_vh}bkD!t0XXi@a`;N=FYSw^B^c%l@k1bB30y(-&Q@MVng5fkC z1>NZ!*zkO6)WgI;od$Bg`z!F|U{0g)jON37u4qwWqLOr)M?z z+iV3{dF|RR!dh?>S1Y6>+B(Z=wR{0>t-_T zbEINi&xDKJ4ZImJVFXsa?uBi>S|i(!Cc_VW$jOX!tfyBSff&Uo)=G+G2*# zZST9jnv|?tf?(ykTj*-iY}3st1-K=_m)x(g=Xyt5fw+v{secoe2C~hmt21`?o8!J* zId_L{Lu`J&H-0-y4s#r*kz60|sWKh}9 z4K5Qsk%enaN{X_!s|(_JJJ0TZAH`w1y2;G9d{i#knG)hjbas%IB(06M5Jl7Je6r~~ zn(T^0$PONGTycMyA3ZfJoKz8KLTtF%abiVtk=a$cxuz6OEO6|X1iXRceDu;SBEO64 ze**Jp2O7ouPdMK^-)Ab_l5(u_X9f$Tg9v<5c41@;v=J}@5h4A?oSrIt%M#GP`}58S z>qJMGX(_Rr$UGym& zpzq2fs~S3pcHw$$pQrC#Da}0hPO>+5pB9v0Q?_0zyP2}CaY!=735q*1N_fBuvHsgt zuBaY3*}9|+6Q{dW9uM<5j=p8Me{Dyhd5p8hj7bt&;vkdwK&qx$1FkaDMfbKS$n#dZ z2VJe?^Yolx|2TV62wGejIJa>~Ggg%#ky+YWeRK@YRHcZtYD*BQa=oA!s7Q$ zK3^O&>V5{ZP@jb|ns#5d^^yP|{r}>$0N)aRPC`((u7w%Y(H8^Vt3KHRdgLI?Bq5Gy zj*fDdQtrF^V1)E(;a#QIO1iGya#OodvolV5a(mU5{e-CH{wt2t)LU|^GBMTKIveWG z`@ZPRaFvC)Q$JaL@Qgq$ak_eNq0>~y>SHvb=SlgMC4ECuanX!#%Y(bU_;noAnE<-N z`G0{#7M_8etgw@4Nj-v*ZfVGgGPEt*ED|MI%QkBt{~o*lxS87;g#+zn069Wqsx&9J zaW|=F7rgu8jcW=k8~GB#z;_QkX8%ttTQsH?%EA}krIqCE zGMqIKIqojCaCfDOfM4b%3a^C=4eD)_9JtNXo`fj7En_m!IR^MU?7z>P3T$C}I@ioi zX()W7{Ge`P`T0^N)HDp$76{c%aBCTDh&NV6T0Nmmd9iep_DT#nb79=Gsm8#*n;jev#I z$^vbFCK$f9$keLydT}gUz5JGj5M3Pn{xfS2{z3<^GSOn|&JyRN4cHo`?aT9YkIVkJ z?~)lue9T>}W>rh>+P*F|%WkVkNFE(E$+kU|`Bfc_W=^059Xe7`Kg4VlTE@=|iJ|m^ zir`GUPslFKN-{OPK!a6ymuV4?NW=zLB+^uL0z zs2KFA1;%rf^H&PlIhDlncDLTjJ03akswa{Vver9pV;zp|x(jmAMKF6?Tf=1IO|_$g zZ)$JrUS+FT;H@bOY;np=WO*KrdGDa#2X6*Io(zhuDd^GxH%AQ6riXBELH_yPVgfIJ zx_P||S=C$UV;*6BIiOf}BK`%i=r!EDXk3eYtAO6QSQb7BD4yH7s(no_ne@W^X!+P{ zo;)l;_--XKS9iL$c+fDzdUH@3Wp3zNaXWdL{cYDh*PDxXA^K5ZQAWn_g!jn@q)DtdR%d4z#W>dxOx7?iC4)6k8-|wAXKvG`Qbi%RO{{L{JGpa_`3!3F6>*J#1AIed6q-c1pt-toGe=yC=5wIQF=#d|YR8kdlk zQ)7yJsQuWiv!P3*dErN1BuS@Z30JnXYUV^T)857A4;3v*&ftY&}RcjUB?wlDI?V3%9&O0Xf*Yep-EMM^hM3QvS+RL>{)dOkR055Y^r)k<8^tz39Vw zk;uriH8!0*SWkBLGs^W9y~YHYmHCg%b%*2o3w)LJMbnS|7CMn0zM^`I-{D)T(hbVH zj*Em+rlA?eEQoCt@F|4)MYK}0|M~M@;So!>+Xlq67IPOO=Gr<a3obki|8bEp8wR%^S|e@giKi|D z7-#zFhc_|+q>0lZZmYw-h0o7Z@-CzskzaJFIBk7Wp;_lrEM%qAu^AR16{m>=oYds) z3tCH3HYY=X$KBtxOx0{V42pSO02u^XO1qozDIuS?)kU9&TjwMHzMAEdNzkOH(TR|G zg({_}yK;$z4vHb%+t2dz85`9@m7FFDi3pwj28Bv0R7qK3wk!t`#m-}?2pd8G7mVIa zt^+F6@{4-WqKw{}e$F=*8iHqHWt%@41j%!HYKC@)jo{`dDgRi!KGa|{(q?k6u4+s>62^t zMwW;tK{sgu4F6X8lPoFawyW>gH;t@_nbSiJ8#;;kZVi;Dl4t`Q-YfaeESyfuaEyh^ zzA5Kn`JC?zDI(6UA!*?R7PpF20&JY{&F4R50NJJ0NlZ*Bx%`vsv^W8UNeiqHXN~vGvj1g`Fm0 zfeWJ;_`WO^;JE*NGi2rEQb(`CWvnjzjmb%A`>KPwoQk=E)2uZ%_#zUrU<~LxGlT>7 z7|(bCUjI+2Oj08mMx*1414T6y96R@#J-%XN)4Km0fTO;lW77cr&iQu4FtC`my?9R^ z-cr-X)#9tcqH@jYMOd&)9_2~jsQ0_KE7yz4{-RHF6<{Cf3ZNHEPpoJl0J^k}Uo;l6 z>a7k13+`~pZrXVU3aI9giX@-oi1n7xVgF`vOn!PW17cRcfNObh294}t`f=o6AL49A z3q`Y)^2xHkSeYy#&FH+%P`4F1L`g-{29^zU6{W8sx0#iE8tFnQpE@hCpgCe()rH2Zvj|kC3XrX9n{MUNj|;80OG|cnxdH*6i}wcZJa3XUT$+XJW4$#r z2&)e~RVKvVGbd-!LLnvDc~U7xmU$edG*!f=f3F`kkpu7B6m(iyR4s`>%a`4_1A;~-1894mL0MAu|x?q;$$HoECvl_bV6<&cbQ5xsZd|X z{H|l4w!J@h6n;Z+u0KZIa3tn8k+`{COmiAaQkd@`aY|SIpUO4kOj|sx9<a6oo}B@RuE*lnohepWc`pV{B_Ze)mQUndm!h3UZoOgK z_p7XQ>KZ+NJLec$&#c>uTVuC(THmb7q(SX{e)0Ov+7+M}$ClKyVg0=!NpWk%0gMGL z*0;1okAFdJAXXjSI7F$DkG}@_d&4+!;?J+CKJ22p3P^w5BqmIcl2A-a2xwZOBvX)* zl(`5Kgrr|{k04EP_uXyV-Rdg?bchx5J4`U{p;KbVD`YdjmbN%c>l7(7f!M>vW(iFG zV2pRDR6>0z=?k6869Z$(59r<|A&&bU0rKDs%z21GFnWn;}xP(d|N#-qdn-= zSOgg-zDXtSf~M!^oQTCI^u&vI_MdW32+q`B}`I46+e@kjhWE>RP zdJ(xW1)-I@SdlPyjB!1UVhnF03<^QyJSI42l?wZzAY|inaDc+gW5*{C3<1#><|})S z63`++C-G@4L5*dFSu@<4%+F{qN*S3>m7hRGxbTTS9oS<*D4KaAB?OXr4X65EO|A5N!ssbl9_^^Waa zA4m=#SiKf(6xwr(*Ngw)aD|?4sk5J?B6Vq+-bsZ+PZa6!4)belhSqN)*0=xHH&|39 zs|fJw!GG_W%gQ?wS5P5rRK8#e$0;K37YspRm~V`~vFAZill~{4G1Koo;?k6V`h;jOkA@`2J%D8WZ>>g(VJ^mTwjl08)065E7pS&6JrUNIM!&7^eoly4%f@jW@F_I#Y{cM{M)Td|z%eL1!D?J)R5c zNp+Oj@r>i^p*lEx(R-Phtt%7Mf(E*@?)kI+i;s+xbtreck+U(nPTc9aPSt}YA{gBU z8hmG+o!xK4;gOqRp>4&?PCd)OOV05;t7orQWOvRqNs-usP1H^wo)}7!xeYF=t1WB_ zil&{s>rE|}OxH?gC6xk&$vYdwK6fZg5$=4DQIzNv>%?$Ep0JjAw4T<_OuG1s^TYKN4Wneoawt=qY!1&#JM`npJXxL<^UA0e}S zVw?<{KNrOa$#`Y9eNF^ELffuX0A(r_Ye#uCTBJKPT6_UwXN>=Xl7Jempk8Mz?3z*C z*jo8c&5~KU(s@&@TzTCv+XyU7BPej}=Rijk^kFg;a=MqkMXY*?M8$s*wx$$A_ryo9qVpV*K^ z3O2(WNe;_*>Mt`c$BZiyHgMB^r-S}E%OVm>WXDpfPV3c`^IzVt4g9g)lHQ56P+0&| zzQ<&j(8A46A#<>sgwDk5$lobs`$RRA6Dz{kbY#+ci}3!6n#R9(t0M$c_({2tXtJjkNNhoF9<^Va6Ne#n zuF@mFBoFo%lX#k{hMCGs$N@14kERU;w9ZF2HlBMRlE742?e^oY^+w=+?;ZQ>s!2U( zJGJFJh^H@brj9Fq18D)w#Y?F{VI`@iU)3A>3Pb@B=YjQ-N6UcB3wCe`n@N2 za{al)7r1!6vm@JE{gw@c?$?*}WaSX7Mm&y9h)kYpGrKrUO&gaIqMUEs;rYj#Nw zCLGazi`_HHOk43(oKo;Me3lZbTAt#qFtaO=S$sm%2$qoGxpT}T!CrUh!?EC>cgcfm zj$i!9i^@{ESYNZhtR);v4P26nhF9ic%=VL}t>P~pOHTUiJn_5wo9?Y<3Tu+2l-QWV zAI)%n2j}@p%fX)T4JUl3tIfxgGjZbFTUhFK`~BKMg%3Ek4VLrHv?q5kyeYK8 zwl*nAw5$*cnS@jcV|Bi=n-DATtNY)W%JhK+&z&}xi(!5~I_BdSuATXzPwgd5W8W?s zl|}p(Y>OkwLB`O>@o}EW*vjBR)75sg>$igA6n$f5fyTKgHg=eC>Z;B>sCxg>$FP;~B*0iTS?L19S@>l-?f@u#%kVo-l-TDP)! zD*`vA-o?VgUe4z5xm6?4XXZvcpk(PaI`LoL(%eQZl<{x`S2d*ssZG|0Nd+oQEhZRf zj6R?3^?Co7{iKG#c9Tk-EW$QE7?I}n0Q2?@UI;HSo5KsKfG6)PO}iDFnaLbZE!XSa zN4oZ9%Pb2e6DH~g$=`|{G*n_pOo_j_eC?FqUUr}5q~zT7@76IqMcNJpBTKgh6JZ-! z$@XoQB5Y}3Xu8&wK8IgdS96(wgWL_2c(gFhYtAR;-G?)+hz1!tVlsL8FWu(kK)AT^ zC8XD<9+pSaBR!e0FDc=WhLV(55nrhPTQfWd$&SiAm%ij(YhGW0K0a|h0<1oo%t^RQ zA5QitLg2VsnQqihYYrlkfQwX6P$|xNgS*6)t)Pfw4dHUszS zc)mJ{4E6QVV&M6B!r4%sr1lxmjQh^~eiwSnsBeKIa7!}NMGXnyX{N}mbbp|my!zJc zc4R>`AUr7OY3q1?xA>tH$GDq&^yK+ob?Y5apFOSHT?04%`kg}was)>jan~qRP{DA> zw(JSei~0cL|3Ai#C7+>>ZY=I45GX#9FpL(eZbJ*_$4jX;ZtE(u3xnkpAxe{7pX43) z^fn^(cr)(%t^Mv7!;dM0aAWD$)w&d>w;38;>7?I3A^tf8634KBT@XgnUMk-X8VI5V zMI(JV3`ht&C>5!faOL_>q$gd+%$03_*!!SCd`W-%FWRxg#p6ks-@pJ3Cxyv&nit`F z9jj0L;fvPkX0XoEKpCovg!!e_81JXBVkbO7*Kcl{c-O-;Y}A4&C_BA$H`rj(&S z;Q#O;W|UXQS84YEgWKyaFK;DY9$XolNaX9I!)>7(I+gpc&*YT4-8kzm>?d_8L<{>2 z$y(nW`n(Q#2@Pui@PE}xK2oz;Tkz2SPrpbW2u7!~Af^kDEUu+9RToxNNCV*klgJdd zW1|>>@j$t*D?Q~MPp`5l3{mS7sR7WuIni$C6F;#2F|&Q57G^YmEpzHEd7SturIOWS z{t5|Vk~Ts44vO-ki5F^l?*U&e^S>da4>L$2lEkSrQ2muL0;%OlX&|J{E1sdq;M3PM zJ|Z_K{QtU zhr7#@X3!*#^wc*A#nVn#P8MhH#vMf8CMVX4F=GXrOaB~#2<7+D)&4<8H~|jG`;l9r#pmF5HcZO~ znCNSgSyANtuYastny6+v>X$GlI{nJm)u078Z^1a1M%ht95qTE4yt=qM@+c_@KQl0v z6~F(P@dUFz=DDhTzE(-&sDxc1x_L?L=I~2#G~Qc1|J*t(9GG)&Qh^5n7uB#zcZN~f z9jg3gLZu6DM=dnRgJa4KvIR2s<39ef22H(&DPe zkWpH@t>Jk($4(<+N6dXWnr$O)QAe}J38Nd(BNLpXPO$*@mT6`3+g{=!d5)2cG3;CR zJLl+?Q0M}a&(WW%I+WmM!bSG?dNlk{7Z0i-qTGqpLOdX`6ZHF&kW%#S|Hiab*8f}| zSCts1E(ckleFswNqb%wrp{gvXj7fjWxK!~U7Ai1JNmP}umj_}Yd01wUSpB(7>N!sf zxk1C)eRrxpZQ45fz2&#GCoGw?EeUtiO?$R}x5JrYyJ0NeY=#3Du#qMV*HF(oJ0IT; zw^|Pa?}vrG4clcKfYo&M82&t3<*N~2&{43|icRy?W1>2^I~IM0|KmsI80bY)Z_C?N zhl$r~{%w*oi^*lP?Wwb%3vW_c$t>Nf1x6!c9f{m}8-H>8;-&Hj{13C+!}@KG{+CMw zSF>Mp$-e{oby3jUhXV?69;Cc#xWmBDT8W}R_#^$ zocN#1{dGj9d#nfYq`7Zs=2lykb2$5_XL5Ef?+1<-7cCbFrrFhE1Cd}{`CC_mv$N0n z9V%rA5NYbRaox~gwG!(ZBwQLJLsnX?H7lL0e~!*MF24)WD0WV=b2?dO*B`mhn7U`36 zF1(0I8>aU(R96WK=g6`&%O#l*=ZkUAmXeKJSb6eXxXy4wE^YlWTA`!s)mih;ipi@f zep}!*mk#5A$gxY{WJ%VEFI^9Y>C-i_G{#64E6p-QA2J-Q7s@AAQ~*zMuAW z&FqI+lDc| z24}FkLN$|J<2E>Qx=%zIfdYrOU7A+&P{{GSU!Fq`zsbpM+Q7%p zN3Wg7^!qEpeP$}wdK9AvL5Xs5IA3e; z?{&)=++LpYeV!lGv98+WMsJ@E?~QMC0NMQ4)DnI-gqg^f2bwq4KcBpLI+veD2K1k; zt_JRY-)i6dmXCd1SlElccU#_FTv&V7?6Bvo=0rXOfc~~=aJF~1WLEgH`trEBQ~ZE8TXK80cbot7DG%VoL!h6PL&(3n)>(t&dw(Q* zYyGIjSTg8u(sbC+RkrhR@k1+bq~ii>%hcDy@8vMnep27|Tzaznu4Mg@f)ztWGJ%*_ zBSvFhf{f~`E}Sd{({9qn3_!eBO!$pY(hHFa4Rhu!Ky?JWnD=a`X@y^O^E@UVZZ4@* zS$+$PTkSzK%FhP{Qnx?enw3?O-uzUrE1IYixZkylh4)-Sto;%~9i6O=GNC3tN$^g? z$Y*JsWZ{M)nbR$mrUU)rVU3NE#VO`Q4n72?P?chIPXow=by3BTW}NtO_b=^SV}g;K zxNXu#Awsy7hO^MQ1$Dnc&yiaT)Y0S2?UA3%BygDSln4WvVBVs7XN!-!mqj5hpbWY* z2w)))y1{TxJm}Cwa3-Fa_j8?Y)|qYo`*cnuwWRB-Ta>J;nymgrM8I-G6NeIEJ=eDI z34YIof@-RKKgqQt*3K*``@?}D`zUlNCfhw5zpU%Ll<~99XDd0ZI}%eTcKfunw$U|E zNpaik@npVEQCZ(!Pq!WEH$ zc$MmUAngGM8CX;M&ofP%WLnsfjCKK)CDItDB>eA5vXsb=wxSXc*<}af0nCUyX_;fF zK+=G8I2u-N=osS&xE@vEq@giQ5wd~CF--STRKQtsYbZ3buN<*t~Eh08Ijx^+BA#o-oA>p8`D08Y zUzssID8so7i33+7D-+Cks?8Ci(OdG-O}SZT%`&@0n;PPHL;pmyE`h)=6<$8_CuCI@ z`h_Z^K_VFi(O*Z|6b%TO)Ju`aX8=BfU8_K;cy@URr?P|SMgeTC?{kHB0c3Vj5WO*< zAzCkF5+yqrNJ$wd3XpL?w2WhrL$Pv$jVqCWkVo{c#o+r^%}{chgIJXzspPj|9&qP(UR0^#;559-ov z*v)JC=e&ZBJHBx5YJS*8y?=h9d+2{>m2Y?!7vhbGfBxRm@55mo3Qi?wD66Xq8a&ORf%TTB_}~>qj%eNQS)0rxhKL96VQnf2VwiL&#-W3 zE|&^%<*W5jj@(m=dPsELV&sk>6S4Cs_t;Mq`#3QKW6QxBJc zdldp_G3*1mquc%5$|cwWlrwrm;=-!k!6M0+gZ?YCM0SOIc#kXO-u0n?+_V%;i%2X2 zuS~;3K}*H>Ssn1_+kfnX()*z&5l0AQS!#!5L4U*$Hci2M+SH4X%^dPkRZ&-liE9cz zTfneXomE<0rkKyv&Meb+LnPwmcMx2$cnc$PdVc88bs(M718&W)gMyIonPz?9x6ar| z)U5rzd`+n%_RH|f2Muekm9c(}NUypd7mk^7%{Jy{3dM)n*fz7X;7TwdiGY=b0G)^G zS6lOs8Q6fGxXTFWk_l1)|*P)zi zjCG37C2nq?fhp)0X7ohWWZ%jDOUE(-Q~Ic7^uS=?64|TW6$>MzFopwbM}9Vf_$JCqbw6FheDSw;-7X0n%uZQkfqQMXzkKBd^QuAyhHoM?`brrN0+2e|nKpWnKZv(G)tt;^X7bJX+a(O6u7LxnM+SF_BD8M*Zr7N%h#x00D^cy!h8v;?zvZswgb{ z034)WlX9=fE}j0fUlba?pwb{~@b;dEq~$WE1V_7A6la4pQV7cAkHQJo?(y_xHZfTN z_639q5!e=#EtWv*Lq2<3be!YFTh#`1sS6Oxd)0u!j=$y8WZhQ{GQdy zoC&z9s_c}aPqw&__6+!A4d{3O>Y<;RleR^b$UQ*(^%=xp!8+i%-m}T}w(|Cb$G8uH zGXB*jjcwaRHR_IXKApqJ#|zK29aAaNV54@V9cxhN2_mitf1_b^@KHMi4OeYQlP08Y zr4KWC?J1(>V)3P938Wc>krC^pRWZJPwxFN=t6vKt{nW{b41e6=ibKsT-@->JF1{&g>Um*mauFN7(TA%rr0zSi*~ zRq%f^=U)g?$}wwn8exZ2%cH(WYZZ|U@Df@NAdn$6@=?#@rzDpik=~?|(HOMQyh$~p zr*M@PS#o)ZRwV84)_PGoq$c3OK)&*gAzBnsUx8oNlL^0iDUsE zCAEmZfUaE9BdH)R-9G9M*7(m(sQ-HPgv~;{ze~{MA~kX-2yH$j=SS*s;)wb!@$`f< zAT{id9khy@Uu~x5Y{9V|_0@%>}fUL!BxD3w*wB$w_ZRcExwC;CGd8F-DKW=BaD!OUW zlo>q!on+tt4ZyY|t%yPy_nU&pB*A;JyU7vobVKgeA0@=x9851?3%L1B2ISdBm1xbD=q`R;d@6JaNds~ zCB|)J7UCg2j)m43i@ul6Qy@_x{SDZn>j%7Mso<|D)J$2Xj3&XoC8o}V$#@Asj%+5) zQ52a=73o9zD{2q~n2y#%oa+!Ib_*O0rX<3$*=42jo0zImSXA~bHymuHRUKBZ{-L73 z-k64U9SOw^WomK&@h%UN)2u7>af9&O@Yz1*zSM9|70oW|+-2Q?J9(;wHGABxO^R^x zq2U(|=C<0H=%6sPQpLRZGIBS;@dhKMQ4Qs^=wFz{i9x8#G|nZ`tv`d7(XWL%r7u5> zpp10JPlZOn%P_djZKvyW9;~s^YZ!3;m&B-p@v_`681-LZH>wHE2*Wu>c|L!Cd){x4 z|4Ua=!D$0?I!Dg&z#{m?@XMMn)xvu0U0u(YPMHEr=s*2kBi$gWMf64TfbIl2&>rZr zsvLvxhQGd6?q~*^EVG5x6>lWaCfy+{Cf5{W|L>BYp*!;}86dRg>9RIb61vvDc=Wh77kj2Zd|J@^Dt;C!-D#DZyBvBYxeDmC z+SV+1xOnNPY=eo;;a_bkMUw(=c+7T6y(J3GYa@_iayIOD@JKY`y0&}{dfeOR+d!5t zdAL5momYOWAkcp8;P1TD*@;#D?L+tB1EF-hI(aG*jdTievD%G9Tp)>BvZ$V<4na6z zmC^8m`Awty50o2S`#^O@W0taUt>! zaZlecHS`TFfw9NryTq6h8KjZP$c>Mfii(_Xx3Ueo%%upzMaBv4SB0WFAktAY*e9T; z))X}dk@uSlD2;uNHym-Ao2qkjB8;y%glGTyK(%*h4i^MdQ}pqT0Aby6=&4|32S!G) z((0sP#8a^Adoj(flA-DesXRALtMi%f`L8j50OlWUH1s8zUwgJwrR5yFp4=!|{Z@So z{eGR=D%H#y>ft3|MUP4wYcgYzfn!jV@DQ~wC;BTJwQd>b8nG6f#g8Jsz^|G^`719Db9JUV@N6+j+6- z#WiSgx(O5m53CJEgG9I&VM;xDehMJa=XuAai7}v~;-ckyP`Yz`-mm;XDk4yG`7!9!lL`#1+jH}h;*%rXQMj~* zybknrpN>jhey~X0@Vr%V6#|*|ue?Afy{Yz6Y&2i+z?;6en-dlY$!SJ}CBi~e&``h@ z6i_7DD{sRMz|=6av7DmIoS6n%<1Rz2%=2OwH7tE@VG!(faQ4`sDJaQYZ-#C!;$#DU?6q-p`Ke|G3%U**YtU z=$hF6G}2ZasNQnpYRHF|e*L@6gSbxLrb6Cr`q}K+$F)4mkYY;<0U3R!^_Gvr%$bE3 zx|{qwFXiahgZgmcK>tMHEWg}JVk3lKO+J>y{@}} z=cl{t*((^$ruTsvOPt!EejH3!SV%#)Pf0|Ofu^rJvURUhB_JQWa@QAxFc@k&@wz!y zbZPB8yNzjE19UzBzuI{5kA_0KAme>nj3rz$e^q0#VWooLfY7UB&m5v>%3s;5d>|R~_c{*-E zLwI8Km;K%awhUmeIzs8x*>yK2GU{9xr2f2BZY#4r!e!ZR;$f=)q5ML|?Y`@hvER{t zY?ppT-fnfgN9@ww(=7O9?*3_R+1{MWkQd^wK*W5Jh2N2-2%aioAAEkgn(VxPy1RI) zwes?P)XX_@>wLa`*gy{TD|_8JjU@y;#vs3Px%?8>0W0~^r5YLAAY$sJVlCQjrJ{x; zoVB1zeni5^T%#70{r(?s>V(YZBU0sJp{WCJKM3jsh~-tDhLP>(XPfJ)I!ka#eHRu%PG%zSKnii{>+<{4+;wYb>c(`-`Q z-=4bFQP?suNYlm4!Go6Rx?FlBwPhKm{>#-9Ltx(kjm6 z1VUIz%Jtw+33s!~U`>yq*K<3wmk=^x*6;u1f`^q3LI z`bn#Y;R~O)WA(Sk!NdFc=L6tE?$P4{-V7nZnf#4;ql6z<&g!?xy91P4E&nN9Wb!<5 zprGRFb{?$HgPNxep~=^r8_f>Ul2EskS;@*S>$R)rE$3MN7(^}(oL@WD1K<}rR52>m z{0W1_0>Pfc zAlwPx*}J2r!IP*=63mp{JeU%p+FLmuCnoJ=J?({G=kasElkNkH3(LLNj}D_>G_CGJtZTl)bLw>CY&A8whpBoZ?8TQI509}FYR=yOd|URZBL#U}`LQ1U8PJ$}nP6J0ZcJcYAhdt?U=Y|3kgf8Gr}_W!&33y|smgQytDz=JXh37Hc+UO5}-I z5QJ)dHR(jL#rp(T^@Y@xS^6q|uQiSruckj2$>S%>F8(ZUnk)Jz0QlmWdd!K1ON6Ix zKvv3`!!l&4`~-vYB-QA}p-ypVK?nI-0CszL-DUpss)xk_A4!6SPZxp>d&6gfX(X>* z6eN#b6xl4^3jpQ3kLis(1@H!88t4Wfj$saDZ~Df91d8A8YJKHNtq{A(|DV z9RVC0_&6!bJi?P?O4RHvb$CKHhslP<4+}trGrk>{d$vU9ORv74dBy4A{6hl`rOq-s z*9R>l-k&XJ+a}}f#W_cVot>9*f}gIJ>nn2f0Y9wI07H}Zeu5nbz7_lc{#bzTV)b5> zeyO!jGXN~I6@*-zk8u8L+nLahL5Lde4Ch|{kU(1r5(8lxn)oJcdlb+-05D7P!w~Fm zlCzg7CVbVUx%mdTsQ<($$xs+I+*Tt0cJm|66l|XY3idXx4i$|uJl)h4A{|Vj@TkmiSh@5ESA?dy1-y@p zdX8&2bhR@wYL+5b{SLtXxT|mOQt#SxdiindtZm)Gr028{_t#2ngsZ{pObCu&LI2Q| zI8$VjKcB5G%&q?GsO~G?0g(wl8p)AfLLhRqQ`MwhN6d>Zl@==+86phycLY|F2iX{H|8S2%rXfj!RIlNW8vGKI};(-sdl|y;F07M@h0^ z)KSfSriwa7RjqojmnSV-m7Q6>O@c3ia9&9Qf1El*DPSR)-6a(qXfcRQfOStIt3K39 zfUhmoI%E2!Qd(eT647pGsyp|!>m`vF4D_r2&Gax=z#$-y2Nt4(I9CB0Cji>CuQ4@y z!UgWRQu&AUxF$0u`NotE%+cy!21BIP_|0H9^W!MQrx$)9KhppGkE-)pi%W2q<(#mc zb`hl+RCbvp4{3>}qXR;=392TOQ^!|B#L;htN<5XxOt#HA4 z>yV6Q{HTP#nqdH&-P?(v{))?nng2D{>&$G+z71WX+Dqhlm~rP3S^ow%ws+0f-J56h z@n$A*bvfX4S^ng?{Glv)uY+`}TQ_q1>gwP`_;>i;8b83-``hxOe5IA@b1^m_x7e*; zE{-1o`rSSJLd};ydVHN$qZjlvHK3>Qh8mp|74WT+H&AGTi_pk)RM}`3p|||11(9Hf zJU6Lc^Mv>ID0d@qxsiRBR|;N^-i>m;1TVnd&cWPmQZ(PwJi`5{ zapV0N?gJyhMqe*RJ%s4TkT00eM8sNmKAd#+e+Me7aY$#EzyrDkVYCIp$ha4GK2L$V z^}2GY1$^ms%w%$my7&rdigm(_nwNjhct~+R05kk%@Xu+Q<)K(ugjDNZdb^Y3w*j5W zx~}5|4H29fY6Dgu-4gO-b};k9)_x{$Ph2i(GN;`h5O(@q4O9?*S~ht4{25JS58o@6Pk!cl|`Y&GRGvLcQx(i$QyTeuK!j5<@h@U`=IX?pV= zdXYj-)yNiBLY5-8LIgOL#w~@jsgxwXdzy{I3_l;Rr zmme4;52G3ZrSgJOZ-EPv_$A=Fo*qv542C+A%A~_#?++V=IWFO%261x;xNVXIlo0Wn zdNPduidh4cbws~xhS5q*>~{m%S|kq(1odXS&w&n^tbJrC5)s9sGQU+3K}30+_0_-(l$d$Gy~Lbk(e{Wh+9cY zZfioN1poY*T&@yj`xG+vfmzwZVi1YcZSZSpFl-yTpLh%j$Cw!s!HQnzmlMA|U zH-Vs`4o#PIv^T-8+oLm=wjzX^Qa%&h-4)Pa+x`CE1i4OwJ?0eUcxtXYhFrcvr}mrF zCls3`aX52iZ$DqvlTc9y|8WAkBJzqz>!tvzp5P7GfY{| zOUW7xTNJ8U)g(^Ts?KN*mAEUZF9T z=ubsP7sg1{E)zBBf%g_YNk3P;RpG z6JVj*PtbRbGyesFt>D8=Xy<*Cx!?D&gW5YWZ-EWXMbmK2c;XxkcBAI1_%W@R8m+Dr z*+R^RO3v6=J0S0-U@+x>BR;ZFbEH9Pcy-|xdOe4Snd z@|~tvFV}f`LzEuA-Z=bsora9-BfaT*Cgpd0a?o-O!fgv42QOL<8mHkJN*IQP-V3=i@rywz#1s zXRDz5NeG<-ZS3>7^=yXbJ}u*1|`}EOM^8sXCwitA*51%nXx_ecXqVKNb=is#^>%U zW8NZ%0H9{FY#Bp(Q)deUA3&8CTCX>~r0(g^Z%F>K#h1s2tL^N1>Wg7Ce<~0;y`_KO z96Yi(7T4i+>2))AhW9ZQviE5OP5nrnrNS77l8e|x~H{%w=hAe_ve%cPNHanHjIkFGdj1KQF-|)>y1nD7)ptzlyaue21kQuu^a-9?0@;h z0s>v#+QPO0<<6OF$^8}R-L6jDm(&aYsbPpMs{$Y&r zhw@CkX3iY($~Kh z2th#g$u3xE)y?;8XKDOLB7vV{H1s~GBpimt(Ct->;0UI3YPW#+Gf*&@>wo+?7LAgn zMos|YPe}2yJ_u4S68(F0cvA-` zp)eFG<>)DYEXjR)ELth8U8=3PaW71t3bQ(JSQ4BY8G5w96sfFfYh1e}FYfrtI)8l< z1CNt|Y|7H=cZA0Hh`x`Snm)Mn@}$+_IZ3!h-ha z%uM<7B9fOmvBD$re{61!NfV_>Re1{l>iwcaw;;2^gm(>s%{b5{4*ek*LH(m1wV^0W zrPnuQ5tUEqIweG7@KWJ|46svW;g`2?(Xpp2_%oHS@N1gN!eVKL2{|VEJRZOdTRvZ-^L@9qY zQlO46@(6I42&#abuvC6%0d0Mo9`imm1v<5u-5PQ^a%)C_R8a@#IBYdt-I)1|^OFm? zXv|=byRxa+^3Umhw;TbnXU{utMFan>Easo|=YH0MZeKijamRju%QcFR z`IzZW)*?I)>dqM==vBgwkrm&88ZwVU(2s6TF3OB<&$;&kxbyEhU$<9Q(!vx8v1CT% zvmxdbC6ae9%MhS%SVZ(ktLXU?{moXkp7)}kG;=00JBRjieXnf27y+GKnkh)Z@6tWJ zN%hupmqM=^I6W70I(=WB6guxzn|_>6R_p!n@%HvwTSR!6m!?gws?U$U>e)S$jy`90 zUPQgIRCTe0S$VFq2A2;83^um_1Qge@Uv1yzGW)s5rZC$ z);pHD(Z4>()YjDUi=8;za|}ryl|Zg#nH)Dt&^3g6R)8U7o4ðTP$qs$^WbQraF^ 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

>Bk+X})ZRO_bGrRs&O zm7<6PGja97VzJVpWgX1Go1Q}>KrxsfCSyH!OJs^J*dlRz96`zEOGDbXl_kO-t*%9; zCEgPR*Gr9H(!Tgw;Mb!+mA~%LMz!$NnxebkI1|9eM6!R0rF>xT0pgd-<*^*4k{zK= zuX%EAP>B1|N}rMlfcRQ@DkpYWc+zp=K5-xIyLD6PB(or%xy!PBQ+g$hXg^{VRNWL| zIv;3!Oe03)Iu4GEf+Kj|Jz9xTgKkkNP}Gg&iP)>n~WbcQ8KaTXTuqfluGht-@mu&iqUZ{f8Km+DPH5zWAV+(e&%#OKGyssl2V<8`^LR>D)iqz z#vBK^ck{!?Fn$IDL;k0aadGvsHFx>Tv7G5>gSL54-|3atJ)A|*E5NJ>;LoI6a$}k` zmluSQv`z@qk`0m#I|M~P{SxI7WzPk7!)VdF^J7Xv8UE>9pZn+*$vRVy7I{Fd*aC|L1fw#3-P*7xrBZ->Fmjd5A{u%+)_mSSrJF zHgy)mrPIx-=K(AY0V#!(T*dKmo)S(SkK7*jSQY4{Z+B1Dwe0S7nuIZ4qCHGtu#ZFCw{tHNxeSQQSBCmou0ccg2uO>iz((kW<+$?QflkR6WJEm2i zs?#fsI0xJHyx8NH@S|nYX*dQ!r+jBX*G3Az1$X@g_AeHP8_WP=0=r1EBof{RDO$z{ zl)RGgAzEbI9&Ldg=zK~Wka^$D3e%ov3B#iHJ>a6eYv9{=2v^R8-kLez(urLgK6Q8N zW^P^1C%LE6=xCl^UBW0g4@U=%8DG}Ww_MKsF35mmjGldro*Ra%Yu{ag@Sq1;(idma zr>?>|fg#cK1dNgS2lY6#J~`@J_G+CG*u*?^8e@jAURCKJb#z$k{j)jz<7*?{`6V4< zB%HfOpQ=7xR!qAGVIp-i)4t!iFb+Dg7ezTbkVK5cjTkt|)0)Ot7v@JYp(|@loNn0f zgu?-taw(p>^T96>I_3qmxRr@+2^z>FIP+dAt;_nU=(K#wKyMH1p~^(*Ch*kIIEr1TIH zGUz(GgnL3t|1^;?(Rp-P`K+Y~>FS(IBse3fd+-D3+&a;{;*5IQY?uK5n+=DGT{SXZ zN4q4>-uXBfT2cP@ z0BJZ8hG>|g{9EBtk}5;NRc0zEyyrp*!P31R9odUKOS%nG>|cEg04P^HvH>Uk$+o_| zbF|3Mhhhs@{sAJ<*^}T^P|Nw54)6hqmAn`Po3srf$cuZ4sL(B|+g@Z4zO=5W5D;L! z=zN>M0???W!L-O{!59b7c97Vh3cVuW$N-c` zhQY6pLs-F){~A>8fM@x1&u-c=fj5UjN%IHtzg=O2)Jb^fhYQ4p00Tq(xc`&e-rh$pc9L46$^FU9WUN5p_~lOM zvXXDx&(f>6q`_GRR&DdyDAOrNi;h!Hm@%6pdh%`&m0|yeYLKzVe!fB8^X1gd@XkOrCs% zdwhjp=30B+O}?o~t>?z!pPR`d%r8$J87%o>(+d*t)DD$T(Er^~=fgznLU1rJI!G`u zlz;mCzbI`?92{)^^7@e~EA}faNN-q5aFc~|VIJ`4y)Yrzx`;?Eb<)I$OF0ze&A90L zg>TO??iswefLj@XJWo&0JOzuj?ArTi!a6qKnKN}*s$1%_Y|#GuG}lKxQoW)J!sMB% z?t)fVU6~GY$h58CpL9Mz`XoMc)s?N04`Px7q2m@6m=!0$Dk=mkO?inqNll{@rJT&- z0sZYfzcaRWvDYYK^2r|=jT&@VB_4bmUn8i|i5>~VDfn%0DV@q-`MjUcw?3q?xg=ek z&LSea5?V^@EvY?1^up`tWz;EDa*@g60!N$FmoHQw&}KVM*OazVm$gz6uU@ZiljdxR{%ncVT8;ddBqVwJF0c0%kcTdp znMCpAD)vRV(AGE9$>35r2h}L&dV9Nes;^}!Y03G^%NJeyX?PE(knUAsjXoi)DB#s5>Hcdk_q2MYu(lo9xL}o zHaiVFFYDV2v19US;~k<^;d9sfp+?Z4*|o!4W%DOWq!At)lzmykCpgG6Ii?G0_Qn3} zjRG?_wlz9>-8}V1++qTHE=C0ZyRG?K1X?5?_G|PpZ^8IztFD-Xy{oystD%~gqq&Rz zUpCyQHlokl`)wwHT;utnE_SJNpbbqd3}I34vI zxW2wa1+N*`1_fLG*#4%X#kI*XjN0Xr|7pl-d!treIjL+tNN4omp%^K%Q&sUxs21Y_ z;3Ome^!JV(M;8uxphV1EzRxB|M~q7lCA&w{J$u=e)=c4M)pI1 z)#_pWW1akOfWQH`zY})-hpOxED1RsV`Zo%A_yolN5AE0A0sp>y|2JSDG!o?B0ROX? z|2xXxC+Po10k=Z^2g-k@>wg#hdqDe-s4Eua{|s+`7yNsG_>Z7I_P_u6zrw}eh5zn} x{v*ta`w!v&hhO?T&fiD*e{hKKApf^950HcYu%f?WHzL^Fhbh|Of5bPi{{zm{zUlw~ diff --git a/spreadsheet/macrofree/waf_checklist.ko.xlsx b/spreadsheet/macrofree/waf_checklist.ko.xlsx index 6db5c7bb8595e56efdda3c74655740ac2590030a..040d312d0bbbb6a98e49319f9f5511b12f2eb711 100644 GIT binary patch literal 198519 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

of@-sYgNC= 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�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 B#7+PJ literal 198792 zcmY)V1yEc~*EI~|3GTt&CAhoG;4(D95f6T1O&u;hz&tlZK-|*nS|HBMqfW@uODL@BV~IVTLJ zR^JrH6%c>1Ai=G5s5&>KgcIkXNC<{!wvID71=Z781>T#P#eZp%iI~Vc{GOYc-M@h{Qsz+ zwe?vB5%N`bCJStw_qCe^E$}7$d^vGT8Y6I1T*sZ36U)+kUqL3V zXU3hhnCI>WsM{ZAku5zs;>~Z!U`_k`gZ@vh&tC7C_=fa(heo-CTy1E@qDVy8l7a&f zb`*66JzWk|p9u`o8y=sty&?~h%qY7k2Zs`Wn(I#)UfP*{+^G;LmTWkDruYEALfQE3 zJoUrZ@CbqpSY^$1dqIcxl)#qh3;vE{6&>Q1XSn~@a#fPZM=5Zxh9iT3zo;ac za}z6*|NF`M*LKI+I?d3yD4*|T@Ze#N^HgW(kq4@G zsTt4%bASf);4)MoFpnG?oG%OqKQl!#$sWJRWB1t)R>cXEj=jFa;qfkgb2C200p}zi zi3o#?Zag*7qpu2W&~T-2zS3fO;S_lAAr8UJYs6J5bq*wR`0H+5m_KB^Brp%g&y#w5 zqacBnQ|Rj=Td+0b_!;Zq=Wm^o;n*C#6DNqCFz#xm9#Lv_YVz!eCOoipzu!UQV{Y-5 zN7LJ$3)KE7Z5U&wK47~Y1dZ?;QeSTvURzBC>H2K#;P57(WA35V6u@5I+)WBK6*Bfz zs_xYVDI%dJ`ir8$&CaQIa8GxH9nLk+T00e2 zK&j8|a_8@K4Vog0TPP4q>UXXQMJ;e{uVqpUq*+qrnH27ogG3pQ!e6!y9t zM>WXl@Oe0&-Lx5X)$Z$f+%8S>dA#ET19HL3@kvTQT5q2ZJG{NW`8L1^(RSZh04STK zq9znFe?cK*#z3DtV?4kYq{1jdSU@-fb08}eSlQPXB)HeDAho+;T6vmE?UvEl$iwyOsxWfBi^Rmx7-(U-`UdB|wR% zLQAqqA%O=Y->fmC$%ddN(mKyvuKeQE=fZv-+fT0YQ14z2vOpN`zD!O}VNV^rwfGdxHCT2>JR`Tm00~_ulbO^O)Z0)w==M0yG8(-{j~HVaK?Z zd@6tLugN+GbjsR)noZZ>eCaPSUDOvUGg17SGW}^Mcb2X6qL)edoUS&n-~Ew2EAqIQ zj)K3M)}M0A&l{C5LMr?7-Ihgq=dq_HGB;LZqqKi1a}nSgLm-%L*)TXey_6Whv4b&0 z`?d5W2PrMDrB(RQX}Pys5v|j57S-fW4oNr{=V95Lh7vgOAYx8A5k4?zYBQczp&gayB3S@J`)}QCY(++3Tm6CM3 z@2(ilD)>{7;3ze8+%*(%)96^E+G%)f&fsHKSd=+{Wkb)7uT3dGtC0JUF3SsB3 z>1*44)EjNcxyCT9lVl~JarMpt#or<6FEQ_f=2Tep3=*u^*1IZQFbYr7g686O5~1_z zIU~Fp#oK#^xN8u;H3BVqolybj=I5FAiSXeolFm(q6A}{zPOI=bqFX^Ky~QER zfVFpu`NZ{)00tzl27+eA!ec>*+#*V+?)fFb+s*NU%cMuim%fN+M-}HEVQ!X}In?!t z>l>0CheW56!a1MwAAl9V&j^k!^Vb{P6SAhuHStyI^!C+rKNbEC`{kZ{(TLhf{`|QbIIF7r{M^WS>gDeC`R?4d zk)cGhf8( zqrrOP(fz9j)Z8Y^kbWL(yj@m9az)sG)<8NDu{tch30G-W30=7eL z)Mfv+C0uaRLhL+cwE?F~p5WUOoXI$g+?bxfm46!bZ6myw3q=}Q0X(aPn2?-Zjyb+H z1*cWsCYLJuV>!oaLguPjU?JO%2K{tsDhI|3kFB9WiSdPUx53HEz#zk54hd|%4P|C) z9FH3{ubG&X0P;5jMFBT{C-$!ONlv3xB>^|lS=fxK3fj!}+$6`o_5#<7C`kdrhp1SF zOve4ppIOyynBzJ_mgZ+b=b`88-~F2;rTzDd&FA+9-bIU(t0woTAstVt%Rc3q&xmO37FO@Ixp7e{><|*(U;Qck$LaE+ zzU{tu=2)<{p$bl4tdjw{lJ#r>!V{_0&zEGR*LK%hb#Nnv4`b>VqnORPP_ zHwo=5Tr3F%QaHIF&>?8VC1}Pa=x7AH`r4~&f6dE+=5)u2q(j8%u(gHm=<(}S1&)nI zZ`1FBr{^tq11KLK*vBW%vm5RLpZJGC&zty%6Pn9qrBxd4X(67QrWT9U%bfs6`^nB# zgE}9a_z1Y?XYmJ@4aYl=^%kC!7M{NY+j((lnj{WxnVOu4Fu4d4fYG zG?nJ}Yfj^QkOT{M{Jl^uFmHDjb2B|oiBY7-U0$TuTHFyjJQ_V*Pwx&^M>Vm}W=V)^ zlt?rl#%FU+g`TkPuZ6iQ1PnYDy}whh#nU0}3Lm7CwU7`3|?cE%JD|bCwCT>oI zyf3`%NNzWxnU|P(Imkxk88b8BmyCx|CopZq>u_2|53H_Z+A0o`ticZ87X6fm_v8}` z_Z<%DGT^f3LjCL_8!ry@g9+=)IcaqC4tb2Z=W6BE^0}7`Ix>@|cO#AFkcpl;FBvK- zKE5<`#T{L$ea4sX#MCAq{nVx&Au;_AD=>1*r>S#GEF$uotw=C=p9q6LbRm9@E6B4> zLm2e3da>QvNWmJl>c1yHWI$_d!_!KZle^k(AR!H_I48-Dvian@@%6TkgD=JO#TtSW z&fDI1zapX7u+bO~;9w^bISd^~XBtYlCHetgQ+v=;Vv0*HZm<>wQs@02(asfUo=sqH zq-NcoD{}1zc71UosJ^dfN!qDH*TDRHpcRvaz}iu=)rx^^T6XbOss2kmm1!v3uQZk1 zMY3*gVf4o5&ZqrFzT8{Sr{|fdJqa$#PBq4KNH%;?Cy&~vte9hA@PN+_!36^T#kvO? z;l%`xmhpf%(P|N%xW4GWCxhfdHWN#ho`;XnJe{H`ej&MB%;ilm3J=4Zs`WBRi!JTvqdHbj z6tD`R(b*MbWL>=aCGvrxM|&_-1bHm#*_h z6NuQ6P4-Vbn-1tiU-FR!R9B`Z0t+357y9gS+KDQE6vWIl#aQI|FHVHQizhWpGWULt zG4vnj_BYI8ZAa=A@mj^*0)%&w{(XJs7EV{x!=^?EPgF%(P>4=xqMZexrZ>wO0mQn| z!3AJJlj)$%`wgswG-8S8&;~QgvHI=g&{EG(g&LB3>(r7#B*{))L=so7@`-le6`5cV z$bZ5O;r>`SJJPvWr$i84djmc`Uq5m5BxEC@Iqn~kIet#FlYI0P5fOU7g4PEv+at$k zCW%SAfSkGcE?T|?4RrwtdFKlw7F9cQZV{I)_5rC1pbAO=`nkrQt84JeC13m<03lXS zS`8iBhH7``D|HU3mxu~ADtRtiB!@-<b*~B3UzAwICoc+i+*`i(zG5zH6PZJ@f1e#cF|xJw3bK2FZTgwqWhw zvl~*=uHiXQBoV2ZuP;g)#P&sOo)Gp3{IPHI>xAY^mOLTN zFvz=WHVyj{1fJa8sdaK*@h(Tfb^6GZ3Ia;lMy3^=gX#wsu{;vW70kABFuF+G=p5)G z6e)fbyqD3bNG9Z;F%2hV7kCb{eh)rRA!)EOv$ftdU@bufjTVM%P5ASI6OeTSF~hfw;0et zNj^AC_(lKJBN0|KMIQCNW_2geFlK&h8fk$Z2~c$4gM>3_^$i&lFpRbYV^|fK)kIr@ z-~^vj(kSP~xn#!Ev7YU-&p_g1YwaRtx3JC7K^#o!PhGv~=fv!3ZvMHlWeA?L3BHAJ zLhv#wLZzlj>ZBljTLhvuvsO~g&oDcZDJ@Z)wq*|!MwwQ=Gaf!Mem2=ApgIfg`G38x`A^UK%Imc}-M9z(g`A zRNk?%0wK&^l_(~L66i*5XP2c<58)I=S`8aZ6nf+pDhI1#DBb#Vfptb#J?b3LW^~&C z24xhOn%4i4<`)3Ad`Z%$_hr)_(nvPu0GWB4CA$zRBN-*Tg`L-V0LN?%M3&ySKMy0h zD6fR>?h#nkWUiyo6YBL)*kP%nc}a$X=%?9zhGGm64kwkS1!UPu!WQ_KM88vn{?9L| zGP#aX#@ZQ1MNP@;#77t`OWhr1N$c`n{I`YP0aowF;}Juel(4;+>O&mDoCn8oEwpp+ zGV~g#wIxUx8gYb;gF+WEjA8B7ipl@nAg53OYeyBeyU5ivY|&8}CI~V0?LmkMhjqe0 zS|wDfIL4%$kt^{+A*D$jC;+yoF(NrX+WZ4r5_V2rxUqJzVNny;mbFQ@ag4!Db$3Es z@5GJ%)6q|ukv+vc?_y1WpxVKz#;LbE>j0v>;ZrJk^Q^}(Ea-e4DmRH7A)9Z?+`9tE z?(l0*M){8oflRK4;^L@MypD`&nk9!RVq$nAJ1%#e#idf%_X8EQ{ZK|(`h=R1$(jt? zVg~zNKVQqfP)*ViF>WBczt?IEucZ`J2_AfrDJ3MQk-iCV2pFWLZTTTbBI_~hB_#h{ zO5%OKQPWv9T9GNt8#R3hS7nbgnT^ceVKU5S0DjLtt&^Wt2{uhn7==Q)z+|T_QUfMe zEi(%^c9wcB%~0|3$U<3hi;cAFh}Q(meLDYu1a&}0L2Q<+VqFsQ8dGErS1~X%;uy-P zvQX|azyS=zF6H^3&gz58`hajOrRsoZ;Y5~-ka%Br8MJx-0ThXAp&kI88`xIm46bu$_FYvs^XxJK68Q=vhxa4GqJ2s{CC@0{{b|Ex1eRFvGtY z*<(bhC{uC+DYG!*d;u~Ts$z+GBa&3HTR|xASrTbC^F;VQqv7$#sK?j;o%r9fL<1@S znd+YyY%@!e(02ey<3`l@^lsSsaA!OfhTN@*wc?lfO7wR~?4Xy&yTT8~Wkm6~{UB9% zmqa9qm=)-geZO{}5?G9rP;MRG?&cd`aN0-tn&j34`d{rO?Uo`ojZ=%Ac%;QWr zQ?qw+RC6^gIl4QREy*7Q$DKF3S#6-GbehZJq!27{C`K7<)DxGXa>gA{Y8WbfDr}ab ze_YZS=+|xXEOucvc%uIRL2SpMHw0m(rbi1{)Bm5JwqjsFuYN+2g|e5Cy)vP95~()E zV%0~ZMAah8)JXp_bmhLWW&*2>0#E+Ga^NQ#RS4zq5SjQWvNJ43th-}Q($Kgi*`nX51SkiZnmtf3y5-4K6z$AKxrDhYTHLuxMLZce9L>{h}lm8+Zxkopa6 zrj$VR@rY;JIVjSal zqQcLFlWhE?iE|NTK%h)GM?8=0Me7xFut*T?n+g|-ATbbQDH<{-PA|VEy+kgPNhRb| zfs{u4(m+=Itg^sDAmDhTkF#n1djeBR>idH|VaBRGWx6ljOENZ}h!&s3Jt;CiA@`l`zMiGvDI8RMON#Kq`)vuB17Uf??wree*$+oMhbb!Z^irG zFJc<{n(&a@`EL|5Ordh2TK%(?<2Ccb78y(m)`hNAk<AqfD*5q=w1TLK~d^`LP{b5KY3J`p(GmXLIoK^EKv z6t@i@s|$_PIIH{`qZFP?!kc+aMWvP?Uw)q#0aWeA??cEKDR&jiL)cP^YoD1Uej+YE}3x=}^CVRE%0dvsKj z?P@GGBbm?~>XJ{d4b5P4;B3MShJv|189wZG<(r-4v{mf2ntu{+UwFnainoi%>>$DSx+i8RHDmNGe1RH_Nw$0Fi+lD3N?!C zC)My0@iMSsoz_+sC5A;diD{Rdwkv!7>mdLC6<;S=-&LchOlEUmsQ|xLvqZYvON%dP zO_s<}_D}g$eOXD;MtR8%m1Wg157bP6lt31X^pZL%!nK$9?w%-J(YyRCVi4R_77wp& z@v4EN3<^ROn?h{VAX{D|PbfVvTCD4Da;%wvx8<0mCH6)4tKBD*9ayzTKPQn|hbpT? z&5>H0PI1pbX1gtiTz{t_mX-0CUJ)P$x4AnB2q`AgzIc`tkTiQ}5v9KH5ieXHsxb(A zw+k<4_aAuaxz_v?S|)jciCS}45cRU?$$*!Bjg|@CdsT!3Il3a|d`K^gp{kOi zE!udt-#sFDs$yF*XxUe)BI>GluSk>hpLnbi`*Qo$_fyIahoSzsT}+}qXtygBFGY$5 zPwqFa_vyA>;>dGX=moIUQ~tB*7s+Dz{c8GYWe1f& zr~KFNYd9__7=6$I`^$$(yRwqvrwQ-9UniHcyu@;P&lYLl_ce>Xn{K~e_nrMU`^X2S z&yfvsb$FgI;X2)@l>X7y^wzKs?b!}JWv^8%iC?uEeoRIP?((gi2^6(G_@UYT7E$vd2 zDXiO2V6F64tq*ZwHN19kHQ+aLU9(%vb9o<-I(YUJk?d(xlJZ()Wjk=h*K3cX!Ewej zZD=Fy%{R!q`N!pycmBYZ^}28k4=BMd&W*zH}J*tZIf;rZH>}stiBC# zO*Ak*hJ&BL>9h3*LaF=j#o+P<{H~8*wQde++s;ewy&m>0lE1`IIvqe+rdAy=e&hNK ztIXHkW`UB%nAMTTJ!|lP`6%~_-U=d5`4O)6+3FXM%7@7_qAyDHuyKt{PkIS%V+fh5 zJE+^DPgHMFUkM*EWl(JbPRiaf{6qPN%2(l6$8rYzfbjy+pA<(Ex59*nw*Hsba#35)(*%-rJ!?f8Mny7BG8S!P)rtV@HTtnO+Se|H^e6bi;! z9I<{=5+7oyRmV^oWr{LgStl+c2~$lS&lq}((g0+#8xbbl6T!Vr2bIWCB(1c`Nd%- z07)H{O<8aN>OeFutac_F=NJ5}fHEcDqavNC*c`q+krxq0#bAoxf#@4M=ljxvNp&;? zU)2kTDpyAhZok>SHeg;kZdJ454_?HW9CddO!fe@bp8GRJ7(4s1T@7=j!O3zwquK;@ z+RzH%Q;kr8>ALDYzqPKelQpF(MuTlTWz%i&)mX+l_MK8f=|ncM70!Z0mJZvcJ0=Wt zZ|u4zm4BHvebhgZdt#BWq}h}S2cb4(+IBvJNO%nKO26)#!Vd9v6=C7lkniSS(ZJx* zM*UZx*N0w+;Lyd%5sxMkOwC1|C;9Xd#gYJ+>Cb#V4KDy}Q#P z*lvkG;jr=oN{n|x zK3WMY!wJzvDeM`B&p4BfGzt-|7Ylw>M~yJ>cK?m`o|UR1tgOXH`i8*mb}%{Ggw=ER?)=} z^cxyDYeApWtV*M&cr6P55SmazC&VJDOI7=_#esmp+2K}QDksrWe^MZcs`^0OoRfd4 z#GOM^7TbU5RLly%8%zXBy+U$MA45XyDDR`$TOdDM!m{t-z(# zQH}0gcsq@4gb)Z)6xL#{P0ngvwExl{w{Fy(2LdayIkdm6+%_?ZP1@p9KP7grlO$qL zwYU>40}<+O!f(Mok*@#hczY4hXV6Cm+`n}^q$YxtQ9C!CWL3#HQX@mP)Y6@}bIJ3- zv#xYY_cM57R8t`?|9f+0ElAQkw3mvd>1K=7M17&F1-RNOwgVS!eEL^!L-glvY=8Mw1Xi)n!aoJcTanMZk zjDU*3xPW`}H>Yf$(Ry*94p=j9o>c~OYk^p2`gl*GiU<%@YRks|5K+wb+s$PrQ!2U^ zq_IKQD|UByf>B#2^--~sR^loZqZVn&nV8o{MCqJ*yxw1SD&)_+W|n6ZC^bOU5(QA~ zCIV1k7@goSDvF^iGvW=d){Tdxlk~e2?O+)?G}*`k;lJ6{jT8VFg%!$_OnE*GgCBStAfAWp3j|Jhx4N;xcmI}x&7W0 zOwCa8==wN10OyW!!T9*-_vg2_GX!uB9hJrvgSn%42>-9+RkR(HO-4l%I8lp!@&cmLsWUPrvKZnZdQDD_=!c~X_Q77xKVieLS+(~UCm zi|eO0*KMj$<+izo&8Gxx^q+%lKUO(k^t#i`ILMj)i9a@eOnv=G2A{!HPBA6h*Yxd z%atl3?Hb%$7t%5e!}ij*8q8)1KWw~NOf{k5`-vQ;#SFC#H|k_1x$9_>*TO&^;rmNv zHLHZ+ShAC^7PPJxeWHt2z{Y0iS9sLJwD9PEiEz&PuD72Mi{#SxmIuhIS^aY&dkuhk z*v!bl0FbcF%wx;m=xpmH;-wXOTYc#Z5tYymq~D%NH{VaL?<8}6^=lvRDxXu{vjM#1 zqpQBmXfL9%*M8?KN)WE&-_}4&r!kg%;+wmW#Dc}&KwRC<)HyG){!G9I5KD$-=z1C7K!ps@YxU*hN{ z2iSi>847X}VPdpTBmsQNaUaiLv7w8Zd5I_ydoORSVbkP_2LnP3_}_+|DL`WIb-2De zUO-@7$vF~+IihJyCyv3BK>Ahx@Vlo~(}rYZz_3z%bQ?70%$d|u(phI~aWKw52s~Rb z75w|QIaIpe=9(8>a1Dc1Up7ys7p=IcvyrxOba_}fOzfIy<24Q+V%hYREacRj0#!>sc*5L-3o7Jwp}{B2PohwbEFsr2CW}J)ESAMfDjhW%uKC0N`-jx2AUSi_a7^{@JZ1>eawp-Yhjz|oew!X1MWxz#Hj14TU8|+(r(}%^ih8M+EkkM-^AK+UuNKhr|kAJ37 zj(+K)LpdzS^G8yKYn*AQTZFBbJT6zlcDBN^vuGeHk%!lzmSD*0w~Ay3`lqsC-T!XU z4FVoTHIRHV`I@?LJDBMHc?39F-9tM9Ltx!1k2-X@LQ$BXU147d%T`W2S!jhJy8bcN zth7dn*A-;P?eyoFBcTPUt1e#Q5N$R->RaH)z=D+w$KUsr)m7UIxZSD36ZOT^qgS(J zEiJ;&`hwoa?M}HGx}#^d`Uu(|o7;RY`$QJjf4>kaTE+pvSHZTP`t&iZ{<}@`w z-hRpkBPs9v#OALMwlO)REv#t-7HEVE-N{S#r1vhZ)A>|fAc8yp0`A?MGL?!WF<;Be zP;Ev+p=EU|lxr`FouX0LA}*Y)1znh#9j)yUKmy@8+ZR6199UHZ26bZ|n*7WHU(9Nl zBCdD;^TyH{9l(ldqr}eV-Z<rZ` ze9kz^T>B0X;$)6;x~n?1vSl4yKOL1zaqfUrWE|aCAzD__SR6<6H#$_R5tRp-M5tQc z)6P2p=+jNWD(%TR?kuEqsMzGi`dP9;sFALv67b4{C~t{Hh?#GUV<*|Q$zv)?=22-t z76o5AA22n^Bw;$EF1ycLunim6+`rkE)O}dg&GRF}-Zi&Ae)5?qY0%g6>a51DMtdO7 z9g47wk%qPXDZ;2-$dyi)&8vEj zEUcs2Pwn#I2v6kHnzr}|Nay$u(j%oM`g$rf_4?0-&DrteK&ndWe zYS{dLZoVhy8scPy>-o|pd7TXmI}?kBjKPHnRn?q4Jo`y8)|y=vH^;SX6%Ixvp&2{Do>>aas7l6o5L zAeo9jRN4gcK|lhP$w_pMs2bXj;k8KdpgHR&(MEStU!70uN|ZgL!MPQ+C=`H=P*Uyh%7O?6G z{}EQ1MDdWMuE`$HCv9b2;v>ya4W_noFz~=W1idvEdnQzRsmvD5R_!~_zequE7?5!9V8!P!Mx} z61UQ0`}C@K7--{(^p_JSVNK;vY_l^HWt)^>%rSu886ddvu$_reX_Knh#}~wUrhB zn!uX;o{eeivm)%tC4^nVl=LtTKcBloR~BH7<@9s#eHJxx;cB~}&{9TJv|_Fcs#4(s z@S^tqQQbq;`)BpTbO=yo(Z0?39BT$3wUo#rxunkU+NX>kn*6)nBG6E@pHifUNnN~*OF+}V9y&X+u&1u5!~fG) zMXVqTgAFzz#zF)>r6!zMW>BT?5IKphEM{a761!F13EV2K>ZVXjR}}bP11Bd;RjdG! zo=n_|msfhNv-Pu&7!2m^^V-ZJB1)&@*bC>zz;n9pDed>>3Qh11+v))6C3L2_P}M*a zj=d=fMyD->SMIUC;I280Dl*)??&53cW3x6TaO9%2q3d8v+RtV~=c#?6m=z~ZM& z=HQdr)xzms+rTRlJtY`cWuo9%bDC`~H`Dsdd!>e(MVqAS)-ao2xoqivN;dSS3ZkrE z`J_iu{SD`^uxbh*SxfU68Lk+D-e-elITB`Spr}Ks>BbHm0&sU$v>~x--umn(ujjO; z3OHCb!3*K3*rwrH-CoIdBGosf;2rslg87~flj|ST`Kdq2+qvjHS&~M6xopKbzNCff zV4GH^0esbzq0+}Nf`N!j%|xZet{xUZfV$Om6rP24hb4I#CQ$Gz)+q7d&|32}TT?b^;U zhG(BVFug0$d+gP|*dZW9O!NNQz{2`am{rMx{5}G;I`2T)ROa1C&e+J8JcLMeB{lsR z`pqSSEH>Dn-nagw9HYvw4M)*0c12~hhADKkC^y;q<#=wZ=IEw3j|%thYfzQ2@XaMM z6i+{RC)_H<%@MWh%e$}B^cCS(+12d6RFCL2cO3e8E$lZS2d3`2T(fk|Dwm`fE)n-ibhOenSFDvaiEkp&zG?p{&sYW}Ps@$T>t5c2#7|ix~nj#!yB*k^Ci zy>LI;c&L<1OEHWS`}2pzwD!2zMc;eH9S(tz@1`|nrU`{NrE)&pWwz?xq>;F{eJQnY zHq-hf{wv?*&{G{zatC~x?Eh7ammw@duEEJk;ak{g&j%rkj?aa0QDYfHw1;*lrnZ_{ zh$q~!QXbOiva9DF=bpCYO}zH=CvmBUZhC&nh=&@lM+C4@xH2}DBz7Kq@(d0~ z6t9OUwNMMve*qk!lw8iH@XpLV=k%9fv~*?PkO}`;Y+NQGoOLBF`q$GXrX$T{?lF^s<`_x1=@533CIN8 zvA>O~p$#ng#ZVuU_45ABpSz{BFR{84K3J9vmhGwg{0KMM5m?7n4%W52@OUBG5veeK zceH0MHs14szh7ST_^-d}ophA63hwOOwItc3MJnBHA?jS79bx-+o!XXsW$Nj++ngP3 zEra&>0H=lifxZn@-=po;V)|&L$_;r)I8SPWRiOE^plk@3{n#}pjaX|TgXNn+Ku=x+ zQkjcE-FO$muNKAcAILsm54R%t?s&8s6EU)+2wHYCAFFq?r zd#Vm|za;X%n_e#T;TKJVuwK@$m{yRJ@?39AVj6k`H;mVtlEmN5)|pJ)_j|eR{?nMs zage4PIFK`{{a92splov;d|xY~NjuU~cI2G+702t+dgs?gf2by<{1!JD6)+)8yL zOjAFIufFWxdV@E}T3#+4HLvp1rR+OqzCEban9U!tlz-FzVio8d08t@`JfZrh?Hd1heqM%(0*Xj*~aOw=2faW=&Dgj?tYK^DUv4(Pbu9$`Ivo8$Ahvy zJLxIb7W${!snk;aIWF9T)LG4jf6R~<#)7o=QMecSney`LQ+HV=H+_o6HoxF(=VqKO z*o@qrCmA@$Yi^`{<*F4_a5PY`B`{p<#-L%&%Cb7>t>I>02qRuHIDdC zmSlVW;$dPN@@Zv8pH9>xKi#MTl+~u{e+|H^)SR1xlw}o%?Q7-2um#1^i`ThymdLeT z;+R*w)f-E93`6>KIJKI8dAY-MfkAvVI;CStMZjofD13VP)TL0EIl1vy!L>e-FTB&eQ2p}*Y3|xodnO4Etv@lYssR(j^w9cq3uZB@iH9lvhcAN% z2eT&LB6X9Umga5KuzMzNU5llC@}XgRoU7`;;xd`KYj569Sa$;Ei8CXtWG!m~WRQ*a z%_kC4k-(r`E{1o_Zqhd!PS%iknP*Ooh2t;x(Fa>_+o_TrVNH=1sw-6rVD=$lgQp{T z{AE@FQQ4imff1i|Oo#?lzC@*wa%K`@qXm?}*TaZelKCgW*3R4h3g+O;yo5;3;z}oq zk7v>p_D7BG#4h10%1x#0 zJ4Ee?(-5&zD51h((y$9fDvkq;HngS{AvKH^q!-NS^-_{s`77(9%(z?Dk025$5cS$z zOv96zN1iP%!9K0GCSY;rsig01oumA35cA|KNIe#R8IhBR+$Hea? zXo|6tanU%sZ^*w{!IH^N$F^FHVbBk2xT!?HI=D>L@@JXCsK7U+$5}OumpLZfj06lE zu1R|47S`k3dc;OBRdvmN%=vv}Dmo;}{I!miv9S%;rC^XE&xZ*zBq8n94;7`;K2=tW zD)e0DYaAVu-f9&A8E23U-4#Bjn10=k-y{pZY}n zO^~+I+2Al3jYzxL;MkP=vS@3hko_%r-%nM1M>$iMQf{mIbXuBda#9vU^*Z9MgdZq&tdpZ2KtB>o}Z1K4*d{`yM zUI7*55;0%=pL7h2SMsNXON_CN-AARSvyc!j(s&{bW)Ef?VpGSdDEs>RL&8;IUl#_( zo0$Azk_j=dV#d6R$r(1vNM_e{GdgfGeB#J@-J#!_a<(P>qXald>VjI@y?MS~%SRl{ z-Nz3dz;zCg|?-P0jaH@~DtoI~QaKtPV zscs!H2nv!9ki2nEq|U)qFJuu zf5{(?(_%wG4Q9bBP5Xds>%l{5#93(WYvl~+`;Zb>6(R3~hPVP^lXm*(&~t&1tDA^5 zn;%xzIw9SMz=#j=Mrp=`Kn{_QS{$S^8d!MajQFpPZ_CMzzP z_|PBiE*igIH||neAtdl(rnR(~T#ureFE$uuzUEAmk)4$5~t;Wy2mo|U@xW9CJ@$jqeRo~{z zzQT`OIIDRpd2Kj8^M%nBq06t4sV(eyG3 zn)C$bEW}wBnutEVE%seFL#}(oad%p{CciiPmK`kMT+=DYv!NK;9IeXSV}_U=+_zSs zYhAw>v^P{Tn?+F@d8GxH%OfOxXv9{C$t7Y1Np}5ycI)kWt#DXA>GUj>xMGN18(b(o zIFNGd{q^SV_HuXb;@&!6#Mlva!|fjWynS;Js5~-v`$>@-!C1=zY~MH}>!BFIm-uwL zaBEA8LAj8RmzreYAoFDh{lrh*>FpZkzPHkUvOBxHr=qmty5~+#RiFJKtM}zn{`a-p zPIb>B>UL`7!GYzkFgxeU+}{V2ODpv-yen!ep{~h}`pOc_+tzQD8k`Gi zV6QWgy=t+0w7)-ZF~Tz+DpA@YPqWpEWY@eRp`VQEX%&T<#=+;LX`6bvOG(rVSuCYP zgUq$NwA)z#XKh$cqn@&?RqItvwj)O7HnEXm9bX0!mdHjeY^Jw6Xub7bdUlFDPZeEe z5*)8C&vgvj)B#M&_)S$f{I=2?$dl&RGz*x#dgM+6i zDjGn8qf_Q9u4GhAUKDoB_^McU<7eQo#@9diz8C?ZHVJ)?BzJ!zw@&!M$GY}_Z8 zBU`)or+&SKWVZ#oNWhHZt*Nm!9gbbp(}UvLsC<+iw%76-lAdW-jDpca%2*B zj$}B?rQE0RAq|D8qO!s_Umui?O^3CB9%iRb%>A}phFSj8y^Klx$$5?5&{%1=VYW*~ zmBoxmr_6_KDvN*u@Us#zSTv0$!D%Y3yuJc(7+S47P%+r5kWWh}azo1bih9riXY1Ap z4OM`zo~L-UTK{3$J-%8K5X+kW!LsgIS}mj(U%Kilo4CZj$EC{4&Is;0XpwTM5|%3| z-zFmQ*UPO!1pY{I)aR=tzN9td_W9qwFN)O{v!3GuN64ID-tu3r+v|)oVR4cN2+j#- zxw5QdWPZPA_5-REsspfyy^uv}pO9v_ejPKBfKE z5fnd25#ek>s9o1cb4H80y)}PY$;78+rFtIb@~~F*crQFz@l@J*cv|ZgTROY;F5PS4 zhfCn+grUH`wz9PJR18yCG+-__a2^mgaF)}l$*3VfqB`h#R+(mNqF3Dlf2Th5=CSYs z3scpbceJRlXz&gWzO1hp@B+Ks?Qgk8XCxJ=G=e1_Xh=_0ZMjtK_5pUz;Qznl%d0mm zH9sLb4L>4aP2-KL@k99J6*V-#QlrLBsfz2$_P1Y&#+`7-ve{#!vZhSU6^iY{VXvOw zZ`-@cbHAPUyVBebpS#Cl#M<9Jujl8vzu#BJO#b1Kz>3e7O?71i*dOSd{hUjcbl+>A+w=={L;q%$1` zi=Z6KzgZ30C8a{M)|?6+Fso@Y_pBg!5sY4okZz>2kzC^gtBVrNtf%TKJan0=Mb7N_ zA`c%2+tI&{7XJaUCl5whcG2i$^D>_0UnN0!oi^Rt{9UsZg*J z+fc+Nt>4zN%*E@3aTQmj8rV~Bke9zK#@kFjy+>Fk-(UFBPaI+zk)adgu;GaX$GZ5p z+(#cIhGn@F7`hI`NI3QdMVtjlQ-oXtG0}kXUh}kK4mt(bu*Ukz? z^X>JW1*JURSyj?YYP6CovS`QNN9Td^{GIL*A>G_b#QtoLoa)pG3{FU$t;O22$GQ9l zE?+fZ&*p?+Z$*?l^W4#es_MC>V)a)cX~U3=!G1Xp5r*UdU$ws?%V*9K#R6o;(utY% zj~K1eZWeyZ9=oMXi@rR;M3hsn-a-n#Gp>){u*aG{7p#tXmz#Ky8qu$q{ zJSF;tBV$8|E#C@!J?ohS^Wb6Cb;{9;6Ac$pb(DidR@d{5vm_r+Uf(z84lj2BSt}O@B|qi>=lzbP;&+fQz9Yf7iFQUcWJXgvi`UR@ ze#ZG$qr6|AF9>(i5Z8prW{bz9Ny&H!$!Q|dq^xXGShvwG=t@j*9%DS_WT8cPFxS2E zzo*4AtFjYln@mZxQJF_S!+M?)+#$Cxn-;Z?)H2SUIW8al>bz^GP@}c>$TKT9{V=Ek z*|L55wfOp>nzrY`6l7o^$n;IjvDJfTOMEHz(DcFHb8053&#tDQbe4(@CwpRz3o-X) zHHo!_=J0`#uXg0&hyV1m>wEjvgVxQ=+xI&sDtnMogM~3VDx`ZjtrIO6Fx?=$ABBDX z(6uJ2hUKKx(!^}wN9Yq`F-lrL5*FQ1)wc`ES_~P$1KD{o*Zb$TVZTu_PDHMFTO-3n z|LmL2>jUngv`_J~wvR{9O4pw9vMVATZ*s=ji&utD0{Qsrr z9?LAk29#dc=&!&Ug6l8$^8(w0%L$V%%7yRc`4@(S?jM#mUGaWcmX)IOIi@Qa;Q&|f znr{}R@WRULTPd}r{WBd50XsI?4$^XnQ`{402oH=dUi&}Vy;2q3`Z=*6^n=qE(8EoF z{J$Dpv2rIS)%UkU=_6k0tEV>f`VGS3Zuicm2l>#COLlkOVfUrgu0$Xmx<%K2M>tBK zKp4W`KeJ?n2oq@FVqpA9>vIigo^qOXW5&V z>T4N$swcx}F;Mbg9X9zr2Q^RMp znEPNQF3#qM+z|XXqMXbOz1=H2T4%Z&|DIHYTV#d4XX10vXt8qjn3r|rL5~1cJp(!3 zWF+)GGMe^WcfoU5I2*&SkRo0Tti(B#zh&;~#lk5D-k5{j=}(Gt-3PWvbjx8Af43mV zur-tx@u1rXLhNLHi%D2CtF6K`e%Wf2>VTr=O5_bPnt7qA?usr_yuzPf?~Q0nH%u1+ zTA~zW6O6`*);!2GDBcf}Y=2$CLQS=}!2C$Y$h0xkqB2TW$Qu}|eff$B8rM2_FDXb? zxW0dVU6fm?B;d$6Do#Gw*Z|^GXHG`oR227!lXt^AEsDIr6g)8oGWPe`Xh&s_o9$l5 z6ES?H6x_X{xN*Zq)wUVp+UuDy(1Ema9k_-~m%?CccGIB>=Y>&khVJwFj|_Sr76qBO zt|`dOQVZX&PXk<978AGLF7WKD%Ubvc=IFA&qjwAd{LH899x(^X`SuHlgM5`ko9^w1 z^;&-JS;~>LlA6xJ801??VX=O8j*CtD?CLL~hp(Z8q^g#Yu9*%)3LB{;^=mKgSk?q> zj6Tr!(_au1olq+A|7T;4!6XI{RQkY;Q9)v_^5Wt*mM$C|@2j>Z@l{6}YYwBPJ7q>o zUg1zgp7Y6l&Mxn)<)$t$A8hvgJa1Op1w98VR^=NLuy|!hjBhh#c~_$4)Aou3t2@b* zr_&qcjf;wOv2Y=nSWy&CnL_-I>r_OLEs90uJ|e0VAWWxNk0_%3|31%2F5R*N^!XS~ z!A3tN^EXu#OM_MiH~10r4cEa8j$^{!vw0mm8}zcJb1kAhHA7J-08#x@W;hNeOM)G> zT3Baq{aiB%mTIM2oE<6T{aN&F(c<@71jMo!jPQ?E*|1be#|*QqgTQ0R-;xmE=l?VR zIGzNDtgmgJyILy4PqLM1 z3;3k&sxn>GaZzsDGH-oRzR=A(VN3Pc0DX9|;UZOCQZah>F>rx-J!$2#;Z(GxV!TC9 z?0j`{lE@!#iFb2>9dMTUdO$E3BRBbN)rfk2Vx3{JpckLdK8$7XS{TfHe`8{?{~z}u zGhYwo%d#LsH1CKDW1(^FOJET-(IOs+LNQH)QbmIvUJE$>rRdIuI>_vT^fx-CJ21O+ z#mVw5&UDo3CPDf6J{^i>->4isL;M+(#GsJdQ1EgUr4Xy8``qxdZ#S3~&6n3eV{I~7 zCez9|%*nK4-7E)CMKI=ifEs0OyhZfZsKj^ZC4u;`X+AUf2V`7#2en+_td<-ED{IVc z%kNc#sHN{4Br4Dj(T*jHiY4!)6@-SgE&ACn@P5?+@Pb_#o1TOV0|-jhMqw?ML@uY` zQjRQ_4zR!8eP3LxDD6V0ifQ6d7`NbrzW;Yw;Zgf&`|d;`?q%7W^cgf@ zh)+hse7e=mp$1w$(`_d4MA6%dc9GTJvQ2A{jw==;rhjP}?uqvDQO3~FPwF71@*&x6&xuQ}7*+R^Quq^V;B}?lR%5@Z5PBpWuiwvR z)3oULviUPGoJrLenx81pDRf@hj5$rDg$E=v)k?C1*Eme#~EdytGjLQ4w$^8VQF zuZFUP5)`D(`7&)5)|{Oi&UGcpJ-;cR%FX?C6MZws4=w1C0z_=cCY^zFxUNIM$X%3_ z$hPtd@((^Wf>&LQ)^!j-F23_Ju)MEA8$t3(oPY$x7od?y-9{fIq2|94Gr(283VntB ze@0@BTzWMMTmC9?IW&#oB=(jM;oAFlSGjR>ymI$z9%kQWsi)@6z|Z7|K|G^QWE&f^ z?^^e}CEf%ui%q#G4P4Z$daQb%D8L7Mr}VMN_4P2r%$ywB#%WBlK=XYe_qhJ#T-(WI z;XIe)EB+;C#Jk>1Q`t?%RtjeO{b)_#6?(= zt{b6T&_#=obu30!w}a_#X#5H4e^Gq@j??&)-WVp5B}L5a@!9Xe?zyTp)9}lQUeqhD zFcNwBRA!Q8Q&tnl_QgHY05`nl1{b`gS(el10uO69En@a~LjG6S7 z2=aQFP0JN{w{#o(!EOPLnc?^V3@jZScFlsTxKFQ;#%h&!9Np~SH|d{FrXs)x+F^Z- zg0`TLuT@0zJheGMSKq&d)R3{Sels8pXuBt}tAB)cJ-Q2DO=;WjlmLP&)_9m**4pk_jq{&r)FEmLJ#1f)Q zrI6up#z%Ywo9q{+z$Zb3{~`TEsne2KBtf)4#-N%TbFx~#hmz_6I*U~F0IOg_)QVA)o@ylog$lVIr%9cid5sN7i8BKTTsVJCuMl#90t7&X^8*)_4%E_SxRK z`qVT`zZJ~%d!k_;^o$jD;|;2*xj{7Q^{g6&2lcm|CB9a(dfeSC_^4Hpc*~GN^-UfVwMV{sD5+-hC zqxb)Ve*atoW2cYvcOX(Iqh?Veo|)9zphZv6Oee`IA}b9xhum91MOkh8B>X?RF-9@d zCWygIAH3ck?S1ruHqf1pzhyc9@|dT^sj!VYG~3yF-oH$mCSfr@#$MTjZ)^E-OF8(R z4cj-BG#dIMJltJlFBz)6ngsMuSZaW{2q&x~2?WDM?i$0aOcP8{2V)X0L(rp+xP5W{ zDT;w5@audYbrl)p?+P?XW{`z297TiIHD?=mbmwIRzJX!?sz(Rqe0`fP!5Z{IuGsS& z>NuD}bNL=A?PEpHdpkk}3@M>iF&5!NZ>=<8<$38sU6Lz&>U{Y9WuYd7{Fdox>_s z6X4I?ZyS!T9UR(69`REfSwx|gP3m7kc?Qa%fU!%(`AZelO>zFwHSiWXt1*JhK{2Vql(is-M^4P=}VA>2z~Raw;Sh z+EAX)aPHm8Jq^~C>G}{~T`Tc4ZJI&0iTb1E3i=OpPqNl|1@>J*qu47HK~8Cku_P(w zvo1&mHc(e14TH+~pf1qf(Bwm1kPppFJE||`M_C$d`o)}O?UGnsqsEEw^+we*X{Fcm z!re5D6UA%17JMEqX0-(>Om#aYmQ4Gnk{^V3dvvJqmUHou3il{B_yj*~@;ap^26S3A z8U;@WEOJNY= zJ#-KuSqUT~h=0h42Pj|+Rf9+Y6vkuNiL9Z49&G@oh-3(NJWD$1yqtJe(t%J>2a4v$ z-w=bWFhuoZTo~qAk>@;(xePccaTXET^lBQ}d>)M#eQ_G?8{%A=rSFBuoewB%WWft3 z63(5^K+zzdE}9{Hy|pu(Vj}CgRoxZ8z;dhs9v!JZPpMg}L^||dme3+yn%BbR*dR;} z6-rn7h@YiR>F1z|>zKBuscy1vcOMh=@E-ty#sRH|pOt8ZDQ(pNyg%;5OjD&sQ3uEd zYdUMrOEUwGcPqo3M{E(*j8Bz>kz$TN6oV)yGpOeNYo$iZoYmZ#l9l+tfTMYAxg-Mb z{oBv(_cksXSCs)u9o!Ph$5!XcEY7|?;+PFP&xVk}vb(DX*|0ynukX!ZTzF8saCrH< zz(FaT1~|U2GE@JmjoR+NaLjCg-WKAWgsd3QD3ZR%EI_E00>h-oEQe(gP&8ngzv5Kz z;{$~P3=k0XH*8FVs{|y5sO|#82BmQg4DV)?(zaeTeZ8H=O9GUi_CKD`U_;w8X_WfGXS7G(U-z*Dck)oXBaD{#in>DftBhOxfE4eCdB{PCUn{#HTB%N&wWl z;Bn;XV0W86{Bn-^h#aY@dYJBB#&}6txsS<~tL`)j*=A%$4eoX-d!s4K$RTT+v})@B zn^(BaAuEk2Q}p^=cWtUmvBQ&RRk4F3Upeukr!3|wdFP9;M@le-{Lt=jah2T#`Io_9PA}in#=Yq{w{GZUJ=H*4YoGN?3PVyBB|kcaR6h; zJ2Wzbt@|K)(f1H{+((Kz%?~h`S5(Rig**_yK;LTBVdem|8q)bzg|p_)0!gTNKpKV= zXw??gg~ESm$culhkO%vWDttL~^GioxSO+)+Q{+Jr5PL3zhVF{VroP9R+Vp}gVzIcM zC8pjpeF3k5z-UTQV!BYTR7jZ&m)??y#$j|Rx&MC7ZNH@DJ&1t_c=ewka2CdcO-U1SX@4wl|4{_sisPmJ)*wd0*49&2+PgiG!6t|d1vRN5g2&ILM z(R5qxKll8n##2rnDBUpx6rdW5jyw1Vy622}9QF;hxeMTv)DINkBpU9<@9tgc_nnLU z&|)J&EOLzH3tMpB2X<~V>e3Nh<@r}3PF&sA$qhCp$}(`0hzKgd;j>K;!8*)U*k|&E zMD8NPUb@zR9CGT-kU$ptop_xTaMRHMK!fLpYEXtujR9yPD@X5L} z!u^`W=wV~sw(p-z{F3$4hApLaXFkY=T)df>9ur>vF}g%FI+^mBpdy*dds$i>IAjUP zs_W;!;k_h)a|2#?%oWvg6e8oiQYRo4SW6Vhvg@l&@dkERExCYfn}(g;A9HiBZRJFD z0LT8SZ>1{mJ$3o<`Yu}q-{yOIY9%j~Q=e70Ku

$D+9o1z-Ef(zN;!*QX;OXHM$Ra`pfFdh2iCf=j(@+=rb3klX%zr89 zfYo~cY58<_|0-bX%AmKHE5*Yy)wUl6Z)I=&!|M9vaIb|%rI#@@5S|?QS_aH#d)WZ= zPgFWZWlvLFH4y#`kw`1&K~w>=1mh@|s~N#Oj!8|Ok(f21C3sb;uxbGMSAZuhGX}z6 znA3vSBMN8RM-uEA28=h!Svy&C^;WrFcRb-X@Tyrd4L%MJL?1T4I61(_*a&)jNJt*5 zu}qxCoQ4ho*?zg4mrZN*VU6Ysmz00fH_@9d<^~2jLrXSU*L~UWD&;oT!A8oAOUH>q zxy~N$uJPXp^Ti{(Un?%`t#i`RF^gy)ZtXcnvz}O9Jh0gBMZ3b0tu{8WJ%KjC{dJ(~ z_vg@$Z6W@7_%@d+63C@}$DywyO7c+^N~vGOfbCL_0;dDEc>e?0uc93ews;+J+7yfO zxTiBN=fPgzc@!uk?hn=%XmA!96G1<_ZS|Ap77u@SaQTv@`y(8jmaoQ(YPE0LM(#-0 z_2+!I8~se~^!MST)SZGm?67{9#cs=GGz-far1Xo@wak@d4@B&nQtikaSy&uz;_aSr zs9!A*1a+^O2)9gh7u)%DUSSZMJZb>4HWc)P=&!zqKm1jt8L83Z!E1&!aSgOqyZ^J^ zH1?TpkuQ$dK;av&w_j!3Gt8u8f|Tl&He;)i*oDbB8J3F(9$jbPSS!^JowSX}1t^hf zbd=(lzHrZjggl^%491?<*zRX7_;#>7b&R+a`V{zw+YB= zi{Rgc+64J{qX71~1qh^a7*0Og$lWIqC459RbiquU-ge13Hesl#lJwMLO=si%7|Zw< zk|3dxA9JrvJ6Y9r0;H1KBj21wp(o1V+C$dy0aYxGIt*PlUZo6k(qKPZE7z@=B^O!~ z!r2pvf8{BlMqH$UdYN9QH8OCPEcnpqIO^DG1`XE~1sKLTi0M0=}Qt?UEQ$oFXO zZ%beIIp45u(W#?YOId3r zL*G$oA-qcd+6Qv;ut&+Na85a}Vz|h@!h&wSJ3;)39o=m9=<2Mkn3V0uU}*Yu&3zjk zI`R~I`GKpyLn-1{%M7N`*Y5KQ@wYB8ukq}CC|8ri5$ z4CvRwq(7{4-~Q@$)ocU5l~RV*&QCEl>e}iKKjFBUF6|tuT;Ca$3}g zQPu?ff3u?xfyw*b(ri$&-Y@?S(N*w7K1#QyS_1^eR?lB4m08{9iIj`Earc`Xp4>8U zTMi`EVT%>Wdzsd2m0X|PP484wk~X0%yP$G}jO&KU-X4eMR&D6$f#DnPhc?Q<2RiIC zC-tuWI7~Xa29@ez^COCRMvioH9&x3ll4OL%*^Zq-ogesLWjd&4`GwH^(1!*pQ_0DO zdQUI-02#-0tR^(vCG+VXly-=IsSRhI1${q51Opqz@=gsvESlsP$R_dW2mIXtNFwxc zUElqNkn5bj-nb^C*KDLltSiEDcj(xlCCSJl&2&ktD?@MR9RKSwIx>?iiM20N4x!6XCJ|TH8rHv!kMZ*{TttghEGJ)N*afL{hbbwUOoX=@P0FEK{^^>F zadqQAl!IcP*%-vQeGFbd{ldS6?40#;k&7OJn(XzqK<_1;WzPSoEcXh3+ixa=HGyQv z>-Xu+z5A0xTNq+a4YyuIA4aTcVC{2+y@ham#Wc~uf2Z!)^g#$ zv2Vq(P9mfqA06XoSrMdoq$+?iS@zv z5>TXHD5f9Eg0a(3#%jnDGqOf3nRNo<+*A1>`4Mg<6Tw{jb{4!@kN&cw>t zb2JTWrG_fekjJ-|t^Sp5I(kbX<7&(Rs4JQkmr(N}=8}nU7Z0cD&|0gAI4StF%WgZ1Mge zLxs5Dh`=O5Mjf$vC;#JzGIj&LsIbpwLH;{Kp3;id)#9>JUOEc^I0~(Tf}sAM*o4Z8IQx9GM?6|2!`B9W%CIM}s_fX$ z;}H7W)`|+Gv-gyc;CFut3heVQ1_P@47GzbcLZ#{$@ro%HRb|bk^%E`Z%VXdpf4N-y z+vou;nKzM)R9Uu5DSvy3?*Uo&J&Li;XLHjK5wiQSG>&RBvsN$b6E^yvI8#2$qq?ok zgtkM|*^C?Lgs*b#zA5(CfrBV}$6p-8X?m+2{#07j=__pp@rmo>!X$OZR1W)pQ7Bf6 zE(f43OrGhGhc75s1gSP7t;vw$J_7!;QR0X@z|W8_^n6z{lyRK}F`dsZC_8Ggy*ubj z6D7>A$ULhyOeIv>vz1ZK841Al5;@e8Wuo{iB9NeUEoyeaZXG<4_nooEZVNluzjZCp zI{1J=b};-pq9O}nv0)lg#}pDkGTI?;emHQXN>Z^Y2=3N^Ar9zY7H$;4i36%X7K&tP zP7XWuKrzHN*Vwnvp5>+QCWbj$E>-^|MS}V{_)J29=3Fk8G2PY;r8gsZaK``VLd5FU zk5(6mfBiGVKN|$s72>Bq3n3A+%*~!ZwNC2hV3#NtA8FYSwTy&>y+}}25T4KfMK-x1 zuFt=OXZ#g;lr&R;P0y@H`}4Ni;Yn>FIN z&xX8hMyn>2=9>C?zsJ8*47L%|C*fo-I8eFdrYf(Yd1cC-=7z6Mw8?`$|{TZj)1ez zP)6K+b!3X5wb|s)2G^fIyV}^VHurz7fsc*~EaeixnmivSmsgxA6V@?nm_yV%Y`UK% zsI&U~pAQf?)WG+|S&;yJ;Eide8F{7e&**Wp+-n6UxK*1z_KP#PM=7-nrF{#N?~0ej$gs2u+>tAW-YlYDxGFn0Ik@ET*rMIf8S9fvE4pHKK@nKi`)Qun{fB5cU~r=`TvHJM++j|o8jA)>y#0>Q}xgNfxiTI0UNq8=5N1~z}p1SsvMFCd?`a67NQ#1n8NeYp?$wpY| zmm8!DJ7|FqO#F`OUhqHs;}&>judX))@{Nx9OIA{WU>ZT&5m7|aye&*$`m)gRkIu{7tKJaUy{cn3rOy6gP3ar#U9ff2L4AG1+?dwd3(7>{I< zRO?h4NhQ9o)!=eVu$gJQEkeB0(83`v%nFqNc=!m93p}t4RJ66){q*M~EEp7rlhb;4 z7v!@90G~SH2)!a)8d=7^Ty8%ryvl>OZg2Rs zaMynJ@@75uwmybdT3p#9^O)(jh$jP1cM%ko{f=xm4_e-{?<^6J)x2RWzo+fnylq0YPH#5w;y?mKZ6snJ`Fved z_-Q}Txb4Va-g%fewAQ>QaW61(WW`5%4;*Yv!C&_UAhNCY-4zYlDx8uys>#b z6CDCYu^!lIyM2)AUUCNLBjZ|U381!@#XwyBD)Wn3p*ks*SHm2J^>ro4jG%=gfZYl+bQRhbuzG?bAK@RQ+fz~z#PG@S2s+s)1ORUD76n--yUZX9*e`c2mtqoaeuX!M=8EF~|29b!B{G-=b}B6os?X!5 zehHy7FT)Y0XXJb$!l)f+AXWFG8x#SYjS+yLm5q_g0UOlt%pL&z;-tyvFnwm65VDI8 zZB${R*5o>1$A{%ts*paEN3@i>QhaDH40SQU7dSPW{&;tNn4zJ$Xill~z^DjI)nul-hiJaaBP71+mTN?JY= z6TZ+YyqK3)hYn|^FS00MD>6c+);QL%jMCfZ71bGR{w@-sJZ=dDc7kZb(-q@tFy;&d z-Yk+}G7OWAnkMHpM3Nn{7B7+&ml?7#Bovg}!&M#i1v((D_bVcZcu|-r$)_3c>Pj(Q zSshO-WmzTv__%t|)^HO)ExfDT-0}pEc@^Pa7tDOS{C!tyxLiN(_wnWF7*3|}^OaE_ z{*q1c_kZ`!H8_8QmLgt?Z{e&|C&}9eQ(uD87|2ZzoEeNfz|05GVmIv%fC5bs{~r($ zojV~UikH$z75ZH2UTsjZ{b_34MlUib9Wmo%J+YFh%lUOAjy0BHrRlmn>TPVnG}< zGujqgJB3FQ{YtyP9zu?qI7Ds-&%>yNZo0CvOjGma2BRwfv6r3*Sc!pW`?JJb;1%E! zTY0h1f`_W;7cix?35lt`Au-4VHW2SgAv4_+fv_P~WK^~%23Qx@q_Hjac~)+g z$-13yQ+mDDDarM|z6V(H6?RW2eDCQMHBT^(KvAoN#ge&C(|owH4oizKYtruM#;HKO z_p|{Hf~34~Xc)bpr?^12SAV;R-vYqHyZZ46#+-o>-p_vikrztE+DkkoHKK_{lEH*L zznfMVScGmVja*C4DnE4Ksw@H_ll@n0V(^B_$JS)!|A?)8PpiDK*URa5NsMYBOaHTs zB29Dcx*uL(0g?U>R?3&t%iL&><*wcRsRv6QQ4_l49L2JAl4TEOwc;eH)1;4s%fu=W zVLQH{E|vMzwfXq9qS=sr6jz197NUbpUocCduNss1#Yv5CxhknO?(UJwOIfOu1YFmX zMdjz$OJ}x`A&1K#cIuyow*j`mEmh`+fM`KXRW_$ct=1i1+D-t!0OrM%c$q$^z z9A=J^8q}I71v!vltn=hkHH&A<(5{?cl95qw%cm53}!EOyZ+2&5Q#4)L?n{YVm8R-`s>RipkFh=Tg058(jR=J>_TW}4HLCBn+KVUl>J z;plV{rm{v}(4~ftjW4%&I{-S^KjC4AsS4O0(`Q0 zM@43Lb&Uy_4E!J7p7S86Oq$V@oBrc^&^nbV53HXsoS|sQ>||A5E~fhO5O`2Jh?8Cb zvME8Ts!S92EGRr!W<40znvD<~-nmOqobB!WtT$l+lap6QAXrti54|)*MK0Pt^#8IF zjH=mb10UO?@5k&eSfiSW1+;Wv7R?sal9hzvY)!jO! z9R9G5d(_awHZ0oFXxrZ;A&9;_Esfzd?S=fS-a|y2<)8`d!&1}Vgcb@HLR{Y1G#87h*`=C9Slpvv0FN*F z8F8O}v`pyz!Dv$kjkV1FiS4Pvi$fRGrKTB0loiqCHc6z|1DFVha_gv;DoNb-HCVvo zUxh_=4AQ40 zEvN}vS{7?X%nOZuk$VQIyuS>jnh#Lg%%!YahHs+-$vv@I>i8GBBL*zD-~i`l_|3Kh z8p*6_1)*Zd#A4r&Yd64}rLr;PXlq)XtrVFxs{g91N`Y0jI@4n)HPySo7w;H6_iG&g z(-g&-I-YMX3>mM(i?ujWxWM}|Ar{s`=)}nc=38m*@2Bb7>3a7a>+KIMT>Qw} zpZ1(SYj3foqemWh8)4!)H}xKV?w+*x_&wH<3c2_QYD)ZVB~?3GZUz(B9~9_}bnVsq z7#AM^5gEVQlT`eGg+R$vyuFYkuxgIvUHbL_mCOt4YLjF^UW60POr-^F@f z`(Y&V7bmG4&7W_)X!+I8Tw@_I^kpphcj6&2Yyui#{`j3ff0gD^-1+3wSHOYz6c?;8 za%}=!e9^d~W+{`jgEBc4ojY6+{J6n1_5YTU;rmQ0+c?47FkG9vEr2f{rjJ8c1xE~` zU->1zuUOZaIiOeK7X3JpFN|~EnCGaEKU7u5{saBDz_sjF2Nvl`2!@lZ0zgN9}R)KZvA^K)YsAXOieani;%^ZsQOEbMv#-X&a2fQl60U>s3*wv#r3-!m#lAwy;pe2d{%&UI*;zm`Lvlc5x1BpdY0Q{O26=m{|YVPZb$VT`X7^D zL&WG{);O8q6;@A2Wsexrp|jk;jAx!iVgSS1C$??uD1kq^a@>W(==e{M?*qX#QzYCv zW4^vr2jCZOKs{c3AsmuZ8)^Moc777)`gQ+1XIq-p?YDyXeDOqd+Xo|-=ULeeZEFY> zU1&EU2>oe;aw%1<%iu?0jjXleaS<8o3SOkGieE>ic02D~9+`G_3$Gr-E-Pwa_uF-T z6x}D1UdRk%`27Yhc6}7ceT%JXPk$_tN@eg&52Dg5U1BR!RYwPBuJ6d3am<-1^?0n~r z)t-i4WES)FDGc7q_w$uOUzm^fG{Ya2`>xgYlu9ucayvglOY5x`coeLVLm{45xB-#y1OOblVpvxa)u@NU#_aD4WbEd-#?(xNbHv#13=2ggrDX$tK69D-`vL9MLA* z$gth`2?+2#x=P_K6&riAc8bk?vv(q>!bET%2gTU2t;B@r>|L5uz6wGggag2_#2RtZ z;5g7>iLh1<-8V`a4`q-GMK2UkZIl#Ge0cG66?QZI7Z4+AJ3^Y}1msRt$|$L^;NasZl&6rr82mq2#hHlJ zEO^OUt#Mz$f~;upQI3mIX9HuRM}mhk_Q14F28+sb<;WHWvMV&CpSng&d3D8{<<|g@ zxBde%gT#0-(GgZpoHLu_PS$w*wL$1>Ac%Z~Z=Kb|z_u$OQd1!TOjtDHr+FhUXe)+r zCO9jYvxoyL;gXfI31uf}$G?s{fK~PNM_T`d1SNws;!JR=+#o7OLCDKeK?M?XN=88o zT+x7CVs8RI@Z$w;ocwqDvKWO~g-faWvByk8;&c^t&iFp!%Q)>Yw$s4+MH{j8Kfz6! zv`$i6gr4{&97sBb+pE5f+v^Y}EHY8ICn-0n;WR>}VmWB@VA9V2CD<78!4XZGahTj` zlAuN3eTi>a9YZDG22AB(Ju4O@2siAmqP?B^O;}#bUO&lhv3S%9@cQ`LE=N)r47>J) zK+2ZeR<8c5P3)hz@Be&v`z^LsUx0P^=B6?>qo=nbhrfsZN1^9CBX7mZ(t`1lH#c8z zO0TDQ=~2BqZ+`4n;NGbCo7LTG>5==_p<3MR=i@zU-Jyf;;pSBl#yLo$oL`1SGPPv) z*JURtDW^4X*woI+@ij;g{$~;;LxY2?`J<;yo)mV3!l7+vTTanY;-%1IVHJl9u zUz3Ia4Vk9#V2bCRy(2peHI!qu(g)JoPD(zWf|| zPa3tW#=LHrXnzm(-^TH){+D!i!5~?P`(VTcfxw z!y#18{AJW)f`%1N_(`dpY5t&&lwMBP&)8fdf*%WRWV=@*2@c#&qj9XWGnY)02)wim zrb&D8aK0}G8@0Lu9E)CU)(_DYxpdsw|#0f;@sdXhcav|(^B`h`<|0VBa zl~=%r9{~UI>*D~Lk7MchVDJ90nMHWNt}5Hh(qp}LOM2U2j+XFOibO#E9@Bn%~k zZf%CwTmDq_FJ5ga&8C8d6DJnmJABw5P9qiA<#kF47RtiJI7cSpeLCWnO7p4fIBjb6 z9E$}Y(~wdIAbHb1k#|+2;s5cf^f{-dTxbFQrCfrH;}s*VUxe}@6Z_AKMAfF^VOn#A zdBV;ww^DBta^ZC+IbNbqOtuXvjbP3Dh4K7C$n{Guk?vwLT6<^*%h?p^g9ToHeGl0v z?IZ`Xm>hw8h^>L_6{w?dU*tzcFNRaMhuNRsvh}AbKEce~T@;1YEgG(8uJJmvpnTU@ z$+}fy*=*%k>g{FOv1pT!c>0 z)cz5ODS{jH*l}A$u7jFkfAxj$bq0_f;X6>>dqdhKOq#(XG-UL+szhnq`9^Z&u`jcWLZT}xr-xwYT_q^TMZEQ3)8?&*K#e5 zk)G3@9dean7p$?yq&z%*^Wz zDbu*Ihz?KS4TCxR@^EbX@SV32qFcUtI?E&fW#i^NRV;{O5Qa!e0Fm6uKbOK-I03yK zq+T00@!>xOF6haB;T8iW7?TGP?|i1&Hrs-ibc=NCRrOHz8a=G zB(l(yAF+J3sODXHwG=cxZhUb4%c-$U{$8(Vogm`#q>O^{19)?B&&qc3xZt3TBdxKh zhEMY7d-5m=G0De~9YWh7mE{Qeo2LX%8)on90Kfh8&o0ww!=Y?mD)rxW&i1%k)nKl= zV(aZvwEE!HxHG6;8;AGc(o< zedrHbX%F{C5@m*Vt?{?t%I-H30=U|}10kgxaeW~iA_$8oylAm|Y_O#loA=j znQJ(K8gKHXM-@5%E|1m!3`IfzK~|;|-ayd4MG_kF#`@02Z0KOqssrb*;xnkYvdyOV z^j1btGM^HfjZkB(kF`+_9tOSjUvKztk)?{M4I+{AU?bqp>1=HF1_Fm5IOD zSP&ZSSb>w&MFZd#vb~080nia&NC^}d&@<3YX_lQjTSfWgPC7Z8uvR+m%SJz$RSilt z)qQ>57^80j_6-$1yqvIO{cgP{BZlP0@EMw6vF8%;|DShc61l?1n+SFyR=OgFF;`=C zM?ak@aXXzg`J}?SD*$J|S7#P)C_NI5+1+2?6-o(w4pU^q3;D7mQPJseOJKR$4^Ho$ ziwxk0j6E@-wqJ*ZM7AL|Y5wIv@>LQwN-YY$wl_TuP35s=!B{{-bDLGa(-WtT+tS>( zO#T^CIi{<=Zg;o0sS&^rQcm_1@u!cZF65_q9(-KkfKL>Ye1|bk(X=Wx!_93Fm5US$ zN4c=zD5otfM#rBh*z8!;$L-c&CmF+)P{nNEh<7J1Y^J&X4D{E%*E!KcUzBUssaLRd`1_|s`Suuu{#5kG50fb|(Od$9(@Bd{B;IX!DfqNkmglwkwq$FyO z=!W0_0t27p!m^FcjpI;pCua+krXtuS%+&0c}Jr> zFmdkw-Lq;9lR09w>;8PXCG5a{CopS%{5X4(VoUnAlENioDRz-RD<&|}o=bJr;Jaqu zVGXE}6K$aeJHK!&vJfmj;ff-JIkd${YHaC5dI=+NV;c|^U;l4oeK>{?2f&S;SL#As zu!5r44E>?k=trzu5wlV^5v04DhBwyIcJ2?(@Ulz0jTaejVaktq1zKDee!Y|UzBUJV zeogW%CJYyt!OrrabxrV8;45Z6&=||psNgRD%VKFdHc%EveMzX*hDg~+gA4n@j}r~i z;#eY%Ris2z5m|dcLyv@E!$ahM?kfyFH&(Jbg}}A{u^#0AQWd|oq7jN8|Aaa=>D$5E z7!ZASsLNap+lo9B&}V7TBbkqG3pT+f;nc^?i1jl?pqxe#PVIUzFJ;+HXK$s z9x@;x!a8|2@_krayI_Wx7?P_Dau&Z;jXwXC>#+8;1#mPGT1 z^0@u?FjobBhog15q)=q}lw^RAC#z>dW`dZCe4n?(YbA<$RYN5dwl8RAARnRQ9B?!U zEHk*7De!Hdeiq0fVLALbnVDcwg(OlcYBj009tf(`S^-=Pl9I4yI_#rDieLF)z-HLL zS;){4czkt0$fgx-c#x;o!+u7ZH}_zGkGF}7;kYrGB$pXq5DHjlPOn=;UFKJJ2Pw|! z)c(%p6Wfm;mcM{Z68nQ$A7uV`3qn7BD3gRoyvjMG37kxOoqxK?K{AO^Yg=h|W1JY9 zMm@T&3fkOvIM05$yboaC0G#jpu*{e_6zlN#&_P^0i9GEqIB?^o?p94_^_}v*P&tT= zq9$&xh8xW2_|WjOrm;Pc>+poWPJi>ZTTGVrWMqVIY~%Xk^6JwoFvtIpM8C~ zcmI8d^+kVJB_UUOqZ91K0M3YehGJg;GAsOmNXcRCagK8m7pt zVbXMEbA;HvJ}2ET;Ds^ry2&6(t3;T{=LH-_H%*~Mj`WcB?S0WxcX0SKAWG0}9-+wH znm$1fxd2IWX(t^yEgaOKD0aGwQlQXk7!GE|L1^RDt@u>fh}-$1bFoNRpT zZ#4>^ZlVr*1}9wS`aejw^^W&$vU>qikPkirCypQDmZx9A-tMtfW9qAD*)kMDUgDPL zkq*!KFbFQByAO@&3Kyg8W~xDCX)|h#iBeH;Kdo>+aMqq-+!^RR8e|9G|Eiq-R~KPA zqG!i!ui9Svb8v1!*n_Zh;49tbt$w`oqMbB>S1iTB1`Tyog>fXI5LnU|o^mI$lXQ_V zDt1RG+vixnoUcBV0#lES44IX&kyEL^4XQ@eDLb)lv_PrGq_#5F76yL}jItwZec{Rp zU*mM}_-ZyO9=oE3>*WncmE2r(I^o|8rftnPW+wM;3{(1BJr zy}v6{=VP4ZnV$4M@=0Wi*z$1m-JK-hLm%wzVoQ^KCMYYKTt*hYolLq-yBOX123Cd{ zC%E;{ANXrXyNkWcbG;2qE>0<#g=yS4mFS#Izb}?afEMY?3{xe94m&m5VW5^E^gmcq z8;EESN3A`Bv2Af&OV|g%TMjQm6OlI1Lzdf$2|&a zary!p9kfjKP6P2!Y;9xxot60F@$Hh2Lv}E-wl0QuuiVwpy?kP2F)VJS?VJg zk8)sKC%ml;JT*QcyoKQQWPu!jP5t{c$nQI|siC`D&WSZ_w>BpRGntFbpRe!@Px^Vd zxu0)Fw@hrfpbFZjvZAumJlLMyPqY&Xl*Hk}Lu-FhM5bY*Ss~>?qi8BJqG!Q;?W%@? zevb^U(lD>uN`C{FtQCy=b1ql~-ANpbN^%eF!oST;qFGO_N1}n%xbjd@p0EA!M&s5w zF7%5X**&@oTrOt zn!dU@!*OXRp^k-~)FCy&meIm5DuFK@v)@pN*};~p3;a?fr&p2mvzBF^yB%3&mg7*G zz8M;tJ0lX^k=~A{eeVaski)PfzTn%BcJfx42(pp)`<|us`^ezt(^mX4veP#{z zVvT)V?*T44Hv0H=k9DK5tj|(k?4A9Cl>~?@zod>bOqxAw_ahit!Rv?t?uWhozq+Vb}MGvC}gxIbeY*3C}Em?S+^RVrMGFp)1 zmmMu+T>C>$r+#1ft443i%I%$Q)=MVYZ_V>ghqEGOv-q4EgLV&G??`@DFvH^>+6$v+BAAfLOu6+{`8b2_CkCw ziTZlz1?2!UNQv_L`qKYApe}_!0dN`WNIZ1A3n^cuD{C}RYsfeY&Gl8rbP8Bhy4Sl+ z2GtmSS1p!8%-LF3C5x1*hBm}Y-zp?msdHRcv(Hr2=gvQ>N1z;~KbKC+sltq5Dw%&z zVNrViX2LHW`}@TGCwfNB%Q>fv^tN)A>{TVoG*cZQ$YS8WE9pb#@%`?d%NZ zW*V|9vD?tGc3xijoTX)71ka!5e#)@j@0b0S*~LsB>pfk`dZ`Xk*ljlbQpx;9Y4k}sl_a*`_nw<071oF)T>@a`9uY+QexmEtq&Sn$`> zS0P0|`pK*uQnaQP<`NQrcrGbndsR$lZId0}Z2J^+<7k7t;Rf5~pk{LHJ5egIQCwD6 zKJE@8u&u{%t~Aycskb66V4uP+Q7}kUW6=-71dwQz;z$6|rxFc|?(xg6+7Qm+74o{2jSY+*|fA zkVOYHA%g!i3Z`IxQ_6N}6$bU-5*eunG>ac#RS z0g;wwsyB%FZgPWXZNt}<@C<+sYUd_X1XwCDipS0N2U082d_8u%S9kUJ3Upk|mLjW_ zJBlEXNBTvBfXSh~q6p^gjPAj2nDyoX{ydq5g&|>~QLrm=qq^KBol1PODEqXH2aBuy|+_RBWuDF*>$exR`d?s|d9E7zyX>}Jk{##DtA+JI^S$R$b3&g=5e1=yXtXe-ijZc_=!QPPse)T8^ zdL>tY*G@L_rY}0tw51`E%L_S7Cty3U*Uf zmiY7FgKQ^r=OOVx=F&hanL1HibPc}5DOu>_X=Fb4y&olrq6dwje%zO~&WQ&nT}6*H zE%d>iFAUmy1kDKTami`L@)N*1a*z1AD}(qYT0-}>W*wS?s&0j@I=zzl0GhVGGShVxnLRbIa0gE^Ra}sq%1vvX zBkar(oeyJDl^Ts|FL9-Rj8nc~cQ-jx&7m8qaCs&Ss%!nizPUY|NZ7xO|pA|e|P_$-T?p|R^E z@u|}j&1WtgCeWXe1>a>^birFI4F1{$(a#@G^?CwxDVh09ut@Vm^^vFsW1tfN`CpA< zS&PMyV_BIk7@fI>87(P5|G@#kIw2#x@Nj7$5zy4<)K($cs-9(eH9|25e|FO1PH7{f zf%p2;zvKmO#ijYAcbZRZQft58?fv;wwdHpMxYy7#_lYs(vk|V{?#0*gZ44<4IB*Gg zsWLgOMkxj_bQFD9S1E6O32TdTV6zu66{>%M=e77tRVUH!u`t^2aU*n{$P5X6{S%Rs z#^-@A;kCI)AcFFYna#qWFqXw2{}zdUixrq^s3aHxgs3N%%&~ktxTW;gHzRMyHKrXBPGa&U8bzs zt8xM&U<>!V9ny5Xf4Qt#$7VRWd$~v^CI`7I=K{(K1f)KbkGX(UX+!6&%ntnxM8aWl z++r~cxper8L(wnwt!FpZTOL}qH0rhvbG&UHGcwP6TufNmf;M^6OARUU3y&NYg}x1&QzaE3$_}yG5;o4V#_)hbhmd_9+s}E3{)mQ2LIBPl-j82BZ*fLPh_Sz zM79~A6loXh>q6rmNtGBdvzC+s)zJU%7ODl3lBvxgZ(1DZ_Dkv*cptzr?B$n2%aWLl zmfGi(!Q$K_8oQyB4X#3vYd1eaaYa0D5XtyFDOme!513o*MIy&<>80n(C-4Z;bzg%! zlq3y4rgjM0&o=xS_Pu=cGXA*D3#_WgXzc&5&_yI2L9^<&r@!=E6rWoy}&Lq@GMBvb^hbnz*8% z+CF@z1#JNlKGftCM_Qdm(=sBx!}VapNYq=|(6_0s;L94G-v^3BS*t5=$j>n++`0r) zj6B}}`A-<-NPlcANXuGhflxu3sIsCD?H3%UqJvy3vs4_+@uxOUX31&xUscFsUm_*e zQ-%pPx@H#Y3@3&eULR`R)dqYc@!=o&zl~e2JYRN6B`cCriwC1G21F%SyU?v!L!Ql8 zbvXPrj4CP^HLaOd0zB>*yG`D!qb*rFd&CHf={?>j3lFPl7+v1(o;7ZqzI;eUUv#c8 z{Gepo^F~@s++SZF)UfWrpDuGaCiKqffy1Uc?bga=vNEjCUfH>=wL9+&&OM8@+ZWnh zU64_gaSt(W;igownl|t8qoD+Fp z#FYt*TnII^2}oK+BP_~7wHCs}b&C}#-BT9nu((c$TL&_R=W}Q<pH4 zJIM-oku$r!`&jn0S(*5m-WHMcq@+##gT1{;kKUGMG8?!~TIr$InhZYVC2g+>G)b3d zJ&kN0d(#d%YW`-FykOIX2%`C>3W@`EVN^0-dit4pWi;3_dK!8EgMTG@hmy(-*FgW5 zryxu0&3T;$cML)AqNXx;Fq3^b73Z-Ou%N{aZw1y|F^Gab_hD0pIIsbgbvX=ErXeWXk-r=)fC;)J` zPy13{=HlS9RWOwtlkiMfJxCxU**4eCuh?I_?f=+pDRtGt74M_BdfYrS>~Z_N+|{t- zzjR>vyzUsBKaQ?|V{4Vyuz2Lq}WG0%HfSXo?LDTbE$oB2S{M{N^$1Xm~*?(dO z-N^f1&1QkiR30^4IxDJUkz_ULihUU+3Zgwk`KlpdXZw^~ffL0+`+(=$sXE?XdS4(6 zsIt8$tsbRcV}vL_U7FqgE6_flhSAf9>x^HZ#;*;X29>8n=A`}W=Wdr9$FHt6y3(SV z-EFm-b?P@Cb5Z+YsQVDV6Zb7N3rMFQ$X}e;kHT0sfd4b&vxvH?v~fxmi9jHD1I8V3 zSF#HDiu+vhbj5w4DVv|hxPfQ!_4^}aUB|;up=p>;n|lqWf|=7A80%Zxqg6xm<2m*nO%XBo(x;RkBwYakifN|ElRrA} zVGW~{uoid9d~r%=h_x@>qJ-(79fNH|ny^it2WuxmDPb2jnor0q4a=6&dm{2r>zPR%^qX;pOHV{}EHG%l z-C;ih-N*3ui_G0D8XX|sAMP}NoIC>_%YnaCos!T`ZGrO3G5)CJV|-v@t;(NdkW>E} zX})b1j+LTY_Z|n3Q{SxJAuH+dH(eic=*+7s`FL|!B$~f-WgQ4mX>k8|pm*QfFl$Y3 z{X{g!H(~RGbC&HS!YFuS)dVLaa~oncAuiPjW)fQ8D3!?9q6HwXL82c;gtp0Tq2Lnh z397;TUrp0mpm1Ed`R}U+XRIHOPl<>>pzef{Fj^fMI#%%Ura1pxlM$n}IahSzvf+71 zZ(2Nlk}+=jgk>M-+~9elqAvV7I^?V^+63q8P}B9-zg3ci9+922guQg5lv}zqBUAO( zSf%P@T8R*%Mt^kUrwWm)m^K+*G!mhYYTxw`-2jVDvbJ<|YEC_xwRbMq<#{a@(l-%d zQl@Fr9CO;8EW|PK&TNRI%-Xtyx;@Q45xOtaNLB;KWRmcL?J;+gIi)@d-i^sOA=VN-5|NgQeSdK&&j zCev0zSwF#~wIZ()*#rwR@0Ju8Zr7WsSzbx5U;0?W3RP&p**2`37&F{r`1}3^$*fo0xMmE+!h4o@SOMnL}45vSHR4e&N)vLj`nv(NpxLA{4>IjQTU8WNTStwv#7 zn}vu5SY-si9leB%j}JK!Ap?gSx2+Mf6Dfam{WoIdP2`YbGJYnxjxhy#ylHEDUmn~4 zZajG}uxwwwE2Pc7 zw`52M(4%-2p}+ry;jU zw@+6{C_D>@{WfFZrQhS+Rox?sNAxktJ1%l?aC92`*Vp&wc3f>f*3X6eREyKC4M2wb zG_ef7rJ(ljim;uV^TZ*8hVd^IXUMGLreGVS(Fl8h1G5!Wf{XO0FobF8%yq>-u*&|U z@Cd`y;V)6uX1IZwBPR2fS)px;4TAge`|``8d-31%x4|4^!v_QC*X-3L zXz3lGA8Qs&E|)z&4ZuS_@`VWUy-?-3o*UT=bOkVzchniAmqZ>n6jZg|UGL_4nvRJn zy$+Hedsk~mFsdl-UF2q@GHoM)&U48`h-aP3eciR|##(4y2 zX}h$%ukQ8%-Xmj&K$OMTJPNsXV0W9H4v z&FAgy%6@t1@j3Kn;b0?J8BI|5H)=4mbhv5)T5)kraAjR?1+2>m5$NK4F5kO$H^~tu19NlWsX_;+rC{rCl zEi}4TmGV%s?LuT#*2>UIVTr*+81eJtP!hamSo=s^h7;D6;MH1mPv7pFcZkW1r&z3anpd{)=vkq~TzrRp`H?D#**5Vj zi&IQ^8KdB~?=LjTAn6Hf$=UqVI*+E*L-$An>rPawees28TLC;STh!UH1(Up4o$Sx+ zom{P@hhOsx@B3Mh!yOnZu)8W$h(`?XQC`H%BMfvhq9f~%1E{sZWy&({3?`*!q(4ziXU637IT4} zLPTNN2j|N0QbN;Ff%NGON>QGj+VtgBBSpD~yPAzi;sQXG5X2G1YcXqBtzs~V#b*os zMJw8%X#yf#-|c_y*WO@J6_$;A^)@&;!bj|Lg;fXyOvu1YtoF+#ILwcg6x6%}-pl22 z3dxcY8(aI+JdEncdy1td{q`8=D36BmilZjWgzp z&BG?^PGF~^n)m$OO-0H=^a*&W9v3?@WF%&v()1F|o{JD33PavWxJ+GW9Ae`iOg(v7 z$25%A>6)f1>#EUIMUfRu4_J4PF9~fM^sJllDmSSzh3$ZaG-s&5(cO9*yLla`me$jS zPY-^l#BH5xkvF>!H%bFVCD;UBM3)FoE(?Fc^abaY(9g(12l3o?Dw~`V-fTT(e{cT` z#nDYJeiH_DY5khC{{|Utv@5x};#4a?Or<`Zh$C62CEIn6HT^$~Y$#W?ev@0)+TmHT z96;i7&T_H5KL4c5&E0&@w&(7MLYC%g5qB6Natw>6b61bf@Xb$3^E?^5Z=NFfsfr#GTa*xP^1)0g(-FV8Vz< z+zX@kR>vc!$r$h82;N6d6zu7R6GObIz1JCvhG<^|jx2nut^=>Ssr90gA;{F>V@n7( zPe4>W`+!`;9jdZ>*TM+{4sEB9Y~m$Dvdt<`Ye*L>>>&38hF=Q=UCoEI_rqk549WWz z&&$_^a?3blfP}_*c~Q(I_aWPG@Gfi0CKFAFqeSG}I>3*>qAw8|~J@Snhf3IqH=rW`>;G+Zl3p z^A$gEp>Q*dEWcSEkbGgB0fXMz5eClw?WAB&MFYpU&BKbg#xCY8!}d@`Ht}J9^{ns@ zzf6D3$mn7GP?CyjRFeTk5ybY@Hvcejnk=)?r83vn?*mw_NHwu z)ft^r$2@e$=9p{+A^nx>ZKZ0mlmWxjR`C!C!lLtAtSSJ2IPhimN4p~n4_g9y#7P#X z8BIPj=G=5bE5E`MyXYEgUYvJeooDj74SjQ>&zjlLPTMmu*=mdjB9CyH5?-db`gAwZ zTH$pfQD|)FjNc$C!>V8hp&3VY&iaSo za`q8Zuutk7m2QCv_-w+dxuHLVOh@ixGetk9ruh=!)Xbj?>kv*|gB2_}f=obKuwfjx z*-np$vXM;~nxt*U{TH7mX}>Q{Ev9z7UB>7|;N%r+z^~PyMaTX-x=+I1mc019KIsV> zT$84qaK#(Ng?514L9VOtrOCX$&Z; zJU5`IOkeQ7_vPj7)Qw=r!9%5&EF>Dt7bbobSv@xVxum(3^*}-;?|TnqZ+h=h(d)izRCn-Q&&RJNXx9V zH;h&1HwukL03>+1rg~%j=)p~@B3EeR%!DRx8TS=nX6Fy;{YHA)oU5_IeB6$Yj-cvu zVSopW?}uZ8FcXf#lCG82D6oy74PXO(zpkq*deKR&;DOAfd4~(% zOwzJZ9`2<@K zj|1B;9x}VAm*f6tom`)e(+5{eUfzsU9pNY$Spwc9s$DO(m#EY5%LJxgzfQp_)@PU< z`qt&e9lch5$vU?j2YiS4qoWBqF@Kh-J6A|a zoLH}Rel^m!sTAMe?Ozqpv;JBR;_PIrTzyD+dF=Ru^lWqS^?C%$%R$tB`E;c{rsD{Z zez1D$lh!e^`G?ysJ*YEOXpG7=o^T=-6)C;Hm|_9;TnJu>)}l1HMIkc3It%R`!`P*- zn@Fo%*F6AX)cGQ?35sCwUOEeZytH2M8dg+l&}w&Ixv_Hj*j~p;L4{NzK z^r)>5YBr1+E7W4A#b6H+b5yH!6cs7x41CLIi0WyU(xEi${-ajh0@2vCWz2RxgxK z!ARtkLUfK185{mfRmh~>3gmx3c)yDql)X)MFb%81Oj?9B2rSX?!6bkc4&s7tgtLq$qR_8whYc$ z>@zjNo^1Jlq?j3C-4dotTx9X`F{f2!;p0E>)Jr#EKR!*pc(D~6-9i>hKI42DkTksr zdXy8=Z}8$TGrs5cGMgIh9UHQWE|-D~I=NEgR*q&UdIc!bOf>cmqRr1^UVMHAY%OBr z{AG1De@I>yR39>2H-E%3R#I4pM6*&SL{`GAY3$bjm{!|tHkD5aLWz6C`5)Eig;m+> zs5F-Ygt!mD>Ct;!u4$7)`ki5ao=wHMO)G1zBiJzxmZXYr?ExiVvQpUBmW@pZ0lz?x z+TmPxxbMx$Lja8} zEx2fzMX@fVb?{AzG`ow-XuqfVtX~$>OG5|gZ*{Ka0%Gn23Amo5oG_dLEf0K%(M;zN zfxg)S2G+*D%L*Vi;vc>&&+_~Y2FAeKikP?b$)a#di1H;Ci}^Q@8Ht3k^N1!SQ0>As z_+`;#zxUJ3M}Yqe1q#RFv8?kgmDqq)fS-*oSnLy1JfXT!bWR55g>gp$G|B~PgQeOd zdtdS&sPHmH4PYcU)(=eEy?b%gXwCR$6}IewJwT%@TWc4T zTk~I~Ynv;pgPF{LEz4*j$$F2A;G>YheRGcSTEq;h>O-NgD7p6F=Hk? zGIlI6qO0=Xl9C5)Nr6j>1ultklBJSl_2-GL-q>r&Y@egVe9Oi`E+>KwpVtC~gKuFT z7cov8eaIxkICdf3w=;pOt1tt1vop{%XHa~T?xmf^LcBLA6d=ym$B{AwxPqUX0UFif zl*Ot8k{3yw0!PTqVv;8Y&?-mr$xfU~;nDm4>!B2Y=l5(Z{k-zO`oF!Axgj@LnAS`^ zYX`bdDWjy%Y|;*KKR4`OBR<|Y+fdWJwNg(-rF9dql|M~zkJ!j8pHaZqAguqYYUA~jB_|@Lsh1dI_qQTz% zeOD7h3|xgr(#rzlq9DWSysMHam36SubI{>Lx~86RH}hh9vbZgIVN*!B;pbDqp@Si- zfX%-kiQkqb7hc)P1YgNTQw1p}KD)I9TWFzC2x1)}S7{_xMDd3DOf@t8FlN1~wIBG1FX3$lt}?n1(1!4Poi~#ZpPcWN$zw zY@moLDVS7z9xA0-+D~Otm3*IrP%gXh3)!U1JOtPjI*#S3g}r-mQnj!OGX@YJcz{0) zC8Ht;)>|avrv^vee4*a!3HxI$ex-ElQ$=jBYN$Dqd|=`2c}ouUGdS;xn{4Vb$+5K# zN7-?4i^|S_L2NSqgaO<9!#0)AtFGZN5rERuSlZ?1a)y%ow9%mZZK{_F#?0cl?t1NO z0t}3gHMQp7{{KqN5~5L6W0e-|Z@c+i>7DH_ryVvs(zgypUUYt>Qz@cETI6z?MF@ge z))Yj|F{3?p0aPOrTJ`! zks>oHY$Dhv6E?&r_7^{dIIG#{Jo+D$uAK`tfs;o^ZB?SA(s1?fG(N=B1+naoQlKw9 zVMAh-y;O0q7k^MbISHt6zvlex;P(~7>U-R_-~P1|uW|wlL2gHw^MYG0T)t!f6{pR{fHYPJ2GKS@SKedvH1{ip;p|$> zmNnk}6dEBljn*euA`rqutAfM7TI!UU_sU9mn2SuD#`em^(4qNlqI(?2CA8_1%)S?g z4sRB))25iUfiWV#g6qShINlU>T~yR-;35!IvGg)iRx>+5;yQ-i9x>JY4j`560*XlxO!)JFoit1|b0K}pgbt^73O{5vp zSQop?);cSHg|A@!Ua2Xn)-W5dB@kwj)LyIkt+WFAnLSwH*>98^7T9-fL1?V8N`U{0 z&EyHHzoEvhx9m1(kMns0Cl8uK!DD6+N6@+u6Z7{K;qX;wqfUB zg4x&_)~{@w8z?_7&z1xIM*ch2LjsIX6juPiF_xCJb-3neLwF6U&hC^ z?&qHXtbET;<^95PCJ~BJ!Z1X_T7-!s&#Rc^P6D<+4VvI0f3jk{b3{nBdJcMJ3z|S% zk5pR}L$LZhJl>nR>7BBrz}H4b@+{@koEBF51c_OU{xlZBh2Zg+vGQZ>^XaJLkE8Uv zd;-)HPL#ToV~5`xD1NlGFXZ?=&rJ>WZ%0FU+nb2Kb6%m@{hWHGGJXczLxM^o?N{2ePCZ3$yp34`>S)qfs`& zhV|?*PJ)`8E_SWUS9lY1Z5q&0;lWPQk~Wo=I{2P*H1Z#xD54-oY&35euLh-O;c_N7 zUdGdgkR;p9!h&`o_g*@=B%rTjli`{y?12PFUOFV{W!4&q$& zP7F}%GAx-{D!HUqHB^8934q3AxQl8tJaUm;nYNxGK_RX8WTR*k@lr&+%~dGhfNO}7 zVGJRo78zvLv)sx+H2BHl1O=xictcUA-;z1c}Ow*pWOj7uiVXhVEILqa2Ec|+m+A&Kw> zmJKH8aaXLY1s zy^Q|uRgcW)t^SlcYy1yJeRS6$uKik*ruDa6VkV~r{&^s$A|BmodyE9iPjfDFYRg`x(XFV#xk;2UXs>}^aNO&Y-gwIA5Vi(tt zo|7+abU+wO7Q_|3=z@xMvN#sF%Gpg7tkSQFoVzv zdx3sXGarQZLS-wUqCLX9@$PYnxFU7du_m~TiHS9gbB&K~GaIbcX!WqR7K(75s^2Z3 zkzaPAuarT@R!HFCm2|>U7#<}}hvH%f(~kTw(N^Jy@}|ukQ9pZ-=hZj@c6RgM#;{O` z!e=c7347ud^m%2-NF1(%^$h*Pto%gTur6pIqk_w-(W4{uU6L(C0Z)v{t^Y0 zMx=RLwW;$DwX<;oK6jeDVE>P)uMCT-``%VU0qO4UlF#crchukG|NX`_oO7MM*Iw)1t5?W+_tn-kum&eZhNFh?L^BXKt)`i(DC5?kqPG=OXSA|(tpVt1v5hkp~MEWr2F8^(H%hp6XITXq_iL`ibpHN@4{U6ieD2!J@0O0vj>E){=CVPyLHnUKZ7f5ZHru1u z5!l^F`43u|BaJ?9mf)s>qsN%-_hB-`kPj#7?wnPhCYo4#5ToqrUCmaEYBSZ1`S-Rt zyGRIb;Ke4Ej~F28Vj-=xrT4yHmc))T4ZjcB)EM39Ho{Zye8T9oYN%8GYmXNGt6lvZ#{sNjkfg?cP8+9`m8eg z3>B{Qrg?v7twEM)CF7UzF?MVVMr6tm8C=t;CBqe0ORH-Yvxf1 z1*f0`G16^V0`U(Tle#Nu&(+J|z_n;5h>9j3zuqJA5h-8;3!i2xtgPKiO^VBwqhD{S z{NGtP`DIlaCrDT(bl5BKv5qgSXqSHtDAGV#MJOegJ z&005O$9!8i&w3xmU9{r8!ecW8@vYoerpApT2}*z($G7i;fm)fv$%n^?4k`0y<U1o8)h5+wrMKttn=q8<=rFv#a+Ro(;y#enV=@6YwsTt z$4X9}912ptc-Lebk3X0Ge>Q+B{4Z_;b(d3{6Gl_TwRx%6Yx|-VcB!uNf-jvx3;})z z+I|mp;>?~-bb5VYx$t-BdSm_xsZe{lC>6qLag8CwL-Hj zd>Vy#4+5-c#u66esRJ$wS;lxY``=CSYeW`~>zDra?=fR-EJal`;<(yxwd&Q@iO0U+ z3P#Dc`rgw$rnH2-s)CB8ep0?WVwBGL?<5ySCfu&nomRm%*TTs305``KU38t9c;YuA zjyUt66{EvFMV?nBZS|+%cxgVBNG|UwN{g}fvx_)iL=_s&z;70q2Fa=WA>odbz4is) zZkFG=Fc>mAeR|>e<9%Zhf5!?lbA=D zPL4@P3saNq?H3VJ@} zJ8`KGmmMSAH&ra6O8+j~M{PDHvIJTB6;1b}-qawsneARUcMBdLI?t7l5LH1eZz^7Y za^j#3)+G{s@vUHJl=g(J`0QWnP7r^W2oapxE0^|h1TWc~OTmQFI5mz$Uku7j`#aef zEW>yANqkJS{}?M97DPTtO_=}!7h1c1`mjOth3q2;N`LgTJQcBT)(zy&7Xqgq_kNoA z<%x>6pEAh4VK;D1$p~&Mw-CN1!uybOZP=PMj={0_BBxb$^@IFx&%Sq5I?WH9G`>Ft zcRU(yw6Js?wDGi@F zn`mI%m=lpYlQH3-h`6cOLH-~rfXnLJiws8{g$d z_26MC35&*098#-MC1p*NoZ8YQwp|3eG!@=om9cC>4Y-pG6Y4k zJ*jS=SHBYeeWS&>8kjAz$jrEWMW%4imupuZ!lCgg7^8|o+@8&~C(KL)f~0uv=Tlfi-T}@j~olT2d$ft4AZ5r(xRwlU!Y>B6{x7D zEh2O22_8@2nSM#%fQ5LvG{6`hXG_*3Sux+>*Xw6ziU?AU4mh84Pj3TO($7I7;T~L+ zer?xvPS^8cui+ktQnoOTU+pO)Lf_oZ$5U&ksUbM&q1n12}JgB=%iwcwu#hyyj1rM}Lxl$lBKzl_h(tnf; zvrPObiqGt8!o;y2XtHmiq>jPCq0isKSjOXxRi5Jd+&;uS=L&}eA>{8f08VKHrqVud z{7IE45b_7TX|f#3J&$a{E<=-uLQe~Vl~pJ0+k)z4V=$Iu0dfMS(TmOl|4T8)lt=L` zm{Yq4pIa^s_}naqDg*-Iu#npP2H~eEbxyluAxn%*dY^eB|b8)baQ^)B;f?0O{1|72n9^W z_j3uE84Xg}DT`?NN`=yFVvH%t+jkFD7qJ|c@&fUkr!Xw>zx^F-l0#=bF`Lr&7R=#} z;4mn@o*Saq-L=iv&xmJ4RGN+!)N{LHCN&G5hzjws%PC3R*gYvB652WV3S#d+DjU-8 ztjVX8QTWwh?Bm0@c9MK{Qr&yA^1H;b8vF}3F&5A@4HAd07cbsW4OKgeCR|1>ibvRK zc!{27sR?Hym!FT1N`%PObOc1bjVfF#Hf%_lKNE)EoEHASq1?C ze#d@uYn4Q5v^xE^K`wJhsuhOij<;raZzC!E;OuBy{*s3FjoBUKb`C`3aXW2FK@e_) zaWe7u9;Z;a5InW7`Vizru({IDlxhz!71S!VoX_~LRcKuSs*J81 zE67RUS%|xm)+bB)So0JM*R&VJ0h2&Ymb%hX!5IKrXWCe@!TDvJ>s)RU%QPGd2+XN0 zXw+Bp6DsBqX0MRH!yO};iI-l%y=sLcGUSx!_*FSFy(5J*HA$3VR0=d{b_;`YStCS$ zrn-=XCMW%rvl)7BE4wlH`4H#2Dxvnu!^sYT+0`E(;Y5y`69gsePbvGyt_<-BHA z`N@W)XjwANG?sh%{+!}yGqwgg{ky<)-gwA-e#`-qy0j3P9xpY{y|t&xOZb!zwt(ko zG|8p;{1Uj@Ia3}kuvUK)pSC8RE_H2pY^f6d*rmvNK>L2d(x|!WDCwI%$=CYT9h!y; z!Y7JI>>iuOd=jbqMM{CpX>GPuVi5&n{}5nS>eb13I>+`K%MeM#5L+ z`P#7ojpL$L_JWP}dHfe`i-95U*eh&0RZyfgeu@ z91SH9dVU9yYQMXU*Vsd3BK-z7lrru|u!^=xI_rflVK)vWBK`8(z00OZ=w0}$x@1{% zY5tgO0MIvv!$*Kn0m0q9G(~eW7=!&0+}3#$TPKX=LW2R3yH?ESqdVWcw3wB#Rl`%I zPGJavt11SPwsM=m3>l8Niu+8+%vN_a?Rj4DBGOJy`qsIr=X9NdW4Sat&Hkmiq6TAI z!*0ki)!Z^4fry6v(C^l2FmKaYz^&E%O4YoxxHO1*G*!||t0AQ*ADK+e3M~wups%;I zqD-FhrRh}a*ky2O`;af#>_RT0(lX`;QCnq1S#vM3WZ9L+9Q)xVkQhS+Z zWNZES{Z{*DW(nKO@^~S*iDE8xK8GOsrU$Cx-BDrx?fL6h5bRCd%5;Z<2K&flE#)}Y zbf9J&p=kkW!Py?AJ8IS`+Afbp)mYsyg1@QYD_%TK*jt^o2LKH2^nOvyv{(fPip$d2 zpi^cG3R}U;`HGo}^ICF=dgz)C)3d4Hg-_ty*tq+8Z|Xn30DL1)$-sz@CX1GOaqql5 zK^JT@pPi7H9;@-YhtX49KR=vn3BKH}oJ|Zrvw_{Lf*{5KjIULe z1>2O$9g`6_b0%UP3chYUICPt8d(e6eXO&Jjs^!|*aH8N=T}|)mm3uW8i##Qtu*3vh zzQ7+!Zfw~!6_T!jK;E=Ndz{4_2a*=d`y0i&YFo_KG)^26wF=Cn#^@rgW2B};&t;^_3L;{D%nZv5W<@)X7~WiUwacJ)=-VR;DiS(7EBJO5NmcogY;7_lsuVQ>du z8(e?FFy0#e^7eV)6jxpIMnk<}1?{SzNeF^iXp=ljTl(xYH2lt({s3J#YQ)1H061;S z_#9IocA0P{Diy;CeHYdYX=O==E*n_1gI7U2muXcrS0~q&Ta5s6#~S6!qx++`ydTpLQ9Y)FO*y0_#2%DI#NVn=!bRaO z5}%6ZU>EudSq5g~f@j&VZQ+m+khfd%1bwOfm~jE`a2!Q#386xp6=sl*UL?k>7pO+i z4KKO2i}QmHoUeV#`a|XxIL@kvnU=lbvx|(Y%_;hK1y)ebh7(c4;MODP)!*br#YX&< zl&f=4Dd;ZCKR0vW9;!DY5KyW7`z)&?Su|<8C8M#o@VegKhYdHofjMPjcI4rvRDusv*3$#5raa1W*t?9<)+oh9}i<6cG=wpkUz> zmj@`T=+f`oJ@s)TATJpe^?^rZjUF!#SOqbqOt0fHjI{In;@6#J_2VEFT`R}MmCMIF zrCWT`WPR{$+O@%>Msrg#Ehcz}B2{jOs?GVm|C12GW#W@d>b%SG?J&680XAtw>I}XN zQ+5xM=xWa-*2j4t`V=t+O5T0y&uxBuG@qzsazbdInpreTUvorWsnJ0;kE0iy zCEA|PKXT>DlYz+EEnfq_)Rv&(s=B>@BD3*%xSkx%5LRSIJcmbQMQn-y<^0()lUEYA2PEbjvWO7^d*l6kM{92>I2D1*lc=}U554QDe0u9>b+t))F*FG zd4!qAj=+seMcIFMDC^^r(3kX_Y(-qN)Fi>NXcwLkR-1^`9dyvu4DhSHbn@Y8r+Ipy z8nz808@|wL_GlI=Dl6PfW2V$75~~!?9h0tR1vkhF+-ui$pPey}Dc7-j*diln0_C_% zaT#rxLW3fydc<`&wcq~XdDxO3KmRM3&jTBzgQu!_6(J#K^r1h_eQc$4Oqp#^=X!`y z82a3x{;>kg@BkT@6(qr|5LU_OOWXzL9%B~CpQ!8!EKW&QOOt%&(z!t)@Ixa-9Yu8UbA)n(jlOI@^I70g3a)jp?_SZq}kFP_?k(< zR3ua2Ag^tTca)N=bI(iVR1>_wC9htlGCvddR-$g+nH+b-gHvYQEg7^C4&F-@ z1KMVGBb9r!*xl!{6&CyDEL!7t;?7Mcfb=aDXl9Z>qMEEZ6*u$iM8>xUBfbT{FD53; z%ocYaCY>@D0+63LYTz#AZq84~B7MPJ@ocYLeU(WNJpo-nA!}5ZSAqjmC0VSnvIxh- z^w8We!vP6*YRzz@_%~;Cvu+;HeOGyu3lcKXFs;EbiCe2 zpQ-ngt=inqfQH)P+hq!FztSpU0yFQdfZu8DsfJRDZcD}p&1xV>pWPy*+j_h$=?Rfb z-c8<0!*LD(Vg=(=0Yqs%bHO!s?_j-3O=_Y;FfhKRRpVJmhgGd`>^3zCa`327LPjeX zjR0*L(g;DM{;Q`ErfKqfZM&rzfYVe%=nl{xVU$2-Y03KEjfV98!bL5uP~>}jthQb* zjWp@PK50Zs2w~Z`l0@|C9;Mywn7~(}pPTN*%tzDGg)Y=ZwT|qFMW`{o^O-bekhC zI^v(&Z-c4mh(k9wku5w6lUbBay)YZUH09Mk+LLzu7r6l<97%!IZ@W1sQ+WD{XT4AOW{WkfE!^^=ex=J+}}D~f~X zJU~}#T3sh@W8KZ9zrQTT<@sk`G;dor1&DxK)-l04-BxA%BqVp3s2b+nR7WFf~&2 zdtJq=$5k{x-{pf-s==3x)i3SU7n%mPtGJ-{mkiKL_lwW%$#mayi|t+Ajf;;N(c@@C zD(|ZxsO@3=DYa#kiPPm*L&M9)!RxdtsM0Na_tkRD_3ESn&t$CQ+CbpLusi$nno;@X zD(ADe@p*+sjcd~e9{H1C^4%Jr2SjA1fTtl6CusIdK_V#l%ToKV+D#vW))h7bk=+^4 z6|m!o-eaAeg^Q;}XrV?I=ip?^_e;eW0QZf>#3LW#`c4BbVHF0!`rqH{ zroIuEhI>$4)xk5@pP?LlPN5}&`9GKxij(bW7M0#1?f}OtAqDD{=tJrcLBx@6VQ-AH zt<~S(sNsPJ+u;}VI;K>##g#D5UL+f`FO#!a9QPe6{AmJ?%SHu9Q`&i0xskRUNm)30h^))|WU){$cA``Wb zG+qVim<{!32aNN{$zs~!azO6Vn3{Zv$5AUe$;Trhun>04MUVzfKN z!B=?Jg-*eU^`3fw(LtnBe@wAZ_x1as@v}6r#_2gz(C=n$bng2fV4Uk-$+(1s zxt3BI%}BI^VVe7vdB1;*t8x;}CQaU*K3p7JMZlZ=6noCm{dbO9c^To;t< zWKj0w&B2_1gmRdl>q0`9@$`axbz2W5_%cpx#+kUbm_}L%M^mtaq21hD<*s%dTIt?qz%|omdlg#=Psndo5fH+E| zLdcbipCEmaeZyaT@3~&eevIWqrtM`BV-dJs;;Ug`kzRM_{7@B73F{-pslWibi3or@ zoNBU3&wk)#nxcnK^j~H;#osD>_M`KZP@D8lBD2CzTI58=0mn5Rr=t z?zF)WpL$Xo_c}Op%WY3s)cMv**9KHgUw#AHhiK%`;}rj+RI@f|ARMpjKyx?F{k~AG zu*J4H(Qpgp(BaO42UyXp%u8)n%#2jha=;lU|D%&lIC}VX4h`;aI?aLUWb>kGU$2G_ zKlwSIi_XQ(0jFfb&xnlBE{{eMs8=AnM>p(XzhumvB;vkMl?L~1%-4H331@^3 zagR2QVH0FYqFZNI5Az4B95BW(r2+L)hl7~Gp>|SE6r{F(6A8*HH`)rt$5G_cLt=A5 zsU`OH;P#^blYnxTYVoO1^H8t^Y|(-xpd7AkX&7qgq~=$fcBdPP`dtg9bs&yp^VBH1@*v1`5}%rr9)yT37ty&-iLx@1YGS1{Z~IlQ>c~##E2hC zS1UDHiw(fT^7r6aP;SWNyTvC+Q>X>lnRiKJ{$u5&L8)pfrWDf+Fe@j6SviTu6pqUB zeT8Z4nb|Drhh!j}p8@25fwkieT|eYD6&x-Wb)KBXRPua~ZJV%ldLWK~V; z#iF5!erTFL7V(Tl!KIGl@Q`=~*Y+sHuc$cG!4llh_{bnYGrI8p5HFAKG-CBM6QIczr1Yse&CZG1*JmlaaB zvH+Pt5Lp0ne=`liA5zQWbLEqbegwGA+{M+o#bPn6*|MB^5h7yHJXI6Rt5xQlgccmE z^ykxPto_qx$Ph)nGWFHGe(N(_e7^8-vYb};I#!KpDbA2|str!=7YY_qp8+xrF#b&D zMy{EOmZ`DE>Mfv9|H_``V&^}|U{anfnQ5525q}lB@4)&x50$9@k%8;N6^mp%zw# zyW>XmzyTVLm*c>GZklj0ZNwn*V+@eRZnd-7{-2uCYP8=q9eUX1mFs^IU=g*|x}ixP zcoBdikg_Q!9nm9Hh&p_+R6%(KzxczUg{@D9Hd+5_rL`?K=v`uD!*mmSBv+^^ezcn8nr)#KqUa zKoiu*IsnMIut`@W$JH~$jN6sO?E&Rmy$>CQ6cBoIQcB11_bW?3jlV)SS@x50Fu}Dq z@Y^pPEK6{4)0383Fc{I;JSeo-eo`W0?lu1U-wr=7Wd|&z>8pJP8wf$pp1$959@~fO z!`l4ELMW4oPMag|I9(J|A2(isU&MjoK6UcTNXCn`pqFgEAX8;gXg6)@dkI1bqUAhwE`@y{}iSI*OQ89QkHPZ|Q1>B(t zYa3AC{X5^D(S9SI!+_{M_=4fcC~Qdbu~)?K5C!6HQCJO8AWAH)Q{~l7Dt;p2T#_-Q zbkswmDK{Ve!*`PZS&%6xek4!@SQrpb5+BH5#)GdQQB8(C~TeP=;YDEqV3(qtEDf9x8^+X3pfk9>*l9OHW0Yn)ypn8s^DqDNG$J zu}OOdrTX$VL>u2w{iCh^$C=FQoI^!0ZClr;zc>h{w;lZ&K~_rF-C>R(NOB|=dii|Q zB$6gnCjr5RUHzGQEzd9C*dXCUWftpt9h4u_JceV}AL?Qm3RCs|P&hj?GBs1JJ0WqpqsZ2pfc+0G!#=^pCW4XTL9)f<`8^_cM z&5}+5R7hoVGJDgtPHqV@ zIERAqNONz9|O9K(}Ew&Nfy(DE+~$!kn`Z z#rRutf)crNkdoF}f9k9&YLk(8DJT$A#O{dJ`0qMbDoGQJ#p!RTjUOs1hI5KZ=_7c% z<_E*r^cJH86tw0vaX{K{9lArb{;|onIkhoRa_s)s%ht5{-NnIf_oz?!C}oGoT0_Um zDqnNsPUPwZr38-clKdB8mS4Gn!i8a#Bxm69A_A|cvn9(J{3~9pP99cgg004ziv1v2 zfiSGrLn0#aud>ch_r)fPVYPP+4Y{p;e4foG!7v!X7=|VRfz>iQNW*q*+UBMP27|eI z7g9VbO|xUjLr67yH7A6^^N_U#>?VseUJ1uDE_IKd-I6I@?U6{F3K7$wY<)DAZN*{5Z^_+36XPq_-*Gl^Xj0XWK}?2mFY4 zhYF-Z6BVk{6=a4Qv<3|<83=eeUj6XF3>7stZD?-qI!_F+iMt3#DXKsQ+;uvNizWUN zd2$cHg0$IQ3^=5GPfzAQar3538c_>hCX)hD9kM0CogT4{L~=@3LmZG|ktaJWEagmG zYK1oy??!`b!O8Fyi?UD)AMQUj*mg3R1Q9$QxLcKBiBmsH{OR3W6&6t2-cYbfhqiXb zsJ7uw?|Rqr?7=(khxybFyN)OKnzH^E5%W9ALDhCe*Cv?6#(FY|Vg?J?LhLyd^yk>lsPMZ3y^rmP?9){BMLErYEs3q#7ou;<0Ti7j|eif*yie$wi+JYsdJX3TiqSygc^Ch#f`&`;_x zx9<>INg{#mBJ8s=8jm5O#$BakbvQU$MWxtpiCR4L6!2cMH0ooOvz(bZQZeFEj0o+6 zI$@R_`w$iB(H%uqo&Q(I+(EPFPXP^P6|Kykydl9(h$7s-{O+0RBMw#yzcfazdlnr$ z6;;)!)DfsJ!m-su$xc`2Orx{VrFS)Yq!l`x;c552pZ%mn@WE+vYjA~5;2!K5eJ#2F zRS@F+bb0S+#$~{Xs`f%pIt#;}dmAl=V{vse<=QE3dNR;IeL|N*KO70QBe|urhg~c* zUK=$on2-r0M&ym71qg^L_gZLdgDYhY z{LRz{>V`Y6xAZ%WXV#!Xs|N=eflA)na!_XnoRyv37jZ|G=evH*OtI>zEwq-SpnLS~ zsy5JqAdhc6jz%$fzPP*o1m#gnjA`k}y+n`)vw8|go}$)BOb*TE2!q&Yr3%46e#0`M zo@I^HeK2LB6nZ_rGybuCCE14EVd}kl=DrcOfKX{G*)?l8x{?GxertS=E3w%7%;l&( zhY7pn-_u>r?x;p-;)3draLfRvA+nZbW|7Kz7Prcc--y1_|$>`FI$C7j40ia?wgFa7jt8FkM~gtdB;ee zNa~Xbaq^PV8TInrOQdurm4RI>uKzIe*koXxHIn+#^cEIb`)RSC6$Y;K@$4ilfR@R! z_E?5{ww{95s)sE(S$>g#r+qc46}6wavcAYsb-G%)VI^NZ`cRkGj$RDm?8~}my2+Jo z+^HeD_B4zJBw{N1*AJwM(Gu1~0TF77=w#KV%`M<6+9;z@!QV12@7*KwdaNzuy*4}U zv@P+iQc>|P_x*{vavEEdTg*F$zDMfQuU#@rC`%UU`&?7ejU_SFVcIK>#7W_?@BZ^> zr&JY1gCF1CrmC?NYBLfH6(F0(L}8lOr=o=e ztt%V_o%81)xzzFcs0ktIVb-fX{BoYj%+PEBv1Q~lmv^J)=m~gW&f)FuM1#T7@+#Xw zq$nMAyFokeN-J79&jQ32JS>bJ(nQKg@D*XT#SZ^{xi{n2TbI&}%#GkSGESGXr$D@R zJUhMHn_O=REHC#<`erTk&p~uC78r%&wL>txj?gqQ)z&iJZV4`Sk3DYxXNK-i57Z3s z>Ds8@o7wGp{_<*fYxS9k*dG@}C{PK@=59YwXT$LK{{cwz(7+d2 zE~G86Z7AS9UE}c$vCH`B2LA`1+}>GGnT`)B4A?u11k|9hC_0N^T}WDK%ld)DsPD3* zdiklR0PlgHj0;{dH?r$qB9L-FKdwqonWpba#|x8k@x zZK9a+S}wT4hjPk$?Gou}^wcftbD!|b3F)Q6lj*z(G}R8e4#mFaT&cNV5#&R0mVETN zJo^bs@_g--L;-z#cd^rHJ<F5 zn#}L{b8=BKxB~*<0^oC)`4~9rat!ow0iBy&C2r{5Med@2I|lcEP*K;mNytF$>x~!$ zS#f|TFVD*-efxd&=(hL5qTwhc4e-IDY4<+TGvRejsgTR5Q2-ywNdQaidXsF=f!kvi zqxM};|5V3zc2vsh4^(pZeIK?yjS~lbi8R=~tr;Qsgfsjtskoc-W-xA-*5mx})c&fx z?W$hN=k3gVh&~2Zd*o ztDRTn*Da*(cfI#W&-z4PzH~C~1TON{|KdmkMwg`m-=4LCy^w4w#<)KZFgR*kEhg2p ziFWvdSxNd7+$D;OWu#Iay;iA|GuTflTW}OA{>9}a$Rymwoj0!G)?AI)HgTXPrG(rZ z7Nu2#s{_lX8wGPs&b>aDddPgq)qS_e+V+8Nwp=mr9vHW&6dwmH@wx1Mg{D}HSM$Uv z<$&&{%q}qDvL6fj%0%qQFJzO#JJvRk5%00l!Xs3YBf8xu7}Ni>tk^AR@8SxF(UdF1 z)!!X}UmH^gFbF1BNKqFHnwI)XjeQWxaW)muG6D}Z35af389Fh^LvNajY5`^%I4m70 zGoD(-D(#wMY8oNx-CBN4=KT>yzkJg@t$a*FnMlB!q`RbOz0wf2xXj00*dU}C_-O(r zeqpH){UPiv_nMg#fzd1piI;Yey|lh_a%#Ur+TuU=NLYW^NWybhGDG`Cm+NtB_1@b% zjmx*n^SVbfhOKWzojU;x%J+NedM4JJPDr|dP273_DB^7}t z;h@+BGn`s)CM~-E{Y=|(g*{KY$xTCBa=6}dnASOyb%)CcT+97G70C=2mh8bFO~P}_ zU%LQoz9zq>>{L2EZ9Ypm`_5}xvQuyh?NvMkF22~Jbsrvh>fNyY-r!yec6m#>3H#Sm zW!46HPwM7UV$wM&%Y;O~s#ffrMcQ6KddH9Q=XbGA`WTw>%n2+*H?J&EF&Hvq#^rl5AS074Jyte$SCfth6L1w9-QI9ZYyP@mR*6yI2&#kWp}2a`CeDsiEwt;?p)wfF-9>nBYR6 zlju*80vg<%`LsgFXQcPci`ayT@8M;_Duz(P+64BsQulBvz&w2~W8%uM9p zO`^#Z%QR8vGj9MJZ$A^(r>wHMgd*uf1VV-?{8?}{GG_YjIBNQ?mSc*^q}3@(dOZNG zK`$Yyahy7v9tcy?oMG>h8~&IhKQ#7hovc4c_5VA;Acd3dcNikb!E9?Jli= z$K=xtTKPh#)>M)mc)7KE;C-bX2TgUH?d8)ATA#n;_sKop>R(RPD9Yhr@-}Y(x2iq- zwHbsD!~*$c|JLf{EAv=<67r^8Zp@13cD2%zJ!X>QIJ}m6!pM8G$!mdr7Bkmkc@{2# z)MjRz8r^$Z>Hp^4V_cn4W_|p2(_!9n--@_OIwBFGuC0d_s zpjCf>#}sDpqu3a9F#SvE1~w|ppc{y7jE)_p>}NQ$Kp@AQz>XpJ!yXSCQ|7N2e58*X z$)t$8*7JHLiQXZ>28k^6r}hi-{c2cy<#?F>2n90u2qSq<(B| zp5A2afIKoJVWQC%HuN#Ahi!bQeCtU0jPWkUB%I>kW$_+8ps%{IvTur0ANl?LJJ^jk zATfOWELs7xU_Rbt2TrA5p6%Mfj($DTh_`a|4&Qzo4N{2bW8kQ;G-7*6WOVoWn!cB* z;u+BnEc=nb%F4ys5~N47PgI|RSjuI0dRoN7u~x zU8cvHxMmKlWf6>KH~3^JOa|l~2tmDAT2UWo*yfl+COyHW?#iGy1niW5-J>< zzacdpWd<}Cizau!zAgQ(b^6J5yS-KlRryxib#UmH?jdtNiQ@>E@X}WYr4R zf4H=WYdPQ*`eE1$Eaqk3g>N?aZL)kwhuM)UqAO|lJwow*1akj8oW%{KmM^q zp8BlUH?^$|*JiU7&PD?x8@9|f9_qKdTaXmDtG)>Gukd-jm56}u_m{LUjW~u`Tix~p zp`xl#j(*3tOqixTERJg)roz&)hyTxwH!^_m696#!Sp}9+G9*-dkFXWNXt&58O?SRz z+l5D{3b0vBaCD#izffX{uxCuJa#GPaNJMeK#1O{Ia=G~}&ZLS8 zJe}LbRM=kE(5j;Ve(Cr!wU>aruhSL%jr#RlG`yCqibJR2wjqtnIDT(ulpVsRF4V%R z?nCJ;W2HvRxnma!9Y;jbW1DsGI%Wa-H~eg-K9 zp`L_&6S*d&ME|TCG{$*9TIDliN-5|w<0i@?muzZz7wV1jvYpEak6kp5Cp(eu5a&NO zlwSbGNpB7M3A9Enme!=cEBZ+ep7t_k`Tz$FcQ~_zRtg6BZe}XGdRo5T0VP|hW#E6R zg@k25PFrJT&M!`V>}Dp2PWHFGufQ7@jVF2+Fas+1G`7 zh55{{uAVdO?dCU?lB+X9)0utd*=8|pg!jTy$2DnQ(Y;fwAnI7DV`@kBFlxu}cJTq7 zI$O?M%*vvdJonwJ!^G#He0-JRKhfOZL|D`X0bJ2_bZm+iDi#F4KQLN349ey!)0>IX zrH5J#fk(>NnEb3!PuOiBcy%yoJQIz_@ZiUTJhj$K&8f9}sjtda_Uf38bZ>Wh(~sc! zzVcoi>8uhvRw<+k;$riPDRau5D726bNp?4#y(cgKH0NW9p7nd7lCHgFq!+Ur_i+Y! z!hwMrs7h}_*aN&e=UwQ-x(@|V*3rKZO^R)lm-J$svLCEVH+kZbMf)+R?5ZQRXBN=5 zW%`fy>KPDIMz~%b=h}iON2EJRJ?6;+O&m>XN@(<3zO(W|#Fxyn-2SWx_j_aXdc9Z zILz%fEcWfpD9_7toKPSp66qx{Rgq}GWZ2F_6I4!Q9@=)YvWZ`A{0pD)&kg5f z2SC*P{vM8ELo2z(Y9qE|jBA z-WrV(4tAtDP-OctY2>iOOi(u?G6`Mk}@ba&yZu7Bd_r%W29qBEP(J!vuj zj+7xonmd+$4B*7gNA*3LNhn3;^S*OS^u3=^e#q$XS2M!0iGD}c#UeY{OZi{zW62a4 zeE&FeBe?2HT{Wz=zpDIHC9}XR#;g{4;J>T(FOHnid_*#;hamPnk zvqod_Wq=N~c!k^w@dHW%tl^%z7EPT7ypWX=nwOh*0g^|yp|*E@TaGV}Tm8`SS6C0m z&CaF44^u0T-{Gcrqmq zIuHvRfjf}e89!XDI2L`jy#qg9U-Z-CcN2?WO?w1}vypKiLzz01H@M6#a=z?k>u@yC z3e0}L>CsfYj^4egO%q^kIA8qZ3gUyJe%90uTJ`}&t+kBGB@vW#bHT8OGjfdn-S2<@ z3w4#zO6VH`Hd=+i6e$U@h%y<4hNO&AFLqj^zs?u!&St?@*LhF z4)z(1Yw2eBTBRV~)xp5L-;-80YB#4czV-7W1C{s{iHlL{7;5_bMRFRI z;tkSd!fC6EP?_7WdwUBB)(jN`@`PNx2qNI<5~bVvaqXq{qLsBFmfQMF)l@9c9OX;) zX!DP4fTTEYlAoILOjH0SeVGd8iop4gPmF9VMlPrc;lpsHCI_UOIV+65tlg3@6Q%wZ=z>kYSV~ND4@^+LX-}q zQ4Xi_a>UhRC?jM=hABztP2#p~*G%J{QUOFQ2pEMh|7gLgMkZbarbQH(7NYzW>Arg` zE^F44p zkfW{!r!E$KambayUoAM@ccuqE3m$^-s}09)iEgrm>6J~c%+P1YstoN}Ta0*ZKieF7 zmP~tK$E1Zqh+Sa=cHoePOey-Gn1-~17LC4uERDW#zH4y&X1*lN7#6U4zb4^YFAX`R zfq-V(FIsetJdmTJ7`66_u}TI1KSaUd#*w+W?2-Ze#`kTUZE9{eD#McbEFQCuAUVv` ze4w~YY!%&DvP(-}mpOq7H~%^R^a)MdYTnwgNMw#IeR#lcEFFBOg{vnZi>qgB_n9YBz$88vTM}|xaM~142x*n1FDKbZOIBrr$I!|6zw!GubnC-x%Ug-pw z#gJ68$_b2rWRS!bnZN83(FBtLe*>+Va0>VaUu^0eh9;u}aiz2LR1vHx^<++(AK{XqbgGgDsT9hyapWe7o*mTJ`_j zBA>g<;Nz{GjN*&Gv=VpUAUKTJLsDk7yiy(xNMOK?JL+Uxqn8%;|^5yQDHsilVe4IrduoxI>A6iT!Ea>Oz^z8R#`;Lmnkjxz_3%XlQ54vFX* zird8Gcn+?pDqIqNLVgn*M^f?qzp{`AbBa(Nk*P@3wdntkeo^pMpPh`VO2PCKxrB#^ zNPW4Rb5JIb4D0V=Gm(YI7-g$RUK&o)6q)Ara|5-BSBk>PIv#y(;mB(yfv#IrQ?X4T z_aFL^AkskLu@UyGD*Ms%xnk5d&N|hboP|s=nM`|C=EKS{Bkpuda{t#^Aa~)WN*QdG zH$(RfE4OKi%&Kl2YK+ld9@ms^k9?(;<{#@e*08F)-u?eEb(H~CHceaU?(XgqkPan; zLw9$BbV!4AcS%b((%s$NDc#-u9r2at`@8Jn-krF1W_D&azI4X%$^|S$u`y1hx~R)R z2+FmtS6RXLqm9Hs1z;gmHsinsl}_pC?N}pK5v*3%RH+6=`a*Spkv{LM)y0_|(H=mx z721o(c~l#MWo$E!vyY{E53};C6IByxSUO#4P>LR3ucWfA=4?$0#=+5UHTKQ^=gm-y8|H?asvv#%F$-oSL9MACa*g9Dm*pW-86g6_h_ z51Qos(3Wl)`RRc(nE<6Ng~dUOc$F!bKd0d&U3q@BOMLz`aC72x@k2@k{l(Fq$i$sQ zRl6)5_Y4$(m2WBei88u%VFcnvZ%BaMOq^K4K$mzGhG}%U12B5J;d8`BS4Umv2uf9) z8}{HOQQ65^v`|PHO!2cA&ULyLRU+2A&;bT1^Psqr8VnPkPkUsz*hkkJ)vw;9Y8 zbnj^14E%8B&7x_)ts-DVhGT#QYCZqm);_f`-|$hhYzi;)OQbd-w$@PbR6CZ#S~j_K zD7mxj1<}rcxhE%Ts~IT9)|6D}NgA1pBPt3;-0L#P$mnQ*%b>Z^bSEM1*NOsO2|~4Q zfx5c6+)nWYNgY}$bu>&5WT`8fv65_3E!m-zY^hAdWJCv3W!naRzQjCGdZSl)bcT8f z5A!IyyW>Tj^CbUDARo+8f~0Fo>|@2WZY8m~ow+^tLSb@>!1newpq!?`gpguU=SJSEoL6 zf2*ES8q8Fi9=3HtTE!AINr;{*(B zJt&9d3R3CmY$wsz(rJ}*OS`9A;rY(=liA`>mZpD|`GqP3QZ1*kl{j@k92P zrz$lARgL^@Zf1H{o=mNovD9^$hWxrsZSF*!;LLedu}Q0?8y_KtpM@g?0kfHd9#JkutOYQ3WExVd8uu=Ot%5}S752vp{hN+v63)2J51=+`wPrK~~xOWWG=8#5WOMt#9UVtKsF z(@yLwX=r_74a9HR(duvHZh>=a+4FR$Ctb1m<-zh18}l=90`7YH(x{cDRNza)NvmgL zJ+ssejJr39dNZ}E4^13{G^fAJa-6CVWgI1KA)Yd8Pv8KL{9tbG(a}w=NR-GojxXs< z{a@BX4A+~I_N5knG!wFIqSn(Q6h%IyhjjI?cHatQ8LDR5XH%bqG}27za)^;CzY!N=*6^ zf(#Yj78tCXB(%~UO2odn7QnKkU@n28Y$8cKL*K@!M?t*X7suKNSy1kN7z*?M6&?4{ zeCQjPjrgrmaZVxa7a3<|8(7RU>;7EY>bg%zF|oF3sKT`{nqrt|lzm&&u8M;=HubVU zHD?IFJ%JqmEOs%OLYnHz6|+A?%Sbn8i;5_r27Bw^>jWsutzFx*`nX9#@S`!881u}@ zcD8}fusFn3t_u1l`aa$&>70jBG723z2VLKAlL9!)|IGk(lJjxmxzjR6jbIO;_jPiM z5$xKimqHz-8(>3;yk>&aO~b#QF%DIo+1(;>qdOLXY>!6lV5UMRd zvdNnkpg+2^voD z-;Fu1u|KaXN*?h4MEcVG;(ee9IGndz)?R()z6)9|ckH>=E32}hlr<`cF=PlghY0Xg zE6fr|!FIHlfNy~Jw_1Ys9uV1WT%#J z^+x{F=>P{&Knv^G)brVu<3?1o#8QF61>)Y4^0%b8n=V%l_Gh2PG~GgxHgQDN3}wly zKT6kUILZ_uD9GS?y=ha%w?CPA1V~p{+6V_W`!kJ?jQ=o$riiMXQ%P5gGiM5%3HrCL z&S=z6cl0whqVZg%av`4HXiGn_>oxgz(F;@y=Py~YAJG-`KC8)+??u=cjHoSFiXO+o zVoTyZT_|8U;sX1PiNvX^tIvi|sMixXR~J;IdX_;KKiQDyTe}D6@)) zzBYfj9xMkvTx91oSS3cxxtZ8?L#jUgR7l78RVD7cq|SrFL2*BpNp6qW+4BBMr;!ir zQPCp~>B8NQ?aakoGOo52Mq=NgkqJnWf%9)lnARj)T0W1$4X%!pHvO{2H}aq6b+-C?$zPz zMM2F7fQk(tv3)kC7?95`6P=(bPNfYhDqkLa$w^xX`hphJxSx$P2f&fJ2z(`oLChC( z6M~I6)`%9HFqwI4hHWzVlg)Rgw^k!zj&wY{CiCq3#pY#~OXadm&!DyIc$}DG0-99h zT#9-JP_B&E?LWDHFja40`>80L#ZQz#LLwhJ>W_bJW51aE+*G=R{HLV*LSe#12U4G^ zuN~`8!qGJ0I>UiDNp_S_AZdLva&30#AcdYRX>62KPhdF-%9|Iij}_eKL@u0dwPZug zuSRsn{j!Oq?^OD*pP!iIN7mW^vx}GC_$1sBK%~4Kn8X@pA2x)R(G083vkJRfKTv##XL)nL^l=17uzrylUxwlKuo@3w zkGkf2A;Tz^g%mzXRWZ2)xEGmWdl_1_e-4pG*bR|&Z zJmw!JP|Pdjpbda~DAyCKYDDYR-O7Fmz(Sf1n^lwomIwfw#Bmg-gqGVfUsF-u`4>s= z5)&75#4aTdsLPS7ilHcx)9DJYDjq*ZW6@H+`2#j787ZO4a#Hs_@WABYxS03swW6V9 z2JK&I4}f(&e(h0@^lb3-b+nnzv- z;ae#;mbmQXUxicd{wA!E*gTjhgYU2vMR0W>Uz1r_y*0aZ(wM|G>}`g90meGFLzg>EdJL=F~`iEKdCU7Bt2E%yuX6dAH7plQC zijjDM&W(cUfGB2Vez0Bq4jPA{%Hf+68`=X`{9hXG(7NuWF9|3D0tfqcz#0V{+bE=&ogS5R zT-VF`$I1Bh-L$|;*Abx-j>H2*1E`k43NTBQj(d%Np%x=DgI&9gxXbz$n@-VP3HM`X zL`5sl1}yo|WM+VpX(p^nKd*B9;-R4(;AaEk5AOJr`&K|;{V&>8zgMU}R%yZ2zq34y zI;p9WzHJ~AYBZHHQSQp->H;q~&&NzHE$Yz(k%d2Gb);MMdu{lTl-NkT8m1h50u&aO z85{`}zk8ro7g`%GzC&q740F|8QQj-AptZ5v6D{E0h-DLHP~@r;~&<&Pjr(=>N+Zh?E2g%J?9qG=cTd15ffEh||!wrC+<% zhP%|B1d_G}WxGjfD8pZ#ep$Ud<~lau}(@`{6BE@{Q@Tt6$7T4~Pwi*12i7 z#R0Zla5=1-A6l))(In8y@rFs`GQ>@P2`a30kMcLOlA`Blgqp#SvOxrU_qctTrZ>uG z{WZWA5rn((t;1UHaBW%PJ9z8!33{2j=nVSfD>7z+(A`Rw{boOd@~C9CO3n@jtoCqb z&>f4aZt`*}1pMeJK3Z65E|4z!{g(NGjgIBLYCzup%W8>pF4`hN2pp8)$X+4gdM` z#EzLt0x{>=mFWeI8O2!5S~=N+4DtX(B=yWsbbMEN#5om*p5ra0^?2ob zH*h3L=M2dARtm-RYxm^HIyAGo3Z3lGVDGZ*ewy*b2-(`(kL~NqZ@>;`5~v*$*Yyhs z>{zD~XJ5wzO~s$r(yg?DlHhG)3=N+*!zDAqvD{yto+2STUku%llIArz;x>;0f19ru zFHt8tV*UV>4NbpX3&Oc-Cepsrsk4W97Hm)hHDc(acm}r^Sx-URuL0y4_H`oj?Dym%jau1A)z;@;Siy(;28)N@-eLY@ zLJwy*906L!h~&HiNQaj4UvU_l2g5*Lrg3VDPlCIQ-_!U>gci_iF|87|=XsA*q@^4N z{pvLpmgBIrn+yHZw@h?{)-bCC$+MH#y9(>{YVIjNXal?FSkNNfUlQy$2+03-}D_oF37lSKChLG{7 zjTKrXhx4NV&Qp*VYL@aCcfFV}l!u8+8fZY<<%_}p6Dkyc44_cK{t+s&kty$ctCpcz zLOSWR+@`zZskmpFpI|XCzy!}iM8_uir4Pz_@LwjSdAhYXdjv!jg`Pm47JX!^Rn2&n0DEXL#A z9^|X(C@$NYb7;20Q4T77+30fc!C^4z{QfPlZ@X!sio}>(j%UQ;PVz1K5~yjaN#>Q z3BKf23p8rU@hxg)>&Rocv=}##Crs1$jq$vvxy2`KHqVFWfJlqgyF};o)t2W2r@<~B z{8@naF(Bzg8!~57Al|k=_vE+KMx`en2I0MD)q3}rd*l?iAEmUdb(U~KsE%mgz(HAG>r=XQZnQ}HU^flnD3}dzNcY!KWo_d&%AiikmD^uaK3~*a!#oouJeAd zBPn>X5Igailx|Zl3g$-EFl%Lw0SFJL2gjJjDJca9>r4S`cs6J1c)kZu(f7$s_L_Sv zueu!GF|mUto-QA8$*FJAJ)7>E?M_#y(}TQ|&q`uAMAITR!6As}moxfC9FBoVzC2n$ zy8DLKUSUNh&-`2++#^KGg*1wd;wRlTVF{62Y_ps9>^l4W`OPWi!UMg{DaR!#+>?oE z^O?W9lV_P*0T?dW=O2(kbyBU{jL%_jCmb9)UJWsi;Avok24;!Vh8&($kD1-|^ zHZNK5{c5rThpLP%)0Ez$q7SbPy5p(*RzKp-q>DmhI+)32Nsq}+xxZ{LbJ>hh3QApe&%VqC(jQvzX{e>^C*7#p#n`0=J@yVr*{zY@E9u)j|3q3Mw)B%uS_d! z?^r~GwUUoGt)VRvoJasi=5i1~U5KI?ft53|@X%45QQ(B?(_5o|vy2Kq_}1=;b*Qh_ zZB*N}P$+ z-x`hxJ(ufIii6BL7M_MM%~(y9YUP!#qH=!X`2~5HS*A4i;sYI&Ra}Jb|HmQd7FMB6 z(JQguABQp4RJ&GnArjyeGEv_4CFgwMw-}7}Ch)cH8wO7LXJd|qhQO6rH$*GVv0Gwc zrWT-Iucokkk3H*)wag-o=Km;*ZZl|O48_~>)rin(72rV<;ZThTiNHRbug)~`=l1!wob_EeU+Qio9a z0S(luvto9!+Lv{~6+_b$=(X@<;0)|HK0;y-Y}=C?R$6JCP10mi>#c47WQiL#=8f&u z(Ij5I6Qq-ahZyA5G8r+!L^F86B|$7}ZS-`5VW0>Fg|zzL63AnlGZ5UTqh02$EoGB!0II&IlQ7 zm-lJmq&pYn{oeJa$N58&{|hQbFvt$|*GO`}Qb1SpsJ_&fOy zQEsSnvPs?en(T@!F0SHQH&bH`7Ov(X(hM`P)2bE`o@(f zEZwQPh*$R+ntgTjBD`gLcjd(!#!)>aBfB+LbZeKMzDN&R${l}=pq6r9`Ogdw*P7v_iI>9af%1W!N zquq^Vr*@g0zvV?wwAc$fl+EaDoWiRO#B4=ZkgXyI;Ef)r;1QzE!UrsbH|{tupvq8`TonGHd^t|jxHrD0EW4YR*c1{fpiY3+wrXTtaWzpwQRMXbYGH) z{b1SF^2rxCtq7(zN6d)fqw`A?<~;YP ztwd4T>`SPIedevlR>7N-r7m*@nFPWIy%vR`?4V;EsG2`2Ydx-p7B1^Lwfg7&zHd#rg8w&^yEdN#HD~w`edQoGFne0B09yX!4E3LO?7n z4MebxY~eW=HnA1p&WE>=UGk=94dLkY+-2$tH0-3d{-}TAGKZ-1&5tOh-S>Ij={uFF zJR(d`Cn0wW2b22VvB+F1(&JB?kaAaUu(l>ig(nqMTWLR&-_Jng_qk6pwsBqTTGwWFOvuytMEdM#onw@k4T*D{KWgSV@G95E`_?pZgjr~1^#7o~ z$CGN?=X(i&g{CVlI{v!|Xq9E)A}F1v+${!Ymw+K~0!s3X;y?f@zTQLy+ezUwk|Xw< zf{p{>KTu(#H1Ka=R0k~Y;IapzHpPIZ{BGrBIEe03i)wiEDZMw%Wo-E*z)wmkdywLf z5&bJ%BZK^lm~wHl)V}0*D8UxiA6}&T$92r*!fhZzY}W39&gX5&-DOYS^it5yH(FBt zGjSNNvi}?HHH?ur7r9YJA_=@Yq~3|GLkG_h>mb31%H2X71702GJd}}iP6)htCMkNN zu$6Jyen8KJV@tv`<7GST$p<-HWyaI1P^f4o2RWLGIf{qOY}RCUt1;cf&E_Mt4>h~B zBg~}C6LZtI6Q^}sF>-E4dzMa+uI~v4t0@KtFi3yHf)E%)Mk?QbID-Ycos9Q@(~Hg; zajt16#e6}QZ;|X@U?^>1$T(*8frCYQ!@MYe;!i_LC`9)_{O2S*lR}8{f7wm}fdIu( z`>ba(K5p_e4v|c9o<<*A??8~`603r4%ERA`%Pz{B=LfQ|qyI}B1y@iKL^RGz=dNtv zX;3n5nbY_Sf*@Y7LwCrlfmQcD1e1kMYlvrEc#lOP`>2Z|$INwNQ&J+hlsZPjt$PK( zVW`Xr`AvM-vDUlI$!YeK&pwnmu!utbsZnXEce%NIV7@<^Rq7*^7pd|y?;xSJUP>&Wg}@Aa5l4QS z(Hvj(7-g&0$hwc@LFmb1Mzrq;(LwL{MNHXRMg6#7UjiLR7U$fcUj2*1%cGUUmWx;pdK=e@@z)8IRQ; z>0(3+;02y!A0`szM#}oiZ=ffgT7@UPi{Hb+;H=F zICJMeWVQ~}fpUTIrt0b6Z!ni-kk9qg4dfSvQFV|^&`;J91_T=Xz@O`aU5s z-w-YJY9d^Elc!?G+Zz!8jN>q?hVR2;RXd-8iq|hYJYkj!M3a7y3(KRmrME>(y+OpK zo+wvk99b$5B6hbV0C^`3>7E_2C`*I-s^uS}TTPKUv4XlwFYJ!}}fX~VXELe&HERu53p$jYr+HvIG78I**B3c>8nhjhK)s6&w!3h`e=?c+I z8Vci1d#+FYR9GMJd9pt{C>6-;Al+{wM440Mf^E5gCH9ZZ_ie)LnX9-&76CSr`eM`! zq(eGaW1v7`C7!fD8o*YSwxRvchxRJ)*6>|J{y~FGO+6_Tnwi0?}^ zB#EV>^Y8X0QWC44m}yuUweGD|i>Tbyb+5{Cxb?y3M)mUCtX0=)}y1D>8SXt$34;=)tUa2@fBn)&e7-hDk+%fi>J0)Ev4@; z{wxV{=ku-zJSWGff4p?IP-(VVqwiRSndsyed=PwlaLk1*-S>Y%6O$fi|95QKfOiML z!}ekXtu5_JCggNr`Xa_8tSwlxUEFAXuTWdrV>(&l9outf$9R$hMfq0M#a{Z5AES^% z1+cTk&}Sv7JR9>gHGtqfRto3EV4e-Fjm`}(p8AGfrUDuJiQ+VBwsfmkp65txs>&^}uR&bNGB@_#^W`Pd z)skpBbcZj1UYZtgiIDKJ_}pyMi<*$eOue|q8td?_#y9+#>xw+trtNnG;!k;h;<@I_ zaGu%wf{Hb_L%q7WNCmY*y}bS1x=_pReXjTX&IZl1518YVR0qSGQ2A{IPhTuh>V>=} z-83^8UUeU(T|g7OUbKsJO44^T*(wK$7BO?Oh{}2aliV~pCC7A<9PToIv|Q%D{RUwP zEW43s{Mj!Gr+hwezgJI3k`G%7dHR-@+5y?fl5vxKl}SCWlT|2FU22 z>|*qvieJ9^BXu|2tG*Ij$m^<-b7pj#;K^L$5}dX%Sg1Gx>In5Sn!AAix=7}=?BLRT zFL1(}eNPG_$e;WxJN+uG$b4&G<+>brH%K+&oUiD^h)M0dS>;Uo+pPwLy;n@*B>|2& z$RV!o^_Ua|p|!Cq?i%J5(?DMReE>=tP$MBsFFb;17=uLG^1cbWxa&>azM%M{uxkT? z4sadIKGjoEZeWWccz~|nQ3myO*e#3o&MQ|6GF}B-$eTJf*^kTb;lbL0^2vRF`b9hR z_ln^~0Z^ z8{Ws1C8xT-Z2$221)HKu4;d!99-ETIYAd&vJEU;t&$q8sG7bU3)NMD>2JctqDfeYO zuBd>avN36V`^D*DJ5PBdT{>qYj9SW_Xji5ZfN4jwD;nKtdSA4rdq;3M&A#e(;n{Ep zN$UvOBK_{AxM=BbXq;cAK3RXu@>urR$bBWSA_SNdf%Z{~s$d~LIs*fjJv|!TQc)s2 z?mq#%?Ugy+rlkf7U|J8qF^$tx%x`}}@dUwY<;c5QuCW4z3PmkRWXVo|VGY z7ZU7GTiDAySC5J{H|Y-nj3GY6ECK%`MYKm74sq@OmU~Knt)xT5P?vkz+I@Y#!yzn zq(~_RWz_EJfjaw2FpR}F!O@2nG*A9TR&y2RiX)yv-EbwX*N-A)rE^MHWv-oSS=f>9 zH{~LWE%tk`E{kIzPLZ%2ESAh2LXA9e%jajbnEVBljP1gyoo%B+2);d=B?Z{EQb2Ga zjs~ToAD~NtY5`R@$FfbjgYjr|R&oE;eAUA(o&tuiEqKH=bhf zgu%Yx8y7HL-Ek()i9D`Y%dS&Z=+nT~3ONy;+&@Iz)Ur#n(>E^jT%L3#-1b=#upQd8 z5!TDw&VD$KvmcOlmhlktya6`zc|I2OyxBB>eo$1ULq4T`;sXG)+RpYq%zI&Jex<~B>zPNU04h{Zx=gXR-S8e)q6=b)<`fl>t zOLOqWUNJ{$wAFf3>~WWas_5sx6sUF_^OEC#7%C`SVdAhlTMRIwbp)aL1C4VgmduZU<$4eA%!W)Var; zt>{)wP0Ju!Syr@1;WGhtc(ruSF#hyUXF_8ZiVrpwfp~~C)+|;gg`cy;Bup?Zt|4xn zf)wopj;7;{cb|>$z%d3O9#ufyiX8kZUJ=R(3DyvnE|#80K-J+=$agMGMof6^$2n8} z@<0of-^}o^j|$a)g%ObO8Rq5DGBfPQraVr$I&3;9*9BA4(16&Nuc@*Y9xhM4wZB># zUryJIulKI^rlp@y8=IR=TkGpRuk2PU5j)!z6wqLMPm;qPSO+}r*iJMA)YXfNO8)8= zw~9JYw@#d@s>S%leZPgvD1FP+6_L*5qgI<|9~%b#`M-rY!dY09N7wvWNRwS|&vjFP zYt5iRSDHg$VuVc6kk^f-ZWrZ?Z7378`_s)+@8SdFpI&DKZ18^`GO@YHPun%(sdX_R zbV2{17qOAvpxxdZkUSdtkbQLYM5!FR9xz{2t-6IGu%xF+{P(<4Y8O}nfwh5+KvE8} z=w-{QLO$CJ|7ftwO5=*$pb8EPEQa~}Fh){&FmV^X63Y4?#w(7XZ2}qp7{9EVOkO$D zF-wW|sZ319a_U&XFPNbX+j6jHfByR{q0an4q4D1s2%FLP0}F}@7Q&(1omtoH2@C3Gs%sSx5}&3( zzuJKE)wc#4mX~5+z8Z4LI`o!a)pdT-A+%SPLVcP-`seWqn$s~E=CS!W!l;hbu^?an z9|3|gy6KfBfCOlU=|8-XLMRvgj^spfr(#bwvu!yztKk*R>40^n>nf8a^}UgQ7g(%! zD1feHo61ywg!feobVcNQ>aQZ_zo*)c%7vQF@Yl8RrU5XmF9V>GP)EUXtRz-sf_5IiN($JAZaBB95W96|t^m*#$5|em#7}7SuWxF#k>w-{* zn&W@(4g}gW)xqnbx+xpz3n@ywyu{_tho$2vd=(+fL4$FR@q?&B8ht&zglqqqYV*Ew zIGKyK~hq zH{os-eyi15#Ms*ZHagPN119RNXtvtWAU#p7iI4lRh)MPyCOZ9Nm8Xx+fbWQn8Y2X$ju<83uwWJZ4^v<87X1U4z#mVr9I0U9p&Lj32-gGVUo`kEM9 zsXUY_V!cq~lQ@ducu4o9&@zO8?#4BC%udl-^b_w%ZG^~(D4jC~;2;mt%16%Nk7lq> zq%-mN39-Aw;~zxE)7iRo&lsRebn?GvRAVMFMU$>ojji&AX++s zCHs3(8*a$m=PiqdaVVY8-Jbn+v{~AQJDVNB#NN!!LdA6bq3`&G6IIqLTEF@$_ox^7 zMN{6-a6Ii*&UH<7AH&na`yP=bdON-4VuqRyYG{ciT)#6)IBOLu+-D{|j-46-RqOk~ z_vbbUbg^4yGVzeU6~PK|qF?=;rU^dnfMiufLz`9549hVnB;6zaLE>ae~xTHEVqENu$>w`UD0wcqm-P}U@|vCol3iD zJkp#0{@#vx#;#;?dV+#q^+?VhoDZSMr<2eMj&Vf^A5O}X^An$z?{qt!66D2qt~sT7 zAq#50u7&G&hSX-8*>3k2eVoMz5N|})vY%>y{IdTWNYo|{d33y%x)mfG{;Xkel}E#@ zZ%~Yf-v;I(5E3Igxb)`@2*1tn-akKiig@n1*A9UNN}xCy?aw8i1?bo6_*!Itz~OY= zaO*=ls+NC{;_E{+t96p6OVzafb&S_x(CE`-^|Jn`Dbi?Kmd&|c?YFmE6K(WL=5b^? z)9teCL`bsXnq5jWehhnaRwe_j?dbbGsCZVNF&KXsEH&2*Xnf9SBM(x5oyk&T#*|>X z^if_`qTKdrcc+ro1xZlZhg|bp1Ibh?J_c{lqbCV53L)6CQIlT$1csZjP~!X{GIO8L zb+K5|VpgybaS@|Xr2@U)dCjfHU#U2YgE-kTmYajY(?Ct zk;&}UiP<@xw%*-|0!Qpr`i4OTENSh9N}QlS&~eZh_D99cLPsLeZT`nW6kFdVpjsRQ zIY`DT--q8)hbl=iufWb)$`u?TDK`O4Dr0v#vv5~$9Uq|aUB5cR;5X}-!`*bmd#+9f zLHE@DmaC^mM=Q*ynq8_CJn-_z@@Aqi)$YD%_;lBmxf)Wj{1<} zcbhrs*t*V6T|2n#p|x=VKCkct9I5kj8^VeVQ17NNGgJ$#245MhX={wZJg}l|*LCLj z4}7vn5qH?50|J2H)0239dfFY({4)++rdfW!2`eeWVOqzu?DNDJ0i4XinFBxPtfM9H zZ3N*s&5~gp+F-Li2+PkA($NSw`OZa?<)!f%1dCi3u;E44_e3l4>Tve+RAy1PV8{Ztq zPQTSU%@Mp?@D|=hUR46KSXS~yc-5#sBN*r7N}|3izpIMT#tBmN0{exC6K%t7+o6h} z`)v_YWIIUg--IHUel2jUJ4|Rd!zRmwmV@(qO$TOxH?WLps7jQjk9T2OOoCi+qa?I% z_sV`}!NO2dK!Say1HouHGDeU?d6x-+r&&I%r8it}O0aTSk++jd67N^7bU-)d-NE+c zWM22v_T)BjSFO8)FC5?*km1f;=KNQ&n_Dqwo%m;fE^)+*pt=%K{FGufG0-gj! zi0PrkqYzPKhDnOl1LAR+-2 zo-Ploy6lqDmz$U`?Bdbj`%R2ytWR_nMG6~T?|MHwF=uUFzFbT=bCl%RCg=yKXlZD` z{iaZ1Av}BU7jhV~XtoVpExi!2?W1Mm*XAXo1MFLV@78B04xVGroBONg=*9p>{`v4} zZKXx&r`G1@s*?2M>1T&(cM~?kDtOYnh~t-EQEqNcs|u+_p#+YL+Wf88Lu;d*!*@>1 zKUaUrJ!vX_6jYRC(ld-EjT(ddXz`g-iS1*_lj~NW0TBdrQs6uBFZyRs9V53R)Cv5najdg`Fb!@u39V@<5nPM2XGZq|lyFMT zB0Q~u@aq_LO4P|#j;9cIbs zUWWKR%{`1oV>t`yM~`uLb+4|toq+w0faj}=tJA7zKLFMLM4dG0)8i!I<#2#(#p^9& zS)>k`*NR6(n9Ge#2bf_L>T$jo}kcMRS7dyZFFFb4VWZL zGrZ_yu>AY4Xa8AVdwBFMbx|1ntjC5D?D8>$X{s4(cwHSJ|Kjnswk*;H@~~=5qr;2*7~>pSN_2gNm2OxiC|XUX>qoZe zY4p#~!lu$nAx7+Hm|c+gy8pCrjRVEehBU|(sD)6*xl_D6L7ve5yPA=S2JG{!9;7z` z0t9?tZUfsVTUaDBO98rN@x1G#!9U9u&F2502x~%zPJN@F8yZGrqx?~D2$_6->_-dn zQBj55Dgi|;S`9mD!@XZuL^}0v5{)CPl7zQ)eB`<6-Qm5VC7`>NiUI`~e)JIT*7axn^x=MOGKO);HP1K`J~0g^u_zwTouFppOcN`3@PH-+tm zsKqD%ObbMVavb%IA+ICR;QqN4k!asU_t|jnf7c~MP4UpXcac3~lNq9CfM#6Iy1g7F zpJ9BcAo3|;o-Bmk?FTCrV)=>3yDcm-HYB;Vd-{j{;w(S)+`qfAqRJFkimlouP6sA9 z_^Cw0kQGsg6v%1lB~|%vMwjEyi7Wq{!Tp~Rtob3J z)H3S|A>0*Pb9mBCM6%<@4b|}>?2!upRzAh=uBiZIHZnc{A!k8Z5GBa>3|Pth*g?Rr zQT=}Z7=Q2j@pN3(I`XKf{lbJ#Hq1$2dAwQWpV=)h)kv_7*|zVa-rIxi_v)_*gW)eL z@FPfjnr777gNY3Rk7$wiLC%`gQLt)ejs+7d@&zyAI*KHjG()k`iDJ#&n1^jzTp;Az z|3kQ4Du-PvF}>&Q(UVbIX%$ts_cy*qm&V^+J6hErEiPoNJm+t`uqiu-=S9OB(zM&a zJQt1;yDb;D`5eaabj7hxqrMU4OhTwq9*P*ZjIVlE*alP{j87T2 z@9s>9iO>>qJcjG~7f9$(J{-jm$>zYs{TN3vcIZbrsc#074)&)E-v3BPZ-78A1l=uI zW$kCSy_WdN9!Y+9sS1YDAI8@r-!$GfTpqWZ7x;=G>YB{-nGIzTf0L`70Ep*u5y2d5 z$ns>Tp!$X6(-MWoOk>#dYB%HJvhfkK;LySUnDd z2U*32QA}-^QLu`qwv(0q-qcD>sGIO)1IAEi9bHnK-r=?ny&k<8KZ+*jk7 zo_?Bq{`qnh(*4qCLMz5I6=L?VcjiG#h!FA%gYlZ5*WGz8Kb4?3GWk9v;s1!b>aeJu zE)0Sa(%s!4NH<7#cS$!(N_Tg6OG|f`(%rp;bf=W$x8nE1|Mr>Z?wvDpPrT=yGc$Lm z2cu6_uHO*CWgabV4aYq_a5Jo;EQ8QTkz{GQ-wM{C=m*88Da6`?+k#Vl4}48$>5&jH zg<))kv~5M|0WP9Qn2=s-R)>7WOUk%-#%c_r3W9DtH+Zt7nm$*WH5D$N-b5BOp$Z#0 zF>`X>jf!{_+Cxn+iVB+7RJHiE4`N=P6j@n$gpWG}wA@;{=01@^WgaM|*efs`({> za+<$%hM{GDlq$NIxeCM_0nQeQCF0oLG2&;-=#&7v@_UAcUsC{jJ2s0Ei-Kbz-Dy*^ z4%sCs=|eHRcoeAqwY~i!>gb{m`H#C9n^GKU^8!9jWw?y{%~+Lixcn!`zl7UDt9Jcu zXg|IE6WgSBsv+D{`UMGgu!RT`JrYgtR1^}1>qc`bl*sI~W?6oa$WV`~9F!YdKwUE; zzQU)E(WIYx72eDs{Suz(VJ!m0pgyzlpnmU!emp5EQd9vx=5WU_OK{Uwr@LzDn#7&v zb?VfvpMe`4ikiT$G*^A{(>mOi*zy9 zABS91<%E^}<7OVfXvG-I@Or_w&AKI2>{UoUlcO*erwYa?KPQVblap7{?%YU!EW`Up z2zl8iK<2N_zrrV2=V(uM_5dL&nJn1AB z#mUzIxY1%PtB-K0Lss?BDkpz|!J43!o~k(%sJf)GLPw<`6!Q{Oad!aLV8r~l;`ID6 zi9B7Rs-bR8sn-Or+Ca=QG_Nj+m=@u1i=>Q$1$7{d6f)5c>WN|mOI{-jLx<_mi4dU9 zfwBHzuSj{a;H<8D6Wy!3nVX80MAO&iC%fV_Bmvsf3RiM5?pcD4}1)$+45oXJfQ~Bcgw#!-0G?Hv?N? z|682g9}`56je3{ucixXZAC>5^?pCs|OuTQtA^=!fYUNIBN)}daO2(6$E_Pk>l5w%$ zo=-%CVk3SR2Mg|P3P-;K;HW+X5`Gym@Yd=jeEA+rEM>Rd;2LX*(e&*1!N=>Mt9PGz zH!A?^AQ$nNTvO5bCsx!2-gF#U?C?A3E)1U>QSC5vDkIjksa>h*;ycM5)Idy5kRl}- zX`6co6@}H+Ul%*spotlWUeUy;F#+0o368&iKJiP8B>D@9?Wg-T549pPe&EbOB7oAhN&D4>=e@W@T(5P8&vHI;E;?)o*pW16e} zmFxZUS^tOp&%73u&d-Tb_JlLtIah%nCL@FQyjTc|@N<{=c=0;oS~DLW_)llMgS-1N zR|XisDG0o3o9=CIAK%=k5qaZ!&}jH8ReTeSlgw$ZCi$k^EC^|8E^_rG$2Kw^S#^Q> znte1)DtLj0%KvAmo6_5+w;Nz@`SxVg?{(DEH0!djfACh4rz$lAcXuPhq^^SnhHt!KTsi<2^iDcbziMYCjj0fC+&)#iE{Iy z_i1Dmp(}iEeqZ+XpV7uU)qTCi(VUndvZLSy)nVD$eX?Ay3&P2>E-js)V>9jO8MW+Z~2F4HAu<|d&U)&mV7;vpi8OyWBO4X|CCG1j(L~(QG z$F#Zouq$h&cX&!4L*=nlmHhsrDXYm*#AGBYath(#QH(=>q=H$R&h%=ywbXyc8|U|( za-!3+ zqW18}hGsDw{@K(9aE~X)_XT-iR>^Dnr*2DYM(b3`6zv6Al#AqHg-?Tz8lImYsIpHG zD{Q>H=)Hu3XG7MD2&-%2fhEX)zrch(D~a!H2-#OrY4q~+1m^q_Hrf&l&bYb}d5zgS z?`h%09w5{>!V&8i^+;&J7hb$)0-u$nIS7Z5MLZ*CT$xltN zmI7TP;ZTw)hpL&qztLC_&`$i%O{pTf^hb80&WSyEDJD9j+DW^GK_?0#nFNSv8C`PJ z>u}jUKOc-B!YR5Li2F*L%FR$Ro~8sH2H#=Gps2G*yvZG8%5nTqi&M~M9beP*sjWgP zpLa;Jla^RzXH67z<08x}S7EdnLNUlH9G@ewF3j8LGvw$TX&DPqq3$={OiMUgA3vylO*GOlohuNMvC*r z*RaLP)?qdz=DsFuIZDJ!QiCsW&?WwJp198Waa%ZwgCI*_<5Qx+wmWyxuXBX&>rIGI z6A;!#iA;6ZA8c~lw3(8!v+p#F?+k*DTULdHd5M-3h~Y#qbbe&u$oVBr24Tnv@_k6% z#(t7n1>$;w=$PiJN}Vww-$}$@0~VvJ7^Fl6u^&h)O)r>5VvsQr6Bt=kpJZ7Na#UMU zHywFSI%Z1N(DaWDT*4SjPXYDeFB!RISd~+3eiijQ7SBX^5&%wMO-p$(on4emA{+E( zfW3l*!W}LL(6_x1+VbwxUnHB7o3~FoKXDoOE|j@9HLc^Um(+PbGs$LV<+f+~b4NJ$ zAVpOiy+I2y?i!G0|NEb0c%Dw59KSg;Zj9E5n`U=}A$(;gXNgCW_UnC3%i6c#?i%aL z#x-qq2I?=|C4FS4>H&LiGmXh7mE&N@?wG-rvcPYPA(OuQ{%3yL+yj_0Gyq~M--g`f9bkJga^ns?@vCx zE(U$V`+?sa^pl=N9M5+IZ8?y^OAtoqlh>r0xGRVXT%LZr8HwlaLQz~C_dTO+SE0A> znnBk?9!mLGxjeZtvTcn4DekIh6yg(Y)dBs66N%Y&Lkahb!!1BpcQhql!yx(E5}&U? zHecFK!edj4A<<*Lbg-tfvXyI;aSyCPQg?)URdAETZzlt+%FZAKA8|7A?D=`R+NSkz zc9q^ZwlS_LL?Cj}(jww)eUaPRcQ1pOv>2Ez7O}sgY6A75XN6G1M|4}v?LH&2#bKcl z%HML0%O9<^bD73*g_#md%JS2EAK{mw>1rYV0|kcDc~K)#pM^{?ama=){g}a}88$W& zE*Y&#)2k&plgRQcAPm8+EGsFU4g!Yyr3z7LPW?_Y!J!@SfgkTlLO*MN)$_O~eFx2- z8uAIez5E2>k7YAse@8gd2Yc^|r3dHw#knkpdXzSRdKjs+wBZJ9Fm}Xlno4_4;y~Af zx~%n864ZCLUz{&-T3SIC2KQ0P8S_p@E2AmA)pxbBzo@Xsxn+(&+^ft1AaQy1c^Mw| zev`UY!_Ga-#r5+ns;7^vzR2g>c3}?iuWvtxzR?pQ@Ju3!?h509rM)ow6sv}sIAflf z*PzE~A(cexi+YTj?>b0E3v}D|g7ran{YO)SN0CH-7K#N;M${V@2}G_(TB$mWc|XD zpJV7)0naMbOoiJs#U-FfL0y7oQ-Ze(TlD=M-rU6Nph8Eva6p5C|1+rc%;KE)57y_0 zMfYpRgvJFOcQ(=7vu9 zO1*=dP^eSj1U69Q3$h#)37D-GGX9GYOyG36d7LAV;ITN?_7TQoNTc?-&T|r>lArC# zLa)~>+KFbG&zQmK6#v;3g{`o~B@Rjb1d*z*7v?nOM-I{uWWmn+&5L8>YuC6+9J;m4 ziK9K-Hdl{_%{5UezQI;n@~%r#)$Q4LF}&}Fb;BxxB8zpVQ!g_mICuxKoE=oAGtxx3CL+gK4V2;pZSX#)j(T|PcACo6 zI?87-`(G1Y(49Ba&so5)cs}=U-#oXswnwCAkc^4lc*aRyW*7>oQ(>J;hztZ+)1v(i z_t$=bei(PhnrIova%bnZE;EO~$HF)O>LFo+T<~ajaB}!D!in~R$|Y^0%?8F=ee5Dkr5qOFzDrDjUK>HIajzajdU<40yvEXuOvt}!EX>LAF#taU z=F>vX+Ttf^VWfBRg6ctSheOF%yooZANPrWMd@mM9ujph0fv)JC=JU)b7y1qOfOZxq zEl#pO-`C_K1An300pr5O+;AXXP21(+utV~f<5~s5_?v2mc@YR_l&I^ z(>ULSVpPw@I{(_$0o7X0hx`J`04Q^mH9pYiLmmD4?wyY!$J)D_0{C8wCtfwhBOw0F z`@`wBP=V8_x0_orLo5G4u;$6Z`(J57jjBU!Nv_2)NYnz-dO>8{a0T^9t}2SY)aMSc zWtIO>l&sxl;t|f>&;*e}_1aHqBKpu4|Hd_jY~+*ba;%#%h3KNmmhzq$?A06%f?BOM zYowGPG$Uv3VRp>crConNrKG<~3Y@BbjSp;mOrdhy@rrs4WVJS{I2o2Ddmdf2^t7@` zK{kpWI>oCY%KPPY8O_V<2fYi;3rM9I2?+;A8Bkt@I~ZIhVH=+8_{DyisVf6gXS5LE z!+&(pO%rT6A<{6ZTgl9PZd%08+Irl$_rmt4#p@d*@mnBimDO~sRnkOL?0}-&i^SBI~5rTwP` zPIa%wN08md$Uk&QA(#J6Pg(>?g_?`7g@mw(q&E2RH>|RWfBC7V9a_r~4(tjDGt@CD z<={F)jTa;;U32WSIM!qzK9nf8%COieZ4?DLOfn+T%}2VxAYXfFHPgS$%Mv%;ym6Iw z^4qPJ02XT6&`$+r=myG?$_Bj(BF!a`qcwCl!;aW=^Z&YYcisYZXaA?W^VC%Pm9t*T zOpWB;4K2zcZweB|bV6wpdc5vYtFPU+WWR|potC)A;UL8BVHMgl?@I~egIgvTJ-ECs zb(nzU{TX2n8Ie)Lu4`ZKKo^jBzVj?z|Cv|EJj{g98OtrUkWiFLExGmHpCRK`r=sy4 zX}^`cjn?dSPjkR~l%Sh|)vw8sXqV0@gzl7@<6kCiBHV#pq6|Bh?lbfXyA&>iSFP;a zUe*j1Rb?Fy_EsswU7mnRN-`lVWJ(^+&JbWnf)J4d$`63?{o-DErbk&OwKMZESLOX_ z8Wz#!a^_+TdQ3i>{D$0YGqb+#nghpJ{rpoJ5PnHUt)O-9-A6!eizRSp}W@M^n5(Olq3c8arm ziv!R32#U$9)38`gfym-A?L z65!L{_OpAtKR!n19fban5oqJrH`SNL*Qi)y`UG9&!@D66nD=`h@b>6$X8ot>Q4P7O zl`pGfCZ6Cn)8dlcLMeDlkkNgw&kPqX_D!C)3b{d;opMrnS$oN^7UHnv?;66e;ft^O z5-^6x=U7!t!&@!S4X);o4b;VMQ0<~Lb4`} zQ+oCl!YzRRNMf|`HXDIFJwGe1Q>)JVoCD)?e~;U**9;6sYkDfy$Gb(v z6B(t{>fT4N6796YinDD7Wr}r|hZ2hFzy6h0937fHO#FxV_G|w3fZzuYtS=uJa>aGM zvqgMX1m6ypmXwIlBYmi?xuPORF-{{=K~bTot1#Y?OORfNgL)-`^w}x9iQ7ekgg{g0 zl%Bedbi4993xe!NZnP`oF(57gi55P~Vjf)PS2tEi zyA0&-VFs^Ktc!~&WPBD=!dHDejS=nuT<@_8x<7UH)K zPdI-|DMwIpP?TEkIZgu)9RK!Prq^B(=#@TNk=*Q~iLUk7z^~g>3AZdgbl5hPOsHl;^=jSfy$V=G^YU21??Md|Q(-ql!j-1_S2*_b+>$ia zy|HYqDxG9b_v4tf!@1-8o6qoy>tOahE!5Hz_bKVsv+=xm7<(MGJegixEDC0sTtm!h z8I!Uqk4gYi$r8PdvAe27jQG+!1#|z}cSYI?+eP5&*>L}nGJPyDoOfFw*t!LRtt?0& zd=J5h$==fW%duDY!I5*z9^w3oz4u}p$@>nNZX+xGROwzHgFj{E9ImU}Y=)WBpm^++ zBevYAugW{Hdg>BE$zQW}<|(pZQ|DWGNTW#6I6xX$8!; z*=b8Io0hETcCd@&UEMTtcpMRqZ=rZu1{Sohi(w&84_MP4|HWN@nlwIj-uo}vWIH9U z{$3;!X*9llre9{-)A_NMczx+?(!_t#AQxRputj-wP+h+BkcgXm`;`Cz5NQg`5q^G} z9v6SSTgWnX^gfAb@}{}!GtlsMTsT2&1?5(lE4m)PYo9?zJAlB=Im~C{jt*fq*L^lca*h)jR}wQB9!{-ERb!>egd@6%g3R_x7vP+sM~Qs z$?Yb+lP!w4dux+CzB9WY&(iJLT&&xnZABPl%DdPq@)-@qH>|H!cTz#fH6(|P$!keX?Uo0N=_ z(i3Fc4FwG1n`0sY#jL)Omp}Hktqn)^mX1rXj_Q4Iy&WT|+gb$FZ@u`+)~4^87j#5e z&y~H~ofyg9KYGc}W=+tCC4GTID-uyyn{LU9rr5bDN+M*H;yVo5sXxpSUSUH`6Nfp% zBI^_$hy?mT&peIWg-IATS)(exjA?+APaVo|0CxRm&j~sz#Z75z927wM=+m^S!bwdQf_vWLSK$5&Z4J_sq8 zX^SD!QyU8HxXKp(=EaqBf{o=4V2yzL@&wS?*i$PTBI%H%D50QYT+aXXnV+~84Vi?N z4o!{;+=@z1h37SUwDrvk8?VR-Lxe}^f6J_Lj@;=$13EZz^nL%5?OdWKuf2b$`jvZj zlk_g!Ty=1^Oa%6-YCotB8MH`l0)4np3&+;&yG#z%Jywa1n*8WE_*9*y3;AM4gtA9>nn@N;<48FFTI+pO)6sc*l`!8#}u z2!3smu;@`tB~_S*QwfWMb%-+0x*dd@(|CnCFsYnehetSEhoG#;h)u~9|8AwbLDlS+ zgqM7HQ9mNLMrp{WpMzp>#*E&rt}b_1WX{_tf}k_^`S<&^v$NG7L?JMog4dMcsFzh2 z;9uq~AMAbWhb_`TA89Vji!hZBgx}Ce3kUHB(>^9N6f8SPyAD3?H)7Mp|0}Ckv^APq zWHp)ssfM_Ip)}XVhJNV9Ol~m6P*WwXUKlH9AQZiG$VDB)#q#5qB+^TUjgaqYM`x`e z>lr|cn!gdsK~JV3&?5tN!f3N$-)<I%i<!c+dVs;8WcuPU)<#>Xw6NXKPH zI(9A;J7?zxPnDbD@Qo_G^qR&(gORrt!?)N`W@Hc6q<+l50R`(X4n>00Ne?kneL#rR zaPKlLv?E?}9gbQAwWn%GevnguhCIv|a^A78oh7b&%J$WQbCAVwvUG)T2tdJF)I_qI zl-?TiLc-=_pF>=K`T>#{>*9^;sn(Dx{11TR z?qBTpw(5kZ|06nNPrGB*c0LLAP;Efn9j%`W4YtMOR2wzA-1Ly#+o~qa*Es#{JMzuW zJkre{s>LsLWA&^TXeNA03>}xokQmKQ+hgRNN+wq&S7_78994)gN|W&+lwY0k zABp4mT-z~C3M49^z+AwRpv8Eyp$VGGg|S}D))myU3%TR#gAl*Lm8_UVH9uGA>H|Y2 z)jlb1J{q`@+t;isn%K=H{W=Zn;9|k4xAFEu6{{i$}Tzk8^)7dHdF_({i1VZXQ7;&sX)8Q9Hh2w z>SJlOA9Ien8|5Ke zEQ>Epa`lJqGuCRL5NjJjvxru-UrL}W@)-x0VtZAn086|<6EFBd6A;*|NTptc(_OAz z0>)`T5Zi@ml%HM z3Y8T4kL@|-V48fuVVVS4bsMu11o@4JB5`Y~tbfafl;4$#I;gXzK`G~{l1FJ4 zLm8-)H1a#ff8|Q#EI({WVfqALWr6ljoqi}p?##o7gHaE-HpppA8)TE3hgEfaWifji(j-x8&ARQY_dN>P-V5=llbKgwc zu1;<_@ek)wkctji0>!aB(1twm1Sx%%bA9QeY+@lUyaMEX)B>8Es&m6bEVC38YbzPs z(&;{Fcz1lvPyLbFZNLFUM6Gta3XId)9Kd6p?tqZm^YGCG=FNer<7soTjlpMk$o3Ug zIj2^U4R$WBFPgm966 zYQBnBZRQ1EZDtnJn$rY)tm1tV;uUu|XtU%-|yJNH8a@7SFPSs)OLFlj{1CEAqd zT7qOINk6Z>eCcoLKqQ8$mgazI9eBNQp9LM~a14ny$=o$Da@-VKB1@impprz@nwfq* z`F~Ly2ls>XOwt36#V`oM^GVoJ_)G>d@F{!h!;A*S=rPEXy~A<@UU_y=n7A|qRd8QQ zAlyw%M{O-I)J{xSX>Wv(w>j~5?8mN%@kCdx`~nV7!^KT5kA-EJ%?eN07- zz;&nG9EFjh@cPx1n=mPqHpJ5J;8(oehebzc5YZG1?cZJ=@|UEC$G~8`@KHP;f{J~* z{^Z#1S=9^InJ~L^e7!E9;>NJFeSalGwE4W60A2Pt>ODqi5=0=DSmdT9g(ECk7_<6l zBA!qt%44dC`zh7<)AxYxE}2(*Af^^;8muH<2Gt#iDKZD9gHG|Bi+8g_*__CprYvAT zkh?$enJBa*Ge2>o;AL+zGA&TiG3aN^wcl}JYOxF+bvcxZx=A~KVmLOpYO3T2-p*K8 z!yvBSXiRi?F;9BZE_>NO*Is`bORazG3>Z=9mMCbX*Crk;g_LM_h$Tw|9J=sxf47%? z6-ggTYz!pQE=Z()1m^9GoVDJnZrz#oyQ=unL;mGqwziwkgF08|xY_#?K zA1y5H@q_v1_G-xmA@h=hL^$Zy;5yH+teeX{Q2)Zfw@Ee^KBB)GZyFl1uXT9$ed3Lu zk2E?|#J|#jiWe!6C*KnoxJtwh2uIm!8URcR6k!*@y56Y#6H89)>rf@JJUmFOEatZ* z>){ZdMr#<}$Nu~y$~0`fzU7DxJd|mBKkR|(#zBn`?-fW-NXu3?8qstAKNCL$mB;jK zD2a~hI7`1pE}PkiAuBhuzqgaE;Xy4KWLj@jQ(yS!60Q%Rxqq_;WP%XRkz-*M^9jPL z7hzt0K*?FgQrqWYJ1^N4b7u{pTQ%Lgs9R@e6w}d1!Es1cyC7XzIK*Yu-oJ$?JYc09 zoMjtZ;OLY|cd-REf`Z-@A@!s03pQYA7;|9ynT!{73H-Zh{!Kq9jP?#z=4||#eh6lj z3{Xi{8PE{^=D;)Cf2m(P7(W=GDp?F5`vj1B6VG5j7ggRT99@CmpN;YSJ3nhCS2a2~ z8cCzW@C(BlYAH`|vz%@XS~OAA2Yxi7{z4x9kOob>sPBR?+BYv$^zGAQ%3@ zFkLR=%3WwU$<;a@qV|a_V=HyBvw5TKiNR`S$+li$7k(|N99EC{l0{^9hCiuT_)Egx zmYZ8;L|A95F>l{u*eKO>>@z8?{x1F+|~aZAW@YYIc^;pv7m6a#AOa%*T*-dsBTtorniklQV}ep!UT>D=O4E< z#>qlMJ$@p!b(=qyFRPP2zR>wyUtb_)pQCm4kHy8Kp%=_X2p z4V{Y}hhH8wHdi)T?PNO>h2myxNC-S564z7}-oGGpRRmg#4_mbtKDli36~2nDL6;Yb zBoq$5MrpLlr7g%!($K{|DTrm?{w7A;<#@p z=c$ zmPBw4*+pB`R4$G2$Bi(5SV1_d{_@_H&J)g6RnMWuZ>fsbfF)5JRuqX?StX1TFf(hp z|0ZehRiw}YZYB*o_*5$p#FNUVj)&LvID(F*TP&4#cG~HW_CT@&^KCV>iZ}9fR3JUY zGV2brb^1GiNE7kG*BB1@WrL|IwHcX6DNy&gsOLlatMh1#gJr zB#q6>kZsJ>c{p7jw$>*( z;K~l+F_i1tU<19AwB84k9*8hoY3tJ7zi4gFr#|J)oI#imMr|xgc#VSijCq)P=Evh- zYH%=gG@(+8hD7F|4Y2=mjcO6GaO#SjUXYVC4QH-TLB^Dm0i0?h0k0{qShTMmx4)i( zPwzp+B1qh7IP24G*voCoal`gxb@VT{snKp_h^681TCdpSQq&g=fO#${IP-0x7kPf& z%vVo^|A9~-4LAp%TRV`yK4R$=TX^0hMHB0(bFO&=WHS2nHC_i8-{OcJgwwZKvSJi| zmnhm{s;TIJUzN`q5Ve=SxBdkwYws`nL>&S3(xD5l3^Tv+HI$tC7Z zxYpxI_~ZLHAh78T#zvSajNMzh9`q_CHOPRbV&#-7MUtU|cl*J~xiuxU`NA60HPR(5 zkb>P+NdFQ)3~;d!kfrs2EUgiG1Z@L^t|Cv}(z+vIDe^1h$eNimF)>bvW2syB7@$v4 ztn%M4yp3D2PPB82l|p$>Z=tiTYxYyJ2AP4+z}-zNhw6o>wTGiaL$8uoh78C}_(i6W zDy&G3RV|D{mR2+MY)TU^U9TJ08CT{LnET41bumWCD{Bi;f#7_Up$V)AsaInaV|Htv z;Bt$gP{Ub@>C;)Q8^?oPW3f(DDoc|+Pw(LGIhmFj81*Ua^EV_`j}39Mf0HRk^(ksS zi6UrmE|DSgL>BC!ODmBKu?2$*blg2(}~Ir=2mn_Z%^U%lf?i zip)UchiXj=_Lr0W(}HnfC-@0WvjAqy;&Tp7Ddbc}772a6poXkUJd2F~+p4GTH~&(Z zbx1KVnhIjDKY#>=`R&*B@P4<44$^PyTgBc;r^+iObt>(*(@x&EqwSvRsyOGcBxR2c zHHv?S>!hw~L7ZI=WmJH!#4^tS!FH8zk)z|KtvF>wfMV9eOMb%7Q zcV+{Qe+U?q@$#T{){AL-piuH=58?6+r)p2Kwxm!Z!)-eHFOTj0{8KYJz8B;x7isNd zZTse-33P+i6;u;<% z#=U(jhzEYYO!mt4c6s>5SDe{)>ej=FYR>RD`&2dkzB}9+NB1kkU9rdFQ#OO{hdw2p z3|=<`zV-$|`Og-ghlGLb>>n6WsHqjSNWP&N54j$H=r)78K0|rk40(p) z?Xt*0;@X`L{K92dEG`F@EpT$)gfq9sRz#$&z}A~Cl4kd=Y~Ok$DZ|0jE8f8MaCR|{ zjTDEo7T2>`=jv;ho0CR1G&Y&D$1bcWTlZDxEPTmFM3{@Nb;}`!_%>Y4+kCr_I9%*d z+ud&4-6e$KonP)_Xt6xHe%UZ{rbPE4Atx z&3fVDa8Vtd+(Rp#)+%7#Oy(D7@_tkYML^;gSms?0>Hw*YIE{$i5>Z)s?uw&HNIaR4 zA8WqFHzUW54~(E{`wLzw^Ps=g_FXqU>-V77_=9rHM;-}>dl?xTjBnm!_u=*Yg(zi)YUVKy~2>wqJteLKu~xjuRM)J6o+?Ujp1chO_U+CJ zKJVTE)xsNrk448FH!v*TZFsI2ekT5;&dzRO$JDvF<9J`4xON=hsl==hH5wtva|3dk zN5CzLpa%N!z(s1zE)urUMLCBL8?vjMP?_izqOkMKH4GKp{imJu7#w`UjQ)SP!pIN2 zohCmLP7ZNAhY=+*vE?7^I?5Z?iu_at!48F=wv~O^XZzshteg6d%$5gJ0xZ(iM;RHp z}%c*&hT%yw|+!6Z^FVJSjTADLw)<&Frj?{hCTzawHf8(m$t`F zuAEBRKHL|w|AA}6TqTEvA=QX{&ISk!Uq(3EMvxbP|Nq%F+={{66<@z1AfWW)|3aII zb+)B%T7iOIeTW_&E0z@$Z{7wo;Z5x6Njge(p%7gUtHs5eZ^km~3ox+S?4^I$6pbwt zccz>AZ3jAYR>HI0^&2}PVFz&Tz`652eHpJ~@uXw%=sLI&7~J0HjNE9`C9?K}q#)to zwj1u1&U|u@A#DYv+oSxz2eY2(elmjgjm+xjZ#xSQs`eA_jP~cX%PNP9-_dG5v@?t+ z@0zz^!G?-HusFX3+n$El(gJ^TVJ<5&L|%zBNvM`SE*e8Oji(}$SbhCCrF^FbCeH`| zx>uO?(@q(f!o|K#7C}kF!P25J5naKtq)Y>apj-H`58~!=;Piz`rYk0Mj;~~Jez=t~ zPCp&OX{XMIDE<4-1ACfHJANKLjM&HQO{oKei`)7cCzE#YrbX@NBXQHu{zUsJq%x`6 z?Gglzw#X#=5JsLr8D1z}Ej?6Nnta171L3l}LRj;c{h0;G^2EHK_;6qnr^pl7>5xOH zQq9C_l*K7DLPOB}RQ;qQx-oV>ykFmHL#$%fIlrD^@;Jh(1gvhee}%H?3C_FYe=!i9qlTa zS~Z$7a)q@L71(Bdb#u1R&KzWtuK2yg`YNYy@$4t-zz|?$p^sQUcFtadQ>=fN-XKU_#jv=$_mq zFKSLuq$~_8bX@{VhnE-oHy;@Ec<-a96vQ-K)Cb*t19e$GeD5-xS!w6D?(SvlY}5H6 z_IuG^#9^7?xB<^34A(aMHI3r*jK3fz@QQQ<1)|7s#UyI-sHo^*+I{@!(=a{> z=$Eq%Aor)Sdh)qSsvB&#@2Yr0B(8@tu*`6uLa)=$Tuuh4-v45<(n3`yq-+!v(7O6Y z_=f3+;iOTKxIGVVT*xoJwQ|I95OlN&dH8G}|F^Ol?KojVjcC z>l;8##&D$xcApAHP$VQYkrUKH1*N~KdMP_7$7UpzRY21}x^saZ_?LXV!B1q0Qlu7B z(37Xatr+)O{{nUpjugH$5f5aAR9(CU%OoQu{9Xcvq$xKxI~|Ib(pB(>`U=R9l#BBop9 zG_u``Tq&sVuh?97EO%D=L+I?#ii{79qa)+2c%KmevV}M=8m257I-T`Q?{mHVhS542 z91UeU5e;n6JPYpKZ1+%4u&+D_Ec{);sP(&UUe2(RQ_;)q$i}wl>6dw}5aZW`frcl(xLLw@(%}CvSnwyPlqUQ+AcsCUGB~LAQliF{4g1x zSNPd#$_}aat>*ox`ci*nD;g|m!*I}X%wbQ2XQDwPZynl~HD0R4jt-N?$9$M=p+i+R zdxy%*n#Yag(e=#@LSS%%oXX>+{BZEWuiR0?Wd1|`*zFxJhuh^x@bCOp`CJ?RAwRQ$ zk|lpXgtwjqYY_P?2T^gMV-{IknS!b+Ry9*jh}2+gNl3nN+71uIwNO<)&MP~5+aIgE z>2t)C<=u5R`u>*EP1WlOW^CI#@RucAxG^b#QvhI1mF_PI(EuNA%t)8i3tmlEVNuMx z@@|j~F}=EOjvH%8K8-bXB;m<~+50U5=zp(D*wcVtO^0Acya~8Z(_FmO_zmDLygv8N z)NbW@Qwn;$31sxL>W9Ct|I@-)26}xx9VHg%NLuk(4S)4SJF-hD;Sy;J>ZTs@E4Gpv z2zOUV)#3l|@?A$3`w$M{HsC@KI#C!TR5)3C{!1*O?>d{{Lm)d&V`x&B#lo3Xcxck9 zD*WG0@W4y;8Owrt!C9@w#A$=2V&!4x@nUI}DM*CWZAhqW&}30!yJ*7T3r3HwwC?)Akj+Cxwa$C>b_XoFm&>4G*vGaI{hkzX(M>DzT3j-mHzZ*h%M9_0C9l?WW3d z#RPokTG!F2vx6%qYy*UBdeClKW_hlW&Z3XKImX3iZ1tVN;PhL9%%snr2#=~P;ji8~ zw{U{rzR^e=L|0{2{~eiK@PP1mx4C}S^t^I7e=stRdL} zgxKH3ZgDklAkPd?_j#f$OnCuorr}I%+ zFU3wPXZ~iXHioYst?tF*J+^5?Vb~!}n_ac>4gz?`?KkWqhv6ZLR0S<-4vvbC&oG5A zrFp7akKH%Indvg#&Rq(DKfv%KcBlP5+r{qgZk!$Y>#h-@ya2AZ-8*OJ#YcOMwJGx- z+K1L#FMmi zTeD(HA^xtW8u~Pv$A9Gcs0`X;-c`))L6(w3gHJgZJSM7%c>7gENwpG)-@+ATvr87+ z%&*L6pQ3b`Z!@re#0<8^WvehQB72bpxV zY}z2?^{_Q`MiAI*dC8aUeBu}%NM65+E|Tl_do(=w{5m4ig3`GDxcuXy8qp`QYW$mL zT}>GWT?I*>6uNvBqQ(%a3a&3Hvppwmal@swHkdR<1mDr+@U;9jW5T_nBdZU&7^bqE)@X#(5dSU+!vj( zX51ojZ@=%&UiEn1vEuP^^Omp{E}^S_Y#8PIB$;|IP(ZhjXy7vUWUycdCUAEa%#%9U z{6wXFL>|G|BwOmZ(Gc-ubh+#>0a{B2JNmQtp%K#V+&J&7%kCRl>#(m|Rr$foY|St) zvA9vnS62+*mS?ED|IzZQ%4VF^N)g%uHx)pT#TGnn_G|yVV;Dx@%7g*PW@2XA(J;T7 zg6E4`Do#~RGyNVh2Yn+=6^Ya_G~dgcs(gs0809gV^XL8dP?c8N@Izo|`tAzIcG%8A`TJK0MxW=7_` zNSHKjcv_iLS?isASgdUGjf>YL{|)6nGUi~A;XRy7`qS03?jiD8^LndSHV;R9cW4@n zHW!JjZoLI}o#_f8O;g4b*M{=uJA3UJC$PDnZGTV0PGi0N%)tF6s z!{2R|OmMVe9=0yH1hg&a)E)bWNErAVN|d-yBsmFpw57D6 zbHHx~|4<9(47Uz*yjyY?0oyh83w z;(UF*zc|H7YrWjuEHV(E=j9Ks?VEcj#z~*upzRtkZni6+4L#GFCTd6}lC6d};^m`B zN_RMzz?IO`c?bs__d`uQ|80ay+Ups9CJ#XD3E$h!g!>5U9WALW=9-g9VQA^N<9IBVFMlR1WQbQl%#NZLzd>az%k2!H2iXl4O5 z0LRI8@;&W9wpnO0SD|$y(}G9N%YWB+JcsHI?;^X`<2&kxZZi)}i|snyp95A_y6k)D z&2|m6A+IVaDRg>eRio9&&SgZ+jvCS)8Rg>;<)Kvr%aorU-~Z}tkFESV9h?b=xWftu zx;|OS&Ou|itj172(z7O&ghVe%H_CLbnIpkxZ$}Z`ga)Kr19=w>%B|ixnU05|9a)=V z{FAkX$+q5Kv-PpJHAd+q&l&vAq!STT4`q3%zx}TR$OKx#HwSI61OAC04Ys_$LL5LQ zeGza-2`yl(8q9YFThRV^AOd^YQ0@5`LE#V1_dZ7XNj^(Y7xt zJ2?3rwaL*<8~#stK#;L@y;{=}^1f2Ss(6=DhIf-%qpaT!>uahWLG=htofo;yc5#4;Wmrn8*6?pBIH-w~|CnyCE>6Y6_0Gj2 zWV!=+Y|bTQl#bhZ`reuxSHD+rs)s18X0F3Z{Ei97gnUKK336iyGz;|_0uzi0!_2wO z9G0#6>SJMP);Vo4|Gb6NMW$tic_01)PfFmm=3sm&J=Abf346%Q4+aF1B*X|_Q^~1N zO9d7~sXZnHp-n#ZzxD5YUaGhhzRz(S>^-KcTx@w9Mrg*sXQj^)OpNP~9WFlK9hYZU z_S%R;H}$YVH}*npbjXMcZ&s2Qbv^fYa4{7VvK2}!Gc8s=jlj4MH*b`Nx!1D<*_e2j z*<=>yjavDCa$_0i1g(73?S}OT>*c@#2GH%B_qIj`*tPTF!<$GPfrk{VHyL!YA-M=7in;$woA_8`-? ze5Vm%5G}XWuJw0?w3@QpwVqDfm!@FTs&v?{&B!PduKMZ<$8FEhb9rg1@xL^fLcP;i zO&xA!MkS}87XZ=q9$3C~EgtqZ&wcqU)PeAjl_=<@YW>;u(9icRGo!b$JE%$cedZOT zjm$FASjGAG4R2eK&9jS*cE4xe%PyvyH$UNv(vLrj%#E{*T-@ZN9cqcRC!K)^#9bR? zB240_t5`YDP!me_sOS}37J~bcJHs^cyOc_p^Dz?f)XRBN#?hWn%?jD&j z+v}J=DB`Sv`E)x@F%GpPZCTpIgCum8M?~Dz7PM5H6YVklVO&6YLl}Fgd7oVhsLbTz zk(v^2iCks7pOary?J@hB7XK=V5yDpeH-|LIcV?|Vs%NVPn_%PA_*ipnOAP7`F&E-= zirYIt|C$obyja(Zb=k1%DTD;mvH;bY+shSc*ap^=A89J8tK(U#ogZfHN#?mnYQ;UmY()u!%l)h6EZp4q{dM88?MJ6BO)DoKgJCbg zL2~5PA>3ej9nIc6WTfZ2w2ekTl3-_JGJ0+!l6G4=`akH-7`!kPb4wpwr;|@Kx0N=r zA$qmttf!A5Rpj7Fk5n{R^5jK@G*AYV4#6p>PAnQ$Olg3QZKl8Vx?xfUKk;wSpGmJO z?@90D>S<#UJc`JM_n3$bU`In&vd-ARV)Wl#VQa&Wn zz545A>LR5UXEI>HhPuRklyk9FgD!wt}lC3TyV%ZR*s#Q)a zT1P-eS(Iy^0vD{M?4)*?iPoha)nnQ4*NfEQeYR}4S+Z=%M`hHBF)smy`ntJN03Kg7 znRr<^<7y+!tSCLs6mK1Lot>0fc`r}WaN91&9vm}x_M=+q%(*hgQXvji%6lrh-B+A} z1^^3RZ4`va51I3)>MzG_!nG=SoCYcax2+(3VUra>uL~&dv#yYW^j84P z#AI>6Z(S|Zbee<$`bnog=?(nH4aigxLib{Qh>ANNqXTFi4?Y|LZNFb5^dI^~M0OVO5NhT+U^kG@?Xk~Y9W-Jj@0RZ%wx{&zdFfivwZFDvYD%51kzjWi zI)~Z$!sBKG)T1?X<8@3px8;6QDewNo;N})ZMaV#9=l{a~ET~D)H9g-;kk>4atXU}X z>x-o4JSZo6*HR9k142W8L2BoIjG7+&;r@2e)#627ABVsD}Q} zG>i_|-%kcW6Y`J~?x`mcFsGW$x ztvSbUlhr#Ycw4M-#%6?J;Zo5?MI9z3Q8 zY{E7Owq7-Ex*R;>Sz5A~IlX!)MK;Rpx4EJ^U7tvJCNIR}O#8*4+d;B@Ch_acwu0-Q z?%oakdQXuopQgttBHEYs|F!$`Kap3&dG;lIcgNl6fyN)0I+~+P)xfl-wsJ@$?GUVp zUst3im(JX!*t7hAVe`$Q`@>(axusM371GDGI~43SFVDsTkyx5g5s5nv@A6nYettL0 z!Oy;F#SwMErWx1QrfqjeJ20Yq-7~vGchv>O7g8Ro*+WOK1_*3v1 zc8%}9q`+5mJ!X_qOFI=W>8atQ$ju%jU<}K2tl491%Jr(z{%x&EU&~M_4&-kGcl`uM zE%F=j>bu6JLye&-%?r3D9w}MuMSVpkI^Hz@hzem37d4TY-j*lG^Nz4}4K^XVf2c}( zYgFuJ2#bW z+Y`D!8$iht>iaTz*Kro(wdjH9;eDY@VW~wcil#(1AQ~t=>@>%V7YxENZ|Mr-39@GS ztI2SmKR4hk)?2d#i#JE-n9m!5JH1JgInf1)&lcN~3St>-I6he=QA1|Ep&tz??anH_ zg`7R`PLSIPh9Vdfo@aMlhM${NZk~8s>j@ro!@Z%}f6^VuTI1aMr{S090vGPh=Z7m3 zu>o?a>~~`D_;;?nW%RPaXU?QX{+wlvW1(|S9e>bf-!qE~Z%b&r=yyLjAbN?7J$+k_W#VWIU!Dyqbd`QY`{qbUORY=={97aCK9PR_T zf4kh5xDI<_tbH(=!rK<#`4r34>Br}?*>jD4 zV2OmlJlanj;*Bej6>BuC_Vl&{cP>5SNdtW;jUFAx;SgQRqTGv(3s zp)RXg2iGTb)<(~|;YEh@PM@%1$eHcotCwq=qehP8`sz@0(|o(?cBq0uS?-zo7%iV}?5+=0ZH9&z(%H_Wfm^h&?}<(Qahq*1p&Xv@;l?>2Y1~Nz4SfXfj-EfSa&Vkr zrq}DMOHCIRl(ea=#`9h%XJeS!OdZf{;CHdhCzvbwkRO;KU=JHd zz%5_k->3M5h>k*kGeDHjWtr4Tsud)uUi-~2KuPI_a3qPZAIXP^L-b3{6n=0c^N*nX z4)i)$Np#Pheqnp?LZD8`<~RAFjb))BBtd2=kB4l zfYyqjK9}B=&DNNT=7`z#amSh;n15y9mQQNj?w?Ty%iy>wYguu@tKjk80iT0m7OxT; zGs{RRNlz71^W~^&Yf`KAm8G(^hI9*ub2kMy@K8|R;a_K;9+^6?J||GRId#Ox%b`t+hV zF%B6%=`^B<>3xFYRE6Oi8ffJ%xrv$P-;y*pZxk{3$`iw+vW1~lq>Yld0v>AF*TJJfgD?kWf~_ODc8zL`C!OzPZEU~T$sMoZwckTG!? zCg}6rTY;?C_M`&P_IY+W{>T&-W<0282>PJL(>!}t4>Ewgse-g%uJMKULaub1$?9I~ zM5j1;FdS_nKG#_0o%_H{+imHwmF=J^s+O}P%Y)!D-%A6pPWi!`_dNzc$CQ-&B_?=Z zd5$9`VgZ0`C|3X{N0oE070}iyL}5uM+V%1gWT{-h$duT4uKm;=@aui06jVL~;@MY= zi(vZDIra$mTFPmz9#cdfm88SGzD0Dk-{z>Jh*fw0mS6f&eKnW#GD@b$TWP%fz2bTHI{&FyCl6^Nu(Mdw3%zuZ zRM5_Aa%b=yKHK=~z+3j3Y0pm)>pS|YU>c8t;$xo6F}W)Irf`FF-0+f~MAKozwNJWK zU*93XL8eN7`SRE(Ed0m58ekVJy3eZ9ymyJ8P0ik6F=bAGDPV+ zT=y^wlUb_PjNm)tN!4b`sNMTu_AKEU zx%_7K%vc+fUi3NvheTxTB5)r)vL79NjRlD{cN&`HX8B#iB9;65aAMn_mejtaE2J&y zt}e~pZ;dVGXN*HlwBc*H+#xgmwyk)sw6ckf;>-Bm(8*b{*R&54IR>y_Tz#j1wW8~! z69b-u6ccQ=th)h9J8lqASHOHaL-*Vog(8e&cw*@6I~~yhr0bzOop#QYRJE1}d1M&} zM>T#?3nmlo+TlJqY^B#+Ha71Z3qizgkwThkzYJTH{=#Sy0*w>D0`J@X$7%Slmh|5L z;A-mXZ7R%bYPyK=W@NP9Q9?*+jy}v9R!Wf|?D4_O$Ghj3ZlkA3f-txJsEM!1fGDhk zv)nzk4yQFQu7Z%%Z)FGuEUl~zE5kQ(N|!@<-FeNa>TmK3x{NIvQ!$Fx(%mqz?lLu` zWI)ZrPHTth6UDSV8s|5;3x~S_)Rm++*SA_;motwiVv5nhBwiDF2NB*&OqTamkgNTH8d})-iDyCB-GGL znT6RF_}?RFfAQERpd^+&3Y5@^IyqvK8mJ& zY=Vz1P8qF!q22{!EclfeTd&5`&{S_o<(3F9X@&OWkBfG@?HS>PpgRed(9)nRig_*& zQd%vA)tD=#bDYix0-wtwpMm46InHpEm5~1;LM5nz=48moG{-);2J~4)37gf2D1Bi& zl5`~Un!e8K=LbU9r-~>2thsV54NE%heTBhYC>6Q}VxfKWd&qylo z-FWT}Z@tc5AIvi>gB0Gdl6p`tR#w}Y1GlZKOo0Ms+72;N92cf3|1MnfAq#m$UD+Z3 ztzt}#zzZY%Wl+M!r?2!y#D&uxpp zZQgL9Wm>Zs(ohE!f9oTI9^Ywn<{ypNSxaw)tHM~?MfnLAC3?Fn#xJs=P^b~ zmMhg<7^2~0uFj+_MaW)ERg3|8^xXlw2`TES26KJ z{*gN7+q1%??R|5>+m9zz{%M~NpS`qSoZMf3J9*dh`c}t{Z*7?lskztly6{B_ZB`tY ztG(^>>OReTrc-9<7FtuZRIy_GanHlMcq3D3$2UrXEXm&?e4h4Z;RxIIuLDvBo%5c$ zAr!Y!{qJlsn*ezQjWlpQ42+8XBiku+WYq-%){^`3XXG{SF#Z}HwG6s{Vn2l92CQK+ zhsp!)uN`G$@(R<)^#LFmg_QIw@*Dy^5|`x2SePR4ib1S3(rr=e#lI+x&d-$kHUcq? zcm8_6e|W0|_yIRL!R0}_Wnbix2JpFnzVar20_2hs@DWvoXq^l>aVStefrV0mJsahF z)+fWqlDDeR;1+wjjekO+z;?4V*$kq~DdkL)l)1RIttJ?&`X6&}xfFusY)_9jsA@jge_mD?H03jI%YSYWDQKE!bgk-1q*Mw>$IE z)4P>mT(yn#^Xyl?C7ZfS?3QeA>SO1 z#WCk%jz5m~CIl*!o~MZb5{cA6*+jm^8RcQsJp577s>O0{pH*s3r-DoFlPHUhC509B ziqp^J*i;i3g`~38<ZrEUej35?Ac?3ebhBEn6S)u+PS$4gBI;g z@B5HwuYU;pXfG%w-^s!KxSaSpjrBL8Nl2w!9>I!g^d<{Vn3t_pAG(p?&6iornI^j_ zAw|f9{$B9Yg`5cvzAJ8z`h^#uoJD5BME9K32aHA32)Ve4xIz@P8^A zyQ(}<619xPgtJppqhbNH!RqD8&0$C#Q8H;lLj8q>-C|4sx_-P*U`^WPPvUf@8L(&q8G2KWvQ_n7>A+dO_DIbubwV-sTN!Ftemq@Crq!~i`xJ< zD}A0L)U$BAZzJw{@qM) zJ7NYu+}$e+A*UPkb_?@_qFYLTB~Ip8Sk8OMQQ;5`uA?dYPIgw31P(C}+H~!vn14na zju?3ryX%e|Nk^mFF*%Kaxna{l)5>>l9qI@*6@E1(Fapo;L5C>qQi>n#=rqgXT$E0c zr`xMjkl@_}Ux*iv&o9^#gF!Dp!na*S9uw6JWCqV1{L~uDO#9sVMJ=t#Lq@QWePT@< z9*ZjAua`)e>62PAa!j-jW+vlM$;M!P@xv?s^G9P>^pzvq4>t^_d|-V>KTJz}cQ`FQ(JYQH2w_ zqb39SjTb-_Q|5RY(1MGB-LpF-Ymq14V6n{xw!D4~^YEKeNc@6rh}0i#kpX`~6BHtq zA(4(@?jf{XDWR6Z5#Bi*nW!P8sCzR>srN;(Fs56vDl zWGlM36BCDK`<5RRiOgB!Hqsyeq-Ry*P8QUUpCQq%w8w3)jFw-}?^3>1CuFL9OU*Fb zXb0r8XRew1dimk60WfgLwI?uO**}QG>R7S$<9D9in6!6K_${vb(Jkcs$fmOuDW22b zMjWI+rMdfXu-BXAw)%LGV#l0-WZo~Xq~?)y%y?>V-OGeIucN|3=^Z}379I`Ncj-cK z&RbH~US(!0MVbkUbP{(`p`>E5$$j^X9QEZlu?#HDnmQE3pPaiWxw{Bzl#MlxuWo1~Q>e)Z?Te4J#T@is53Ls;Vu@N!Rc}{&hBzQc30}QG2-HeUr2-;Un8@WjUsxJKg&yU?excwaY+9JH4Kv4<-0;m_Zem7EX63c@;dt=qCe)m^PZVHAm>-wFb!CP>{s#1-@`ZB)qtby;y zS8t?*dS{T8|KavHH*dauz7V8|#d|<9UAwq>e3IvSKmbekfs`Dko=yLowrHVlkF$ov z-mN5;omUg0*8lK81f`-T(qW^bI>FL=ir@>g>^D4BUg>l+m*C+M2ogPfe3$3uXHV2D4U0{5g5J6psIfOTXJh? z58Ye{A}8)&(5Cu3BQ8$le23%VR#R-zOh|H=*j-7fGl6E%>WBl=wbPr2i+HDR41p=LVk>>AmR9Vmg6`B-b+h`Yq z4PNhfquSFfO)J>RW;=o|ZRJ`gmzi`iF!3i$(r9uTsC*uSa^6-ad=;!pSp6jKY7!Ih z7%aso2@ET~h3skO>Bx0Uv{5eM49qJ8z8~Q1s^SDQw8VwkVyXxh4Q(iPnHwqDU&g7= zcbX@>lCf+jJx}VU>~cv~UFCGu0a>o+*Chm4@c$uPEht#{(I`LO9;)+7Q~|mb+6{jt zLpVSFC{Ca5`-c+rf}$#Jwf$RN%i5FyZYkvvzh9Uc!-iF{Z$}}OGb>hre~>RlU#+6B zb*Ru-h2Qn?@t4f)&98eB0zlZbraltV-fXlt3U=Nc>Ak7dw?|;nw>3FT zlR}zX8dB}n4K`pK|kSBHH-i(w1YZcj;1?txFwuBwa02LQtqGC3$Et zI}x|;3s~!+*O)yWlSnG>Vci*C6N4XZZ;Adv$4~@vl6GXRUWltQt300K+puGmLC?4~ z!dBpm)4e8tLo)O9MqXa)XZ=Z7HH=mj00IphUge>kW@;~Q{AwX&!tD=~ihv*oLXEOW zYV<}5OE^0xb%??7;F^z6f3-SYaW-H#3h)Vx9O(`vAN!owj_vb^-p(GBIo7(~MiE}* zTYK%-x_%RX2cGKbt_T z{(s`Q_g>YVL-@A2c~4;m=>)5v=GtVQP!4JWN$;ttO$b@~;IBTdCP1YCQa)mOz|T-r z62)a%7(zq;g>TfVl5a!UbktxYMLm;+4tX1tLu;jH%o-^xP;cJY)b{-{MwV(lJstvc z*9>bj#y6!=Hjg;N(#5iIX|rg@@s!*C7T{!?;VgX?Xu}dO-t(zu{@wSrRcIMp2qK4f zZfoiz;IbO{Ty%A>W%+{dY8lfQ?!>UkyBXhYe48m+uO0=ja4<{(naaQKD}~s(lJZcX zVcBF>qFwHD_<5GG@DY6#FgY1cb(u6Q1>?UXKBLS;QiIB(Uoj}+Mr=o&Y!BbIV|(&0EMB)(p7S1jls--7R1?JyHZ;av zW>XOY!wRdkF(WpLVjRYcXmFK(+kA-i&F&*aw&;S>cwE+SXh+-#CVIV*i6^- z&7|f}s-Jlh4m(4vqVNsvU|o_xZJUo=9JI29I`iP!cV;Z!q^~`)W~+R@_9$S(uSLww zZKD8Xfw+Y>XS{b=6mAI4fo`Ja^Y@Pud91N{#o=s z1Uh>sO^>AKWG;X~gQI?-KsRcS)LJ2}9m3oW5tm+?sUsx8WX}lxUx`WelH>UCGAw}RjVGphKNqOT6GlPl6#2nC@}I*yix)Vl4+FO<4yR9tiJdcs0Crxb}`EjQ5p9vA6) z$0U(=!cpJn<=4Z*>~&TORtN!iO3G~DNxg|~7Mt$n)A;VtK8SadUNp%Mn^l5I*`>D) zVx)7m^6m75%ahcw$EaMST}7RTEuITI?^Gewo!=fYL$gderxrtUVF}q;)#HS@Y9_7B zUoG&xnkF{-Rlt)@VS|6M*u^(JD`Hc=bmYk+n~4W#LJ8uoB;1wphiT z=Xzo1D)r7#pl7Zt^uz)d^W`}SjyD;_PBmeW4tRSE0J9kMdJzAfOvz@_vL7keYPRm; zZ;@ugr^hChcrUQ%d(zW$bL4VZqZ&X317!8 z7spJEaT@(i&+dz(Rw5n$__^7d;Q+#EeK?-6FgPA3slp=Zr&bBe*z(6R$v7Z8SsBer zb7XyqG}=9j&ig3GFBS+QpK+EylZ<*>7-bvP;tX;LD~ghR#j~qNonj4_Abw~WkADj) z{-~iDkgq<}(rUNOH&j+8>Oc#W`RaJi#6(EvPUSA0<4HhH|KUXcp{8^2O%{T0dAsq6 z=$~Nwfu;SIAx{h(Ph*pmOnKtDO~sE9R7%^p_%o6!`AQYRUa1U&Twi)$GhYcd6o-)a$T}&8OF4a&8X0?bUE$AFaBwZwmMd zygF3Hhd8#2$iF>~{@wR<>aoy(kqghg2D1r0gBA~lPdVQb)ZyMJ1`4& z+V&$|ysk+ZwaU{*0VCr!CmA`wdco^!Aaa=rf3IcC!S9%sr-OXt1;d1nx+4xTTsPE$&vlM6yT^Q>mh@;IR5DS zn;M9zpjzFKUis6O{-Zu^UJjbbn5DGc&wSSoCrQUl0bWTSy-$?yxqG_6EuvSKHCne!9%~=senhXhxx~s@0x3&2E zq5kOrQDgpcEBp(`2G8(s7@`1qsvk$xFT98mNsjgTD|6&=F+h2ATh?Zzq$Ct3>5|6i z0LEevddTmyFUdc4jxU2Ir7@A{f;({b#*!o`y6CLwxCYit8YylhO*oPLo_F?{hDv&X z{DKQ1r#yBQ%aDH%EeoFO6YbX}-K~Uikca5uf%Z3gMlHxdb|K8Qz=D#hlOhVaB@{QQ zA&AuRznGmW2QqQ)H(JUDXXaVFDx3#xv9osu`iG1)Ivociqfz0S^O~D#N6iC0@{LId zX)r`Tg4hK7ckxaihEv#?t-}H}_Rr-e;QC{~?&i9Dbxrx=PI+aA{T<5`U$ud;A`pqg zp4{27Ji77He{#GLv8H|EZ7F1G#dZ(yPn>9;( zJ%5i$N}c8~NmcU&1%1 z`~o546&a-BWdp>Ps-fq-KMp(g0SEyH6v^9o1qd{(PpD^q5&CRlX=a_O`!Jt;D@)%P zeYSd_SQ6#lYwbpW+*&`^V*QCRSb(7|P)9%cYv1(e!^PoS&&$Xbu}SEYV#2~!(acup zkRQryk03XjKf!TDi zRlIqWRJB1YgtQ8wCJX#8;=l3VbY;mt9ahC7IR2YHmE|z_35YCdmU(`CJleYPM)|DZ z=;EmbgV(JV2^I5D2P-Z{%A8$Nrz*^YwdhH);?>FGHoz!$`C@S1b(=dKQ|a3E_MTj^ zx3Y}7&W z2A||_N&@}14c^m1d)&JGf>5W%A__4Y1MbuRqXVM@$p^5`J^yGOUig?>GG*3gbN z3TOWX2|*M`q@1UJGOf{u6=s!a7`n}M(es!ZrZ=J7v4t`^f&+AAjJG75=|QwpqmzzW zWD>r}``ndK+`dGz-I;h#S}6LPiIg9&FO;(~G;vmibyAme^m2sC%9n26juUR4#z!ia ziaz; z(&!hTgC|~z+Dm*fmzeDY$*gx3HrJW0k&wpG>;)F|C2i}F8I`$c{vt}ak;=4*g~ z)+Kpewh{rI85I16q4`_&HONRyWyfWGDK_a^;lP`~>dX#_sz+)|!Hu7ia(LE|%mv#e zjeHoIe?-MlI&45sS_NCjqu`iNtE^x3Xbz$A{XVw!BJ`Uyd=0{$EeCjz6u5R}iS4Z+ z)AohtjqG|xa8}_Us)O*8TiB$60xPpxM>}7n-L{12+RN-3HAh-P@u8TW-3ZzzKik0pfH~rE3-l*Y)ul?KN#cVm*89Ud6r# zxSnas>YhN&=uzM5#|;3}R<3{RxIGjQ?`0m8p_i&t)>LE@Rjkk`pv^#zCs%~u`iuS2 zzAI&&jmbVpC_EMCBAhKBQM?uG@d-_-G9<2>^y#ds12@Tl9R*T9$J1*>+1*z*-wPt* z1b7FxDs{Y7Tl}vtHb>Kw+uXqAl4?aAV=H{L)k0cp=19qfAA0h5i7s|4?@r8x{*6LM zIW3-+oN9gNxgg$F`z+C46q@AH%kz+$mY`QHRARv^C7u zhG2zBxzpNr#>us~JAM{j`zto2$bBEnCstSu7TQ-s0Uw?V0CF^?{C#BOH$(r3Bl0<6bsv6|@w^?!- zcpumx;0AXfqc)CKGFv?8XZCVAm*=WfNoK5R3nk%@YJn#?6>YX{Ef+pMycUJ)X1!*L zCGGfPUw+~hf3sQkV0U4C?$m*jk0cn+= z*ufkre+|C>Q)Wq>Ze=-`Bc?^|QPMc$MtBbw^XagMf_E)>gV{sQYG@FGOqo|e^iyMvh&?H6nNmX}%OX_4@lKI#M;RA#e7UFwFZjNtp?{So+PsWFy!8#Mq)ANW@JW)Wg6;UxWB5{N1RRP5}5y zc`yY{dmUmO?x&GBdgiN{+JY7+4XI#5CdgrSuuSq9uUKkH!w27u5KLG^!D9PQ`7!7E zqW6qg3c(9Q$E`Ak^J}M|Dp31+vb~?0$PnEB#}*|+xB#V*yENn-zVYR@234t~cC^P~Yz9Qj zK;RtjmsXkz%^uy`f)*SV6qf;nJv7~Aw3%oPdU}0Q>!6s=2QnW|zcS$b%c(W0(lo9r zmS($vHLT=Nu-xyEU+I8uV9kK7yJ0R{+WC_54P6LP>wR2!ZlHix`nZv@9B6&`vOm5!&$sfm{n)xN3~jzq6e$EJX! zAdDEy#_bst3xpq7XN`u!P2wKMoNp*gt@WsP8L{o#?(dsPdVr@mDPzuorCR$QFkSfREEBdY=0 zy^cP4HN1Vw#1a_`^bI_SrJ3 z&VIB&OlsK>Jf=P$D9f8nX)DK1+B&wnwzT(CJ`_qU>i@BWaach(PURNUp95WbO}>K0 z4H zx+ey>h*gKCtAnPEBYA?8CPPXh{QirZmk;dKi{E}FNo++Qs~vt#dyeekI~h;U_JB5A zXC7kULC4savS2jV7fCM#eih95c+-Fz$vj8tCT0T85mF% zmOgLH7|?DlCo;Z=7Zj>33#iOE&NE`?opikzV)-D#N~a2Ka!!4o5>n6dUD+hh{P?W< z$5lY<+DNe-p%t%3^&t#0uOgkvewc|R3;fjM^|UtGcZtg=_;+%E-F*qbBa%#JX+6wG zwOfrYA~N$EiZ5ik>%-2kJa;D3=_i4H0crHmwH>214@?C+9D3+2sKr6E{il4s5^^KI zY-mre>+8K-mddz+w4_GWSf6aHt^Iw(y!MQ+a#fTU1@b#BU3{e$V2cBsK<}`*5d@Jka z06sTLXc6{%WMBc7c#;x!f6BkXCYSxou#XGhCuT?~1LM_o+`g15q^~z0dOTy|H+dyR zT}2k%%aIjb-fbAA660T1&B?R-n*fKfLe;t7W=2{Yhk{%-hL7(*6By+#>_$a49o8aLH z?NMr#=}IGO*?ibGI_Ztr!~T`@Lf^`*YVCHYA&rorwF;iP5b5z8vT{Vu^vAD1Ts*aE zn!=7$wfB20(t5R0Wb0{V z_UhJA=dr`rgiCfB8DFJ_j2NWKg`}>5DC|=`VnL_=#kmKn3^A4k33#Z$>jml3kiA#_}XeC0(3C~|) z(ia}*dC`Gf%3Z$7h1 z%~7MaorcYrD~de7lfPOtl(7~gpX;>v-J7o>qK=(4)F=;F*zn;&T-S{n4|DkH=MK_P zJ-G@47Z(u(tvw_xSs!s%`4v{~{}K_o%!6a+S8fHhl#U;M-*a!?Vu4SO_4V@Yt+;9Z z*OH#)fQqbkImM)Hc*8`OvcsL!r&YaW3_TDR(x!7zqW)i}TjySEc9|;e*+CYp)$WnF z9#5QRN@HS;&?8T6JGk(j@;Y~UnG&#V(RHPTvv65~SYLJ)i1}*jUUGVMk}=_3)~+#b z@X8z8_x?S)Wq24bQT0iNZc^Bxw?#=676}y{z442*g~@YtXzxqJ1O0(jmDmZ}j_l61 zZA#9^ZMukj2-Pb%NFresBun=7Txvrp7JKj;6b`sV05n>X4f zY1qcLt;SB;*gmn@6WeGS+qP}nwj0}a<9oh-_t)>{u>a_W&*Te4a{D2dCWktfoP;ib&=&Yrm+ zyy#PdBg4D2G(L`u(SX6jTE>8}bY~1P}3k(L$u3jbNPYESY^* zsB;C@e{`Kic(xR*Sgk1t4xtdz2B7qz@F`$(&>xqAc7YixmTTN+&YxAKKK#v|JeLEc zf-qI3F2k!3kVzmxw4)QEz?$XudoW-jQ8kpo33xH7Vd=QZ&bqsFDSaC@Xa-%tp#@Xh zvgSW1@d3Zv%=TRqj#Dngx)cL+-z6vo#;uWskvXNXf=}q>Du~EfWVRyY%v+uI zps;{GPuADHzq}yR7G=F4GZ4Bw=-WuRG|QcE2Cztl1yB2npyr4#b;F;C^jER3ykiI! z?Kdo2{9)kvDUi#jTN_5zR7dMnfrDtqt&aXobTtutB<9oYpz8+~HAq+M&}r;YvO&U7 zZpqOGvLDtEp=E!!|Dp1%(T;6uMrXLhVe%#+We{GxU#>ieVwo(pP3DHqO1b;@fvzuU zn#cjZmI2Y(Eu2#W@}S!ZL+G;-s#7iX0JZPb{#E0afbl<@%2D=3Wj5W}YM;CDYPpTD z)V6FLPMTD1QO*%f;ZCZbB@twb&!_vuY8(HRAMoZKrS9}UnSgR!ysSzar>(Nbse`d) z!Gk0_f+y8(Nh2l5=}`dlBc^D%1R*IF7HlKV;5jF2O!UxMj7mJoH0SxSe~+or)yI+c2PSzmTtwV5hmG|LQi;~wa?pf?e0l&#isvwwxs^poK8 zRE?C9V@mC9S#SE^6FD9WuMW>2_a3hv69dm(qVaz^=2eS{r8qKmYikfEctw1<3;tEC z9T-CuYX8Kqe&4);(9Ny*cSBzzloG+JQ$~6hj)ZZNT1OgrG)z5ow#LXcEPTXzu{sM z$w*ZfI9+-e-^_4BQBEDLecwzRb+p0p)S!9<+>D7Qz(gjQ%iU<$CtVm$it^jPl|abF z6zO4@Qk0;?HS&@4aNY&Cm}Naj@6{FP4AbqwCXZ0@rkW>gwN_N|lr`OY&lBT$YWDxT zkG6Bj+P*e?_?=@Ub!Knh*7`nb)%bcj>+MzhdR1uc{c?2v+a|HV0as4ajl=u5%hT=Q zzLAqi!AitIlfLXDOQh=20x0gmIgi;t^;b z#hOaecrL;o++V&pXtcX~Ees{9);P?SewLZL+TY`xV>V4!E`OpVi{fD0@ws+>+}tB9 zW95(5uy37Aqv%H5xaqBte&;~xv1tU=O8!v>^=ju@mu~qVqqD4>U+EXooKo6KGF$~6hTZ;jLpzl=8kUO*>LQ1iqV8O`G3=3m^deki zVg={=otsMkJx z1lcIX6;Y+)^ee2-h)Dio%1SNM-y;5dY!zKk!5fD82@w=N(Rb2Y`a_Y4ZR!(yGPH9h z8k|ugIMDcH;n|u=-ORnJe5fn^1~JK0;ue^8ceQzI2-tBg_St=sZ?kUFk(3G%hO_%a zzZs(SmGupkBXg9U5Yh9Km3_dKBEb4kPtCw0qTrE_YJe#~C8Zgzr-!}~vv?e=f*(mu zTbsCxjQA-5%?4QQuxecOhs1hmf6$6d5|WB79MRDym#nldG=p!qUk7U+{e!1P*^#IB6&{4078 zeyZq@wO!>Dq*$np`e2rsi71;&Wxc46D)XIti$QKB!fHx>p%B|#GB!8lX|^b|lrFfn zz*5s0vG*g!!2fe%JLhLRY@iQ1vCY!f>|$MIXZm`vS5h@3gI9=LO+1sM`*j7nlx^{A zS8H#twL@j~)7I9}qN7bvgzod*jy-*APG|HLT>=8d`(W#_a=BNL*O~Ig?L}*0-`CDk zoQ07@dz_0YFbhp5faAN_gIc;;?Igfa3sCxeez_tv+s@y*B41)GC&to1i=qBlvlh&o z!H3#8>w)Zy@4yeqhpa+7!qCuGGZLDROq=oZP#?&@Q(3ydILQbWY4KXQHTd|pR?AUD z)1ge@pjG~U7c!m|9%xr@%Ktc3dDr)=*PHRI8>P_d^8~`aBi}w`sb&Iym1eMySMvl^5_lU?Qg9R@=HQk9 zFUV!DqoOFr50QAVb&|00%XcUH$T@^!H2AX6CsmKm_~e=nY!P z>^o!qM;X0htFFLp%t`Xb_~U;u;G0fvc#ZtY_3OOph+P>z;5$kox>-wFj1fL%(cukLwNAF;!6pUh&;QjSkre~oWBZqNKx^(wZ8GT7 zF)hx^r9$I4PC!LY##t>h_&_fPW+SGkJY|X0FEDm}&D-Vf+{eqZP(O4QUxkqSNrXQ+ zz3{EDDj6A`)$4S=NovoEMwL2M$-A7_Wa#_%@zNnIhuN?}`856C5TzQuzbPmX->zr5 zi#qalWU$ys1`xlo8QRvN#9x4q@+WswYQdJZ+%sk%O+Gc0nE&B5YzA*7F6 zMssE?8TH`V{|?8}CmG*#x&^&wQJ7jx7Peo1DA&7Lf)YK((Ju*&hDjNT5!x>y+?@{_ z_M9<=x_v?bH#KVoAuLLF9=Y{4w!*U&$H4u%Hb~>qU(GlQ3zI|(5{7$H#w!mSC*2H& z5l^H6A+9x3Mq%J|Tznp=Y zA|;Ajoi6Vl#2K=asq^mNIhEh;R_$!}>#sb+bc78P=xt^MIHWB&O^6pFXl{d-Db^aA zF~8bZC2?)uLHB7}(V9U0A+;%*L?-)IHaEXtnneK5FFh<>2=j#z3ae|?M;Rr(y*F3q zYVE6zgM*zbkYpX7^Npyv_@`wqd#&RT);yq3(orMV)wzd)Kwg2ettjzxu2^xCw>)FX z=S$=(1)L^`ZWI z5w{k`ff9v7vo)sjX|v$`(8mP?Xb)nrj19~B-hWRnftf31IESNm~P&uc39-1 zUl$VxL$0-@x&sSQjfV;gaKB%IdbKf7Zj3z7d-~Fs?;Nj10vQ93lAybq?)IxhH4)69 zNaUdkt(XwJrb~4bcirs{*#ney&KP@Y<1E2~ z#4+%d66~Vysm}xZnq3-dKH??3rutEn=0Nn4uXw15;$QAT|L$yzSMdF_f&irp!@9!^APlI~lQQQvc|!&dNemuMVQxI_#e;F)#d(hMWxX z`ec?eumdptetICqk~tfq$9a+*;^BVOA;psvqv-y9?5!H76+9kJA*$fT6-D0H+qWHclixoBc`R%$^KIY1LwOeO(O?*3E*%TsC+J_r2O@IDBM;<8;kZ`ZwNv?sAPZYaIho*Vd*9PLGJwX~b z2=Nk{Q{mbfiaEKTvZ0;qs=gBbjjyp*iYYmaPq!crakgs$ck8+MdU<*KXzejS%EA}E z6gaOqBubBL2uF(5y<3dnScdsukfJoM#?yrOpCyW+PsiJ}$Pj^K>?hB%jlDv@o*=~!s_&(v~hj<9{c*C z&Q24P9F@y5;&B?6eXtV?0zrFbrKIZ5&H+TXe3aZb1!#x9fktbnzOVz%6O)U?uMeh? zOvEu=$+@FXJJ2wu@Yk9ct$+U1Uk)Vll!C^sP3M0ft~Y49nkS$Hch)MqTa-@)OM>^_r_O3-fl6>Ln$l>*aAeN<^ig#VGE9_H zD=?xfW{5o3U;Jo>-?w*gD1 zp-PtQ?oc>|L?V>8Twc)`zDGteo16Aa$#wy4Nkvdm;n_cr{8vtqP+ov4fq5bf(x1_< zBy%HQI6f2Rh4BV&Th!1L_P1#T3ac_zRn7Ihe-u(Vw#>))w?7qO+Z6Tvg^m?C$!_l! z)HSo3WDHfH8ifHXdsK`qWwJHw3@i`GHgL3f|FtmR3@*^2x~Ch|Ldo=En@jBjMBA$) z?0P9xTORSzwl{}@ypzvyf0J-&o8I&RXe>;GgLAoPZ@O))(QhBGgZ!duNFyL zF*)43hWFo~aclZJENi$xDEX7(v$|((U=J3OtKw2EtS}OqRVQE6BfHsNj3TZs*aJ`QXe<7n^ zQG*{}Cr$1EluyVv*`Ix^c;3gY#fc4c8xZoFX55nb@UD=|jx|y6$py64vRSd<22EQ? zE(2(yTT{qpl~PIogVa+?h1^%xj( zZEV!EMTgc8Q=iiE|9gwu9OI*{eswnxMLaY%NzfU(4Ww&-o;|qVQlFJAmKkMJbo`R0 zk9p|=o^WZ&a{6zz8*DGO6V^mkZ^q}=8rl;a4#?vXv{~aIbLD=ZZw*Gy*gNK%J`(>Rb!#iLt61?ZJdiZ!c0wa744kcaQhW+o>uZZXFCt zd9KDBW#tf&L8emJmU%&k^2H@M-9;NXovs@MwZ%r6?mwfx>Ih%Bsm}?C=&pGA)I<|o zLQzDf5Nso3r)=aId0b@H${K23RL>Tmbon2GX`55KxY)vFfaYS59+w`@x#L;0mH4SE zi$@rXd9MVeyV~%!jetx)rga0)J|7~!h7s+>#X(@<{o}(9ReXGM`;*t2uE%7Q+Rf*J zKOzaJrx_ zDCof$PWU$WwK$V!Ixz$}9~y?^{vh&bbLfeR>hVqc^UF-leQ;(;;c;TNN-joM_fpEQ*m7)4%MA|C5EL!epz};AWn)+0q+QK2M!Sk8KIluZjkHJ3G-F>0-sNw-@l*E{;= zl#SEk_1~6OtdW5p`KxfjfHgmAaItME2PNE4GLo%M+O2pKx6SOb?js+a51QN*l@$Y~ z1`!l93}PxOXd{l<7ou^p!qYh;h2Gu)`yhput7~l8otmM05vltgPi#Ki<_pzm+Q`U~ zVYtsIrEk8cWEg|?Y)*rTh{j-O)C@c@XS@#1GUYtL)KqtfZFEDQQ))#Hs*Kw_&#TLF z#VR!){*Sz~0bX`@z=nk5p3H90Q9%i_KnRei??;=k0w|!Cl+c+qT>>aTrX_R*ul_|L zV~09nt2WN)6_7W}baL|0S?jqqB zf2IfbIHhtUPr#eKO*ikSbt*jKpLf1JXvX3FE}PpVJ%YmhJ%Hs%=KE7<-bihTRhYtT zJ$aAzVs1?jwZZGB5jsOl^HrJ8U(zHH|HrA-=ZcMIcKVZVL6A~pZ$i<2!JRu8tnnO5 z)2J>xhXoa6B!G);QQan7OInINst}8e{l$(si9>7?a=&|H>alHX}~jF1uuAbOS9nTH&c)0}w}f_F=&7cuq!%oC}Ob!ceUQ z?0;=e-Vge&2w$UCvV}`Lgam6&&1-SzY8s-bO3q74jRII3nGnL#yp%`VN6FYvRHHrP8*X=#>lncAV8-Q~>sX6X5 z%f9Y57&HOMJqPa(zhpJ+C}lhjp5kK*WMrf?$vzz9R4WTzCK_sWz+wbtj%!0oTP{X0 zkY_|;b|^&984Q)#9kmKA(!FF%5QqLJ_ft@E+Ff_CWQ%JQ;7=Q1VE+x(xWaw%A9FktDn;eH!Iv<;85sEdsT(#q9fmwkt>sOohxi(P0jQ%r=80Z4djTI6k{9%>1c5 zwxoP@DeR-lkN?um-=@&?jH( zFP22+83#hsR;}qj269>q`!Hm%1zMB8+^12m-n=)>Bg!MT`e|$YD06OjWdCl*xkWOmwLC=8s%T)B>F?LDA0aS!lXpC29F5$dIfb@LJ|j9g1^`A~1LNBZ=xn?YE_ z_cZ5J9y;~zo0Ba%w{CWNHu1Qk`$TIp#xj`b5 zCWeiyRHGr#QIk^b=YP`v1&LU_n0^##Q2u)XSn!c$b8s?ba}oqTTf8hIwQN95S zO%m&Rl>2stk~Az!I1JvggAu;JCq;C7niaz{k)pk|${f(&xFPX$h&GvXEB8Bw#jrALhv+%Eol$^1U;h@CCg;Tf zj|(lTpFk-Zq~edD;wPFn!UJ_`t#j^T=;BS}D`i}@%u#qdr*__hbz4kR?#y~|%|(3v zow=2*pIl~Nt_6k+y9>BJK{1#J<`bw~bqz<&_OkSk zHHVnJ%eG5lyQ5+2TpLRyrt<4q5y2%FeWH{O_T?k-T(kM4@0A(g5A)mM6@#R;JP+od zfoGxjyEqP|6DA#zP-6Eo>%V#@K_#|c(I=4}vh7jiFizOUV8g0)8qf}=i4iTL{W74P zrchaDn-cVS0qZ~D51wKbT`~xd1_3H6lak@?yRAC7TE2H_>}7RLTp8--31*JC+O9D- z8Fa{1|Ml3e=$nOG5nV)Aq=T|Q$JUonEk9cv69zt`S~Z>7(rNXD>lC9e#43(RtEQp_ z>TYM!F>pMHb~luCwQw$#U@xwk$>@LZ<@$ilSY`Xm;8-DM#(j20%4ienf?9GEDYf#h z7_pOdxQ&jU@+P~eZ31SVjGL3>*}klrA>{uEl=^BhungqJMGK09RW2pNy?0w_7bvoc zTCLgp&^(&ry1dU{S|&yqJs#e?!z(T#y**2xbCSduDJM=h&p;la2j`cUnvTb6>JPf% zp?3xKUH$CwZpNwuN(<28#*(Glt820gi(1Zs5J&q0YSL)eRxdBknoP+5zW4?>Q#6&2 z*LQw?P=#IJ+hF!dtI$K={mrrf;l;9?x2o8h+#2lk`>S_G$KJOyp!DygX}i=kxMRyEsuIZc@H|sas6=Jdf9w6}z~@*+mJDS684&QaV(M${0|s?t zyqeu>qdaL65pYy!8#cwrx%n{J0x#pP;xQL-8A9o@Ae)%2-zIDWT7wojN2~yYj`?&U zt|I@PJm8u9EJ8omf?-cSD-LhYF)6G$Y}+TiZ$@zxVVR$4gQTX=l+5Mm6?C*Y;B6tTMWa<*mjq{TPG$78%kDcNKt z>hCC;EM_{_4_i@+mfJ81=O?k4(~|9e{cUtI?*%Bc8U}X~_8+V$u%#?pAV%KVjM|38E$F|HyT zGlpk9P>wNDi#SiQRu^G%?95P|S6YjIe7nN}^D}J_bL7t;2gjb05F#hPa2rWUWi*Lk zsCq8cR8!ae0y?#Cf2X;6Tt0PBO+Oq7D3m}ph~IYKuZm4~KB3i=CwEY$-6AhCBN-bb zQ~h$jZ>-xSw0>w(DG?#}PE>RR+}`y(PbWJwTWTh;veyQGM8DzZ7Ij5XZxGo4nwJxb zb+Wa|)mYQRgIK=R`>Vh4yQgE=4}xipst{aZIb ze))6Vepcg$ckc5?bXTwK;FVKE2Il%IJer%K?2tAZ)K$H>D2i{K4DQP0o_-@`!?>%? zbLrqt&{cT&v(2<4bdAH`lThV9}Z&7ZFN<&e!w#e`H8JG)zZ>j)z{A1cZF#>y=Y$ ztiFzBZ{%1t)2-#Q|E_iPV*p1pi^7K~?{95U+-tkldK~~53FOqI&IxuG72dyN zKTnYD8yE^hm~dfC@TjxIK~CWqTx30{s8vFMF43nZKq|2zBC+v-nxV=A@$Ui%qZ|9r z<7lSCm4un*^In@m(6^ZH%RCxbkI*s_V*{2@yrdrFLhR;Qt^Vg0sa(z_Qx|paX=RlI zPM>vcE0e;=&M7cEUB-Fj>LX|DF#%fQ0%QETp*^ljB8oWUt@b22R@6*R%4XaW#5wVz z@j8R!-k5ebV7IQCdl_6}vHY0S54&9vD(NV8$Z=vEixj|hC#E~`6HcKf2?ON=fd2@0 zt|;zKPMH<}xIXHW{t@zI|Lgx1pv4uWjtb&5_@mCTu{!80aZAZ3hGj)Z!+jk^r}Kpo z$r!?tn36aWSPpJE^D zvCJ0v>NF9*__F^vJ9;qNe0*;fDm)I+(1H%Uxuw)cp))W_P6>Fv0+-Ak4n(??JtKr1 z_j`_Sky&B8&0Vs*%iYJ5nQagkpn-Nu29^8(K_ybBwln)8iAttC6Y7}9XaEUCVnt)u zL{*VR1EOExr5t|~^|N(*DQ+we--j4jEIX!uN^Aa#n@Dc>0UXL*(Z_jOaQZLytRAY@EbFL?6QEyrw; z)D6X%yy8Ank8OGuvlQ-}qjp>(8+GV{b`e8hfA(LxYwW{n`<-B}oBkI#sE{6qJ--%X z2vjMYpxL2VIs0QysWJI-YzaW9Y`&+kyTtXjuaCnXt%#BtB_`sZq^5F6TCL}!{wouq zTY`;|g!XJG#@t6+Z)x;k!8eFv52z3@v&6QW^Jux30~!i$O)|`Qh}Of;3+5?Nz1dbU zYd_fOdt^puOpjpzw`)0Vl-epgE!IlT^euP`=KrPg(t&Q{tE45ZQ4LYC}-)0F!&wM25FU0#L zqF=Sm{6Ni+8@Jh(J%KgBGh(P7P^4cfFZ=M#bJf9i0UQmAmf>&Ig!ZuZ8xxSIe=e*t zFJkO1a7gIkCDqF8QLeM?ZV-skoq!hyp45$ffF-ptC z1<#i_L7NtJm!q^E(J7v|vpwacvET0SXblN}?TvIM>wUD1CtjL)o>h@;A%Etdr8j_8^YO$f~o5)Dj?bRCaYOx8r1la-PaDDOVUG zd-j3zkfZt2yy@erOc^6r@vXEVHs&w9tAJH7p>T=o(bZSg8RFlK_L`AEHfHztUa$OJ zL~iPN2;J1+!X05X~UuS$xd_23gMIUjYy9+SJh}$H{9}SZk9}IoR=jaB!xr@S^EbT zz)@6w#zaQi?MYC|xjF<-W$JI_Cg{(i)isNGIA`m(2BffCNSeZ@>MFQ|Lr8BWa>u>| z0BD;~Mnm)}(u2#swzzp%dGS?bWU7c=rIi-AzP&hr-&2A$9?}TAn@D{rAEv!Qm~THw zmZbIfuzSr|+`;x?CQ2$?>0PE$cpJ)ypAJ2(@rw?P;P}$jr-#3Di56>qYdB_IYCo=@ zZr&k&0K!0I<}#{rz7WM@YBcQyry`l8t|Cj2MAFf(h9Y>Sjc$~t*Gez|J^wE>hzzCV zus#IsGLY?>7fJmS%~3*e-X?pOK>2R*=NKLRAK!-_b}oUEJ+Tyn1+Zh7bM5z>;r>p; z4lA889TbI{v>XBy!R~1NS`vyWb%v{Z%MlROJT5zq(dn(B*u{BFMtoVAP%h=YvE&*_ zW$YE$nxjcYjOcJlO%k9d?Z;Ms}+8O&f{=3po6#Z@N% zMUQkz!P0nT$?Dr^J)fh8)CHOAAgB_85NM}c>|ESF8z{CRaMxfRH(^+9e& z2>kGQ20^q;2kL*P?R2rZ#Z@<@B~_le{>f?mG!`2$IiqbVOv;tOtmgr2bG?U< zSI-~aF707$Jx@&K4x-4e^}TQ&cjJ-P8{W^$%a2+@?@(6at4Q^=o5?UU(}WK z2@<`Xi@o0GCoxP%mM;uQEVIoNR}xoGSkqRsAADaf7eO%x%}T3o6mw8CmZMC=(jfbbiz#UK{ZN8(7tc^FIh+K2yn-C<`r>Ec48TTq>`kPOsJMKtA7C z@6<4lM^f8`xCJ=s@)l|hw0?jaF%D7x7HDBx%9o@aqIDm(bw{`$iUc2I0L3fSsujID zEZoCC%#Ed{T+tC|>NPNOWsimJ1vwIGj{bEOp;P7>b)&oJyu|f}=0*nJG&rkl`2)PQ zaTA0>w*d_Cby5Nh-(EphDj6Avp_0gcgaUkH>5>4q4E+rE2PV04m@K1rT6oTEMypaT zP;2Gws>SU=fG1z$hZkod7;y*)KdF$>?8{@2-k-@L>E|-T72Hr$*t6Z>p>F=cHu&Ex z9!}YBYAV_P#i4;k&bWa0EE>fnfaHF7KDXjr+2;+EMeKAebw&)V$nJbK9vMT`c^<9S zY-ZFM{`=^jqY>dRjoJq0);V^uw|0}%i#AUvhfb)r?n zmAO&6rdvjuqc!tFZ6$1ezuaIxCs^ZB^o65=Y^dlrQgut4c5}Y z$mqzs`#5u&Vbw7iQ4rH+r{00V^F#P$vHOos z08>iZno3GmIW&?aG|OlnBD!{HWCI`PHBJJtWpyhT-G1maAW})TA70JS;Tq#WoL+eg z!G*0TW_Y7l<)=Lu>3G&VeQbp~EL}|T#JZTS$T3U8I@^!O5UFmUG)#Ww$f2gVSlHPL zQS73U6Kfl&#%SffP^skMpr^S8L$uB7ZDq(iJEkOvl)E;qm1kfygm82$+m?UV|}j8I#p!X_z*L9LwB{kJO|F{x@{Eh%~DG zwoCd^JaYZHh(bfj{lbZscl_1t0dy~JuFbh`Voq&QA`Ji;Urqu|!!-D09F<#>3cvR? zS(;OvYSS+*E-M^aV+(b?<`y4j`n$-YRe(8|Gnu8tc!pM^s@4JCEUO4t)+EJgT=cm! z`=#-APSD|T3=5AV6>Th|gzgY2Rq^+JP>{F}=!XJHN3s3yqw6aVq7jC`4qfspHBJ^E zqkNsBMj#nO&33+!<{mpZot&HzwNeUEk1rTXF1uDCsz$a?B zM&)nXZSyRDp*F)2RIK0StIf4NqhpTf#PR<1-@F@rCwNJku+HNfe%yBF&lG z*~}=@benl`1@{+uKdMD^3Z%iPeF@JeTQi#iPV4wUBvn_K%93lOZ5l-4ifbgZ5?+`k zYIA?VutZ4HWJACh&>9oSh*@o4CDH>R_}d;4Y5)PKJ=g!VC#0oi#J9qqVMlF8h)19h zMi8Tiel?Be`jW<5lRNbM((ID29izh)Ha$8O9aMOU4|8_eS3UVlB!_6ub*+ud*27WF zop3$|cbsdsx3^m3WR>*mo)0i{)D|vBd=gLKL@9DkPt*CVR$)=Zhjv5!OX`XpxY9L-VT)9JF zhNO)nM355}IaWSdiZr>Tqwgi46!%brB~`Mb!Ya#LpO-iC)}>}DUp-Cm?&qM-4cE3# zB09Z`|3&fKe6w4v%kQ5(_0u{t$XjCMr8Vv&=W6VRaRIh<<6N@lOmyr!>R^qn6(I%{ zmC>2mmGF9-RR`tpU(R=a>FWY;zp_emS!m(vg~5aySLPa(*92abIH;eiGw`e$?p$Zl zedS6)T7>%XJy7ANf@Dr`uZkIjU!?}_*G169)g3MDKfZAY&-FOAEBHJ2hZc7{R3SvT z5t1Q(_2o~O)~Piu>*Kf6T|GbHYTaf{M-WWUgsMzSlau_}qT-#hrIEXx-J8Dm%CEnj z5U)cRymye48HMC-sP`R}kfSmJ&q)B|P?0duaTi>HUpAK%vqyM=#uKZt-9+Jd0fV-k z1|}`0QIK$XP#>R5m?sP+Oc5pAQ!DRqC|7kp`b2}}+SWvydv9k<<9GJc>*UhtD**#d zwjnN~kf_($vi|zf%JXq!V3JK+3m5i-fOfz9(v+Lv?7BO1@sa$E)9@(A0!2VP;6WsS zzG%?v+oKmY2LC~G5mUf4Eel+}bWG6L$9SRX=-!8#)*nBI4w=3Tb9V80;SVPbZppuz zG?{udnfq%*luFrJ#>^glyl))v-F`(+jej_U+U9%V57a5vVD{{kIsVYTuiVCjMFJ(Z zKHVk)KH!Nr-Z%{q0T=G=^Pojy+K51owwn(%Q7<($2#=>r;25RZ_g7b|b6(ipq}YJL zg#F*Z411KK!3OEni~p!#t9`sbCIN$5t9rh3!2EgG1IdovAP_dlkKBYvjYzum={eQm znXV{T^0%03sf(5c7!IQ3q$TF<8#?Jz4*A~6aHYLN#}@__&*ecNB?B!UG*B2pG4p{X zxp`2GUT8eQs)dl|T5JvT!hFRcwQhnhP!fClNL7J?t9U*-xovQeds$M?;mXi}&`rWf zwyz?MKX9eKA2_Ry+S!7H9Q-R|?O=R`_i#I1aU*PQ*Sa3~I*(z1ed;>BA5!f_B?#J9XVN|&?v?$Q{|M06| zW0CW41cUYDkp2`O-e{!6!Qv8KY%o=pv_~QvM-<^e(2L&#x;(5hlfTSWpKRJ&q8nS?-^i)DALXT8 zi|SY;>LG{y8;h?rKMIPdEyZ~OnrXWHUNlLNM zY!vAz>QtAN%G2~{3FGNX2YJG$4ouHXtVRk~qax+Dyft9ueEw+*@@sG%%d`=whu2g` zWwPufG8-3I{{F153*NYvS!~^Q9VEB9oHY;eFj`U3weu_fMxago<@U93Pyaqo5)d}# zO(q8JJmz!Poyp!8d?a@=338;&^*mq$9Q5VNu_VzppWMkc=IoZ?ERIWQ)yAM)+nSCCH{c_^?C+6}f^9c}oK| zx?n+A#m!0qWG8mYtj9aboY1V(WigRUXHB=4K-^x{RZsE1uC1w(2Yp4QhPmKk%2Lnv zu?A`j2F0gOwZt2Un??^@Z=EZ0Tax8xHg9z=3duVKvS5kAyrjc?f;7Lweek6X+-^dC z>pvL!FyKF{^%3eLd*>lvi8*4$i$t+3j?)gLkC`N+&e09!($w6HRA_&>uMQ&2!54)U zr4FVr)CE0SNwd9JZ^C|GiE)MNV5pYlj4k-u?=Pg@GaEQEx+a&2X+Z9tJM<>T_I5;E zsw$lM`Ba>7?tbg+`snI0`7GnytJ(cK-ObDIYh_l%1F3t5hs)8{E5MTA2^EC+E@aY( zY|-P4m1@l#YJPS=lI0y@bmCg@I-VFu+0urwUQuF z)E^;njQ)G(PB=fOx#BNVG!#vKe!llxJ6*og(7Rd8yj7%b#%ATXM$x3qw-a49-@T2t z?Pr+Ki`>$_2V{&5F*OfDVBdoXpjF{J4;^FkWRvDD-DpUZu|K{DAVbVaG!ZAX>Nmmv z`a$UjNk^m(z@rir+i*=99+ejXWsGd?E$ZH13|u{zw4$SYD>Qgz>*J>#%`AR{te87-k=rr%#dbI)|Pp!ZpeX-9Vk>L{8ZgTe;c z5AQ~JP&ijw?xc`j7!955yQLiCSqGS0EtK1djIJ(Yk-uCWLIwrBR)PlANqyu4`xcrv zm_OaR^isWO@Y~7r>G=F7gOyyeL={?cogUvq*=&78og<3>78P5Y@t&ObY%t#~Cf-&l z8z$B98{}@3gPje-+FZFJV^7^X0S?lovN~d)-~fq>h@EzUi?i7Pe@oNWfS4v4Y?qn# zq-QjEKH<@iZyr&hl(V8tN^AoUxt(S|D39!ApHMa(=}lqs{gvtLYVZ9&&FpWlO9()v z2z%Pum_J16r8k#ic)Ut#*4TZnF-9*z$_SyfK+pgmpFY*j_zP`g+y5zQJjtL$B0O-y zTS8qw-TLGxXf;N4rj8SQy41QLpt7>PuZ}u~b)x`RXSvpZ#Os5l!tUM}umJENBEJ{b z>xEiyM%?&pp(I!%dXqx0k0~ya9aLkM3iGcGPp@bkDv`+ErCG!)&;Emh2vr%#`Ee@B zHg#U2MdM)7(Ar-DTcx*lj;U7}C?SJPe72A2>qX8|>eP|T9@u^}WS7(N9_m1W7d0f* z^j5R>ZPEzGhXi(fz9vhJnN||B1XwUzObQhpr)L*;S!J@Fh#3IWbNV|t!|(?SMb7`R zqzarf#9{to%VGawbrn+QFv`eC(sIT76j`5@LwPwK7pVdhJqgb+9=SH(d7qHf(3B|n zaBK77-qc3Rfx&zZD^ZXeu(~suh2wLlpmfoadn~Iq^A|2X_yDEA6GUr%}J ze&&*6VXe%Q)!;Q`l{BrbLk>YcVHW!CFstcV|4-SO>2k+0ZB;K=Y;G>kr%UDC^1s(O zgrKjwxc_{cA)ods*+Zfw-vR{1SrV1AVJt4CKD=9K-!B_a&FlKU$U#QTRmbF*RA0xw z>TH7mGv=%XZND?MQTO&{H!+b?7vT!JY(ZQ+lhi((zf|=>>t+5Fyp!hOY%Zx8Wu`f} z2;B7Lc~9Uu)`}WD?>vfha>1?LV6+0 z#&AvYyoVx}c;Jw}E71#Zb*!!hb?;u~_qODJsY=7I8iR-I-l=F|KR$O+5@~yy$)NxM z?N%a-EJH(1CMe?S2HUfSSr9!7F&K@LS??O^q~oO^{Vm6|FfILr@KEA4U2hC~HD_YI ztc4+ymouUET^d=ORFA7BfR>Bf1hp@-)h ztLe#}vk5~I-~_foYt{ENV+C{rTe&RqJ^Ns;x=~&akk~8A@1Y%?T5_FH60vxlu<$*S z@F7gJXoAH3pUe%0)7}0;ZA6z2v(!eU=!)%Atj$a$RC6SIqBa>uVzxZ#*3Vk$kzx7W zW#j`+ciD+aH6kME7r^ zF-66^VomK#j+maw9u!B2%wOyLP?Y1;n3tE10z|ErmV(<)E5A*7>N}RqB-Z4jPn=9> zrNG4CL|11}w|oGF{+~I=jqkGNK$RBF1<{`_Yw}aK2+yS1pX`Y6G=esLNeuS+-#c}# zH_-Y`%XL!%(*o06188e-D4rTcxNNnPME?K_c&>6#Ic*ooO2QB9?29WH0|MOeI|9?dzBh4&oIn2H!VKW+xFLp3p-wC_ms#!GuIZvQ{*(Y z*CZ;Qk>Qn^9$?oJZqQ6j(AUS%NqNghD*JB=uH0i+5UJ0zov>0rWl@;PWzQF7)ms8c zc5`84-1$b$QAt|zUOKPMDJ!FoHiI}IIgx6LnksXb9EVt%;g{4Vb0kxPzlkx(F1=EU z&RLkOK>7LBN5+RWSTEF6WOJ0m9@x(fKmEMnXUM(S{FE(1A+^Rmc2akkRp5a3VxTwmnuDmFS=1FPSVW4~4viqLZYgV;d!_O`s( z{+flSX1Yjif1hG^C7|Alkdc0VwxMo^5=u4J4G>XnKwe#Fl<5b57l4oR-PdL6edF1N zGp$@Tz~%T)Bz3j=5d8{&V}jQyvXY~+(cVXA`%$QC9HhRw+*F)%uhOmRCF^^l7PPCQ ze;9D<>J^GrL_#5UKYew~khT^55!Y*wgBDeNwlL#yinnq%H1eoJbql zUKhWFzur8K9B{RH-;r^q5B2AaiRz_o;@jT-ru9G6?(V#`&oWB=Z0C+yIBugmdHEC& zt7={xeK1D@U0sudCbA?mH5PJpp48ME3hTa6tObg;`5@2EtARe3d`(TGM@`74>jSXA zgSc`D1~g7i=uD(67VI#Z3dZ|~GyGcWXgKE|>8|5zI8U%>pms~^iGvZlkV zk?rFj5{vt7&FeIm98}^;RFFuBmiV=c_jxXWn}40ztM>f}*18`!QD#Q4;ZHj;ChJ$v zIPfj|KYfIL($n8v%g`WLXx(&D^tD07n=?thA&Rjan|Rj9-a-rDQLF6zAk6^h&IeV0 zye65GWv(aj_yQf`5pRpDW~^W5W}zMW0n`XnoZaZ&ZdvqZBH{q=QKr|N(d;W~dxzS5 zCGl^i!eEjX&SXpW{iz|Ktu-r{4s8#^pA9B`eXf@c zNPa@T)Ae9j=OCn+2}SMp00YEN2YuPQmch~PS`jF?G;@8CMcy5TY-3AQ%wC;aZjv1c zlX7MtshP;YhBcBmi(qEhEE;Iv8YV_E;#vbLEh_1E9WFcz5fU(QC2NdqQmZ=0at^&v z*-i@97T~1tJV>+reqta9CCa`PE=F_L8)s!3N=ZCQp-SFj=wX6Q@E%K@BFoT{UB+Uq z<;drbD8_8%?U&-H^X(oF)!+w`)>m>}=3P-h3qiaE6GOYmKnXcO#lJia!`~gU@{!zc&$eixg}iK+oP+)ft;`JDuuco;B-E^N&>4mJL+af)Z<@ zs*3HD6KmF7wR0-Y?0I_vxlPF2owd$oydm<5GD13st86xRvhEOtLSl_wyjjWS-_k;4 z6R^nq=3Ko7wSTx>=8o4k#uIuI9XEcSYk{Lo7g!&k!5rDTARk<4MYNRZe^t!HnDXvZ zlm7>U_T18{7AwW+P6x(Wfxl&xX@zTGihPb?>E{^iAqp?HVnD3bW^K`uUj`UAx{Frd z{>Emv*;{+4+ne1MI{eUGO379jz|tl=T_ff&&9`?OVDKyq=LC0Wr%er^i3t~Kx)tqD zuX;8b(#-ZHuFNs^g=Dm3iNXk0i~s9My(s?;BWrgy_=Zl=1F!*?k`!_{kwMp4cTc4^;B{HqzHycfG{Z=EHyb`t_TLpqG2j#fH- z6U4-P1PB9JsoUHnkbl|d{5@~}8W0T^4Ogx_`(%c)_J4Wv7w?GT)xjr?Z}2P%UYd9b zq#|OGYGA_G+v_S*vjRAua6qCQn!03#_g#V|c&F9-W_QpXZw7jX#lF~zU%1hBwbSg` z=5g$h$-m#$LLoq}PumKOnLXI3sblm`9<6My{BEaBKe#hwp4gdQY}r$477$E5q8oa* zf}rY7({?#&r{Lxcaf|u(T`Tg7LoQa5B@4uilv+Sd#yAOO4PB!5<2pVC8&v4u5WzqL zRG)J5N;BDdIkMtyl9yE4JC3oU^CIM?W)S-d~{eG zr+yDn2Q&cEq108g5y*X+1-7RV=48_$6AOhyiWEUiAW4xs#Z2_;w=sJP`fA{M03hpc zYc2jmJQo#gZ2AX`cnWm7x$+Ix&iITAi~SV#G8Cbu)wv&i{94t$6#49?O={eGHG{Sr zTYTleZDXEO{f!bNGDLBIKkxBWAO9Ed{(17!nxH^l#=-3>`rr>4_5#zVd4xx5>CPKY zPRY^Hz(U+@4Ht_1Y^mzbTlD=yCZxd9XcC{{8_qLPW4j(%y#TR&@Jw9Q_JJ8`Awn>E zVX2Q}Cs@#jbdH8n9EaW$>+;9%RO)pnMM{q_VJBK)I3ifWux%87H*PtGRhW$G`Wvpv z)mvFyDTg-?Lsy1UmvH|H4OyLIzFxH@=xY#R>{H@?yh}P-{&U)R8><)e4t`u5sq7m! zhn`CV9g8g9gEs`AN*|ws13yns;p*cnnrVN(eE3_uC?9uimD*&fU6l8s1kK$3Hre&f zDclP6Z2^H2GBkE$m+%+ek(oP!0(DR89FniR)<-8fzb2SLs$lEC3J-4FwkR*y<1Jp3 zTeTh|HJc8Bk*8sU$XrQBVw&)^p;Ak<$ce^l+k&=~uLz>@Ot z;&nPrQ7G^XIE%~2Inau_LUyO(IV@g>US}SV(-eHKKsA#`cqsC^Ik%xYdxJYkVpP|c zF6;k#&ZQs0J^c}%Uc`?@g;jEh7U4eJ3`y*+@5ClJ7-5^TN#t*?}t6I);_)_!yHZTyT_RgxzAH7*W`PsUJ%o=b0|6w#mYfZ-30 z^J<+WPJSYyFU+uCVZ0jHpO%#gj-TPE4ld1Y+c_@Jx8lt6LtYpnq5@k5u6^He(-||3 zP@lk*45C{5=&CyDe@W*vFdp?f#JxbZzJl}MlM!TZeuQM^?fPFHGaavaBpA0cjko;_ z9qh#O@7}c`(=nZT9}8jN)Q0)3ujc=8ZRUi$EVbL_$hfLgO{Jj6woh4qBkFQOeul9a zqZN`w!WCVthWm`feKA5K7S4T0p}SxewsTrm!qzO_8h>prn6f?}CH*YyP?>kwPvp0o zm{)+2zSGN(oIiMbSGHL<=7Vt;orA<%1}*XL0g8s~fWJchA1Bev;w zI!WLuPHCSs3QwLkT=aB#lNS%dru>C;P#Xrhs0m-MR#zddBq4HFGCb!te|s1@zsS>9Xs52*w6NX&^6iQ^?ajcK=u@GGTR521qk~GC1Fqq6!3wS z98^-4_Aw99rNqHR*O^}Me9Zdve8y6ZH)9^pU#bxg1gd6h?4XmYo8`(}uP9YUohysZ zH#hSC8*|e(Ar@ZskA>!Sju|s6%}J0S_b49BQzniGk#8H=>8qJRIat3iSv1!QVW(Fb z`@xB#*Jhimx4eZY+0p~=z%5n%r*m{H%Ra3DB4t&`PQVqeGMD@cI25z9Dhdg_&0G&H#l@B;6zB@1@*$`ghSbfN z-gl#FCkjz%&jRX`uGgGn7qoNgVNEh5VUR1mV-4!WnYv<2u*m$CQ&> zr&&E+g_UsX|FLM~9!|2>dKgS|k>;ra=c4AnVJqrP3%2ie&c{hD!S-#b4V(&jzW+wy zjeB zDSzV3kv7vZlzIbVs#Xk{`j*FFL=Hn?&{kpO82oNv{U|h&fxZ z*j@h%tXH#7YF$3EEPQ^koxd}4{fhAbZpw93sw0)}f2!2H+e|Ke>vt_hn-CsvZ8nHA zFSl4-3(g<6l`u8vKOmn6hUvFvl7ZyYLO%VB2VDoIo$`0fN+Fi%+e7D10 zWc6~#&&WqZY8{+uz&{|#2JR%#=_;yfa;LQ`@qdtc)9f`jgBmrwbTC1}+Tb*8E$Ypc zqU(u0X@D1Og&!ZeL0MNKip9^CPy1aS&kUnvygwFm@|IV%x<&GowLZVy;8rcXs9uco z^JN3Vi(q&%{^lPm_S$e!Y;qM7XbI9^Dq!L{Qa#FPY&dn_g(!q=4bbJG>BZ)pmckd9 zReYT7S;eM;R4=9sx?9T?^QY{+T z+$w8r$`WN7PQ!ZKOrEck!=J^BhUcN&0)cNGos<@9yM1G0EPrLNJ<+2Ptl|`>doTyA z?Lbm|8GFR|tYd$fkFl}Bh%$D%usKdz>8!w9bq(05?wo5({2WgILa}?nu5^yiQ`UuK zP~cfe(7P)mzy-st`>MxmLh``pO=U~)qOz$@K)OSQt~c-5$=8LdVx~fvg%E3i&=YLg z-Y~(VN-!Ifb*g7TukJBN4L#&2E!cDOae%sKFt*A;#V5l5PiT+x*P7 zUmDV-d@6&lIS>N)m8@pL&1laXxe4KhUa0Gbc%YfTZc# z=xsXkMI27(xgLl%@^x|6bo7jG)gxgLR*S1DP;p?M{ z)~2!)xua%(>x?ZRt}c#4lR*eB)b`A6R)z8jUUyN;#5-hY z;aLT~O{~n=U#0pa*{-d;O_SXp^rmd`$v@6Lfps6qNB_Ly5hWeVZa;I&n4LqNbLu-= zA-=)gNS;9~yQTp;XxUaVBMCU*4z9Svh`7Frq>{deR?fVf=FO()l3j`xKGk;XUyTl0 zD|j?vIFJK>J3t@9rg5?rVYzIVD6C5goqL19=c$Bfdfr zr@(T~e%5aE$8OZKE#H1{LQYsb)j6~%wt?IPi~?n|x2Aq%40RZHsvzu}dLPhSXm605 z$u;O?)8i~+YGlZpY6u7^sn2nI`_7R>@jpvf*9n=?mZC3eu6*Gl9K>YBm~SNwTSsSZ zef?3sbCP8J0lN*>Y4AR5g*w_m%LONM!A41w{*1_>PLXMS~=W? zCz;<97i;w)KxLVC)9`QXgMAB5kFUNVy8UKp-wqQW!n2BR&U9#Qj)x0M%>4zbCjumD z+ndu{!=(~__Q>&iUxtS6SRJ12lwE}E=}^d6Ho7rUuw5kWdFq=XkevMxlSSi?#~S{`hjTa;+?xlR#VxYn-m@VH3PR&9be3HTR!_;~(l z^R4Uir;%urI?aWxZo~C=mFG}ektco=8wfdIETJebaA$x0z~A6cXbG~u1;qB_VtvaY zb6RX`5y*<*7O0Le2NXN^1U7$aFvKio+bMMO6*%5c%b=_X!oI`vxE$IQCyO}8ZM{|@ zMn+}mcl&R=mx&B33xNmwqp_H-pIv*prm3W&t-%AI$_3ZIS=BmW?s2Bsrc5W;3mw15 zoql7f+R-@2)#$|4b*&;Nqs{o(MhS}z_B%W>LeiEY@1u5Vo_o&ELoj?eS4^Xe|< zdS~9`x;)8&ZBwSpA1ZDUtL@45_h|Onj%bIPvYIQK zT&|)TiN#UdkkK5oA9l}nyGAbLu3b9`D!R_8hjJ7jUFvgDSkSn+lJt9}hL$JL8_#7l zY8_Ck`{O{*KK`nBlOk`a8kuW~NzDC3aFmt)-wqP2?fx-{`o0_aVnWV6{{861QTbBK zp1<|+SBYpADyD$w-X!0}D`U@d_H}nTSTx;!}`yBQlfFxtt^^uj%Mk(hW2pNy6Tqeu!;k^`;JwRn|AaCNAj+$zWYdp`;uF3d~@G$sz4 zKUSt|oaxw_V`eNieEL@{OKSV6A?t_0lnC#Hnir}DQ8!dGL2!UX@)UkUh7?DJ*(-P_ zQ1eJMx(tv(ED2L{EDz9#sJ0sQ-FCq*%jgrLTp|NAF=B9GUW9DSNr#6k#>tmUen1r_ z2YJCXpZxxZN(<)(c_?)JZs8KXNp&OD)Lj=TCc{!|LP~Vq=iW3kvkVSapQKDnGFqX& zbAE$#+Ih6|!_kYBYv4PCH{01&b_u>NdA=3d`z$zGyXAhlE-A3~#&yB(L^^=H+ipQx zd;eX*(=4Z)H#hPuTEh>QpxRv?+Nb{t3pN z0sc8*Ip?;kO#cwcO<_>HJWWrq?)qQq@UQvu zqD!sg`ZY;>pRv64$=&+&lN={GoH>y}`}tLu>m_ZKgFE51ILqgEk96V}28_e1U9IknnZE>C6~Cy#zz7D zoUYC|`0$TmKQ%Ki0B0Ok4o9VU{Bx2Sj8=zWy52weUm|2)ooUw6U|Q!-Dw6lq)IA(U zpbK4L-ba{J`|QB?WJP_4-D|DJyXYhGPs@tK2h#+uX>Rd9DI9|G{A`%Vz%CY(QaAfd z%$&rmyPj&Atk5HKJY5hvI%YOr_M9-c+nwVIM9#}I#Qex@F`Kkl(0JU+U zucbkQnybs-Y4EzNxpZ)pC^~hO5{kFS%j;?RBCbbIStM{&Z^6ctZ)el!dRc~8An<43 z8+@(Q=~P{nW03Umw>~pPX|Z4~$)2LrQxeg5^|(vsSobMqQiaMUi^qjcy+ni?G}z4_ z3QUBym%7<_&JkAGq{XgM!2(-!q@CDf#MSw|x)+zR=BwMV;epUwVF$8S>=VGGTGl^+ z82o*TJ!%xSEx6`tSWz%wy;-kmB;egp$+BJS6J2$5mpiO(ClvdL>ua^5SCFc|p;l`v zp7bHZj`%*s#yL^h;g#PO4Uuzjut~Ry0mn`B*?7x~Le@twdq_+1h2S?GQQp^P(TlnX zM$sriHAj(Z>6+QaURQfHd;Cafw|0pe$gM5l`t%fd-aK>tFTA}?Ti|@Y@sMxk+Md+h z-b!<5pnfog3%|T?fNC=_H%?Pi&6CLRYv$UX-~VTT9QjtYAC52|ghSC<^+VSvOP?R; zH6|kF=16dvqCyKT9yJUWIi%B`S}+zX-tgfl8~vzlnO@}-I<+w8k3zUx->c$WDKTw2 z1$=aVL&#`oZ2(O-SEl+{veowIXMDZEVxs}!+t+QF+sieBMzQS&jg1}Ce4p{y6 zp|_wDgm^DhY(DM4`?-%|93n*)D zR9k`FmDxm(yXrz)b%JWx1go3Ax7noQvFk=uuK&diXlV(3L#IH4({9V`H$85HlKmq- z;GYRcdvHwFZpMfS zsmpJTOn&ic!EGB^3KOUsPAyd7r=wO@N+<@?WvJOI*Cx@Af5(oi{9bqG14320xBVWv zA%5H3Wu;Z-QTW7c2wyOfj2VXgjM6j9-Ea)1yJoNS8emve5i->#O4(m_Ok9>Z!KGE}%-(hQFwk zs@%=ww@3e+;t$1CT{E>meq{VNp&XIRM)J?^2-zmS%!~D51}yY04Sx)}wN$y08?T(x zHHo;7C{-1O)AG;qsH2oL)DY{ZFSo7H_B>#~!~QNB^*OxBRm(HB_xF%1se5*qnV$w% zkz0DU?liAB;iJp)&scY{dqf@ojb|0sceKzZq>7%Kk>eAXs#$J^AmOEj*Ny~4J*HOw zglq+8`xo`J{dR9!_-Lkf6UHt0kM_>80X z=D^RFh;{|W0<G;)58SR^nh|)-9QMUju<%9t2G;Q^NM+&iF z$;&ZTnL1UJF4v&17yXc%p*-*D|EHygV@#V@^TsxX#c(i`M9RG)z1EwY#Bu_wO&=VN zEgticS~bn+*Dksrg#G&S6u_ui;fN6nH>hG})gyBMw()bQziZ&(!6@r=z(0QBcm)m# zKjeJQb^L9^vs+6q~WN%7Y)3As3sXqn`LTd4{ZN%TTo>-{--u=M)5IHwQz@Q0Ib6|z!a zS##v~gpKXSMFP#lQ!EJ}(EjlI3CN*Em)L4V&i&`4Vs?=6^MeHS((Srge1S5hhqwGAKh%s|yjMjvRnI|F z4SqgUR{ZU-@QLmgC{;IFUq?$T37|sr4JlajUs1M-s(cB;La_uL{5DTYl}e!Q*)3n{ z+Z4az$<_TFRp)+yBp^?}w;M4C^-V+A{msRZJ!|${x{bBbwrPm{wPpuk9Kvw!oo2mO z6~@ZDDmtqW?!n6DPr-&suH9(T*6xG}^Sz^Irlzc(OE(=Ygi01 zw}5XWP~@$2+W2X2A>JSf zt}|B|<9`gCW7~nSykPveG;aomI>n13k{c1E^46?ug0N-RUm8Y%UcVsBNL0^OP z*^>wK?>_oHK>}!Ra(ycUfdJD&W$o+-h4_X@0UNwTqGA8W8WIn!Z7(x32=zUSRmnTF zdB~Jpe`A|mkA?!#_Jrj6OO?+;{?#u*S4Q}6tzu5%S~gr6fB5!gQHe+?Oy-)GIfHVMfr=0PmPi8X_iP@BZhwFHF8QZc@1 zlUV;xH{#Go^|)SE(Yx;G@lznR8C+9bXq^K6gqEg`ME9OIPI)qViweK0xSV&)D&CWG z;z^o~i#*7=*GVKr#mKqSmfQa!Q@|7db{%C!$B|%UhcuSH^hvg8g%%%5B_$2>F5z4b zv2!P0=x$Edl3)rMK40wZ2j4|M>YadZ&7?z#%>_0ymIXFV`D8ndqYnNzLa_liXAR#u-yJ2`5oRgO#H*K@%L4&zG z{-IhH3n${s(~oWp35{_JU52IQm&pl%20qg?PY&BHVl zspS#P@qEmeG1$4HYaWuQh zX(h-u0Qb_#5k7j-`%ribd>I-&7Mt;b-8Fmq6O)0jOJxP=hRvVCB-@b7pJP)*8^3x- z@O$5hj>u?|X|FqIo!=(9TV|!eM!!w3>VN)tH=l=IXua!=er*AI z<6vVZ;k5cR{WJED3NO@O@yC)&OKr>ZXHrx9%DaZ{jIYuIx3Tk|(EmCQDiEW`)yy4~ zX(10+$CGgE1}VQ+q1x@2A{D_3d@(yq%h1s*|LYckgt5}%$(MglzKx653%XxtQ#8!r z(3$VHRXH?Dk+~w9K=jC-db3@A`KQKRx+RE3&&>CoommqNrxRNPKQ$I$b8iOJ`oZ?A zo2BF$c6sV^`^Rq@?}15l*NmwRn3_!iTh$}sy7wV)wo}Wxsm#X99GOVVoe%Rl*Qtpn zs+UWHlX!DKI5vuxAi*7`CE3FtyQdCE-ZMXQRQPq1z%?^Goci(UEu9(s&76B*h4~pT zbFS-_ELTW%LQMP_TqzcwlnGV`QB7sA}nlop|Ryp*4ME);ie{k+l(QRsTit| zL~^+=C4+H{8W2dkME|$fzBTnygf>~Wy6JBxAD?=KZhWj;i(1nM_&*Ns8zS+y`;IOs z^!Um5)&FPNCRZ9rU4KH&ZCEfl>C9Jfd%A1SYe~Rig8dd%Tk#kdFa@{y$6haJ>FV;P zBF%FXb@|rp@MFe`?945O1KHRB)AWDQ|0BL5gRQFajnB*#8>i6023e}qIOQ(c6H8ad zs^PiL=&>~u_^A!`4)}HAmD?xOr2+ey>P+WxU2p#NsyMR6OK)Dne1morUKRSq53nn* z-79s$H=z~i3DLUsPO1SxJHB?Sq5uZFsqk6!MFS~jM&6!kD_(3alBq&!`dUlQoiDQ$ zL5~FOi0;gh(v{aoo1>35r}nt9GNiPXKq1QkXkcmSn8rX`HQ=dP*DYKuv99|^Mu>|s zr&ZF5G0p<{{(Ri^MJMg6@{kW>#^(=)^=w`+5}UP3&Fyy7hmiu_M-fvEo?&JJXAzs* zhq*0J^FhX=nhlnK49=KQq)e3xGfkVhJ0AEfBtvH53IR<*UN6)ktq=7RIO9`4XUyT5 zfnj;Em^TmDTQYRK_OO6-z5?F`d`WJ@yJ{H3{b5=wh2?~Mx_Ky7aPV;DY?03KZ)vu| z-x0c^EGc5?=^OZl8L!*7o9?{mFi7Fj{*C@+=|35`huLK*{5VqrRj|G(P*(bW9wc*L zo8JBHLP0-)U|9?axG(Nr-0vze@$a@uX-eHUyIZUM%RMl z`0+oc7FMA@4s*Jy?p^GA8KZX)wW-V$a;p+htOOYcFgg5`XFA&%IBl7?0Q><+QD~S| zNwQi``~hzi1<$>h>8zd{Zt!djFxQ{w+4cY7htH80SO6W|B|!L@AiS~ zG?d1NlQ?lB77f$qs|jmh<@E>o!+?)5%U*}yvbjlfxn3pbHU{Qg-y7kdp6ggQwOzC| zxebB;JRuG{dYEFnCVcEUGWe|luu^V5@kB?<17i)K3v>OhZ>F+jL$qvb@}D3O@S&d{ zH>xrUy8jFe-dAir|8;pC{Q%EMn6^0{0)q0Cl-K=d(IM8(r;yspW1 zLEV+pS*WWuSY0QcYI^la(?%zq7gU)$QEW*6B;KQxGS!1S>FMkh3A-2&YUh820*8sYcY$$=9?MS$_IdLzVvA+Q32#mqaO~u zYu=`ymU~eNhq*So`yDc_^Es%49-L-nR&nQCYJ;Nq&k1vNY`ObAXffl zwePBxd_Cb6bzCqqR@3H%4ALy8am^d;oGx-#_Gqit$x)p22W^T>U}tKlD9Ty~cX~R} zh&FiWeUNP4@4VVR1o?YEDfPMeCZ@TO-)X-Yx`QzCqp3a0@k%sw(fL(URKLw};+XUF zBcu9#=Fa+9IU{N2<*a>qO=bLukBu`er?>}TS4!Jomf=h|;ziEnbOsyI3G~0=V&AO( zkX~mu2V-k&T;v`6+?`pKgp~3~>r32?cJP6c^-{mLYZNXSP-=#gdezJ7o~WGfNa>hx z`J9^P^yNr2Utet>d!L8mwk;aYvuWQ;!CWF^d&QYfyhXpUoph?fX6IpWq_^Xo#2yN* zL<$?G`nUQbVNLnhif(Q7!x5ay78y$|2f*T$)h&39RqHCUd%cb%6TH`YVNv4`&t^4X z!|UFEGQT`bTEg7L?;l3^cbxoS9$#2j#HHaS>vfS)Wy2QcUypA8+NfEF$rhRHK1CEa zfuho@t6hT4ZmhYPfV@K!()8iA4xM+Nz*aFyNWI8& zTi;Za#8ruu=+UzNsL;N5lz!xIPmHx!#F3%eSUs+p{CGCud<;nRchS2GzNdRY<;~Qq$8mXjgXy(4(M;$NS2$$!Om<6JXY!_^tsnKUz*Tc9jvl< z;f0+c*&g)c!QYo;o$ryOUsTVu3yz7ch;AADrtct7}q z`rB77EkFJ?hh22M%B->8bmPQJ&P*7#@KkFMN?)N~eem>-ULKg%y^si}TwslPR0I6Y4v*&KEHqtCk4=wInV+zfY5ibH*!m^B_%7HVYy3 zlWyybazRC}9%j$KBf)AxcUskHe-&DMW8>B}w-}bqH~&I6=jg-Y$Eh?sbh$d&-`s7L zKU8ywUVK>ms0e~yz%P1$0VK%$u_%3974Ya8-miB%ILtDo*Rl{-vAD;jrh0-I_1Bd} z_mmGVIOT%rE`1kW<#O4Tvlf=~eopABN5spMrO@DP z?&jvRQeF!0k5N_Jl5tS>Ue77#;U*>2%~(;~LG9~v5)7;|mZ#as>g}x2^UpB%M6vk% zI6F{x><4wwYxho3oaQt$H#MF`QKdwg#P0dXBzrZ!1LC12jNg zwiSQL5trNK+=Lzw$MdTxvQ$H_eDy ze;R$PK#zdp#A%YMU8w5%x2uK4>yF~|?2c>2i}F5P|D3le>?OsI+xsnlk4_t9o&4QHGpEV@ zLi1QqMMB5R%E_ZX$zX+F=!JjoFH^EIKd+|d(Tq$A#-rvi8ohwE!Xo}tb?vB~m-qxS z!y8AxfK;wkZfREo&lbtfZE^(UXWGHxrp?0Y`+HBY;&aza&M1)MSR*sX0%E!?vR1{8 zixWDpIHHIEn&gTID@e)p%R)QZ?zKU6wTiMfpM|Qx>YvG_?Ucbq4#6oq`pKFX7zi<9 z*@RwlhY8!$g&(H&leYVIb8Z8a>kg|s`v0w=ocJC6EVWbiDj@~nr|p*uHgZV>xXCOh z2Dw&B0@_yMtrr&%qlyt3I}>-uIeSmuTPsX!2Y=`N?pCm40eGJ008g7faHkL{3~P;SQun z0ZQjuPmIqyvpXMH)r4egYjR-t-rXi4t}zO3@;cPGb}CqNL^Ty;CoidI|E_^^je*4q z{pI=@dSe_utet^VZcs>Jo^&|!TGEz$^0BbtPjIk)Qb^_bRcBj@G`^|WiwX}HvBr?1 z6vfwQ5-+;D&su`$4v1D!QhYv$Ehi^S zuen+`PfrPph1zpWwpCnCs$M+FpBTUSAa~?c6eOcCT)lN_owuDLY_mGSmzP|B;=4VP zKc_~HV-k}QBb%hoL~*)yNy?bczn$Hy(hM4xD@{&|?OAfD{>1kt(657hSpUJ(e^R>N zAWm|Io|d;=^)z(ZU#b$k{Z=m6SX<0Hc4qLgcgKtZc8LI6um*w&=tt>#+W!b$Ps_(x zX0MhArN+Dw3ItTse8R89*dJk2^S%-WJ3~1{+tiYh+#}~)z?CRRKCr*}x-`LTZQxm2 zV6c-iZ-E#31@2!=O;XeZD`tN)jXs3w@I%U3F8g}xcbEFD!ETy?qKS--W!$}-fl}+N z4#hUTrL9SMfUoABBiv*9+tL2tJeP=fInBEq;&Y4*QNkxGhG{fYWP*O+pTE&xsd4I) z6cyR8G~;2#l2jM$^<93JKekk{UkH;a_?C9vs^5183tbhM?@xOZpYIfOq)tfCxcs|F z>iGrDzSY@VTXhcMA-up9zRQ>5tmL_&$pw$yq6_wau3<0Oe>#%?c2l3BXyNLvarvcS ze4S~aBWD;M%O~wxl>^4p?>(H|EfiMIHnQFiW_=fhuZC4v-ZI3&MqC|!C0dxekd#1F%rvlx&kx|^+!E6c zVtseF1!TIPtMMfQQ1&9e^w;q;0IC@@;d_O2lYvn4a%95K+-2O#5+i6f7*$zbxG4U( zL5=8Fk}+mdi1u~nHvyChz^Y9(JW}s-f}0+Ius-Xr9nESyGsE$6$2W?gH2ua$ddHebfL9wkVWm4A^X%f|LQ+8yn# zBHp1H_-Jx%kB7l(%#6k?Gy_XWw}2@wK1!>4adwMI;oeko5#bUUMkyCXDg7dA(`~I& z`xat};A>rZOjY)sx66(m^w6di#OfSH1kqWN8463{26pMt-MwmkS+@bVQ~BblF2)l` zNxy=J|6O4fTxTpa1$O?N4>+cD%==;Hv#zpi{7vk=sQ05h<=$iXWPI6>U`9rky~tJ@ z7XEi^ux-+Zg(vi7en>K3_y9RAN0z+of=Q8C&6~ngsiHEiQ2Dj9HafOg?ul=pZmJ!H z%_#8yP{E(Y1&QGYi)rMMf5pl2@yjSY&N4_QJqYMiZea5sV(?F(-K@*H3eP>pUW-8g zudT?#UgCy`%#-q;WRdzhRXU0I-4I=UFwU0vBpwi(o?!6|r>G(TscGfETvj6r=BS)FFExvaYQu?{R1h|5{^(HA95QAqk;94J6M9YUX8F zj2^J>&gylcH&*Q#ZEI`!+HvH?ZTGqM3Vp)Ay!9KduwqgOSyo0d!4$cp)6w?I{>pm1 zl>O1Lk`M3vB`pQgWOKmlWNyajVVxWN)uUvvWq(?t&s8ler$(1eQJ(V-f$;d11CTu_KKU zl~1nur}B)zbENhQREUl@_J%X+@t0l7{CS;onm0`r9bo)UFkL$`5VGGe|ZK=v&7UQ$J=CrlU z1Xaz;hC)05*WcgI2)-_^IxqHr~~x= z{%kV4)K9&Wl2vO#d8^MpNFL6_A;DB=Q99tYZj^QD;m$J#m%Ygm*GTVpqc^0Ml5f|& zr{^Zh_;@s~2nur#gcP8zO7ND*JP(J^B`kN^BRHb6t#Lcj>4&c)6J~ph%-9jKBq{+< zIJn$u66Rw=7#W~EW*Ys$`Zgaqon?b9y}ly^u{Ekhv)ouajk-O-F?O>~U*M z?(|F-snA@5JFyaRMa%;@2rOCssJII@PHW~6ebeya;?-Y>Vb^8}LZ1{WB{_GKTBuB9 zOuw++#Iutq5luurK+l&JyH=3~Sjp|^F-!#_vOLZnOM~R{$%D3f$~oXIK{kt;e&I(G ze>nzBLxG47-O5j7NJyLC;Pmv{x`l2j7ZDEJ84#UlILkM^{VFX5k z`U_g@zwcVrdo+uC1;V$U17l*ZIB;?ZV+2_!5<@iY2K1MYtnpa!#d0jG=fEI&Q23Yu z6A&zhJz;WP2>J{>YQ=;X9LPE6!0^%MftRBenp3|1)#DEL#lKJvn+pg`WXE7+RnskO zFmdn1OMFP)47{#CIfp6)npfXR=mS3IRZ22V$k>7;=7ouGCvxI#5#oSif=^g-;OoSq z#@C^+1-0LUMwOlb)tLYo)Pmakft@?S<9KX$`RrK~*mP$CU{2$)T|)z~GkDBCfPT=& z^hU_~o(cHT+ko>;WCslUOOL;vsq%Xbt_VReM9&O4d%kWy5-An;zX32Gix%-Jvg>plKq4M>0^KkqZ33FmwU3gS7R0R^1*86Xt?LgKGf5BT_>V$koA z1Mq?#^b=k{gppB_OI`u|>kZQ14H)PMlM}Fq%XTBEz4Vu^h!6Pkc~|`OD_4XH_>C)q zVt#PNe^dh|!0Dj56afCOEC%=tXu^4~1wlOLwV;6WUJHN<1SKfuuVSSOVnRfBpCw2`C}nztUiG9I*CWI^g}~d7=Lb zS*U<>aGfP^sF=SVkp53=@bs6N12o}$<^VxFSHz$Ke&dLsm>)9-2;zT_K|YcTkmt_1 z*YArM7)$5eYyFq$fDblqp{YCgR}lsk@KaI-W8tibLB;$~#QsSQp8YDs0zeba#SIk1 zb6yJy_+1eL#r%*u{t$zHj~7@mNMP6S6JEb9V%X<86fk#O`jsm};C|(b)HT0yMW}#Z zyCPJ~53cx+YH;CK`4eiwIj@C+c&>=Nt`{tyEW-6SDna#*~;vqJO*nh&5p8w&i`%?QCB zF0}i`{G}__{wjg`{&ETc1^mtxK`}qL;yUfVr%oqB8w$CugCdD}?ETpx>R9`fettH;97 z2C`km_=^pYhI{2_X}8k=wqbXW&Hpd9!a_*1Dh!(=$VTD=vSDMMNwYIy597h?zryjN zO$VhPxmd{-P)P1Jr$QNl=8Q2NCq>@HrLE=I`NTHGtD-s-{g*i08FlFUl>sBKih<~P z*g@jbNkVF_=5>{*r)XACJjtUFC;mvCM`&?D{bRA2R?62=$46s)uT44N%)K4)G8!gTlJ-|q1TcD^;Wa7eoHGiru(%a*s96-*BS z$NUQU zxjk_J=Yb6a&?p%H29<(!H5kxmfm3^*eQ)AvCB13MYJszySbe%=&7-#XI~A~D1a zWVxM7|4K6GKc5tsWIz%OxarCKY!c`3sBCQmYRo0zT>rT}seS=2XcSE01C@etHW<*# zfMjqM$skPMBl!>PY`Im!Bk%PSYQHN7hChc3=pJmph*8w@;R4EsiGw%iJ@>2}5dKsS z{?mIl{~`=PqhQJbs1&TL{S4aoasaCQJ&^yv&bOwf4oUDoqxPF}KzH78aev`N2)X={3JeMaVxn(SLeRMW8W&EeD`cFy#PL3bq`;fcCF)0IK}G9Q=Wuj9u{~A(wyN z^f%?;>-lyEN`e8`^nAAfCBcNjt>2visLXdS`UM-51e4c@&i7a#2^L+n^Iim!V9Nmv z9$>tKB-nCr@qD;I%K_Bf@8#eR*bEO$9Fh=!76){tB|RS`lb6HGfXeW%UVZ+;&+!5t z{l)V^3Z=oMQ*Z-VM}pZD>;R!QK)3l`5U!mE?(Q$}1!*u<*$F&nnA3vNejX&Ye$hBX zX)x0ZXg!R>{R$CiZv<}h!({c}n`*?qJbH`gYlmArTh9+>L`xP`X3rR80A{o(4*h+w zMUVwj@u45p>*4td^sr8%PQc_h8d7*RT?s~k*FS}HC57gUQHDbj(8_`$&W7CLKNEMz zp-@R-`okOvZdl&hrno8w3{E{fuZz#-D>LZzj}s!WA%My@P%imF5ob-_%pZy~{WEb_ zEdg!5{s0}gp&iiAi~>WOafSn>aM`APKe?`S(ZDGu=RC zzI)NXKf!|2Dr}Ou2EYT;Jb)zFIDo<9&+iYM-97>l_}ci4!2S>rHRnPX)R_*WFGx@*MZJj}F+^N5+n}){i;0Pdd<7 z-42(>s!#VGAFdBsyY3y0cg>;$^giv=MMl2kwUf;X=D4bps?pQcxKWp*ov5+X7Kb75 zOzjWc>l_48DUKyHB4IXpZ+gm?gtv+tc)#Bfa(mtLyKIL=^+Y>pZOFvdRnN4LL zJL)>@AgelDTRrkDKRsoh<=@!8blf7exqY-yeOlpqlIC{u<>aV?Y}9S_1isql^w|-y zo5jx2BKz2B>(R*~S$(zZZrSnjHvj3xsSf^=wqUoTt&Y>hk;b?xzO8V#oM*c-aVJM( zM~&!iClq5xUn<=8H{(Ww0sTWx>c(7-o$Fsu61cghcXphj>}_@&kR3~$9Ih>P9g@`? zy6ul|9+J5o9gMMQ%Q$G3nCBd7pLC72wrC&C25X-z@B^r7A8!D^IvPV&I6@vjz#VPU z9v`wEiPIweHml%r_sBc<^fdE$uWiijVE&NV?EsmfGH8R}OZzmqk(s!;uPLP?&NYJX zcypKk)XR1M#quGU>p_9rad!1#-QgnQY)2fwi)!_-5>q*$j(QUV* zwaM@Ur6<*g%gk=qT#x*#j~1&@t4|KxHnt6)xCND-%$&rL?X5dh?@#u{ZErTBkDUr0 z#+`0))+{gb)AOAk)b;VWj=GK=Zy3*<_=s-$eB+y#b&J(P_dO9TpSe+a`sxcWMpy@o;&i}{+eRv=L>ar)#X?^_N z$FpO13OQGfD7<%?V%(;`Xq9btkPNaroWuw^&wd-@Ds;Gd663yayEMjC3|{I(ssHum z9LO64<((TV<8-TATOBR|35PrFoz=Euqg)3LD?>b@r|mAzvjB(nD#&PFUR=1&Bj-5egg@-P(JjN z7_#LU#MAcRopyJ(SyAWNkJX!rAj^K|s3Q>{rJR?&Y3Z#c)iHsmH!ssCj$$%aVuD9$JCl?lG) zVXd%F>gqTpB`$I}4ecBva)dlXguM*wG5GaSKq2GyR96@CJN|1|Zi4e8~qO)C0bB0}!SGU$y}V@Q`Ni0SMoKufV|e zjsvrm^?@plgrRYy5{;Rmak&zWpP})f5>19-_);vnm35>X%>r=QM{8w0C`UtQWPBh; zBViQ2R9U|)CAuKgxg_~uL8xa*Qf5JDU`bM8L1<)2Qe{DCe5pY5J;0*9AT+-uslOn! zyd-J7Ahf$cAar3_(s@A$VOf%MK?rHtPZR0WvK0S< z5azO^;DQkDvLvt*;j&+4MxMtu~am(qun<~f97JO99lvW(jsR*Ne|Iwaa&e(lfIpNFYp=_Z< zv|@E%31W*9tQd}dD=G=gyb+1QL4Yx>2w?0qcb`|jzcr{+u7pv^5n+WZl#7<4j_^n1 z{@EFTyTo|5etCJ*cEMNn5H-e$uA5IZH5Rp~C!M5cd?1UW%_x77KmmKN4H_hU* z6=eJ)XBS^O>2>q!<9910&Tv&+cd}&Z7zFn;^#WCi)CEUTg=HROhMBtnLgX9^)YEbJ+4j(OI$y~IAzRO+a?tr>m zgZ~T3QlNq&Pz5`o3f_Y1{eP64I9CM7rggFeWcz6mOXUVaxBSnM4_(rL9S&oFwP9#C z!Eb12RYYlQ$GnZ8?iwLK*Igd#ZFpDXv_R=wRW-~ntS zcm1@YBprei`l!1`0CYe9SL6b>DxqAdov?RMZs$(((D{{0=zFxb1`W!cnL&Y-_>~-x zl~I3C?5c3CR7%C}|9*CD6*?!&f?NjNN{)fPw*VwoxlFhv)s!=qKTihy<6`WaeV zX4-}sT03Ui#u-|BX4We%{v2OjM_S2VCS2)KZSlOnLzGNEv4a6yG}|# zLCssfT2WH?QlJgOp@8=P7syqsA;88}o6vO^Soe3@MJ9H3T>JrDcVeJxC3GDD*A#y0 z?aMOYiU(b(p(_V;6@jkG(A5ZB_w8k7b{5d$B;6zz7{L`ZlngXv)o^k91Woh05W#PAhTL^<&*qtM@f#kwgkeiVm zW@o5E^UFXl?Ci|^*!jQI@;A!=hRhrOU3o_)=)S+!a>;ofKxwH0x*kGTo&}KN46atI z8T3}xV=5{DC}XP7RUNu&f@`@62on<&J%6KZqlOejGLZxH5ukLf_RCkPi_G zoI8~JBM8W{4)`8>7VxNfB2FTNb4j6o@C$a=cE7ozzupS^4#kK=~!(D!`C_ z85h8)QkNC~(#qp0D9-?trwinf)Q1|F55?ml6s;@}k6XP7e5H-xS`J-5H1aa5bvN!t zXsLH2?t!Z)boGX=jo>Pj>+-L4%6mUzC^LAIwX*mFU+T6~e{l6-8~W3US~YW3m9koDM6NgVp-IJ(=j<5}i7*S%?em&)TYmxGPzF8->Mh2Yh(njX z{6~w2W3GqWPQX2}G`HieZC$cdGQOiDNM`U!NXw!W#C5wPj_A6Nf%5Hzy`NJuPpDC&(nYlBvTrg88bC2c_NXOa9lxfQNKD zGs9JFmCG90&(Aan^=o2ni;==zYIlh_w02V|vnaf|tfsQ#ol4HU+(_0ZrEr`}nLn?F z`?ZQajBY$EIUQx7rpqZzkcCwTFY{gd2$Z7f1g z?-q5X3iK4Ee^Pr(_-s`|k-9Hkx%lv+8!O?_j&>}OQaIb`x;MWunOoLrwC3@iU@cLy z5*%Zf6#AS31^y1j$tzX!u!mxM!Oh16w?w`jj;NOiSQ?C$$5BYeq(>6?aqY%m$$ML* zF>Y&SmRmM?Q!<_CxUJ)rWoC0X+KYKFo|Kp<8_R3DQWM-yR`K9eIa6YLnj?#)!W@pCC7X&>>xdsOJyyu+=~M2b!)D#xpX!2$X`IpAri_!9Y2I(IyoP`C-BQ^%qNdo*)lf%)mJxYGuXQBz1)rvi)HW#TueGz!u3 zCU7w_M8!wqY=w-|wRy{RU2{TPn7WKMC5`Lo8Q z!JD=Ff|lyGUIwjlpGQxpypyCGD5ghsbrqz|H63R)?pWDs&NZ~#H+1}ccgl&|DvY@`C;ZP>7Bl#JGPNg9N28^u~>}es=e~B*da7pjrvJSaOXM0$p;VM9h5YjyL^ayx zUxOXnUUAFh??Y@CiLPY~EAk=U$Gy{+WcjGg7o#ysQh0H$jaI~1(~h?7iKH~VvmXgc zBz&_kD_MKhmq3w=q7kB|^d$jNw;O!KOroDI9#^gM?xQD@F@nP`sgBL-&y%|I$+DdiFie)%DNM6DN-+0(cb-(3}+4tT; zh`}a~$r+)f#MPtQRr~xwwXTF&De#?VTk`W&dw#@N1zKid;gOdk_sg2vkZsF}FZIGN z4{NrYJP>=)j)`(7`u>uUVi>Vz)K|-pO^=t)Zu&XhZwlAT#rJ6Stz8+eg4|46xoFHW z|KZw*i!+?FviU|~<#au9HMW7YofXL)59Y5oMof+#GN4Y6e3H=)TS4iz3kh#TFOH=2(oLHgqdh|6=hq(Q=hZY0!0RQqX1wi*lz=ar{!}0`zIwB7 zfwp0NJRdkGYdPHY>) zxb}t1En2!=G+(E;e)45=P-`_fp)FB<^=3YZ-q5M&csqy@lc>*zeAGar9Fth6T))Lc zx~>k=Y7pZqqFSyKj$JmO9j9MB*yraLJM?<)&g1Al(MI2~r9^jqt8^8n3j@;dD>w|& z46|VtKF-op({R*#AMA9N@SZ;CjB~|ucrzeB8{%2J8@<=;TQ+nvDAs^b7K3a3t&7hM z*TUzO+KRWG%;y8AVzHIDkWKq#yzW#k+cM*SU9dCOy4fGS*W&xB9Ghe8KtNAh;Hc{e zeJ>kFURrUcTO6}C*5rn`X2u`_g2TE#p-j(A*%t&N^%f$&aW1)2uGy~lQc?pdyC3Fd z6r%9(N;HYPp3B`-p^D`)4d`yYE4aWup8Y7o!?_=^_Oadtd<1{a+4~uU=k!mNw3@s*A>7xU|M?M#@zr)F-?`{8_ioii5Hb z-TP(}?)_ckQOdcnnNUu~$UzkpO{3?1?TSd%7gGv8XFnflYJi)T^0@MDrG?hx1JV~O z*__~#NwZJStdOr+6R}S?q|nOZWmV_N*YxIP)f-2=+H4B$F)%}_pq7=^=GFx!epB9( zy!XA-=3Nokp=6z(+4MDS%5C86;~Ec?+-BOIT+tVLi~T;4c?V?@&PXC@e*Fa*)dG8T zcm&dO?Z73HlMl93T`y_K2(aEgHuxI(;R!u1gE*3rC|WVjLzRao2w(Eyv#_a?o^Pb^ zSK`Wlrq)C$eXxipnf=n^)2p?)8z^X}8QtPdItAiuN_h7czj;M}%*mAd!qQUcpovT$ zj;#OMkQ&d7k#q2y+&7rq=oThlTKt>$BIXZYXbwV+R>Lnr1(x%k5*~pBhkYr zcphbDufMYX*fh4%YGND3kZc*LmV$m_LQ;lsG_}M1UhmBXj2!d9H)oFb*a<`1$(D4awo41y}@lkIgT5Cq`Rx#G;-meuq-!6>07 zxgODj!JE#sJTx6ZKKX(_Wg(*%uj`UwF>a`HF~9PN=HT?6iCd_a+fz3;|FUZ|h|>$l z$^BnCD>!oG4SEc3~LRJKZo0+ zOT~-i?}l6AUfpoy>Lqu$-L*w-*c9AwgqKp@lp0>%T(_d7WSeK+TL6(-(P7QGkA>_; z*K5#8|1y5kq;R-Gh^OOXsMz7w!d*e*&dw-;Dk5VuyrxG%8@SR51)ABJZ|Ss4olf8O z%Xur|(@vzd(?(YSe-g-h+rF4l_h_Fxe1MreQfJ#d?agh91*afw*Q9a3^PPa3t=DIQ z>`Qg>iL^mTbbb@&=0v9M`=(LtCS}!8`ZK-rnB!@ZZnZefaF9y&xSvuT*r}S**G54 z3BoSf<;J{PqLizygHXF43g@}Cj*K;?J|W=WORlz9i(PKP>SC0;`&vlVn#O(e1rNPU6ca#VKfkp&AjAAw}vcs67*PIrFE4TfTbM>_LNT zqBPkYe2fnbZ#axthCK=s`W!q)64YAWb7iV%)agdo``1;u4?mYSPRl%E?HF<6 zgHH0Xborvw2gD%3RS2Y!!8L zla~A>EmkQLA>2*HB)x^=IE@*8(W-)_zi0cll}Kvil%Cl)8c7C3z7CYVZy8~Ehi{E0 z{Xc!1pndqQ&g}-AdnRes$A*4QRNPu^W)pi>-Bsh9jr;Fy1gMACD>j1K@2h^jYD%2I zKK4wn;kbjp%Rh#!V_oafrg}0jy>jH&t_D-^(o=zN zSsk}jNRn$sIrj?l%y2Oujng9W!P_b0PT>k-u2m86A?=TUc1%GNJYK~YEXPqN`XpT| z-am&(Q}*E4K)Jb}$KK9l^BXhmo4!E%mw8ypD?qJA^s>$fAZ0m#xRbiND~ocJI5JwxvcCmMv>`WLZ4O;Qq+`!rvy!kQdDTzAhW#=G{?<@G zA(7smNOwR(4LiKs0#oVHTneKuV?Ba}Dw0ICeeWgu&vUlakV_3wG0{Pi#dAxxSRy96 zy;Z8JLJG~9{z$@&PD33&jM|bHBI^qtXLOL?`}1*_s&rfZvstVd(i38S(}_9YRhr-{&+9Oyz4 z?QWh3J1W|RAMyo2cGEp>V;?1S6|%ZvAXXz;jO;%25JrWgnZbSBV)wf1>OyH=qq;y) zp00FIN4to&P<)=q7~d?O6LxDhx}{wJs^~=~wU~77_S9Ml&&bPz#5Z(x(`*pF;4-<( zgpEdAz8XxlUE*Ks_?GG*QiV^vg)7t+my^NzW%qWS{G>>l0p@)bW@^DoGNOkqsSOcF z_k%Zbu)d9^Jn58-_*Bql$oN*mFrrCN1db_1xQ*jZ zo9}d;x%vY=8`fn(`;sElXBpkODY|{ExIAk zAYAx8|#ZzlxVmszAQ=dmD57-R1k(-b{yxF5D zzu<(%Z)A4Of3qB0lNINiYnWV!rM@4nTCHs4p_0gT(aMOT7kAxBF1Xe&l~G{4wzUfq zcT6~)xvuKvVpL8Ps=C)-wu{0a>2Ry_*5K1g+P%sy>8^MZy}g_=I44A7zOhGTq*5FK zFHKpuaRSS-zECx{J33?>;&r~;%u;Ojq{F+1SCe$XVX`7=8~h8U zoF1V>zLl=YnS+I4!f1|t%xxoLd{)AGvyCLXdHOE}Y20R3U+-18lL-&IbGBI!lcPMi z*?U=;GsnycZ8Oo``5tSv#;h5+Gk>!{wjJx1;PrJIJ&&r85bhCc4*SnGZ*a$kzTmDf z>EEw#9SC}|njO(J8QQd;&$U479)_arDQ+y6ZIE-vEP%}GsTMVjsOoy9OK}E^{O;7X zCqXi9o*s?C2AB-alzV08yN_h~6#1HS;798saUu*Jkt`mD$ zO-y3Lu$P~rf>ltZmnL$p=OQ5Cf3+&_6^WSJ2-)t`1Eq<5wOhlr(&-pRQz?01v zq7bce=M1Fr%QiX$8-=VLlH4DsPrfYTM(8`-57L`6Akb8P z8Z7!2>%-Pn{}Utc)1ZFG>IWu%&AKzRH7Cm6ugTD;?313C4S9$?Ke|KxGkq3h`8>!p95>NQvL%ek6YUxYU=+S+*9+NBAo2fT~8Tj!umZ-IDAK&JfJ465Py`>)g^?FhjL z&sql%BN9ll(ID)K?xK=D$#tF<0&25%$fpgtQm%z2_{eJAI*2u2DL<}J-0ydI zytJgXK(wb7OJf63-HqEzpJ=oRN>u-NIuWv-$dc<35dV#PI)!gylqzI{f}+AZI!9!I z*UY!zCj3&9r)diVlhYkz+MW~Vw%KH{7OnIz%!1dK{ZW$cE+ED{JK3)OG$t8D_t^ez zWI6eT^~oC@`JoLL>PBB(&)=kAXsqPE;VPgv(Wnum|2psUtqQBg_I-VR$K9#M7>nkC zg-*W0sXJ>FcS9dP@;VkX@u;s0o*{`-`IchOQT96OO|gxtcviK=vb-!IU4dJPWq7>e zp+V$vs~(pPRn%=?FS1=i=P!b#JxWIo>Qx zZwX8_x&*CqX6z8^yH4JSUr*!+wSee4%v%P3T;w73PL_u*$mOM=Ea{i%{A*o|o$PBPTFeB;Qlc_iXSPL_()d2zXn#`G}J zkfON=hdepB+~l3id+6y5Pj`p$;I18T1&fiyNR$_jzk34&7i} z@@-!ZE1S^A!seIGFB!mhnx_2tocSOz;L@jvhg)+jsSA%QaUpV=zE4jhH~YnI%sAAh zYI5DQ$J!zOMqbMPayr9o>&t8G&$67AablVXpD?j5=@)eB3?_S_<;SI=2C-ma>PNnC z89%lk4=}xlP3)|f#^QR!Yh|N|SfHfX*Ucp;wLbZUWtG|UraIx0rJ%s1C^z*-nr%vy z)Y*s(`QAaw7JhOSl3pA-0xZnd!ky7l9A1dE3ri|2$^oW$WcMN}3_MRDFfx1CLVvg*V|P{-f^um_F zU>l*CesHJMR*VxD4Hk~}U}4nl=S+_+KP9|1EVuvKd(ug%4zHZUg#q+?aunqJglDCD00>rM)*HqZZU%z;C7C=d&e| zOm!`NmHwQWsqho^KvllCGZj<(i}!&FEK|gs zSl1%=_NVIg+TA&bnI~8DN@8z6j8bd3l@`U`?H4OSo>)<^SUjx}&KF2u7sJN<@FMn-#-4 z$M=Hp__<4nCkGt)n63v`y|}affqmjq6?I#3Jtakd)d)84#!xzT!@&a$PcA{jx%u&N zl(ky^b?jE(HiU;ReckU+U+r04ee_-#w^t}M;!bDjJ0n!~OTYcWd4s{8r`#xQ zJ%F)#i0+6&-jmI5{psH0j4t`|U>n~Mm51e!7hzn1B^4UEH(ZMG(;t!IPl@` z2X_cMv&_40aWS?(YLn%4BI{EnWzHqc5UIw&5-gj;7n~3c)A*!dvD|eLE=zpUU;p7oDr8L8Y4)0~mt25Vpy~&(?=6yytlh%lkLdg=Fy0H{W z%&e^vHOF=x(L2YrTrNuz&no-JDtUcvMf_Gy6!iJY7+-H~HP_o)?dqmN>Ba7%zo@^os2M{3`FNnz-1Nqy8py;j~=U zbQUt+H4TRq2|cz=j^@vGvU+7Q!|Dl}BRx6O9O4(UZt75cmO98|k?G{)^V(<@twYmR zUrx}!$@Gvj{DHjba%6m|4dSDaC}A-O!S=#D`>y@Mvth#gSIVh+vlLSpYl*jn?DUA* zy^c*1Z4}Dhc`SCMDyy?rMJy&ul$hoi-8e~M%Qtxv8{%+BFlO4Sd$J(%W3x>r9&sx|f#O z?YKgOvZd>Pa_3E^+CJ(|-KWs0hwGE({rslU2iRY{Yb>!2jA)VSRObp-jk!^l!zH@r z4DoNgtW3H<5qa&hboa{b@BpHN=4HmP_gG(Y2$Ao-Cnk5*2pz##*U#+8d0%QoE9GKW zRkz}6^o-H=SPE@`c`AvuJ9Bh1AOYi5dk^yBTXxh1PW>@!`FTAPUBQWIQS#k2>8!~S z6?dzYE6cUz0%<;@TYabqIdK)<+lw_Nl`%?1HXIz({Ep@d(zk8vF%gh$TK6#9D{(_! z?7wS?=X|tutx;CcS&#qP{Lzq%EBX6YWQ5XY22^+?2pQpU#j&AMy!(`ChRuA=tF=AM zvg149pLMTx_=~dP3|8sX5(#>)IGG%Wf6G+%=w4St6Py~AcsVKhfk~U*zD>4;*jq<# zaqDC4&7c^eg_Ha5^qs}CK6ZxrUCu0Pp^d{Ays+kyN&e;mNmCU%Zy<0>B{DGM{*GC3 z!p+Nqs%w4By+F)iNc(T<7G}G-Z>#rNb4++miN?oT&#=EaUBSWXlbC4({##^d%u9R{ z{z{*TeljzPzJZvHdAVaEc^Aez7VU znwM^8i66Q53SO|%YSv4bdFd*DR6Hf+GajvayJw`_!(02DCyK2)#_8@5VV(>^iD&%b zI9pX0_bex)Nv%WLc5>b^P%Laa?eHU2>AqqT)w*x{%!_UU(J2ruj4O)E*N1G~G3?m? z#yS^^oI*;*gNG+Bp?#1iWmpeNEL<{Wv2ODd+3{i&y*&NYLBlVwrPj2ENnS0Q@~EB8 zVWyj|i(|c`vTT{N{V9Z8nfqG?PIlmn3>9n&Y8UIO z)%AUL?iS1ks=Ch8%t{V@3mJWHepP!Vd{BD>aCO*?P{=uz> z<(ETm=q*GW)QPTYJom~AY9SnOe4=O%;Wj+4gJ8;rkt=&$-#{K#7H)%xR+No$n zR|T`53f2+VPpWY}C>BX2E)KXyJ@c`m_oCr${Xpf^(?{e+^-nL|e+m4bdIL$JG4{6t zEwZ1ErVbF_D5TvIaP`Q1BW1lhFyrK?Htkww9aAGbSqM^Rj9Vw-?s* z#z*Qa^K#)3$3i{LWJ+YOq~`TgL-lght5I9Q^@0`8<8oPqPwyMPuD8G0`{r|oYbsj0 z&qvv$A;$QO&PM@5(bsfc?GP^PUEk6gEv(TFE#hK~u94Lk3d>xO?_pve{Or7>&E3ah zL|f`|Yxv9UmLe;^u(oO>m8-l4hI=V1rQ+XEF6|I|)ec{2MQqbKWQxhU;QNv+<{nOF z25yy*c6f0}A;p4MJX3L0kVr4>2VFY3TISq<8=llw1ZKKGpNd?}!}oYInhWd&6<=0C#oLW$l?>_?<>1n z)~hRG*7I;Ull7U-?HSzK9B=#m%Su-g78Ay7B%WsS41LS)FhTs$}bE!`^hwdBsO>wJWpGYhEQjTEi%{ABZd`A)zUY z7qsI<{gmYJ!ak&IIO!3x_b`FYqE0fo3&BHXMM~F;DJwQcohn1?_SM1%`&;U045l>r z_oxYnS>8m93J25N3b>cD?tEO&N5-U$H346D7k576Numm?jD(GkW*L$&mo~25RkmuB z^cf3sd)6{D?=?*p(IT!l!n{{CUiiw^MM`NnnooR4bY$udEpB(ZuDfBtxtAl(jgj@u zOWL?XH%)d#Dc>XdLlQIJ^G|oC=7ooBQ4!J}*QSUc&LwmhNDU&B;3igNBP60J3L5Xm@#hmRcqOpGxq?oI9Uw2FH-Bh0Rbc1 zba6`Fvd^}!)+j03uLxX*FpFKXIHoY}K#*B^Ua_lZo&XeB6q*jQ#g-ewJxtFDku-Hp zz1$GFr8U)-)?Bgf%FuNRzt%4?4SM|%PX7&pIQh3mq#z5V_ZI3BPpjc5>MogCz0JeO zW)D>=6M>IFV7hdwn3f|rF)L1Hqd6x+YpngmaSu4*==;jtg^t(-mc1#xV_)!cgcw_J zV`4wbLGWdtXcTohQ|hi!qL+?1WVkUoi-@*fk-=MMpyf5KM+rpqN+`{J;YViJznyCU z$@g}8F875%VsIxmk05`U*sHmaX|l5-3dOKbfJyQ}!G)l~_t@(~nrapphNAQ8BUEx} zDfU}poyU)@2{JmHEfN`l?+CknLRKZ2$)fuTX_R|{r@AETPNAdX(=4E$c5~5+N+wlM zk>V2EOJ$78{-#BK(BcNXLJ~- zm5X|e)qx_%j>9v89hYOKG*^rfvvKWN>LDSfa65^xOk50VgKSH;XZy9KFC|S6HeZQ7 zmG=p6emML{k;w&D16ABBcaf`;nf@Wia&1b{&IF#OQ3;Ahs8D#A&b)0pu4tv)rE#I5 zyKQ${_NpTa=Q5?6llSV#IWrw{5(?ANtWZ`ZJjYnw;xsB{X8Jx)s->Fezo^4YF8=6e zwkc^6k`wr``GU5Z|9cT9t~(jtwL&hIQWsg41c!=vg$eIgGkWxWX(22VTua0^o5VeN zf_Lp84nx16UGV}bz73P)T{8!v#PQFp8W)0iAZ%e}@6@S#8$_~h#|}@ZUeoX*igH#K zO<}Zng7yrb>o%(Jt%~H{87W53I)Q|5pK*dhRC4X7OCDhn$$WkECfr#tT;t%C(Tg<%?H88*?+=Syb#5`Z;P8w#weDwYVt!Lo%!PP}q%KUi|%`zm9!8)^x zqjosnT$Or6*kBc=URt_ACulm$#JU9aTm6cyMdo`VW7TcJEZ@CHRbJegveUGPlBehU zCJMLRsv)5*0^@%Qt`@pFb7v4Ty2C);wFS?gv{c_(xGn~uI0)sA8#I3kh)0l84&Pp? z94ExPAC`XmlE$T}2o|q~whYlLY9znzP8Y3opc6D)fXcG+VP(h~V$S@WG9={o_i9uYA z%T&tyn+e%@N5H`)gLtlB8wtwfW->(u)!&@d-lY+7=4X73e&gqzrc}M|NWZzi%yEs^ z^4`6NCvyd7=6*(yxr`&sS;lT+xBq;Y%G~(vZAx|C0s&OgjFb&Pj|=FFgpw!Tk~?MP zi@ca(P(ju8#Tq5uso~(9oD3U9onWKbh?{Ukq>W%0K1Xt>9;1? z77u@qt+h(fuXy6b*dv(XiZ+qYHNCU5gM`CGsTP8yZ{Qmg8|Mid0Ma1y+`cMNXMmXw zW$g5Jz8y7?y>}_3&@}r)K_WDuH}bA+Ti3pj zk4ngo+Fu7~oPV}|Jkm2X7Lz@EY?ZSk>BeB3#5C&@{zbHXmBjh$yW=E%ud}xCMxe53 zIj)Br9y=gKpDs{0EX|f1SuHbul3i!P$l*5*c1aVYI6O?uPi=78^D2_A?Y{p(PFeQZSp3`PnsUvb?&0jX#0btw+sY00)*Pm zNc1MLP)U_T&z7&RNVI~VBT+=PR(o9>4BjkRtBJpH1Zg){f`<`$d-HM-u)z*>wKCnJWZfw-FgssqNvOT@v$MIQgPy0KQ8 zYzIUfR=hGAxgE}8q?No!J9p?s2hV_PHD%dh9cWXM7kG82aX0kzv}<_=u_k~zdn#?$ z1HGj2y=nWn%a=8ESjKJO?fUHY1%_EUAn$6B>*zj%w=tK&c7`+Scs7fOiyQ74Pqk38 zJH4mcDmD8W6sIz~TyjysdrZQHyBfYWJrL607_G_JpDBUZfZr$gO*!_rWqu4}=37wX z0||B7%Z_@rPJ&O#uYMNJ$f1qz56^?|MYt72_-uH4{+~ChY|7m!6*6&_2n)Q_W+Pf72@+%J2JB9hMo{*0O#{H5ts2MTnrXzjE)pIoJ^4PRYFI zow^AdZpb|3V68{iehd4|!F-T$|1}{`BO`bD;=;3iu)cf0249P~`{L?LI|-L}zzDn< za2cmsm|tCF(2kRR5ek|xtHUgaA#{8JKdXBr^CP>i=J$Y*7>fYY2}PLZOuBRd*M($; zYV0yZaH{N#crj<{4B)Sj$D=cqAoro)V$}m?{&fDY^dZTFWb&Hw9 zS!^C)=?TX-5~yY7;WYe%;Mu=ctfNG7R|!Z0q5MmQ(^zvt{jxnTv6bcyh#vdd5|F=D zsFkb8ar!gfrYzx3ZCXhCZAz*-#JTCE&X*i$iv)p>bl^%=x-AZI`8ko{j@D@h4*#}m z2N9s9`4ZzF7d{Z)Zus&LOhHCuTVGv&9W^BuH-8{-f@GOBmk>*Lt>(Sy6Pt9^CYIga zk+dpch0fFIu4G7uew*$k6~5S^R~fSaPP!EE3J^H?6IZ_{Vf3DQBv-B9m5wxY{*v-@ zU5KIISfXQo0%Iy-q`fiOJy$Nw z-xw+25C!!(r5fO7*_f7EEu>DmHzJuR>%&pw! zQWn>QT#a+1Y7|UeCuH>2HT#)KXp6HuV+-Ab^oA9L1?MPO(!Y3nmMB7EWG}`#!y8ny zIv7oFq;Mg4aljSRu#n8@9bm1MS~K*s_=VILdFSFhSKmW|h!1PQze$w+JiJOYmWtcH zte46(r3Y5K^%kSojaAB}*-)gsrao_co;N6Tsqo9NF3B9Urt)>l-e9z|S#9lWOO8?I zFHlZW3#tN4oR}MRkZMr}pqfpSo$LE|r(;WNg*U@n;{`?~ftJ>!-J9CN9c6@_CBY;@ ziyxn1$h$9g5DQBgq=lY;^oF60f;3@e-fY0i-;-dnz4FR8xc(}w@9hJ&Z_kkvZx0Wd z-=A)-1YfTgI^W2pZEK#cUthHuYR3$AY$ z4hCk+I8^}+f8H(xPSDHv#l;Nwh@3C3!E8B_eT5dkoRC_5ZhNpj!MQE{+<^9`n6Uc9 zP+){VyY+PXIlcn`LC5#0C789bYOU41l*5-j+E&l9!si7+AhHz~_EMScC~$~2)-yh< zi{bI;2hIS%<``KoV)$i@-iy^B)bW&gbL9^7dm-+}(po>TxL6?e7lz~WXwi>(=CX)@ zG*Kaj0?~F(S`ET8fz@2r^!x7TRqALr5(SKdRJ=A6{|GYJ6hit(q%7|095dfDY@w-{Jne$U-;Lk!(8K^nHDSdEaP z{YNk3*3}UzUl1{<2QyIkZ+FtP;5e zDrNuFuR*7syn(=`<LUV`mH)An*3(Kkxs0DKLYROQ0qMSHGw&nerCFa2F zmg3AHtU^LRaXbuJwx*clx7jdouV%Xh1^l6T4|Lcv`>)nouz$^N#r>QKqOd7wq{+srY!u4ZqeMD zq)gKChCElD*_bx^zXJQ&7@V?2c)%#~xq z6xEq(M+!useu?N5{yGDHC38OOJ7&8Lp5{vc2Q+Uqp?v zg02uJAmGHGY`qf{QANQ(hx^PjzDJTXPWhufb}=6wq8q72v{D>&h?4tZ@l5CM4<@)4 ztSGKl`Fh5QS-!pOl<4g;xN>;ThE$#m4E-|N?tATFQnL{R^2-=;DF@aEg|(>}tI?`O zEW4*Ese3RlfutA+#iC9iU+(c^HAKQ_H%ub~#zUS1f7S?_IX-LtB#J4*Qto^Sq}Bd; zYHX?>w18h5Vk7G~s5Imez&zuih67(mpOVOgaY{f6*DeQb>Yj+J!3`C0E|BRF5VVv_ z)=rBM*oNFy|6a{TwmQI0K`P9=Ye1@4-JKK`VhzGvV8jjC2Uz=RGHx`tS}%m@CrSs( zwXRBUR9$Gns|Ptdyu1xx9tD^ts94f<2CK z3AG$w($hC=&NH&TZ?egkE*!r*(YOoNCiNL6jJx6FyL!L9l_%W1q)yieAY+RX01fjA zn&xq}&8s){U@6UlMl-HqR$1ek2s|7-J31U9B9Q3Z%vV`wo4w1~ha)%Jl!I$Lf<)#k z*)5*AevU|~7zzUVoheAy4XKj()(lqTu^)lA6%vQq8wPR><9A~d%aC7yV_j}^mO=!Sg{W^3J^p5^cDKO{6N)(z@*C_7nx@}qN zKQ#}6Ev7UeB}46gI5$y{lmw*1Yd%)1v)InNiZZr5TVW+>8|8a{GtL==d1Q7!c!quSJ=2K-bY?0by>dExKVFP3YJ3D!%w|6!gU@Gt zhH1Hp`}SF3oJ%wuG?R+%iMQ2UDa^V)rOHFT^J?6)J^@%hlm(#rn#z*w3|8tp%y66@ zB#>8MnW$5SZ$orY;~|zw^efp#%;K$FE^4`aGpeDNk=KYmP9tn|AF}+=2!67Q1&;0% zMl2{E%b&&p6|pDP>*Dd=z;6MaBehk^qX&3Z&3=Er$XT9uU${hDltWY}mi zN$&*0mPzgevP*5bE3qHru-{#c28IL+XD31m`rXA4Yf<|{5hW3#JafzfnBw@q4*@o% zixYJkW$W@8-5+k{4GHs-AmXw~9;sz~C3{fhiMrd#EAI8~(L}?qV`pB#Yep4?U+%7( zSZ5Ul*=u7>_;{QL6hFUsM%5nf$+0WXRKN$(9Gk5+_cDh^O-!3~m{C=F!*L7I>uyvK z$zYf^FwH6mnm8Mn=QGX93qtVWkjIK(b{e#{z%*lz)6y!ErQn4%_6=^+HE7_aHTM6$ zHMTO{Hzau!CR#SubC*uo*2QvMH?0jDGCQJT6PNb&=~R>O=8`6PP0?JW^WXP9JEh!{ZpcUj1O-D5_OAzkdOL zg{V}oDOc9F6!}@@6CgZ;Hc0y<*zR;6^LCtYlr9aE;tCt_KKPp+CJ``;v^}XN<|PX zxP%k8xI^flM=lqkRNa;_aq=`7@CY(KhH*h;)C|5RE1_QD7p=cpEFmXip3g%Dvg3;` zIn{SVLNS3^vq*X1p&gP`Uy#y~S}S~+2pQaS2n)>0jmQQAX3Of;iT{2gy|~<=ByIEm z>Qor)rit&!(Jr9$@!B3wTj(ew+xcl+5fZGQcuU>PwU`y9{Vp+JC~`F|#lAA4Nr#;6 zDzR`4wp}2_!{}bZf$Kgxd&&-&-Vr2g=t`$nZhjN!5!7-@`b7^!`y4u6E=;mL_(S4{ zgkxSQ@uGxZ3kJHoX?%{sE2(n+K}P)UW3fe{D0u$aBgMhI{W+vk@j;xj6n9 z5zP2L4t5+VNZ3Gj6P&U4h+ggEPo$B%vVfV-!a5~%z=m*+E=}n?LKNK|Qm_tisxCe9m%04QT&ioG#`H#B;~CY-=ebP5*@#LKOv*TjgWo9N|c#(Q`Rz`qLirc7n0okORQrB(L7&xjwmk5?m+b{JJT#q*MnP^k*V6JZk1eL> zOA>sNtN76-9<~$)>{x8Um!D&=Pj3+a-LdS;LS29a2>|FL0svV5SI6?-y~-?q^(x0} zC^_y>puE!ln z@5x!?(zW!uRtw%}%1V#@D_VK^nrEnqN`?5?Sm5#x=nT5}ie@O4O5@roKgKo{y?#iO zj|;jSQ^1o2?}Z{&_zT?1elm9;EhItlym}4l`DC5b*v*QZswHnojCtodk%rarr|m=6 zUX5*~#X>|bA8b%m;Z9(gxJjO6)W;ENV7zCG*?KSNUL~}gJBie#y;*r;{Jt$oY*Cz= zMoAl{+sGAlA*Y053c+wxkO24*Wd~{Bt|Pef=BJRWqfK9Z$!iRJYlfJ3z(?bum0^LR z)AYqP>MNi8lAmwlD^=Xxs44I!wx&(4OE{%R_-Kpu))c6|(VdS|P?$oVA2?Sp4>e2a zr)_wJT8H9uF|4rwY8(-_lBHYKkdnM!7>pvaPaF~SUCs4PtIgvI&Du6PGdr$cJr^lD z)ygfP(Ny#bWMk?&a~WSE(vjaXILFkIpOFnbHoXPFT+sW3)t692e-$dh%CDbg* z#R*Y6)9l`cQ`O*`*M57re0+-1FPL@ML2E+Z8)^RJDk`f53)$ZmSIIAQXQofymE`;& zn1rQVJMwvYj}ja3d;ya(Rn`PF5im~lf|U`Gb44M^g~A0BOE8qc$B<>Z;mGYL_k$g0 zg2(-E#=G;CN?-vSu})&F@e{4Z!f6}3NMcEKPW7k!lAY4;I`qc$`dOc!XY)%hPMHO& zo-UmaW+|ndT0c@f>e|LN6!|Ipp&d+S`Pa>hu-3wrXN9-6xAH6g?ocTq-=-3~8LMOj z3y!x38cP!9!^#=rTEqjx~HJ*S+`nj)`}&8|Lo*sFI=hsKD6su| zAPfEguR0 zn?p=LA@*&)a|k^(0Ps#De@#7b1iD$9I{rl*r`lSP+g$I&p|tMeAdFTCu)u{qm1@n6 zZqZm?5JJ#A#!F4oPcrBf5JAck;SyoZ1#?1g)xGgzNJJj~>CljS?-b5F(|{U&Ro(HG z?q!bYvL8oM_?24Pew2KKEDU@gY-#w{3<8W1LmY|aV!=a8#DUDT8Db70AkE&aO$!Y;as$?^S9$iT z(40-}#ZalVFE#UuOpQLtg_9g5aj~xA_MP{fF1MJKXk{-q50-VT&h;92(QYEW3;>vQ zpe>OAqxI^1*ll(b%1()W^RMp<2$TI@xNO4D0y#dY)fmsl-Z(@7&%T^Y?cI~kr&c>A z)krmIm4@uUI&|Gwsg6$x;^g%c+dayLp+ z(cdBGm4*&cA!7Av@$Eq6lUYTY_Ft_q?75cGEo$8=f-1TP{R6;(?D2iIbDm`ryH-4E z&Xz5lI_wX!4`oqNTzxut5l$|4wrn$=%)u|Y?EBpiK1b-i`{=z_bQhPNyL_R3cT_}A z4nz;#g>!sEB5CpHBlCA^v8esB6xXaZ+9NOtd1#bIbRm5zQhsV^FqZqLb2vwrhTQW@ z+5`xnZkjx*`*oNxzTFAot9>!)FV2Ow)s6ubTF;tq0%XWiP{RT~~?Bjv_y@gKn+X zkGtDeKu0Hc0$M8ty?&fsOAi3+CFaVn7Hclk?u0EBC-_U6aQzQT+sXKRtHEKmyWbvQmj)9Yf5U#AL+X0{9C5RC+Jojb3wwtaL+FVh$lK;s#&x$rucJWb zA}FZeeR%%i0U-@(B7LIk@Vx3#Qvm|#kc%%cBcb#Ahqpu9M9+!?%1MhsJZv$`CvsMm z@HlO)(h!f}>R0hqshQ=(gohwSiR~lW(d+?GD~4HI-`lK@mCUPjK4Y4F{pI`$=<^Wf z+7Q*MIyc+r#623u1NZTWw8&4o+FpR5j&(ajVU2RFGL~3mMEzfG9l~nB2`Ax z+#eUR@%E}pXRj}y1`l_ElqTW3cZkjrAYmI$j#PQjWN%nf$Q$3SCR1S(w{4T`&LsW?ysU`t6{C&*tB?MO_oU?#m5^ZR_XMWcNFu^#sR2B z`2jvsAB5?mpo{Xag~|x44Fpyh$sw^H3&jP>_IkBtKzZgg8$=(o`WF--f!M@@_Ii`; z{d;Gq;nWAB3z*-1grl-2!Kxvb^D}H=eG;m;(Q!Aa8iNoQ_YzQ`T35H-h`~LnfGFVL zfIc*y%`6{Oaw&i&$t-|=5OoKE1+vgB>;thPnIFav{e?ihy--dj{Y^3lyZ}Hn3OE}c z3`Pj-3JJKy2a>E`N}aGwNVlveofFt|$Yhj%Zl@Y0k3+lODexmW0094f|JTTuzX!df z$H>}%Gb0F9qL~`V759NNmn~L_{(x@^`JJ2G7j4paeH*^mMP!aD`<9VGUy00?<&5XJ zl5ai0)Tg_o&R!0vv7$E2u+Pz?VV4!6&t{97yjet{+rJ|JMc->P-zew!EPV|Zeca+$ zXX*lnaRYW=(VIdlBdWb*@53tlHnuteH=B}PS$6VV$bMchdUZn-l_M!`M|T~aCl}@% zS1FLO){%FWZ(>~Mx^eJ!HCcqg|InGvlpiv^AP!4mTlE0--<^R&1zyM13aEFXg+sFo`2Si;BiCO(8{qM52x@96O;e*W z3(Ky8lGJ=j>5K_xIB@!SNc(Qju;`QN zzlQAZorngo^L&2E(x<5WKuA1_rzm?%O9SpQ2HU~C!eM^fp0X*yQ=NMUI3JYAwaT_UnnCCQS2AnDlUcHi>mqRC|> zR5-qfc@iqL_6)YyKNreDG0eH#-maVKZ(T}Ua^QdB*Rh#~b+Lc17!*?P7sQP4ewj1Q zDEB)qSJoiDoAGSaO+&yJRJ-`}-#RVTcVMV{*Jb#-@#6eTr~k6w|Ebx(ZMi>29?qW$ zMWPbT0U-J9FsG>0X7wW@3h=qRFJLt8=#;iaF+0pAuk>90*AszU45ej%I)2e9UdYse zuksR0D=#3P9!K2QiEEUz{zl>g&kI5!zTFaKo2kurgY`?oNpemS-m6HR(^~v})!xWv zmqFKgLr3Aq=zOX;+b9*--1Py-5mYEvt4MsQ(YL)( z?~ILY_0B#gSKSe(XrErth`@h8YyK9lCgHpN8ouva(BGd`N7U8^XlesAP<692b=3RI zhWk}V6ndFZp5uQl&^RCZLRh+I>t@4vcafzIgc@Ah$Ufd#qiMscYL^h%hhTzEMqLLl zFKSI`zvd5Y_bibbUWrF4Owh&)Tt>YmaqG1kN&ku?_N?0huS{_QYimYAhI&(q?Z=@V#$Y{K123fMlC2aQRHov3BZN9C$sAXbw)m|2_ zQ3FSTiw(;!7nu_4BIa+8J$I$R<@;DLc0RgNWJOspa14llW?xAR%1gz+ujJVKh4Oy= z`{VPz$^gI@TN6bGTRTTaBRjjl7WYqS&0Rw&_`iPnZhNTz7Ja|_fc5@QX%kxq)BjDp zS{(5t8TwtC_+RS$H-Zn?%RA`%h7@RS`pxuT-+#~E`t$!MWut-%s=)zf*cgAGgZ~5I zJNV(xIbQ!v@cI+Q<&XJa|3LxEZ2|xPnFjVJ;Gf6y{{Z@`-Tevp&td&fls`A<|3Lvu ze)=2bpY8geqJKKHe?;>D5dYJ?{VDjTgZM`<91P;$OYv`a@u%>gO!SYi5yaoZ{|{dJ m6X(yj{2v^7NQnRKomZ5Fdbgs#d^bE`?%fpAq2B!);Qs)u3UQPG diff --git a/spreadsheet/macrofree/waf_checklist.pt.xlsx b/spreadsheet/macrofree/waf_checklist.pt.xlsx index fd8252572b309d9553d3f7b6103bc4f13940d681..57cce30adef98b54efb5defd254d3ee7374ebdcb 100644 GIT binary patch literal 187869 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 literal 187847 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

M;m%*O-u*(C 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 ICiVjOKc}dw1^@s6 literal 192972 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 d8DrxJ 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≫ZiM%`;G@^AESh94@7g`=)_6y@z zLmk71yEW{-hK&2ll)1XoD5}lb;)cD5l7g0YBj5v=MBXJ{S%NrPFfG^nDZR8YkC#LX z6ghE}R3|bXlu9P%69v`*k_C8E&9Fi-`o&hlvQk(jEpN&#Co-hgZUuPZMKZK$lb9$n zJ$ig<&g;>n!qgtG$GM1|w)0!ho7^YZoF#fDDt_c>9XCgYQ}nisws?nQm_B)6jqczq zfQ*F*mc5~RUH2lYq?i$7c=uLD@$22@a1ciDE|2d*CcrY4qQ;%ws0+Ij4@D`=N=`Hv zQP=V;kHPy&@L~x>%!a<49(B|HOqEdvBs#(VPMQ?7Lr{PD9^9T7LwGxjzsJM&lQPZf zuhqEhF6~eE78cBW%$u(l5>?urb2)awKq7G^W)GQO-IZRH>m-+to#4v&{SfK~+O8yxM5bNdy>Q*%23*$xbq`r$yx%cOB@9~c={jhv2f^s;0t1SYlO9?-EPjHu`3HP8Wml+?k(L; znnUiyQA9TU#C)U`GrgDF5WL!{r|uypgXy=SD>?127BU~V z5qi4`ymEPbM{s>&O+(=4_cY(gFFFaD%*MQjXvUck(iRQ{gy5&!!*VntH>jqYi(Y1FO4=1G52;!t5v|R3|#gW%{@SQT{RmeJ>91dugU_Ggd7e8t5xePhJw@Ye^n+=eidmUBh%oQ&;H@`d5$KsqU`HR8rglyqNk0d ze;)_rMNx2Qe1*J!;gJO{WkF7gK7aU zw+GCdChzCRJ<5-01>aAMOvTA&3?Wxf(kC=VGKnl>4hQSOUXPQ}JFk=a6+c<55?84( z9@oJVqIZH)q(iZS*-mB=34`Q|_4z$gyCiTpDnlYI94m*xKdf$^9)xe+pQ`VQqtC!7 zZC&XFUqF@A4L+~VQW6q$+L@-Ba-dVmqA--RXP9 zLg{*6RexNEXBP>)x<2ab2Te{2q`*E7biG^BoZo-->h^HHfSSc#*wrncjUDK%F7l7t zs+(mt*+*teiHeIrD~(P6tOOmzM#vS{j$ewm`ptZ{gMusr^dAt>LU1tHE#K?j74y=B zOU0(sk7()6XiON?d&=H;wR2k`^Y>A0lRDv4*Baj$-&;0CpHmV|Et1f7JZ}}2`tf$; zW)Nt9dQ{nXujU%I1Y*&74eI3G6@EUE7FExAzEN~QY(bIZY=(GNXxvO5IY#Ezp7VNG zWcMnRZ3^%8bp3iDsq!>Vv&^OO;r)8OmWFtLQ%rQN3(u}-cvlCvw>EFN98+rs0==LH z^Ifhx#IHWFZH5~b>GILAIDZxNQe|T%0uA*RL zF`2alGTwean5{s_KnRR#Egv(cG-nO6`mQ@VoIv}%xt8jDb&twbzpLt{mL`KKzH9tp z=qe@vd#V+H?&9(ThMCjr>PXejIz7DJAB{h*2KRk+f87x=LaSwOdLsyr**w2+wY=Aa zDO%e`Cwtnrnp-VhQu}O6ICtEonx2l4nv0EpvZiWH4j|#EgRq#FF4&zD$bt_VR|fUI zfRtn5$Y2K(`s1LN1Q%jF8Y^-Et}-GM;GmblQ>Bm6P~@52jms;G;5%YUhhZ zOIQA)5-W-avVQNN%4eYow2yw=7RmK1R;~HrD$$Gddn-@^fy)Eg5lrH&yi=&TnKuv( zwIjJ{iA;_jL0lE7Cmu_1vTPASOzZ&X!otlnImrqkGlRSG0(R|pz^+9<3J3VgkkW1l zOsQuP^dGk7A7{cN!NNo4zUM)at0K4$>co|F9ah4tGk4fq4u|0|!xZr2UC6YhYkH-a zf6VxTfz-4N1$ZD_gXKz*=o&9=f6Zx3?^(f@e%Z+& z0z^+9U4>q1s{dU8%w<_=Bm@suUWyEUHTC2mdx8paxHRvsb=?dGs zFmsqJA^s}G;N8jJH>`NO*KX+ED+NEh1qG6-(zKu}QxT02Wab6t0&yAzS~r^o!^qID zGx#{@88?6Lo+Q1{4g_=Md%OVfPnt34KmhZ#J8UzFYB*3GE3;w|-AfnjPH5Q_n6^48 zWAT$TCBhA%4Zg{uuuj{Ds;byX#a4UB>%b;7)f}-a^6$NMXUoMX)Z>aw6OSpVQXVXb zJQpWNvU3D)`KdDI5R%zpT_vrUQw1#p6ZkKb{y?}U0dzqW(1n|e!E2Ihjuh;aCpwVT zv4%W{F#0zq~1NL`b2eFS}yY3Es~4JD`INsKaCr6kqh=v zL({~^8Jx2msV)+)$yq8CJJ_|U$w>nJ&tzf=A*rE{=ao<#NRywg zjH#i)IV$##D48~?GY!0?l{KOrRzo5{?2cwInnyz-29g!!=J*DKW|6MdJtu1sC58W- zq{e*~P+`4MnI}+0t3Ufy=vhwJNX4{#*~q~Z3*9#2n$CVUm@DrvHK?bza_S5mC8#QE!~z>rFc=F3Zq97&UryN%0^KybsL42DVccAZn|`{Q`U;ikB* z9yt1u3gg!rXdQGL(6K%U1iN{TUf0{ik%A8k1WzUiR-}*f_CYuih9zZLahbJR>%^ZF%%zp1`bcS-5{t0~5BcowW!x z47X-J<)CorSVyb4rEgh%>i7^w>&i(4xOj35jjM7n89Hp&uZ%BM7g~{JdRF}@Pt{Ep zT60b_GJL`U67Z*Qeb*X)mjqdwC|b3e0w5BmBSsfJYz+G~MSiC{MA#5F*&zKhcP8=* zSD^GNpI?iS7&>Z~UN-s0O9o}sI7%NO!tQ>7KG>zc&5PY{4aFg0z!>8Dy(*QsPO-Nuc}CQxvT`XHHvhLOc| zN-PkbiYFBYqx5g0 z4Rc6TtBXkfo9KY(QVH0vA)k!7fCql{R>U!g&FDdGQ(LY2o>*wF^}FxLqyRLy$&MLKE|UC&rFHgryn&rwm+PDc<*Z)ls9m^)VOPxzA`%EKP#{kgQF zr8H-QCncyFAvVMBHv*407%mM~%1DUKP%6Y(Q3ox<5kt-wBGGLGo9?6>XL151oKdw! zr{f0ypLej5oAKRM=}OyW<8(l#+=CdlQ}Tr`&A2?XoPwmbM_$uN&oYK7fzFejZnvi7 z#$+KD=wKgt%Kl(IjA!L8rYAO;^|hg$Dv7#i_v2msVVlym^o>_4ye41n+>(R+lczam zC7&a)F`nCcZuK3g&b0b){dkbtGZHcFf9KyPi!sEE9A-pv^RMvM-t}c^RqByqLee%1 zDPKjxEFvU6L7|$`%4#PTFvG)Y3jXh6C1UIwquP}g!_Mh|9l1C5a#S2|WstRB>nXKR zjL9L$x7%Q{V;d*j1D3y#c4=R;D`*J7_)!?o zPtkNTA4?Rks&j|-zTU{+5n2TSnH>F*cFdnNaY>#AR<<6li<5q+7JQm94lp)X`Pkp# z|K&-OrJvuu`ZuGYErsIHWt?<7&Z5@YG}zI`%jHhZG22mpC>OgsdITEa7|w3a>+8#P zVngH@I`>ANQny`XP?(v#vq?0LUkY^#uoIJqSUtSC?4GiPQF}?d2gc~18M$TZ&R68? z0$r%s3FozK?|1fX0sY^bIhpy z@crkSQVPs0bowa~K4z;-0+*$Feavr=`iW1T=U7#VXCD}n9@AVnJ0?QCA|O(ZAU-L)d8p1GAbj@Ulk#GJV?+&+qm-EJdz;LNk{ zGyMAgg)rOd{cFzlrRSGXIx^$$HsOs8?i>8cEQY(3x^Q(kMOx%64dVHlBGu243Uf~Q z7;Q{bLR_gTJsK`=8k0rw2IzF80QlH#mq??T8Q3M!f_A}%mechhKBK4^7b{_msvu5s@%qP;nM+ceyX+UXQ<9USxZ)AtBD?K|T}2*t~n?1Ka(W z5m?e}GMTX<(R+mFZeWHmaNAkveN&3#_kP3sA%f{uWZPkTWOzF}a`X4sH_ z9>N5C2*b75llHs24()dZTeSW@kndqPZ$2#jg#=_|9NdCEOVC`g>ALHXsJk@b{Wir- zg_6D+YphTuI?;!}HK=ED!Hp^Y{d}Cy3HYD27d$t?RUKKYYf+^}4R1w2|1F(^7; zSat(;RwZDYt@-aS6e zKVwQLtrtmdPAmUJZ3i{^jdlU5z_Ej3b#|80ZS=u{EecjA)cczG|w<3L7w1hb^__2t85+0?#)(#bGwrKIb77YFS>%nPyIH_E{ z|2*rDZWimUg%}BAaeBM0z!0ItMe7F5@5wIlyd4JZvIofR&__wqaP${rBsZh4ySbH> zpJ)}J0&;N4=sP5Y;o?UTNpodUaI7)by)A;K*Jvf)%BCCOx1%5bt6E&iV%+bUA12oT z!RX!>*F6-Hh$J2D$<`C6=eDg~UwDQb$cDX&CuX|M3KD~r*N5yf$k(?CP`wOGS(FGi zh!8O<^Xdy1L~X<6giMwfr&R4*Tq(~Yru|@$H-r5@_4b)(vtl7;*+`szr(z(to=mLt zljw{Kay!{W_6E`-TZkR}cIg+eQ@3*$DoO#mYM%2vaVYt}I?Ky^=isfVlY$In+Ys=} zWL76~)!$<^h{(=37WRDMN09lc4Jm@1`3^ncKL%Nc8kE6<4#dpyN6buXs|zQ?7*5p` z{73S=hK114HU?Veyp&i<`0mXytC0a;*u~jcE&-Nmq3Yj4b74 zT6&6riJxV8Kb_htzxHVWr`NYUvVa}2Nq_eO8NIpJnd;&xH-Dt8A85~vj~V)Pv6Hwi>pJ&@|qBgjH>DS zgP;}!1vyth^YBklUzv_2# zS{BkUPiRRbl_iD#(1N%^94QFg7IWDL7AtSV3umAN7tb4Lb6;U<+KuGu`)U=KK8Rr$=V+({lae@!>pT!3-y<# zFb0=me=?J508%SaPz6wgw!Rzxe(fgx_t<)i)fKP=YG0 z9od-Y-s0sG(Sv+V50Ac~J7NJAx5BzD@y1};&}lo}zapEz_rF=RnWbEppHiBdG_W%Q zipr(ykN0!QPUBDsPt8(ps7 zYUiS@KHL>g)4UA>%>c0$taV!D0uj!Dlb7D<_%o%Jp=Y?&=NSC@iIYzx`macz1JGTt z06(_Eh%1z0wyIM6s%La?0JEjjnmfzNi1EQtnscD-a5PtM#O#j|Z(_ub6k-N;TXn39 zOkxHr@N@&SYaXi6n>N~|9VP*3a|j_-ibWLI0>K@pPs4UNoS0!>c~(FDdb#uV_kmu; zhWCjc>lSPrYcDSDzC55q4&)lkgtz3tl(&Cpz6(R((gnJMREGC@w8;?j!+L5ofy^3B z3YW#k`XVIfWcqXog@(n#;mYw_cmU+hUicmj&Nqa`D4iMKQ;{D(63!z#s_)3H$x1s$ zi)glcB~}`5(FN@+-$|0N%{1Qh$o)C#(zHlfq_JLQbX2itYDfkwfM>9N+2z8cMr?8f zcvU_ZVe|biM{iUFO^1QfdkL}_vV#QK=!-qb)m`bPWXd4g3~4*K(imEexfz04T;sJoNH3i&+eBy%r(8nPJjX-%7ah-ttyN0%BjV zKfbmCv73nlZe-J1?7jGnvav>_(F6Z2JZp9wR9o%vxUa&04EKh|l*Mf1v>>G#TzeOonA`KPm3LywED z+q5S$z5=w(^~#irgP1N7AK_W|S1!!KTy1PWD^AmR*8K~K+Q=^gg>~d!YI22{O9aOC z$kW2*VyoC^yr)jdhJZPDqStb7*;)#?8J}YAUdt1UyR#kNv&;RRQ;!#EItP1%N7LyU zYnG#v#)=Vzt665U{ZS%T;>}U3iV{Y887e3KXhu8X_tXqNkEhFmBJ~-btd$#E;=_~C z5x=uot-b4qnSv~r-{l@w_Y8&uPSN-@474AS`RpkIO`Zh)kVuFAo|}G{u9RE;=9C{? zGhCm8^TnmArbHINM3;F8do{>hR&-gn?G*yE^xv zJJUKzR`dia=Gqf=R!7%&p8gg*C$sQ`-}zb3Kk)(E^L40B=Nl_kw8xIL164@a>}+S% ztx+o~R-YWF_fzWvxzc2Wsq&P#9h3}ePGuN27TmxLz@axMBbN~hUHu#Ng?c;SsvcP?FBm^(kVn|Z7?O+4zM3=z3Ka;e!RNK->pI$t)x zw?O*Zg$AHIJQKfxkPf_q^7a0BbFjzQfCHy`u6L#!J`^3c{4v6ukXZ568Y;|th($p| z(Imxk3vtK|7Z77vrW)BSxpNEfhKsTNu%OP>GZOew)pDWUJmUg_NJy?kuG;1@glzHW zvt@>l^ry=%;o0gXY6~^d(8)(l6Ub6YCRk$B<(P@*hv*948|gtLv6>9{Vtv&5>Rub? z^S#kMLLcHI@1ceo4&{_UOX+BxLmp;iY=i2NUW3EzJ9Aj*QaVy>3q9e~EE0TS-wz(W zBAOp~S@%q_2`huiOY|f#8Hp{pZZ#Y-_P584HKpUNnYM?$E#<@FF zOThuyukFr)uMg|^J93W86=qsH^KC29vf;MaQTLiUxMf(%HYK1HKVokj=K15^%6jni zU4`kY)M`mID*dW8q4B5_@w#a?u%hF{d9hmte(r;lB-GSqWkqT!B5bu>>by)%*TSgF z*FW;>(1#S6*9w>|X6X=VC3&m?OY)bM$kJmdocF@IrHPn7 zZ;CyGVM)%Fh*j^@cJbIiICJ&3F+HO;mB({1Yu}(-*Yc-PZl?E;Gc;89ha#>|Ln{+c z*c>3lPKIDu4?{r`oh?`fXJ;$vu@En7h@2LAXU=@>bh!R&4@s8%l_m>*H*bKV7Awh= zBC{M;i{ly+1pE+ma-T+SrE=j1e5<5`fP@+r5b(DDk6NJ(n_iOGN+o7RFp1PhcxEJ8iSfE(>s?G zZ!xf9kBtdxPXERh{@C>1i$OD`hsEQmxLIMG>F8{%?dj06J!Jp5st~^6tQ%j+1hb#= zqSi@a;e1-J-ljW%I{p4`SqvP!B9aHN^!f8dZ0&K=Sut@7;%WkSxfsbs&&(1$qAy5B z*RCoqpGg!wcklD~tb5mcWWd07OKTE@QYJ6&T#f!|!}%D^O)YOnSJKX|{`dN&ohjKS zB^=x5-g)<12~!E%pd_@~Ga#mMhX|GAjoU5>ONxX4+8e@bu$NE3xPDvMC6ZZQLTM?s zzFj4KjZRDckF;&i_D+f;ASE9QM|Cra$=jTSkU|Hw5TodV2uz> zQUeA9ZfiP;SbIqr8tH$!jPb6HBgmy43$LN^a}KsK#T?TlYjhm38tO@&hiwWAy)-P ztUCDe{SYauMlbo2+c60080W&*H?lB*2kX_-OB+?~807{bMN_G7bKf5xogz^X6x{xD zVrNTvzkqL1Y)2|wyva7>qucNcqT$_Y zh*vQ@Tq9d4Ev++-OBo2Sh#u4{sKX3I4?qK8O^0<)mOxGAiVMl4sMxG9`GZ?>FFQKN zkmPCO0kGag80-V{|G+DumxNm|+DE8@hM~4)tohl^C1y9U#mp!MeWWy5qIp>aej3*A zv?<-jG&M_*8vAPk#O-30b*d>#7=0t}kfu~lpCOUQY}Se7diBy?9g^ITiScf$ws(|! zTXE#+b%}csz_#$->2%8T;apL+3Z~FnQ!b=YkrjPUkHx?TA7gp{T(g~z7kHbH>|FLc z3ZjCM&ujZDik>04e|$1a&gjjNG|OS-s8Eo-1ft&uY7Nx)p_Vavc~r;%qqnUDp@12Z z^GYPYYLie!A43gUDW!O|y9W?^HHU76>unAbPIXN_Q62NXyE2}mcc&bKa;43SA^l<> zmwXYpFc|Ow!g5w7TEKh=-DWKFS*-Bb2+`7yUZqOe5Yc*GKcqD6>l!Leg0(^U+5Bct z`uIIow4Q3>0zTrvz|c^MBr0*K_*e()U4mEOf&AYxpI;?Hd^eYJ%2d`>y_HPkCnQ|> zXGVX<={Wsdi4|+wv1P3SGCZ{Ttbdz;0>h`~l?Y4$ngkT#Tsm+QsKHi_P8?bC!tN9d zhlO7E1*!5R($sulY6{YXa!1$$p}4!4m2P!9)AVf5@?Pf_To#bmqvk%0hYKV15u2-k zQLRa;Drd(cd-)&9l#&MLmhOhB*IH7{lGbfNV>aaTTKGqjVqOTPcH+3XHt)kkL z6mtjwpi+!&5c%U{8ITtcrgQaQZpY=cY7yM5&5rL50lc~AD&0(zJV+`HyPdeI%^a9{ zP#T_|UfW2`dt+3`w4e6sT{efqY40{d$Kx?kf;-MzNFKm(#oQZ>Rh_5!TA(TNJ}DsV zQnO=+8V?TV@28;K7v==xVnv0t!0gG15Nbz0G_3X787fRKBeGWnoX~9vh#FPF*<~BBp1ChYnJp8klXG8( zbOvwP3*kFAS~BQyoT16CKUsUGZ{{?o9^7c~IoLspr+dwSfv@KUy5-nKYY$)robo9Ya5_2 z>|V0Z{pL@Q zim3iXb?)aS#Iy@zM6xHBKZUol!ZX|{623d|<2bS6Lrp)LCA({=RE69;TDXLiH&F&N zz>282CCpNA_YGg33VT_s#;VQAuu@f9q#?Qry_~h4n2XP3A*xVR5~a_n5tp^uRjHpQ zEMdo;(C6h*IDPX9A@0}-pQ?pPi(XkT2Mx8DVO>e;5eY??g^z3>z0nAR)Dcn5@^=KY z>ihfv#pd@(^mjwR6>pqZ8e3FuwJ&K=lg;;^2R)zlwU%9ANsF`io^IT5SNkD-ldMbp zteM&CnXk#`q^Mg6C(!KjU}*LWIPxg8e{T5O_EA-id~pcpqB)6l3pPYr$z`zQ)kP;R zm^kl{3CEmve|IboYpDoAh?gz?xAsfe>8kwxSV3JZk_#O_Z@Kc@*N^P(lc7a~o!|0{ za}18|STF2hFnw2iC8YVl_A(=)| zU`!wI00AC`N_njB;pQ{`olG9sGw@`*{+tZ`b0I=qCr$+<`fU0LEDj*J(J;7CiRP?C zz6pj-v09n!!7-FOW)*x%wuKfP3>uTC(A?w>E zLUiKaaB!*XLgl-gM@zyGPwtEzpKlVQD(eawf`&U(TEX;*;L}kt%TCwTzoI##4iSSP z|%htX-4P9X@JEM>4h>J|pvAw#1|T5QKX5 z)fGZM4{&Rk_HF=kIm~{hAw=Ug@zabfKbef0nc-4*a_Z_L2aHBGiRRt7aU1xQ%+<7& zKifhg9>sl^Xi$&zry4X`Xs9o|i^eAv9}QRPSBxA+hAmaA=~`*n@Zf!{Sy@q@ zu0xfq$I~Gu%CI*7ME7#(rS)Ph+1>bY6D5OM@7M2{%B+ENz`=X`KZ3&4Nto7i0%^M+e@j%74=-@ zYv9#nGpzMXVd?XF$k^9b7CPINI2(cORIH|}d1+6G+Pg~njO!l4jrYi1!-*Lfrd`#0 zMCDniIWbm7S7iL%)&fz4TjTt{?*|^9X3&w7fH6COv94P(7J?Rzwz0-(a2rXG=rti3 z0>uCaI&2JVL867R&L*?yd?jq|eDrCseyG^?Q^OVIq}&lpCN-pgnP)W=xc3Q>psr;a zQ?;`)l$vgz>&x$J{`LpiY@hby&)=zH+eoAB%*b9A0W%tGxNRK77=lf3i<(z)3|Yp< z?zArQUH42-{O-e@dqECLGM!EeBxWz#QmR{FS>l-E${Z>gr0wOk_@>L=w^0wq_K}VV zQ^J2CrlT%zZlGdq>=ba6SdAVUSn;9=w}FX_b2hY@%|fW&k>CR8FDf;}w_I+%wg-%t zlwSf7h>C(7|G;`jsZyvfL9^sTuHn|^5v3MvD3@H+PTz%~>eOYs&s1#no$!*Ti)Q`E zV5KD8ilP$b8Ljst@!7r7S#b^oNQ$>AL1wer|MV>RM5 z)uW@J+2t0+pR^SyA@bVWBWdHg3Et;IDQII(Sye;qPoPE;)!#F#l|o$uH-nZusfCc_ zr~*OT!$FJuFR=GPpeT4oiLd|zdmk?~JY6NRL+!8Aj|hanwq~dn5iXC+#XpSfNoiet zEEkosILxGiHIucmoS7{cK^0WQpSKj>REX4;Ed2E3s7_FB9%B)w`(g=O_BfVNTpfpV zmvB2vTdQ4&Ew$Hyz!r}`x5^vh$?fjU=JeA;UuoGmm~KF2>Y1{o!c@u^qV{3mlR{%B z5X$&32sEs;PUz`Y|BgH^HNP#$%vTpSgBmY6i%>1tb|CVp06c+wO)Cbt;0;hIs1v2_ zLP8q@0hPj1j?fYiP@y}k$l_@`tBdazC%c&0?6bi_=+SF)TeMp?w9(!tRFAZ4;6N9C zQD|y3GkrO?sjJU(lFrk@wbm3GN)(}9S(1`3H;3BKVXt&eEztF$g8;KloPNYmIzDX; zMQuRJlOy@M5(V4u?N1q4*9mbhC|K(V{B-AQ@IZq!_vS2x*u$o?rbsQvPYRw|_9p3X zCNSkiVM$u}L`kkZ021O`*ZCH&vKs|pM-it%_xoLzV{tD~cBbQ0Go!UnL!b9{0*z5a z($?8_E}pKb@?jSIcW)jl&I9hA_h-i9Dd?(bTJ%QrOS5BYL%WyPTi5QgBZXPo{<>jV zwV4q;S%wJ{SKKw^rDFuf>3XH#%LGMoCOaA7$+BW*L2Mo(W55;vya@B;&6O`p8_{L8b;CpR_tMJ!quuk~nD!i9ph^P- z;u!)aes(>?E4_)?Wu}QxV&NiYu_7_V%?M|rc!y1I<~mE+FV8-iP^&Dv-Olo7&D*it zC}h^}LKay7kKJY}hk6BtCan-rx@Bmy8iGB9bK_*};leQwxs2A`@w2E0;+e|)hGII+ zul0Z$eYtCKBWcrjs%VZy$K&OnJLw!;Jl)JY zE0;k=dPBkh$!(5>V9cs&y#BOwzsC7@KM%(JRbT^|S~|YBZIB<>@54R;PS|9__+_Ru1oG}mYR@HYMK+c)xN z5!+1yt)qx24Ez05J5Az!BV>R^yX<={+C9t-ZB^vm>MYa7rdD3e&@Wh@oi;qZmWGP_ z;9Ly81oB6&%tq7|CBk|Mg?#x~G13<@@}RrrAh_?J`s?>>U%tD8XA=v;PvWzyUP=U- zl1fZa}g+Vb^)WM1Ol9^=8%)f1#A;A zy=m!fY$-W6r~s3I{(KV?R$ZBL>`I4uk&oAFwdp1dmDk^fD?m`E58%;gdQCW}o20)&0O-3FBm#v^n1^%)|LQ96E(O*WmX)~0=ZxJQVJ>3?aV=XJTx@y}S}a^L!}F+fQlU%(;# z(=Ftl?1guN0r&gbjjFApQq76uZReud`c&;U?8d4=!}0Z0o|8vwOXc#GObu$O9fR`% z%;F(Z8@I`>i?`wlc<2&uoPI%AQhM!9XQOUmnX4h7Z1e(6DIgsjUt}Y6SmeOe(Wmd^ z%{KH41V+aZQEGs;@ufh#@5F^>)NB-{-%63}v#xl4Ha9gj!;kuy%XhTl?ymJ#@7}oeTG~QZ_{7YTx;EOv*lrN~twrD!!q@SzI$A309cd23f0n5%|JG zPEl=&7LdDY(-eCU4}_B0|A5kD$|sRbMNG(|S-Tyy%OUA7$t%fVbS3*8<9++xw$tUB zI67T)6o-vOv-k_d+`8UF+DRPa86^6%^g}O9X1zHLA;DnNd3V6{d_&W(Ij<(y5jACk1}Y}VNyBmv2=N-0yt?2)KF^I@Nem3 zHx$dpHqn?95RG&@D_?8t_O-&>OBoM5l(Kc)Fj`rnPePN$TWhKe6Zk``KXZME39Fe7 zl7>cZ|5#*qmlv*KFc5+U6U}|>u=kfX3sBUkmC$dvEMR3C^dOa{8m6n z*yM`vdL*LN7h~#;eH<;g5RfWgu-`1t68|8hPw>}1(DE#w3tyT#LzGLVmQYW7i*o5= zv!FW+anfE6SNJDx{j~ERv$G;t`gukPu(EWBgj4^n|AywqJ zU>UO65Xe5+@TdZQ`J=zwn-)IL6m%YC|NM|Qg+oLbPQytjvsdGt-%F(c6~Z8tU#c7{ z{yYx+Y3@^3xXo`J)k5?4(+*O4c6T#)?_mA@J3#qf5N`oBJW`}_Akqbigz=Fs4N?wF zHC^~_fI4Kj=;CQN{qCVa+kBB2^HR}QU*FuBaU*TUN=D>Ei=E}?@tXvj^N5)yJI_Q$ zM5ArDogAh-Xr?Voo(7MjlN)LL4n0n3${AA7lJslDU4me|Y)7Cv8RSDmbg60r6-i^F znL-sDRTkJx@EV~>lXMFY-2xi%SfZV$5%bw8A!rTX|Ho7!2ZJjb*+j*0vX5JEU2EDK z*;q7yGfIB40ulr^rixUB(zy7z_Xy65i6hZ$2^6!x%xBX!0kGDVhz5f@k>`9*yVA@` zgSoVv&$|VmCV;oXk{o%}RyFlqe})O*5nsKgqgIWGq3#g0SLoQ$6?oW(xj0eEYjM_- zQAJINV$IWPaM=oNQVYGvm4ldXhpdAW!P*BJM+h}#HTLrl7=?NNL^&4i5-RUpVMr#F`@Dcy#~?jwEn!O-of$MnyCd4{&c~X znwXqIO|8J&L<^aa>h5UBb0@)(SST&n$57pAZb@@0==wNW&JU`UIEP zfx_SXEUa(n4Kac2K9@%l1>lEkoq2C0`C-7SPcO$P5i=Yf&YQ}yVH1wzRy z)_h?4?(y-risgH``7X!JSCPw!7tysUVj%2Ve{OvAtDD)46muzP0OdSOdvJUy)oM{4 znE|%-#ru^1Vz)M`8=(K~&|+uEJtzCKoTbl(-fzPDf;yR_fEs6DftuNAP9@Kp=bXLd z>8Y}L!j#&tt{&oC8U&pnyAEg^z~;9asQG0WHFFv!4b6%I(b!V>WGpSBH2|+-9BW*W zqhej23&Q;J8)p!-4_a2nAz_{hq%QXf=9c%$77O{b2P8B^=b&wbZGugNNy zl@~m?wNq0XK^9WC36jUCy#j`KGjIQD0x1P)G0NkdVG@jBg~9#$zd5Z{ZaYqnTxzHs2%4P7I$W+q=!0#oY_NJzIT19diCN zUQ5N!@d6b4`AV7rmqS=}EG=Zc^1^(Xd(Ea}cRLm0l*iv93p=pLvH>izumg)My%GRr zICp_;LppuoPYUMSw7tnE9}TO|ziD)!%zM0@%OE@0S^1|6{O?$X9ZW&(^D+mUZ`^xT#9FM?ZI^+abCHg`mEclH_1YILJ!3mR2OFmpl%kEPY^=j%)QS?eKT=!j-8#s>>cr zl{V7s-hgjIXFQayw&w31)&loGjU7If(ODfb&8L0s-{3ASuKfP)9#z0lOIS6G^g{Cb zY#w#Gj8N+{)bJ{oP$Nv6P(VhgMrV@O3a^A#u*9HI0VH#!N<+Ddvr|MQS*h(tf7VH~gsj_9JCkgl^bvrPc znx=e-&PDq5-GC{LL#eWD+Fgx-CNU<0&o~7lk{&i)zJmv2AEex!zbkAn#_i6o-Nxr- zw%|Ff=8UGx$)ev(!$C@0Usv?-25^h`z`n9Q0lq5DC;%YOF4eGGjmz!b7(7bh4JQVl zKAdj7JUQMlT5^E{1wn`a7|ffTZ$Mkk63l?NA|) zs{xy|f?a&>v6sR>s+4W2ry^AkXn*YeGI|VBWW?mZr#&Lzq%f#9DG2T%T?O}(jE!>svyhss))E5((@!L@gqS&6WBb$ zTZ?}XH|S|4j|6ub?!IYc_iwWPyr$gDcPG>uuAX-d`;lI_d})>=le*^BB?0kW%U{QHsD~fjZGep(2}A zUw*ND>lZWz3~KJrmX9DH!?T%3*{Ahb!{}#}hIxv55f{oTV`mA4N8~$R8eEQVA?0 zYBF0E=ersfMP7T944UXw7t)B-mCI?n_~(6yFbwRa#kfBbE{74pQg zOa(o{1Z&xi-@zvm@wc+t5rCeG0{A){rms|7juM_*_#sy?ppbLg*CgtQdp>Ho7X@GT zk+pR3Uvc#_WQeRwls+@i#g>2B6h}{UDVb0AkSiI1Ctr*w;j(HIy;KOOjB=D1x-VvQ zROY%#pgL%e#H_k2-V%4eu%(eN_MId-eXg{v-ke{(d=W;Aea-%FJ=K&Cv*PZIMdD|O zL3S`mP+{eWqx1xZX;F~aOZ@ask`hSiisLE^QQlz6I$;p?u3+}?D#v5OOJoQ&Y-tGQ zeKeG-`sOE}vPr|_75E=`$G!WO4q!PYM&(3mD$oh`w&nM-!P;OLOg9-r8gUBwTWmRHl3iG*@s<4T;#P!sv3pmMRy4L7JWQeC=?gGMSpu zh_KDU2)ZONa_5KnNxy(-Dys6Z??i#45GbMe%0Njf0QodgAfKiHY!sWZu2y0hT1Sd? zW;yZWX3<^0vo9r|(~QYRqm}#@D@7qGJ8r6KW8D?-QjmDJvSfC$iR@cIdEUZ_K$?b@bsvQ_2wK$Gwb7L@X z;HXD>TU@@Kf1~)_R@d92OEV@iV)lcO=HJ;Qh_tmTm6HHNzj_^+Q1T)yeXV*4_EOPB zE$fNV+hTHUU6C%Ke^iOWC!$&vNN6Bca+331+`j<=05Vp^rmWYUP&o$T9CHYhZ$(KL z5t6M~&_J%CP+Mhts~J}puBfGiDG2;*CvErn;{mN1TMb&kK5&HB((P?N)q9K#jMY2P z5Ka+4nAbXbh_`4V3`SOQ8k9;r1`%#9n+C&@6lQbq9N0g&~P|`kX4r5cqsTCFPgJNsmv8Xit zl5kw)zLEjmpfhs@Ps0FP-qhKKsG$2=@mOfngUI(mPomE0jB7ME*r1#ZADcBwXOXZO zi!#c#s#RZ@B-f@;>4JH)ILM#04Gt8(cmdubAVOF75P^o^EsguJ<-M(dpX)ptUSoCmQV7aqg}yr)>>Xr} z4L0lQXh@-S@b&7fd;>cDi2e7DQvt<7(}nWyi%+KP{{FrY^&3mG{30BGYbAGn{=P66 z2*qL6m8QyhREJSGT&S3LjiTXk=)_8w&{GH&Io{A%7zl4JcaRrsE0artBMH}d1N^Bl zskR8W*L2&@`@0PFUc@hLn7sLN>|k_^7RB(Y7Av;C#IdXHPmnf_#^TQ2Z1Mf{(%!07YS{A;^Z0n66G>uSjA3XU-XyE;O7u^uNs? zc_+x@=aK<8KQTu*hq6}|0{m{*OW&L&ri)eW&=_e8dht54T}!~OWvuy{i^0o-iZ?rP zA6^cmQTdVSqYaN7S|5#}fZwM9*K)ZCnj>6~4axjqB3o|H6c^oR{Vr+6PM*L6tXJVi zcq${NgsJw14zQ?timf2TjHHNzpmjd1)x!-1m@Ui1*n(0*>f)2UQLjl9lZ?f__F+vn zKN%--xcWg$vORm$xK->{W!-Bo`_&fv+{biF^wrK%XF$@{!W$k2dMn}3*gA)MeQ2ny z*M;MPGvoImq~a_fviND`hnbnHg|m}qi~EA44fR2NSk00SCMRvL(>U_Az!*Vjx!>&4 zd}7x7M4ph88>p2LW?(gUnpwJ3e;D6=1)|WqeZ(|mP^Avm4eN& zzMCV=Gy!DE0*s}c_W*vj&fn(sfvzJ~_>u*Cv9>*QGn45iBJ#)gtZR!zbP~QzMzN!0 zr#6+Y@NW^A0JCu6M)0T(xE-T$@i}t{z{6%;<<7dsT0-&%s}ai;qaoN$S@#I-mEvLi z`3lr`ev0MmNYEYUBoEx8T`aWbG>zC0o?bzv@UL|UPsEXB;2&qO)mJ7Puto%lsBm`f za*+DZaRX*MamNM@FAE~ifeZd^aRaiN%_FLm?oYlqa|>*}{`uHiYB7ACS|G0}VNF%` z1+<_nYL}{*Ar454Gy`-I-Sx{6qf1}Mf-UUo4y6Q;nRAh-A3tyy?_@{F)$zEo)?KoV z%r&7rebZdC)h+fXGk?njY?}nC^ATf8cl(#v=lH1AX)4WTY*yx^FhN`BSlkrH)AGY; z$(ntPOuE{mD@C{1H4RIaPyV!9f6{X-qa$TtfrV{jSaGru#`MY!eEvx=Q*OTeOF2W2 z#?h(Xs(dW+3t*L9^lOTku7}nT@A$-K;K9!86-Q}`NGqtn6Fp<~!e#H}_WSJGE=A!A zrOBXMG(|Eb*QUn7l$h!xxdsA_=|rXb9e`P(G|h!PrnaVwx&f3MChZid?(c1$ba+6E zsoH5ivl)A_vN&Y-RAwH(sVMVih^oaeB8?t1_BXDbQ!~?X2Ag+QI;~9L z0&wIhsqXGN5mYSp7?98CnltW4+zY`})H#=GSU67hx&?Oy!G= z@s07bKx+N~7!zM1QtC~fs$mNcA2NDXhSTjk=cS`LN@F znNH&**!~kF7>p{BUQzma=P~m1@br4%)7a;L7W2*4$->QV1%sr|`jrX-3MCN(rynkT)Iuj1yn22zl7OE^*@pnk)iop4hau)X=s zb7fy~ay7g1T?9=t(?SDOjQ=we6H(&q=A!ZZ-+U1w)j9D|5?PW?61kmWNjwRaovpx& z-)dgYyP|2OD7GpJjtG#TwnKSeFc*zHd*bbM%Z>ZnT-`=KJ@WB}LYHfnB+ew`p1q9U zR7~8qx~VPowaWU2hN{X=tD%>2C+I8N6=Yrq?r+TmZatXJI2#wqD7iAQpQ8Ai2Oik2 z#aDhE8oFw-$jR8nrd9V)n>1k7C|pQt5v|#dRWK{?VXcR55RDWO1T*gL0dIW^qL3sZ~VSjbbw8r@O^oH)$%{ zbtuk3F?bKxsXa(JdEhXg{}1yl#DP@S&UK~9KWddK{Z|&i8BUXaHsys`S~(^!B?J^1E^>tIIsy za`wcly@`$eu>jAj1W?hWiUJu=k6*9d15t@A_;_O-3}5?ZIr-8eT~CwYN*cfHWh!xK zQ8{FrjU>ly5+$+5UN_IHu_U(LsM8s%%udMMomr)LBOW)@BhyCq|xsnE-Z z1T$w#X}~Kx+6yQtIQLphM`6?o_k2`VY%rQirH|hR&Mso4EcW|5{8L{a<)ck>L{(BS zViW))#Xd23M4HfcR5clgvsq(GuyXX-5i1b!`QoqzQTEYO?ZpL$-;;~=d?SM|q9B9c z^TGbtiKYIG17U}|^GjO(TI+L3_?;iVojm#KO9nUbU6+;0QnTrc$k(D@+ac^_IO4n( zIMUvrH5(XMo(zrLLaaE+mHBbv$~hyQR8k-+ImmHPXIy-BQ3qovtrVzv%7qH(qPA&f z{FRO;GvN)-osxeR{eR$MoDi546^apt(lE$r1FUSbG?l;ploGf00-NPURWMge2vVvRez>b)`z1j+6Qs{E>=)bwErf$yLvrnr1TMEj>flO!p^Obqhu5l zUakBhNT?>D%ChBbse|n>x*AuK#5|Hwy~_Z#vq)ttY0C*5Y6^ei$*|XN=#seI zxFVNYVTS1VR9b7B{&F&(w6C?m>8?aCZ1ad!sX70k^CjuaLM&9^E|1J8KwXafOsuEY zO#oulB?`<0GY;71&2Z{tyA8bfYgrDu7v#oA89dl23&)1uq^cC{R<1E$InR>_IQj{Liq(P!eQ>Mkm)D+|tBiTOD@!II#P`g)YK=ccl6R~8pZrmPwJGFRkx#(0` zP@9z=nunEL@MfaeDvVG4GWp)-5C^ zvt|^=pKNNK%x!^-XYj-xP=BX=VqEC6oaKdx{2LJ-8BxA$!WU1VGt+EM*bN#>xeWM_ zZ+6AE-b`}1AzWmX`bMrovNRmTZ3iC-$6}|5Wq~X4->zhX(}IE0D+XesUVzZ8|FN;o z-8^+>?&nw*Q8J+cHD5grrM$dji2hOsN@gb)TLUN5v8>EV!|%x*uoNKW%13sL1!I^t zJ0I=L8~M4)qB zKKoOI5iz3a93DF2qb9u}18Kb~lS*2;i&|(U+j>gM9u1rd;Z*k00HA58vxG0AFgklo6K0Si@S z`wB{R^;Bgv{Nc&);d>@0jisq>u`OWHlT;zSM-LnB8; zi2KiU!?rMdj90ZEmOOLx*?az`TW;I7TnD#;)sI69}l+TPy+HyPT= z`|>z@Ma(=z;Sq2CF5WthL|<^;ZmG1YJf{~qPv6_H9tU_5a?iIr z!}f??R5S1oepSrzCtc(OIezYL>_2P8nHBJS>`}iW%Y2+xXg69U#3+ac2gh$!_@6 z)TC_R&9Qim1%H-2Napy;!zZ;nJyf^OUH{}D4efpU>Jus;u|U30i!{hM9Z#Ls4lCnTOxsDlaoHjw5Grb{R3`F|_X!)@1V6byi#ly)oZ4yKB~`wku}EjWPXU>XXRH z^^P3x!*j^-E|$iay)P|0mxSfl!p9$`m}F(Ww9n2jmt6^@nWBmN*8~v_=ri#B@g!n8 zZ2Vw?kPK`{`HfN>PFqe9a7u6)c(?iEvk185HfOZ@4AXh9JKuivSN?k>Vlf@Tr2YSw ze{wLAfgMps`f29r&`--ygK|GRrALyq#$?vu%iXCAc^f5_!qR4+cr;^R3?<%m_-xkB4GOK&JSU=gF1V0&7`Y=#%8=X5S%VO?NY zI3bs(HQe+7vf8y%bEQq(pMp2#0Jr~PQF%>Z!RbyM3DFDfiU{?}3jE+*>&%5x!#!+4 zICbHy|Ju|s;`aGQd)`^79Fdn;1+uGA0)3G6;gtR=7+fOOiWI?Ap%tqOb``S=K`}B- zLWVp~V<9|g$m(b^m=9e>2<$(+jIjSHRP1hCDDO=pd5<=P3ceVJDWj#=GLVFm$iXz^ zN%q=uUU`;l#Go&i-|Lyy45d`0j5xmCaG92XE#31_ds7PlP>cwgRs-q@bzF>3w3b8& zs>qn5l4^%c5uGxOYebhTXcEVkXpMtX*hD2J5GE9Q_k@#=2ra?_J--IM>tsIPUm8TE zvxS5{Ia{%2OzUZ!T10&GeEq2cn3naL>mHMH5=qLD@OJV-mFFlLVQ##N>7RW4P=>Zc zhxhf-rX1OeTm`DDQ2~84u`^Y(m}2oAd;@~=jSZbv429LrHk zP_cv>2bG8GMvE#z{`!S0l@oUt?lRyIkegN-5AyI*70j2CO#69JZAJ;%rB6*$Bi+tP z0VnU9l3S{gl4+2SbuJ<%3BA;J_7@#fzuasy+)n3zjH7I6xYN3Rb%KY7!5W4s?h5Zh z8PYLuBlINBhsTSX3|>#*eUg*F3sQWb&zKBmqVVK3|0rE;)%|HAw~p-NKpPv(lyW?f zizl{|!t*~QMV=<+pTO&3BB5hdTOE3}p3v5U@x7N5WOVnk8SK0>Cj%)%CneUHD7xbU zSm|-busgrylxO3CMcwijZo!y~V0^Mt!ITP+hOi#Op5szoD8t=spWKFffD~^EchIwy zbd8_%MO{jeKEeYb+)ml%@jFjdtoCb=TC)Ap6~D@qZPcPJB)O$@K`W+iZ^+X1gIt|i zKnt9!Ph(3i>l>NqQfE0G!Z6bRv6|Gf=3Mj`WAGJ*?88QI+dYuNmT>t_E05 zCdG1#l~~P0MC8~2rT{G#@w};NSh5d)DbbK7e}k_cCXBjPwTuT|>=>1ASaC&rFKRsM z#fb9Vfvix89|^3ST;_!t`yrQiu`O_2()&@FTD|Ew+r;!6x~UOv;q)SPieB%+Q`?%A zI?^HSyYj;p;*Hsr8;V%CtQDrkJUp6L^CbM5OxBS_opw4DD*>Y&sGbFsSTv2W!J)<( z^-&cy5jIIytR3-rytz}6mjS>vEA_bVtVYth+PzM?D2&ANQ&cm zH6o>_=w@Op_>2I{%&@u*R0!ZY^1mm~4E8aEq43hN!;#9p!|;V-J0tHj&PJ~`ocvDh zmD9+X+BF$%q*#ZF2jkueDEl^5$c|V_PGS?O8Idy)TUCCtuFm$ucNZR6mmi#x=7g|p zz;LT|epfN-qI2h8lJ)*@u};%WYFg;mGLm=bge48>lga2xMw&a=tt3)Cm7Z5$@5gx= zh+7EmQ$z5NUShNB3kfW~dBheO} z2{tw@;KrQ<-y2kYNHd2VpVH~ovq{49A|D!q&(LFFAF_reQ4r8v_?%Wd5dzC2OjALg z7XGL}N@nVi*0V;<_a7}(Ys7$Pa33pJ^JJHcQl*+Ieyd7t{mDfPb31=K&zpZ!L#0%5 z(H=OmTbqb&y_6#Na@f5N98*#34${~5J977?WkxDUoVR^;T{y_N-hPZ7$2ff0`BbrD zEs5)$rPfa{@MkuT0VuBx0;Y!KCTiB2@ZG!SN#(MoY!Rn^PjE?iRyeE+Lz^3?I7AF8SDWR`{~5vT8H9 z@8WM7tfIzrSfM4FORJ&3nx%B)SCq@xKq1l~$1KaAMby?3penMjveC=7*AGXT0MZ-9 zO8VPa#=}qU+Z3Q=7h8w!)RZ)XzE#N*+yJ3gt>~MNVOo)_v`%D0{qmi^bgZmoKC#}b zFEtpn8n3Kt6o>N^>UymTSo)t9mMQao)7#N4{TaOO&tNA;iSMiUen7C;=c5cbu?;2u zKpxnG2R8G59|BWysJaNt22g(a>bv^)RM@xQ{p~I=bAcE8Y>g}Zd`ovVQ(eVA;6^3_ zor4+)a`hI8b(6_zfh#wR;Z9eRiu|@YIu~dfy#yW}px! zPRgP!0VsiBgyH{kmo)%R-WR`n`d41IP%C9Ny^J@?LRO-%Rd?KG}n z;2HwK#CnMA2=Uz0%uzoZ(>{*Q5T|NNlR}=1ctmk>gD-21#ddxWEhT80c-AfGb`XK{ zwP*RO#BNjma#9Xv6(%-yj6$A_l2o=2IgwYW6G!qxFIGa{k}v{YSDl5@yj_T%#8lv! zhpC?_(d-qziexl1iYD1Q2`YuLTXybiX6q68ec^j}G(tUlf2v@F9}DYV@@y22%5QqK z19nsp7e0Mb^$VeOzMtSe@Z%^QG5j_fB71wx&-*~)cpdheY7!uuZK^AEKeaW4LLSb9 z?n^ufP(d!~%t>hD^)E)vQ}@#m2k)Tmh&+1#a(^Xlw4|22D%pB0B(_ASL2Pe~3iGsD zJQ%=POf_{~rYopl{pg*qG?h;&3>d5<<-Dn(`}$7mOE-y}n!{Kd8WIwN)r`0wK9jA@ z`wV+)+;pBros^T_ivnWil`aOejUXEy($f6-8E)um)}ZX*SyjnGmC)Uq3{>g_V@bX> z40|pURNt!PJ*O|7i49sThyx98W200$>#BVSbr{xPCsvJ0;oXRq?k-IBt<8t2&Bv3` z3n*a~oQB)v3yUiW>29%q{L({}Z+>LYsXuOR`M!IgNUu`(c{(P5badivItBgPBDm00WR`>4aC?fSr#DTP;SHJ+#X<8EzW7a5QR~z$}g^qFDAUJt) zeBH6+AeHOVe#&eEBkrPkbaWagj+`r*lBtk&4+ zEu^8vJw(*uqj0~+BuO=w-Lb0fL)p3(o@>Kl^Wgan^!Sm!I~8580Ao(PeV%y}^pXz} z8d(E*PIylQd@tuE6~S6(#XRF>mx4W&^@Rt{r@?HyWmhB7t8LGwNE|2JXaUhrDMm^> zTUS0_ZkwzhYEe2ZQFxSH@@+@?A}_^lOwIgYD88~a{50rqQ)tS5BeiReP8}MC=AF3) z8ujPpnT~;0(u~-5&>^Oc@xN@VxB_uy+ly)TfwEPb@pJaW?k*^oxIrWCcWOI4FzL7S z7Aswlm)gs3FFCh&s6fHztQoIKIy4sF?my5`1 zJiGD?LRUdw5>d| zANAyezi?O+#vn;E!R>3@W0L3zLDl(nA4&C)es&yK%d{cq-oqnv1XU-I&fHh-b4X8b zqCh$UR!35+%FJy?^}8&tofoMtlU|nKC%#EoU?;^m8xk#*I7c?aj;=L$C4ft54xLbe z)udqh_s!kHNAr0#9peSlJE?D2F9pI?H`9_~M}Fqr$J-ECs|f>{Ed)~Z@D8bOV@AnS zTa={wq#q@$3cp&97OY16!}ej@8uYd55a)66qxrWjF#w>2@onUgF@Wc&P*zbycGEr{=hm zame(K;Y6<=(}N`Wl|*KmwnwAjpfqjLk%yE~!3MJ$GY8i4BO;EN#ml>^3R}~t^%WQA zF72#t@_Ea2?2o^G?|56fIE^_2g-;sZcPWF@S*xVYTfq>aNy&TPG!3OJ7xl8ttWWwFd z7cGk^_vV`VjSF&c%I6xtv7NG-c0E~f_WeF|orWiemT}4N=g$GL@y*96ab@>0XzR7mQ;?5pv;uQB7M(#_0gB|+NUH#0jazh3SwcvX5dJ_k7)W?= zx-Tmkx#%|X8ydlX#><>p8M;eIT+#%gSY{|a@2aJqRyno&j_fFAN|JxnJY-JgQlELR zQ8t+S)hAz1xhWR!&B&2-J_!hyiI>&Ap^P3r_Mu}zO9i7Lv+cp40sD!UJOTpEm zDy1s0$Vht0>|{uL)HLqObjhkj&(Dc3ytxlF+$-L0CT~yka1WwSpUq-6dG&0(Op_aS z%amU))7!1RJXcGsZ?Eq4+Z)?fTJCJ7c$fHA@MOJRn04;VA6J_!Px+QJadjf*JUkj+ z=lL?M9{So_ima_qy=U4No(p$w3Z8+Mk9~b;-ZRo!xV+b16FM5xDzLhb2O{@Azr2X^ z7d=qcsCXm`5bxdAL2|v;sM^r6fC#RStS2$X7|swDO9Yj+!Nd_<2k9m5y~JjeAebDS zGP#il#6*&lG#O?Prm!t*P$U6Z6&8o>CMjR-i_@VMw_+X zgo*GEhXzEeE19@@2aDErR(OME88^mf)fPbo!5_X)o^WKDCkETp(iYMnJyy@}CA|g$We6mQV>Y%zELXc4}>W>$kcfJuEB8 ztp`Xk{5F>aI$cE=Uug#7Z(#_+B?aHqekkikkz0YAg+<{@Vex-7r@X%Iz6WFN@%b;# zz1MLmK#$x0I6uR3i1!_o3Ae{z)a{1w0M)MxP&-iDlCVWFSIHD^QO%9SoXR0wP> zqVuV3h>Aj@-+uJ|ubJk~FnPvM2MgbrNSjYHiJ0fa22P|A#b!s%eiunk%S@Hd0yY_o zrq5`kve{mqJnuh07xwWIGK2SdRj#RGR>X9_NcT?B2yd34zx%mjiQ};EBCYxS;_z_y zwyCAP?f5XbnJ)uP_xL$@4)mg@y&9!6e0cLxe$1DJt8*yJlcVUZvYI&_{2)U!!FzS! zebZhn{7brm7iE8#FIpBuKO}&PzrSsI$5^NYI1BjBMf{li6{L*<;Y$6$YPCdGN%j73 z)I{&JCyAkk{>mzt=XgvjxcA*Pib*IZ7CcC7m3NpyFC52Qy24N!)VQN7c#I+D@h+MeVQ9j5fD7olikNPYFA-H74D&C0PkA4(E zJOYb|{r>&o+NYV#)pdnSDyxw z3HN-N$<_LDFp}HRqAWaH;aJ6{{O3{$GDtvE7~f-VnvYz#a4>lf4=}wzq)a!*pcI%6 zH81P~*#GNEU-`2rGY!Ol)=-$h0^ESH;7}5)D>Iu8k6y!Bz$mZvwS*ouLF&-qscstM zJD3W*5&zoC)D>z_Ccr5l)Lf5&0lM`G6Rtwc8QRu>lJ@)mV9S|;>j}K zT;@-^o!dQQ%KKomY8v`z4q9sj)C)*IyG&8yy4`IT9OF$$7m7(BAWn*EM8BiykT{`W zKGg|zw=E^+7nOk$mJ|>cSt!*4m3}K574tH%RrgC=`geNCthjW8fr1)SQ&+-dB zI;y80sf$LchzO;)Wyn%h@E>o>$G`1; z2`uOq;_0Cri3{FAR0M*k^(0upkQ7IcGdT^@*r~)6=?{9SOfT{_@uQ`ErB|GGg&>8j zhN!yk)?s!!CFZKi9zhunPQGddr{6lM_f=}Y+>Qfk%YR#LjJ$%%ZXXYx^&yvocGS#r zaC&okpW>^}f;-FGGM!uJ>tn*9hTw?GVdO9im{@J)z*6~W!|{t z)=@@e)H%QZO#A(i%Z7SdzQKr5DoZ!0SOis-bn~Vie#i$yE$Q}0?E7gh*V2et<2f9T0Vt0`%g1XnfnN%(T+Tg=~{Lg0s`^Z8Q3!V=mO0$a3Bo{o@^#9dq3m)S4qS!O7+o(Ue-R#udJE1FT{<=?e8)) zB}}(yM1hC%(3QYcH70XIA^Md{DnpjFe(~acBy&L~FLfHdTQ(fOr34!PMj8^Ul?SPv zK;twyp5)^y69W|@d1iI3@3UDbWzk|zfEip3wHcnucY%Phzft37QPx3fInYf8l+;&* zR+43Jg$I#FUl*#;c;6E&Zna#@$JDbSMj(Z+Y#V>v631Qu29fG3W-fwO3+6B}WrnX` zHv9D$KcE)ZzAlC2dGW1xfw9K%VA>Ssh508lKN;^8&S}ba4w|OP$&_#uC?g4l2jI7= z%Q~6ysM(>^&-m4-k8pcpsK_X)a=`x81ob9G;XZJ1|4kFr_EmPAo{#dWntGT>u)}ex z%~w%jIC_u+g(pxyA$uyz*u{Y<{S5mx4w4e}_5f5?YvnaieIjjZ%4jcji+X9*rRCX1 zK}16A77tE*DPhy6-<9WZLIY=ZYSYX4&hm0I4Sqy>X z&0$7TBGBoyon?j7&Is(^y#@{1v4P?EqX!y6j~zc z!Y?6Jy+vc&H}=O+Mmanx;EY$5!83j|XtFrB@z*r6kfgfnZll&DBcKw9`9ID(S5B+@ zwnea|)zq9O!A0oVy6|P4I^`>^(nlAx*_x?7ke?{JMxc_S(=yvme<4-r)+QoZN%y42lISD`_O?{xwu=^Zb9+8Ah+Sph$ z+~NCX7{+HHaOZ~nE&L~S);{67_n_f1g}BI&YHA??a86GO#e;#E*TQ0Blrqlw zp||XppJi-51A9FUfBcxPxSBPt<^6E|vTiN5eDOn>V5RUT&$G?8+*kNO(PX7cn^k%l zDyUZR)BXZw5iJJ4NOOL^1|oZ3fbhXT;j?6kWtLMa$by^_H|M2U!0e?TPV@zibt4q@ zI$24jM`mm+ni{AQ`PlwLlaaA zS^z2AZWq<8t53R=G*YYmh?1S^_g8GKwLJAO|7=xtjMCy~HXBg;UuSnw2AoIQ)d6wHYLWMK!WteLgI?Smgg9tJR_ah=u#zTA#VOT;wnseU$tkE$UZ_{-M!Kt&Tq7!U>ktmA20GZiXLixDuxw$+_^Idc z_el63WFtnEQF05_hoCtW^c<`$5sdvE=mgG<8w5X;0ev##ZA6V)tW3x>VSk~(RX$Nb znXv|HIvSc6%GYOY$!HA*IPB2mka!2_5*keY~3OpRmkq%d2QCi7%J(@b0@Z9}4|%;GfTT z*x;|M6rD4(l8;1R+9pIbH#3KI+7C}xGFJ|V_*Pajv>(RN($Ok(S{@|t=gz_JG8q2|G(j*WT5=1{78bKlL%2Ms%rU(`Nt!-&j8YC<8UB_$`u3z!u9 zlIy!8(*9kV8Z~446yykP`Mf?|(4KA)5zSC4MKo9_b|4(lYHmg$tkNmD>pbA*t^-U` z-CvmY-qU6BEwI$`%q&bfjUz>NFkfsftuf^j+R(BoqsfI&44ybpynGj~I{#2L==O!m zJ`c5Wz`~qoehi*VFpuV1A389*WzqQv@2l(TiT=FVH?og00=l<4C}ZN-|lj?F@Nyo2C$?^8Cs5xn3u zcQXW@r`zok=}R@5cwfhxEyUK&6*=Vqs-tc&u5-pP?ON3v&R=M|A&i;V3C!S}3Ztfq zPAK^dERVP4>*R}F1@FK7VXZ7qQ$NiE3w)K#W%VD0^ywFkRnd;r>8GncV`M9j?_}AE%SEaPdIjr5 zilmq?SJy}`{mr_%1fAJ~0>ueuO_lX}_|qzpa+0%c{L;?cgrFOf>H2}NPvk-ax{y47 z4W}}O?1yoQ#GYaqPh=o%;$)#aLxB>m%$t`nj6)+U*E_hbc1@$^Fft_K&%f4}1R=R) zD?D1!^0ioHN66MlIahw?-7KTo>sCgX{2lid(&FhyNb-(e$LWXp{Ho*=d2h}}ZC+Ts z%6QUKgA514pO~<;MDKS8`lM(KpY!;5JPvevFqqD7)H@b~X3%G(qvh3ZaDdT{p-@t` z%SmQnH1B!?BH#V>+@C2~2tH+IAH_gP&b*m}%Gn8Z26;-^*buVHiKOAb;&d$~>Q}w5 zuk}|&>{gITcSlmbYJ>Y45!t5c8>2!u30e^O+`k;xuZqZUjA8{x%r~QUg{c^OusByC z@*XPVmAuHPxtI2Kkb~f)r-p#^btTpK({<6FN$}U*e(K>}SEkAHSf~%X9{&5fjwl^` zzY~d}t?Jq7_jwULfwR?X;X+iTk02aNgkzh~0|5yoL|X$MYg6}+tcc$_`2G_+b3XYA z)}8&H&VfQ@yUe|r-~I{@tNL0=P7WwG%t80xWT)y zN$hSFTWp{IgBSrg39V-bwgxULHClrmTyg;$MRG#AlWE2un>=w~w;_zzuhT!tR0yDrTfN6KrE^?s;Edl?8~WRYK$0xQHePC|mVrt3J>GGuh?!Tu8<@_6X3@>)p~ zibC1;gm?~u%_Y_5$qy@iL_v!>XHJ5FN&+X|WthlFe#7cY&I5yDB>j+c{PR9G9qU10 zf?9AWb{*Unw-e`$YLCFX-%*cZ^Vj`xwlD@HRi{1M;89c?3Vi#sYQ4II~2~ z+1~g3ELEjOQqAIE;?pYK%WAUWIp6Cp-itO= z>C0vH6SU}z&TG`G!rp64JMy-U4y;Z7Hx`kZSMTeM8Pa(Z>{ESC$-yc0ZW-t zdqaS^DeN2g@3K>dW~^NPth9KWPRaq`d;~m6g+o6z_TCC?#|l=Ve>vR7S^2 z0ynd+^A|-*OM$Z#x{<;v`Gl~5W9YbYGDN;1nOslfSHZ+_qN$uL7ZiOsETeyCZ##ow z@&I&60YPM$d4-t%yO9QTM)#r1q@`u{-(R`D?Z>4F$ywP8K&8(t8NE$Cn@$@~rPrG? zw3O)HE!-zGG)44TCc&^a_=c$30|5J7XOa2NXp%I^3{OQ6W3$Gc1;lQN6&*#Vm_F8w z_n6X~8BF14`pE2NmmH8<5wBOqe*EhI4c$y}XMjlJ;@NV$2;yRqwtIpT-_ZtF7pqN$ zd662jVXDrLsSb{;$TbwcT1%!gT%?kN=qjHAg_)S}KQ@z)sx4BdTic9XiaW~>GYP^n z06DH~Q&j~Dmyog%I9uY-(RAPn=vYinWz6mlI=G&eGhOpH^yiu4&!vqmI!ZTE-~Ucw z$oCdw!%XCetV3r3Y6Z21@v)<=#V!g8N=TFVCyCNgio_O4@BbEvVOPV99)OxR`L*yY z3K8K88!dToT%Qh?WAoj+Qbz9OHxA%a1I7J@!en2ybS;_+ml?i-4aLTPqD=#Q<*pg4 zfmm4KVn@v$dH;>oO%Z1#uF-rosW)vPQtEy0xnXm}kND(c&Wo!jc5J6%gC{vgbSIQP zm_Jc*-Z-I-ooAZOdBK7mRjP%HXDN58bp*Jw%matwa-bM}b#Q}Pn%K`V41z3y0)g@o zCQuM5Od)|EkLA{9lA`QsECBz$qx`y*(gRTPX2UHu%o7m(pn>$UP8qD4z}c@ks96P* zg8XB(`F%Xd-o?q2mM_J;mQHw&&Go0&QHALHjb>vJ=xUR8YO@T5tK7lt9l&(0@A^N`CzI;oJtApFgOhG&;DyA#;dn12Vv6QQ6+7crr=%lFkXHaK`TlK7 zEvPQ+{U3L`5ZO3bbzCO@rYAAa)<7c`UAy;rLI#4^bOwJPB`+EY$zt{0U)Aef9AS9? z9!1_n=BS?&%QqYSAVn%8BkO3DvRfl<)%kL7-ebyGz%VvA9PlaHalSle>i9~+2&Eb9 zxBhT0E44cKs|ZpnsjfWL>LU`1@^J(c>P4rEtkE5XrPY-k6uwG8&zHaZ58X=#=barv z=>eJrfS^)>R5JrpF(Zec`Nru6%S$c29@W`jQ-*eU&SAktz%$8By%cEh_I7FGx7 zM_dxF=ut|@AAZvf>-3JWqCv&}FH9=C`Hh^xIzOHfw9`uC`54rU4>UGCmz6xbV%Hk@ zm8x+E+LDS4-iA*X(5BJ0@e}Ftef*ms=!yd?+*lee$;z9t>b!Z7?uD0I8C zuKgU<)`+Jts76%O)MKPes_0uop29(=DRaCJ6-zqUl>wTFOW|>#k(+;-lI1(rNhj*S z_kw~>`XtWUwLvEt0Lw*cx1ya^sbVYhJFzNsY7cOH3vZj=HOnYEw6^xz$9o5#8uq7h4WeWOPu>44?Pksab_^P zQ6wHD=nQ*a6bYqls6(dl$$}c{GTW&_f2Oj4V?PdYkE-t4Tw1{LRqTcVN7`~=%xvCh z*ibg2!xP#PHgS}J+Aoj6?wIpREL8V2!(^`v-fw8)v+(a1novs`M1OabC@jmja9ueq zJGW_s29?KkHEYxZ&01;WNgm+U)5i99lo}jikX7 z_u8{ZRhSOg@3a%Q?_H!L@FhhasnfmGE78*XNS=ZcbY}<%Ol#YV8TH9Q`tH#15gi3} zxGP=PDydK3TW|IV1Ac~Tv6IL9?jgb9jveY(NKwYn zeC>JbnF%t=0y{ebBqV+!K3{QZZe#+8AO3W&oR#DDbd=AOeiC}de%VJ;fP+ko87&HM zkRegJE|r535)P+8@f_N0`4E2fkGpo}j%`x~iY-lz|OBFNtz5nOuSj}hz#zQIhk z%n=q=;bZIj%LrdoST23AU&B$rfpH6CCosdnb2m`D94?g3ATWPj*FFL13h=rtlolri zwTCQqm&iJbK;leNOa>{cCDCNdfm@5!=1gH`p6E?*ZC9z0rL9^Z6`P zj3=~`JI26iGg_<9UfZxo_F?(9?L!7ugxxL(U1=92EP0rpv?g>ZckGx4rwDMdb=_0A zjr;at3mB&vvTDJbLZGfAR#wljzd5MV(Vl~s>dCgRkhG}^xBekc?l&+Fu2D9aR6(?e z!0Q4FlJWrr(|h=w*_-wEj z`a#oGvoMOS?+c&zDH>Gz{*8a2F{dq;(R7BBnDRV(nG_D`PtLmtYYX39<%y0z5Gl*w z@eFLXBRl{utF|;L@JMcm%5s;M0?1)1Pjw(NT}thSIi^IRi}MfO$HWx+qm>-|hW7>t z5-f4UN~sg!ffnm3xye1^G+=_6DvHpuh+x7){#HiLOs)>bY!r7_MU2zNVm;QORdD8W z_S)j=&Q)PSI7i$6Z)V>co6mQ+`SxbbrDqSkEfayT(WQ7q4zqzSQAbI*6@$STl!%fC zAYHc~0Ka&abY(OoX#G_9N6)RH$_~;hCsr4#yDxm2wx>cgxH3u-?5OC#wu9?v$gqwK zR?*6j-!_`@`So-z+r`Va-Wy~g?z*H;C)H?-@-jSj z%f)n54;HaHQ1s#3P>L%C&pT7`{geeErYZ&T{WVeu#U-x@@ememDFT-(Y6FlW56CF; zo>7$79F!%LDk6kgqJlqnp#P)zOgKZu#ykjASakB#hoIyXBZLBWC!(lVJZS}sHYtyo zT>1LpZ*eQObm`p>c*ZN94SEM;Cqoa5zq3F5mgml}c;?Xe-KtAb{?yfb{eZgEUZ8V8 z(WMWEk`pG%yfEHh>qF6DV>mJy6@rF~NvX8C`Ak%N8pL3*hry6*4-kSER}q^o1DDvtX$Yc>@7;pb!=_{b#zf#3LLwO{DpqTl5Q^K-wGfm z-IzJH1XKF00*KYfiDhogcSpeX9A>3gNNnqjgjU7?(d*l_dCW{*HJE_6+HN+rP&dpR zxwr$F1njBS<}*c7WAc=n1WF@}>tvbM_ehijJaP8tTD!wa?l}K^43%CA3LWJy1jC-2 zmlK&D6G~jHejC*6taFzq440(UXSXS>>=QiMrZ2~mmCPsEQZ{NY>jm!lC5kW>Fq*}O z+XrLCT+fTGaI7k89&_9Mna{Ws>g~LWkI&2Zm+^gVv$D^^s&ic+`j(p0UW#?i&z?_D zZ`^8q@@BgQ&D9-s?A=CmEgH%W%YjCx62!2(QptIs>Re(Dam&6-3w1?+C(B>jgkI96 z4YLtgK{~S#&)TIJnQt8KU@ZbDK=}f0k&W*}t}*>&KgsO?=!M{$zfj#Un`ezXuf$kH zFPRtp`MVi!%(uvU@njjXl!o=%7`bk(zgPR~dSrQXr$^=WV#BWt+S7mQlgMC~{?-L{ zqR?zutF7-=m4&>HoysATwy$g_F7AI`My_i;)XPtJ%H9V(*B@$M^+DfM+iY>psNLte4x1^K1a9*3fI}c3NkU*I1BQ<5r?Ik) zm_OK!`}QadeQcLwK9mSaCPP_8+tf5zsLSE_dyX)QK8&qLH|##eW?s}K_EGmgWRdkY zNyZL9CIbW&(gY|*Wjw>%rVSOjf5GmcrqkRMy)sVEMCi>%o5h74yq?jKXnU^8!li8CygGfjTGdR`LB9~q?A-h8E zrFkFc*6~_MEbjPoyf|Jy+utFuZX0lWec~(E8~r1*r<8_=+ilVL7b2t^Jkan~3zx(+ zZhqbCG>TaoF45?NvUH=u^XLYmC*-2{U*5pyEB9lx=FCgH8O`a@L*q?$gmwUdOs|YW z!{ijS3{m~;VU214+Eju+8Mf`nh*S)27H_lSL7XI!DqDD8VTMFk!H=tOP0mE^9_o+3 zNdt~Oz7^`NESg>+$eI{(!$mnlImI)uZ=_VjB%2VoD8*_+Gh;+qB$Ay*1b?NVOE^YN ztil4FuiiXpD_Dpr&Lm%rM*Du+vvImF?PSOX7-d>W)K56s8zAO;kHmTzNnY9q0@yw1pTNsQl_23 z*DOY(SXcNXtL0IyvZr#RjWr4#mV4;I6FOV#hM*0X2?@ZMUp%|Xb5gr<3xo?^lm zuyJM*0-St6nP{Mvr~E^aE)m4v7(X6t{IOV>#qTYaX3VAU z6azAd{`f~>mKNjIJvTTSeCk{IP_@%O5of1AV`r3%p%pbW@t?t4phXm!i;lOd;X z87hZtc0oLV8tu;?%VcRuY~DLuc;|s~pDh=)u)Odr3asI^wlKV_VmnpxHkc_IOHP9lLrnt7WMiwNnYCq3)R=Ik{Xgn!hj5HT zq3i%#9CTCLxYsxu8?iDxYNkoMf7X&u=nxU9Xg@SefiAK~TkZ6#vFo6-Ku(G}5v!re z7^N;f(x_yv;11smS5oYbay~Nd9E_=;2Czi_`&%72YhXpO15kW(X9FaE@Wknlsf9;* zYT&C^VGgvJ%lFKTwUI|PocPSJ94Y)0alx4;)C`a|@c*rpu-zsUMmHqJKne!qT^q$^ zlu|mj)g!WLF>m9~?U$u+MiavkV6IuJWL&Q5;2MaN(d{;<8fALI?|xtO+f47=5i z7H&!6%8KNd_i?!8@fJC=wsQQIDgI@4kjqJe8Nm6C87q{g8FMT)xFXe|M-HVCM38j> z9s!pdmsJYc^8f@b$AHn0R2P9EDe}YKIMryD%;{_U!p#$}@(_v|<7@p0uE@mJmc1_8 zszvY6U9MSgI;g`k3bI@KrV)WjyNGF`XZX5gX}>Ef9UrUcb_*O~N=f?#Ynrc}wG~Je zD*CEkiAgS5!ib#*dzO&dIS^8Z-J?&C6nm3O@XdCUe0}-FUMOsEzb`0e9;~~upd7^& zBhscu4OA;npl$#n5m4g3hi%{jmgS!zC^~8*v7)HvN&bc%aF4@A10X<)v3NGCw?4FY z(j%R=k}eQMd(4EZ}>@-MwxNET~@O;?^LBBgP&FYNy)uU z2)@#vbhCL_^}J%^`=8vxe162pGPe3N$b3c#GFRL`l^azmr-0K=$aV3@ry)21;D>;p z{zM$nSJBFef6lPi&y=S0yRhVmj6#ge-{0F$G}k1~-FTO768m6efP$OW-zChOPb@D0 zQI9R)SDCM0P`*(j?~Oj&M>Hv-S+{Z3&{NdJph+gxgH1gXzc+~7`+U*IwrcQ8nR31^ z?mW^cW|FcFrSE>;PU@g5j$xwO^wltAv9Xt{Z208@)3LAy$S)1)z?+7uk!_mJI2-& zv9rrtBWWf-1>;n-IP_e?40VVVfm3-|IurPFH2G>#N8PV%!{hyLk72&SJN2*~L(Q!U zxD31m%C}Eof_O+mfEZr}i1-d9@|Cb>+*;XtC2atem*9Wlg~_men^Fm2Lf5I1F8-9Hpt(_OT) zZi8|7gm9-Xe^kyvbI#X;zLlb)LcOAcXq*ke0F;w~qie)&C{XwFr~eWJ^ABi{1^T|g z>*@6#;jaaNNLG;n5k*t~UJpkHVnHlWz8Htls%|(G3e|zq2X9!sa==^fHJ=De!!(?h zF2L{PAtC0HH$H)$`NBfN=l}G(VM0vH!);-}`LCUXFJBQr)#{*n6poyr8pMg}!x-uX z#A3c=0cOCj8~Np6b9Mnp`v30Ge}&8!g*0!Xj4Rug7s!dl)AmL&_H*zIiGdvEG+`zS z7*%V&U1w~GgvM86tY7P>0v`!rY-vRr1=@G7p%AE0ec8dQk90$@Qc<2pK23b<6}Tyf z?a$hcKTiBmpVv$gnL^YqU&v6RuL~z|2IJ7sEbg6eNvw(P`XpPowHLSAWh`}TonC$7 z&UVJOB9B2M&Aqe1agB4)zo<>9Gfo+IIfOF_*(>f08xFDb|4YOqT9pm`5Iz0$- zhYo>sa=$Jy<;6LtE6YVc*5{|G7E`;{mNuEQO9Xv){P5>Z(R&QNXqdTLD`Ji2K{4VO zi>;9n!B=xncP!&>vIUk=4%+-OciO;Tk>&LE8{p~80S|rptk?@HnGc_d5}|9V(L~7U z!}NCZiGo|v|Hsr-hDF&nZADVLyHmP5leL411W{XzNZMuD8fE_OY4aD*xm_5|k^2+Od$I1n3ieek?}G}tj~pOF|C!CvB5O zPEs&P`eda@cc{3q0ugu%PwMD3lMRhm-qOH&xbLez%S<&b6E}X)9{&lHKx2>NFj@G1 zm0OWisKQiIOgO_tA`NG*h({I2ZX7gw%;<(=^?70(+k&|holVMK>U72DVZsrw!`RB@ ziHtNplAS%f<}j!Z3Ta#2Vw6&_Oip;Uf5$WR*}_WQSYiw(#8BTGz3(^;g*icri-c2`;cd$XvaeoHe7`LPxSijWwfqGb6Vew;D|{IGoJV87X0b z>vR~4yZjmrxPCDTGjtM__ARXnz9ESpDtFRY_U1@NA>BV|1Ckbz?Q9J%y}VRAj|iWP zy}qKTS9G&3A~T6~TjVnG^;={ux0N3e7bD)MGMQAOn5eK>tdPIFJE7-VU+L&$stG!ri(&h1Z8{g%6xqCi_=sI-v0*nP48Q!1TT6D_+E*BzYqFYKOtgZ&Sh3HQGed9paCuZs z&vKucNqD%4+yWqjBMCRB5QcFeA)9_7z$Mqd`soL%oKq8=V7X>U+dS0gMoG!O_ z4FZ{HGJG#Nozvb8&%MvK+4bu(GSJWQpaKtJL4Kx2?>8|0%)O9so!k~OG<&TG*_wu2 z`+#&yPHt4+VA%gnTd};oHSuSI#{}`k#9x?ngrytRGA_SSHRGpjzu(HsYKBM9){bvt z&&O(3C|lW*#y+O6uq4|TNt`C|x9|QO2Nr_ksQWA*{RWomR|h+&Gr|W%j%UB zZM3=f7?w>+i=2$>wwprKb_*fv5K+ z$ZIQm;prZDnKf7JorQ0iZfMoG%{I*>X_~`0I8)-Ou2j7#UbIF(BfXyY!oz1^+=NF+ zjV~Kr;2S{KIw2Kj-HX_f^1-~nNB9(c46YhVe%Qo( z?DsYQd`p3RvVH%-hQLQ9!n&-m2Iu-oUO#=s**wHx!~>ym=lBe9P+62 z8gV#z@bX+VK+%p*v3O}q@eu!WPj5PhfqfV9k}z(*e#e&jr@GSfj9f90u;k3Ug>bF+ zR~@bpiaqCaNAvRW;N{r8j8Juu(A#l4>->u%-O|MM*u|a09n3W$e-?kbRd27y{x{XN zODIA|AD0jf-;ko{hp)312JIpi8E0awNyl zLraSZX0NM764O{06mG1E^XT2??O4^oo(=xYw5CBy73^Wss9s0>sxwq2Q{bw@B{91b zN!5~`kR*1Y9fG}SWWNm0lZl9JuGgS?c0g(AqTHOb+g{YSV?89vXNrO*o`R&8Lw-TN zez(!^=-rYtanyn|FTK7=Rx#|_ZvI2PIouEaSKk10fTINHqYDx2Q5Fhj_;%W;#*;U6FP*k41Pfo%1y<;Y2&wiZfo@pfHMtHYtvnlwMJSF`;@C( zO$O0XOQQ(rbQ%=)^NoW*WSK!c8dqb03UZ2mg!P4 znZekfu}-I-$A^61b5R$b0Te5`Ui}ekg*6;;5>V@%<1pDPVk-ZHEH?npQuQ-m|p?mQy!A%Jx5Rw51vV$*< z8HzusWk39e1aR*%HHj!vv`GT3V|h&ljN)iLw;6=+>wNZOI6B?Fx}>)p)qPs`Hqz?3 z$Ml|GZ|7;BPezn-AykCDnz!)Nc|rfCMX-$U79+e`Q^%GuyBsNbKB(jjZd>+wzm$MY zt6!@Q_h)D*0=ltt83ZsC&AwX+=5ge|lGX=4ANA(aPTJWefb5j7GUZzYhNU`9@ zczm*Dag4idA&KMSLbx)~3arNR>BB^ABS1dBv&(i71MKbX-7^_W33QqKx;p0ga8#1O zS(a(otiGk?!%NUEcYsFOV%kLN%$VW^ae%Yw585|; zlwPRw?1@#j(Epe!-ggO~2z&_sRc9Y^^c2G8OM&}&vWDy3dmsM-izb@c9#m-4hOkOK z9lVMIRuTm0anYoQ*Iod`UpgJ+w1&4r{_aU3Xji3-LiY#T^gJj!)sx96k$94!=K{Qh z;Vo&%W~oaGBCqo!3h_Z9M+m)@*V{jnsf0PTN=vkv@rrhor-RX3x0add`UER=t9p z%fe;lz1V)D$Q>1RLe+g+F=b%bF;(k#7G`KOEk@=!H&u?t4@CLeop5_P`o#GcPZ7x} zG3_uOOeTvBFG#c8*CS9R-&0*w7-P?45~_U2wnI|8-GF!Ef6DxO-TZNJy&1`NX3%VW zpXpR`kZ3H0MPz2&3-d#7MHZE{WgyN83>b7e|8o)kBtH}5_M%e?=`QN}NP@q*2z62zcG|L7epL7WFQ zZI~f&8%0paP8lX!ZiI1oteBT*pO7chm?!>g7R>L;V|xNsS#c7v04s}3pi6W&*ViCI|=;-gMQdQ z04G|ck=&MU1@(m-Xl+AWHtEIp{qDMOPfr^s(#kUG`0^o(ZY|m7RI~MW z@0$4o9pRG_l=9Q@q+5q!nk(%2d0idgw1)rY_6h@i`LJnp00U_jC)8pKu@*+LNX+hx z@JXor!bIEBdO})Qq0NO~*L6}wj>&~>o(pe#l+3ILa+^#A;)PKqjnM=9Q2Yk=|3uq3_4w@1~>~li=Ifads z`?AG<^ZdLzcJQLVo!L=a^Ho=Lsu%KJNs&CV4z(N3+NSWP+8}M#3!^9L@^fklH3w#L zJYTmwQ4#~;VAUGSGdpI|rYm|T-pT=dT5FVs+I%V(%IjMJ# zF}aske9g|Ww`Ey%Fp$bKa9m-taPS}9uS2VN3d*jSOdJe@1vk-j?I#R=_0YDeFd=xH z+^X2`=gk7ZQM90Z2+t?H3~BUP8s#!K-wHAIJ2(+r=k@cI#eLWu-7;v>lf^xQKv3@Za3& zvRjW(Tj@C?2o|$Ujw7M+N&40x>8(msaE~reF=x+&2GaxqUDN89c}u@4Nds5sn%!Eu zdZZ+a6q`qe_`PDLs)K2<`#_Dll<$kvK01Ix#F{I)*Xu`@`cH+6!dm|NMHwU+m%?u$ z;iSk}ypgdr34r3{f2PXH`FN1;YmYb$)Z)TW;6Ii-3FNL@@(8%X{3>XM)V+E=EFDUpLFj`>#_ zmU0=Dirg`0-ulrRp6@KH=0{6)Ztq*F@&$(*=2co)Wgad@`-#TJP|V#Fz0&etIaDAE8#C z701wUUzP~NQE)Csiz0#_U;}RVQ!&!E|I=%*hui!{SHOWaC}w)_iN0b7S-FBrV7s1_ z8&}VFv>f%+XG8%Xwh^1g#Z#FdP#pGHJ&1=i;MXWW+23mY2#iZ()(>OGP!c&!EGl5j z>SO9GDyDjL_!N)(?MrW>Z`9(d5xRxFcE-uAWlJ98utZ)bb|Pd z5BdhH?!eX*5r0gN;93TuI=8&8$Pn!B#?jt%-|TD3Jz5gnc7jn8X8kcwIF8~KwQ@3D zX>^ldO&`3CqJGf*6L`JoKQqXNdcLwO3R5rkv0|Hgr-l7*3MebZ zoa8zP-(K4#cOE6ypGd=nE>0_3Au+`%aI1xS`{q3yu;xGf6%8MNT?deu3G&4>s8LVn zH*)sj(rdg1%xtf_L6I3ZPrSp1IAP%fJASe^n}n;Q)WDJVno*$_;z8IHTE^8~CFq5* zI=OmkO_|@5iL5XCgnW0iE?K`q_%`hWul{& znYx`mP2Z1#9mRkzv`~;AojMVyolTaUi%AB2rg0N)_Q;!^W68B zjK(%+IJ1rPp-2O6XAeK_KUAz`cHlL5^RFHN{fwsMaN%}ahUw8*X?3)9F=IbGKd6Bk z79VeQ`}a=zs2D~nY{h4Z(ci0v-Y6Giw=u}uTd9@LaTb&rd#(lZVg2W}Z9NF!+Df5F zL2kP((+oVL(eW7brR_K$xr~!1sdBeJ&Gab4AElMxC(B#Pi1eh-szZnDSErHIwi3!~FcA1urn|75KO!yCIgU zvA8hiZAR)-SF-5CFfo7SEVoaymo7eqsowt#_6Gt)<9vN4qI>E`a>W+3t36e)=lsJh zU+O#QH~Wy%3L`TlZ#z*Mw@AV_C<_|@wLY$Xs9O$|&ZU8z%~hfqcz)&8SkVo;YT~!d zZU~!%NjgJE(-!L9eC9UMrXBC`(Pky*Lw|dr&lq9DaopaudxitzgI2rvgC66qM|X2s z%TYd^zW#cuG6Tz_U%vuY*#5K}{j)Mf@Rjqp=pXc?)h*87Sb?{?7Rn17cpNh!YsW}R z;s{Hv<(3|UmmZaFssNEpNf-M6qtI%n*>$LtK1A-^~=Zi7@GAhf*(4#rdcU(&_NM~R_68?*>Hk0CNtCj*W2*J{;^ zlGV{}gpAvo;4rlNF(H0iQ}wIG4l2x=gS4ST9|SSDIo=KEoB0QX&^bLJGzqL+v)}7E zNW?0pndSY+PPzMlNo-}a{t2#JP++*Z|IzBiD}<&#i}Z_DN`1vraGB_o@YGO=5WM_i|VOXhgye; zq=-Q$g%#m=sRT%mT!)S%)`Ie_us>;H0%TDPWtD0eS({`edz-}}0ycsFoK9Sdle1X=!@Qbir|FSg951T(tXM*LdT7W_QSP9hrq zd`Id=TPrf%qFzIa(-vPPVxOjlLdGPq8K?|*Dh)LLyqnaAe0s_l@H8Z1Q$UWt_b4|; zN@U7A4|#hn;5|vF-G-xa-=FLj_7V~8Y%J%|C-n`40un+uM8W4Fp4pidhf|w?v6}x6 zT?2V_%xwf{{e`YMi6O@cNM+2V6A+gnM6~Ux!$EJ1PXE^TVJ^{MMBgF~p``YT6us;` z*^T|}305Qd5=^p(;ftqeWcon=r*Jw{t_o-?F3`<^%nNqtBQSr4AcQzwc>SV?$n?SO zs}XX=3cnwl1(fR0^_tPC&%XcUjw}}<_W$t=RlcU+#6X-+plr(eh789~%m*ZEaa=b| zqQ^%rs-Smp?4Bk~RQd z}b#n`+9;w)ni|H9f$SYd>4Z`hV%SiNM+5QFmReqE; z6u|JZU!#lgAWE#xmFurnZ6`bCvRa5>y^UH)c|Vqhmi(}6R0u8m7S^+r+0}XjUGI*E zUNXvJkctK-aOT4(OS`R+3?{|1k9vPmh{%tBWf}T)n3}}wx2@sc-!!^G2#0?Nlx@xf ztYScjSzO2yE!ClyQd294J>*h2i^QO*v37AA|Hb^6aqpKDDHQ?_6F^j%PZZ(2gYpt( zs409RGUQW1ZtJYUdj3)%0lsHEVN5@f4gKh^g|0tW^hJ+Is_)pWAAd3-K~4~v%{7Xx zj|^O0FX8|Tpo4Fm2U(#>jf*#DrkX5$xLA_6pes+oV;7t%~|43|aFWkRY6db|8+ArZb1{%hniovRgCSg&#CHFzc)A>Y(eLhAp2}9I-Yd3J@Uq0)E zzRB=s(^%a*gg5Lmy%3FBm1db`cinq$Cw1OpIPP@&l_fXc#;H#jkbFr4CvCq#ZGPrW5nf5*^X{#@}dPX}rK&G=YoW88V;U7mhr~6Sxn0Knw zk%aUO_WnE?U4>3IDT2!*b9}28w5eZpicHWOMBky;1EE@TuyinS^6{+IN#{`Hx|UY2 zq_nrf0IaQlQ2Ue{l5fy@d1EKCYZ~I(tQkus6-ll$XT=Suk2-KwdLESi zo+#A@jGT|8>TGtQ#>jSz%nQtudaDi*<@osqs)uf0oF*TS5DKxg*D(pK(JLN(DHL=f&es1-Tj z^6+AK>hg%{l5?$got0k8t$H=?mimE7$*KeqMQPi07o4`(IM%#y)E@I4s(HkI5~{WN za1@MsIlO0)lQ{UcY`#Wve(2jdBa^mvI0H42c$nX$g@OK}s1`4QnkIeCH)qYDIaAyv zlf0`03$BtNjwdDRp~yik7=ik(Y#97+Vhm<*&YJ23kTC(}EC%ANHNtQQk5F^*OyA2g z7ruwQN&3ji^pjAvVyzTYS(={W$C35wF?KaLlP71sX~FY~*M|lV|CJp(*rona0+#5( z_+2E!FciINlZSS?^0z9;=KjB@MXB`|(HT?TqihND*^84OF67=Y6&05H*D6pkuW zY9Oh)#q{k-{_#uRk5V=t7>@d@Fz_iimYmwvg5tui0`bT&D8k)JO75d$yT(qspM>50 z4@=IS6sAzAp?!*HMWiEDmR5*+uBs2T;-l_-^3MV-;Yi58!~JMiwNP<=ViFl>RPjLiFrrnxXd zsNp&T#@w;No0RHa>uad^JKEF6PyX-MtHaW@cgdusDZE=BsiY3F<%;!s`tAYdWhE%M z*0qeSs8T|>DhMWRAwk2Q=>0^03TaDK248x@Kc&gTvA6FF%U$zEL*%x_7oRSHG0oM9 z>8P}qZQ~HXr-A&J4e6PAgnw!&H2~%QYZJ1pHLP{hw=VXMBJb17BKgeC@e$lwSyde? z!YZ|$4wq51T)$Q};zq{vb+~a4nirHPGdD09;ge}Jr|dKhw@!8is+{1ITJr4FoN=0MSFn!bd`hGSK*dLlxukC-q$#Vf#Qc+ zyGTa1xy|FW$=X0!czApnX5`?*`{1zcH3d%_2Xy;5^=Ff3ToDF`pW|9LWfEHHry;;M zTsMRLgDWbB3LI(tMI#7i!aRqKDzZ~7Z^+jN5;!fq_=jfd^Q_P( zPwHrbt=A5jOuZ zOz>K`(FrgKO3B+`*d~Xj0@K=FX)R})h#T5K-GZi+#CNufy+`JY$M&=MvLg+1v(iSO zyFR@R5gx4u-Zjkjr9e@kn<`fKLSvVI*D{ zl_WO}pAOSW#M=usWb6b9`v+klG4B2el#;)GR#$R4^|?%ak_aPcUl=sS_KQ9Wm0*50 zoMb;w!SxOHwUydU1yvbsc8gPbeBQnKJvT1&r$s~)-0K0w;w{L{nm`AEal4XRuxz=7 zCb3bGK3+uL7faw_;|FEU_G^+^&~f=EgU zwM9!9V#LSZ^5u$+%Fi13aff>>vO3eKwS7Yg0QCILuH-**Wl5%#m!g0c7>RL#EEW|d zh*rrYUqO`SxPkiFKtYm|KrI7!81QYsmM$TIO$T;$xlJzjVNFy)uz_ycWRL4T^b#AAY25WIXD!&-AidvAp{-Chw&4DMi~l%-;Sj=?=56g?Ebp?y+C1 zC)8&F*DyxCSo;CZF``I-@W3Al0sVz3KxBZHn7IPy+bm}39AcCi5;-8qXw{)UV;@(6 znS=%f6NyR9=)boIZiYoJmXd7$0_wU&DMl?M2!gi5xJxcFLDWZV7afFF%^hO}r>aor z1eN0%uwbj15HGpj6bJLj`n3K_H`6=5WSQ&^;1hC#K~isGC; zj`4XqJd#M{a2uwG8qPv$9WM;0k^bD!97Jsf^*}*wB983d+f@>`{OZi6k+guUqOten zKXu#`K85qU+f!q>b?BrH9^bl*q2cD`@oGamnET3c_z=^0o9(QSbQg_4yJrH!#evyg zY`jjq^aX4(OI#VK1`hz$mMAjnym$*Z0)G6z&4k@q8R_NJd%q;CJ4_Vg!`-m^sT*>! zuQ=Eiba+mJE6c=T-y+}cyt8G~IRSYC#Hn=fdKk>{VOzB}wA*eRv?;m@m;wBD9;~*! z6^rLG7hVFM<3}i>K=+ z6It{s9AjUpbf%Z&MKE|1ocE6<+D|XonFGehjzMnTv+K<0n>|x^S8{frWCm4Y2mVZg zo$7q>v45WE=;XRS`7opz=~TFp<8Vz{g^vh(t}f{N-FW3#+M@|%GMSlJu{dk((MUDk@e6ITyFxuQqJYwhQ8SGO=3j!_vnzANgf zcbP3tM4xPoF;u{g$%aWkK>f(irrvuGrrQHc^J80dK|YP69L#`#E(_<%l7b;V@m{4Y zMsloT>icH_o_;zho8^KMQkaGIFPD#!P;In z$OdHOhf3~V5%-l%Sjn?0uA94>*+j18|5Yj9!?g*Z~;xnF62Eqz13RX0n^AdY>6BXpK%bI z@RAjJEc>7AHK=d)9>BHy*t$K&Q<;YTF#Dw9YYa*IHd`?EopRnAQ*l#6A>}wO$mvzqFWrgIsI}77H*X~8O4hSF-a(pj>Fel9(2zgNc zM!3GVWoq1FZMe`fqFV(YKMgNQ^53v;_rz8HlqaCX3FN4AQq7F)%}mVPlS3%BO?9BvB}HHdbm{4t>rdipEyH#<5wx7H%4g9o6`sP!&Jp z%Ii4kPl;iiQ;a9AxIJB7Z7yfEy&mtKrV&~peP>K*=acSRw624z^>(IV4IS0YGcO!R z^lAVJbANwq{YueKO&?`*O^~nd}~?i<(S&u!VS(#3~kY-)kig0{b9U1tL*Sm*jC- zBRsj&Hjt{S``1R}53ybEtq^Fc+ywnrIqI!qut>jYc*!o7ZWQZ-Z8n_XPATV}Y)epc zmUTh?OEE|;&=x!a5TAc-GZ_&rMc&{f*v zfiDaPEFNdp4|GrInY8Oruhk`~y^Lqx4K!KPJc?%5w;j;T2ZDf#0!6^@HJ@|7jvpP> zSVvKF^;I|CUMCjM2uecdzbq16!zVij92J6l;^JYz{}Z&gmae(_9i?WRp!S(1s9vK+ zN;el-o

nN*p3#>sW7e@ix_)4Msf!)(k8fwiPXWSc^U)b$_(tE<+=H_j z;|GK}Hk9-Pm?MWBlb$R3)GZ?4bos}!emsoGuwPLeVJ7Wf1C&SbROl{EOOmvEnRG&~ z`*?FGPc7D1=3w%HK13QclF0@8NU8#G+Rs9muc4RRWt9JMS?Bhu&lA9B4^klbnvttM z?AvJMz2)?H?|c1IX(7V2`oz$FdR#IsvY z)Au#n1wA(6>Per2-pIIts~|Ah7v?<$Qh;P%%h*iRrtptZPm zp%+`H`Y}_tRRDElV;OK3oZQr)`oI_<{2^ebr0N1I zvaQJU2k=n+m-gQYllr_I%6Qfl+0sjG?<(}pCmnyGAE+c5Avk;Ut&CVSFJC(vbX9PI zm>4|ea#k~c@jerM9f4GK^AcKQC?8}y z4?nb$`#`|n$aI7!VgAlsYtjPM;Z>GobMEbd05r;qKcNlgY_T(#;8@X`zmN=~X1z0_vqpXDa({W@JoowbSI;sK6?R zT%ZI5vLVy;fv8FGa#$lF!eb-}l88E|?icmW#jTTER`0J>`9bjDCO$4>A1i4s*J(7#)Ldv?Ncc!_xXI@eef z_1bKG+rQ%|Fhlq-cD*b6ymyxF)7sg*{B*Kg(b{nmQ}ifT^rC+`b^SbfcCq{5zI}af z`@E-n_5I=c{57Ow$z#3v@nE16+Wo@9(FgNsxbt;)5#ROcYE$Uh?(!_Hd1d4^pXA|4 z2Kf5;bGGn4W4h?2QORfC+S^HW9WRE#mf(zkb*&?V_31D|=A!>fr*dH4_fYrfyONz% zbNlQ0#Z4grj*q#mqqE1u&%@P&5t)1HpGr^k_Z~o4?wM1O7FUK`8P&XSq+HZzCGCs& z31*!&r7keHzmW)4N)4}Hn;L)!6d&7ulVpucshQHYYaa4&u6GwlJpDaW;^)jjR4qC&5rm)<}>lOsF567_15D_$l9L96)P zbsbx2hML6rPrX>Ao5cBT#EghwessEfF>GWVI)XV1Ua7}q4lz^oc*OKD#W+QkIR0P3 zeZSC$S`q;eIRqt$3uKex{xWgeSe9stO6XQ)mpoJ@mE+FT+J`o{X6`*d&42pT?^dPu zj}3cqe$)Q?VNBwMDh@2E(WEWKTZWm28F!+ktX1FF60{iG`F%FIw(k)Fv(|uUnPrDt zy3MZ}8V<*9(z~HKWhmPESgYLmw)ehtvjU6%x8ZlXi~93h;DU%?|LIemc+s4o@*H_- zbfU0OA%3P=h!l~HAK>_3I^V^b6|P-YY5>AM4YG!bqDWs}NpA%K@`0}^)v@$624cLa zRH(wlVFLb{!*pdGSPdNUEE>Vx`8Dt5nPno)k{)Ww-9D6EuB9Ai$x|wHSzKq_CYyu+ zW)A-ZFZg=(ExxmdBsnU3nOGJTBqy&Tb){HwfKQWOxP&Oj&C*?yl-~kp|8oQQy!9<= zfbuMm8^A}2B3mF{g^-l4vyFE?>|;;Fr1ZUbvuDEAZDoC6=Z#2LbI4DlbaZLG5Ox|%fC13)w$ys zRhL3?feL44GOTe}0%W_r!=)Kju zqeO@@RScN+nrSl96Ahs{vikA9MbZ=h35w7b%Pmp&w?~QpX!Et^ZLd)SRAzvM(y|q$GL^Z&tOWS9_J}ngSeC8lAFB zNciw&!u zY^pTMASpV_B8gr5M5~@jt54o~R48TIeEQw)F}J(JRUiffI>{%tYGt3Nb?Y?K#-6l> znWIPU+g-sWmB-8FgBX`RHH=Y?Q(<-2@MWy%8kGIX8sF6cFa_i84R(x2va)_=qkC1# zl#w20)QcXYi$MBl;uc!HMkZl4QFu|hu)3PBO;LG8Em1P6JgOLQm`n)}mq=G3kBh78 z4`=4=8h4ImdHde?i6a(Py?ht#az@umR!zTustH@e=6hk|`Vx*ala#6?XZexrUekX4 z8v4MS<$EG06+>M5|Ggtx9iN7M<*tNXYkF4Jxc-2|QzaYA|8qkYCy(5>kdE!XK4oqG zVSG*L6OL@{y5ZRIIdMBS0a~d3a-~aa`%eT&MKCzA+g3cG4Fi6k+VH=KWdZ8W^ti|2 z`}n09Zh8VLZL>mbLLw-(o|JU&`JRb*H#KMWa4v7#0j*sA7n^Td?;k60+vA-(Qw=L` zmCn?O2Wy=PR!(0#VxJb|?O$#I4fQAcRd8jh62vp&(-HclttH5LY6vcd^E}FK^UK^6 z6@#k-vb56lK%^b6Y0Ye0fLT#5_6L3#-8QqBQ4|Q#-Gz72c zNq!Ym!qdz*geq$49y@dqS_qkB>=bjptUGd-DRT`c1vci<;}jO3iMf-17_d8mUDTouI`-tP;D{9~MJM-cI~9VT30FD?dw46?ITL9$mr!j!O=pOoU+{vk zT0zTXR2?w{`bFN0sl!~EVHjeXM{4I+cZ(b{M3E;ophSGMxbH>N)IMvPlVMuCQJYi; z{rj(!*QnXY4#+vjrd52Vj{ptd6dqk|L(B4TGl5l~=XPF0O976pWsGKi=w0MAF5WM7 zXdel23K;a;6fKk9;HvR!oPGkov8D-o8mejKuM+a{E;&3fp<=p`6I3>w(VK}Am$K;>z!sPl zFmG9E-eK1Yl(V^nCXhUBw@#n4P~idBfjd3XjbB}GG4DXu`Yh0I`{(CkQx~=tZFM49>&)1OJh^T&S}6Se!O*{XiDH0j5NRD+-5tFD zV2E;)WgRrmDq!HnP{(bGRmPN2@p%RD)6Tn+_sdAcrA!u#783d7IR-+J*%m^qAfttX zL+>9qakpqB6iq zn}=Go*ZfJ3GQF>DyuPu+eJZ$()1RP@&=DqT%$>61DlE`DTpjVZ*$f;o;qxmFWKX#+ z+-PB)Y}GieN!k(92kqYyQ1e3-RbUKMN`6xUn|@97mkD(Sa}n7Vb1Wbx2;$QBlu>7z zBRovxUT{yVG(Pi;C#@fur`jdq4;+~k+VM$>x(f~2^g2-+hOC7#c#^Csv5>MgVY_1mB5ljZU7Rr!=N9PBc_F9VW&-8!IMM>F0 zb6n9&I#lncS&xv$roG_u{>4VPh|4W1}>LRYcl&0_LA4{(Wk?c&1JLU zdS~+<?skOB_`SF>>(deN{>D-3)DTo$;|Ef#M!2IlF*xYHlv+d^UEe?5!z+e+FO##Ia{Vy+-#0^V;4r8 zHyol0aX!!^@@Sonjvu9FyLc7%kMfGo4d8j>m8LD$th8n(YaOCwM zX`8q6>AbOE@Jf^Yxu$L3p^#cJnUH5vn~;@vWUru!GQ6u9-PuynKT!0@2OPW{yq#R zdQnD}7|(^TgZf*tTl!ZQ8@{4(m(k;M~xea^yZSw3K@{=V`+Gy2|HrNS43EIH&;_4{N_-OU!uOHYB7HtWN);rwHttd`fhmnWgy5e82S1K8y-Tn`eqYycSO)FlOFtK&b~Vikq4auwT#orKg~9OHNAmewsjh%#?E$ zL{EwNlbyBf)1#bE4gG4&YWBRfN>=L)s>61DWx|)%x(^3W=Wq>Akuwc9>3a#D;vHTS z(cXnhsG3uTB+dq3%r*0v0xf+?yr zLq3gl<>WI6{y6$SN}R-p7uLK?Mg%%Z$fM@@;^TI^CqbJldWB2@Wf>o>99EJ_@HL&T zfBHP$JiDwH+7g~d_rz5e0iUf}d3;{4rcYeIJ-az)>?;lz!2@JESk`;)wA!?HR4IuG zjL9dxPz$S%amb3g_@5bJ;G zMcjl!+vR7SLgVblNmB^b z+KreEXu;JJhF4k;V}83k{VERMm(&T#&$}I2L!+i@-_EIM!iq-&y_rCtteM=)gR)!A z0f|~6M&79zEVb#q25y^dDLpSsw=m85H1yIY6ju@Yzhj{hY1QFTCGTn|=1Z7yrppa^ zldK2Dt(d#^BLAII?P2o0n8g z_k)pm{d2hB^8Ob#M)y*1verEtlHK1+GmDQTqm8}-Jjh&~O zmXh4YgteNP_jb>-&bGsiI4s*_ocXaG)8?4&9He{IZ*LDPTMD#mDq<_hx9l3Gcud|c zEq&hvq{&+Bf9JM$Y0CEw7J!Wbg{n;H1#OIpw-Y@DIgj6^3xO<+3_^p^IHV=)${ zRR)x&C*!A>G?{YN17f*$uwz* z5Bw(XtQBqpOq?FRK7MU*`0~14lwG9jeg87D-m#{GZF73mD8Sz7Gc6{#$6Y6x*-R>3 zA<#<_1acR`d|f#rk|flz@E9c}F?g+)B$oS7gFjD*s%{f{ z#?CwP5Lrz*sViP9lNlqwtS+~ zJxSozUh^3VGO5uCj-aw(J6Lb(?TP+hg$)-fLkpQ-=mq^|RXl>)5Rfo0w zIXllh@@O>%?`Nu-(d_e7v|^+_5w5RGQ=d{`ki8UQ*hGM9ZbP>l45v9fF;+k91y!_W zk~g@{W?-*74FD$8qL|mceKf^Zl3@E9n2cRMEI^d59vPxD1^amzy9Ecp$5h0HmJ&>K zQy>HQ;1C*!uH1d_NJh>`d@2aMn(CyF%O($w`(RobuexWzxEC1z7Y74kgi8o2?W?dW zJ#11pn4p$Z5yjHBEqr6sJ|2sPSY!T7Ey>!w$bjg7WP^5NHbAinDO_g{XBY5!dE6r` z6p-82WRn%}etx>nwgo<)R$g|Vw2tRHf7Fc*UA5EvB#rW;^N1#8;i+_W!*KWx9ierZ zK_JKIV@Rg3@~|%gPgrrBzTHAlG%f=$bgm}Sj1J02-HTbfJUzJCTC6|{(rMv;(zLI} zjMuNf*EXbY+HzVFr;mq6g-yw?b>}j32_?Jxq^YF6CJkdFetd%D;t7V8S~7U%JfwW7 zYQp?~%)NO$l<)UH-X@e#2-&iQ3ZaOxBnlBpWX+yr-*=KE5}}kBYnHNS-z#fm55r)x z?>obo#qYjHdiP@9pI_g{_wjgrKmSO_nd?61JkNHW`?~Mxatk^}5dxT|;m$M38?q+T z$B#qgFy`L5WV9<#T5TMisD`~0+d0xX^LMk7QwKk(Mi*ar{b6V4E2y43B+CD3C@RZ? zPmLvi2)bcAXJV3R{ylJlYwLde03 zc+M*_t7l>EXySC&Bi4&-fRbb8_F28o9N*(RJ;zNovf!5IWWgyjvFYX%r|4QeH!`b; z%2sZkJfe51{h}|{HQzRmlG&w>iGnRz?YPd-W`uvVhIp+uu*Fo6O+HhRvk)?A(mS1v(YK^B*22}hkG9f#dh1Km25f-m%G^Ea>n?}6zOAWMC=*EjY z5phQsCflZhtpauc?9j?(6662G^bP=a86S?i9U~#d8pPXaH7+0to*7EjC~3%0AVpR5+HEs>ua|T56TLZQnb|Ds2?*gIY1!)*7Ae&o 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 Kb6>F+!2bc1fWU(Q diff --git a/workbooks/appdelivery_checklist.en_network_counters_workbook.json b/workbooks/appdelivery_checklist.en_network_counters_workbook.json index b880845a6..dbbd1c32f 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": "{Query0Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query4Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}" + "resultVal": "{Query5Stats:$.Success}+{Query6Stats:$.Success}+{Query7Stats:$.Success}+{Query9Stats:$.Success}" } } ] @@ -432,7 +432,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query0Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}+{Query4Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}" + "resultVal": "{Query5Stats:$.Total}+{Query6Stats:$.Total}+{Query7Stats:$.Total}+{Query9Stats:$.Total}" } } ] @@ -470,7 +470,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query1Stats:$.Success}+{Query8Stats:$.Success}" + "resultVal": "{Query0Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query4Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}" } } ] @@ -489,7 +489,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query1Stats:$.Total}+{Query8Stats:$.Total}" + "resultVal": "{Query0Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}+{Query4Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}" } } ] @@ -527,7 +527,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query5Stats:$.Success}+{Query6Stats:$.Success}+{Query7Stats:$.Success}+{Query9Stats:$.Success}" + "resultVal": "{Query1Stats:$.Success}+{Query8Stats:$.Success}" } } ] @@ -546,7 +546,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query5Stats:$.Total}+{Query6Stats:$.Total}+{Query7Stats:$.Total}+{Query9Stats:$.Total}" + "resultVal": "{Query1Stats:$.Total}+{Query8Stats:$.Total}" } } ] @@ -584,7 +584,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query0Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}+{Query4Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query1Stats:$.Total}+{Query8Stats:$.Total}+{Query5Stats:$.Total}+{Query6Stats:$.Total}+{Query7Stats:$.Total}+{Query9Stats:$.Total}" + "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}" } } ] @@ -603,7 +603,7 @@ "criteriaContext": { "operator": "Default", "resultValType": "expression", - "resultVal": "{Query0Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query4Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query1Stats:$.Success}+{Query8Stats:$.Success}+{Query5Stats:$.Success}+{Query6Stats:$.Success}+{Query7Stats:$.Success}+{Query9Stats:$.Success}" + "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}" } } ] @@ -677,30 +677,30 @@ "style": "tabs", "links": [ { - "id": "a82ba1ad-025e-459c-9443-45be59d9ba11", + "id": "e5ba4fd6-319c-4916-a866-b6e195ab5427", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "App Gateway ({Tab0Success:value}/{Tab0Total:value})", + "linkLabel": "Front Door ({Tab0Success:value}/{Tab0Total:value})", "subTarget": "tab0", - "preText": "App Gateway", + "preText": "Front Door", "style": "primary" }, { - "id": "46f08fee-be56-4b54-962a-0b73fb6217cf", + "id": "a1ac9b7d-6f9a-484d-b89c-31d6c1dc2423", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Load Balancer ({Tab1Success:value}/{Tab1Total:value})", + "linkLabel": "App Gateway ({Tab1Success:value}/{Tab1Total:value})", "subTarget": "tab1", - "preText": "Load Balancer", + "preText": "App Gateway", "style": "primary" }, { - "id": "0404c560-b05a-458e-b058-4733afe8c8e1", + "id": "9c735b8a-a099-492b-bea4-d05bd6d6735b", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Front Door ({Tab2Success:value}/{Tab2Total:value})", + "linkLabel": "Load Balancer ({Tab2Success:value}/{Tab2Total:value})", "subTarget": "tab2", - "preText": "Front Door", + "preText": "Load Balancer", "style": "primary" } ] @@ -716,22 +716,22 @@ { "type": 1, "content": { - "json": "## App Gateway" + "json": "## Front Door" }, "name": "tab0title" }, { "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": "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": "querytext0" + "name": "querytext5" }, { "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/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", @@ -780,20 +780,20 @@ ] } }, - "name": "query0" + "name": "query5" }, { "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": "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": "querytext2" + "name": "querytext6" }, { "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": "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", @@ -842,20 +842,20 @@ ] } }, - "name": "query2" + "name": "query6" }, { "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": "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": "querytext3" + "name": "querytext7" }, { "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": "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", @@ -904,20 +904,20 @@ ] } }, - "name": "query3" + "name": "query7" }, { "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": "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": "querytext4" + "name": "querytext9" }, { "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/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", @@ -966,20 +966,42 @@ ] } }, - "name": "query4" + "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" }, { "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": "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": "querytext10" + "name": "querytext0" }, { "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/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", @@ -1028,20 +1050,20 @@ ] } }, - "name": "query10" + "name": "query0" }, { "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": "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": "querytext11" + "name": "querytext2" }, { "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' | 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", @@ -1090,42 +1112,20 @@ ] } }, - "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": "## Load Balancer" - }, - "name": "tab1title" + "name": "query2" }, { "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": "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": "querytext1" + "name": "querytext3" }, { "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": "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", @@ -1174,20 +1174,20 @@ ] } }, - "name": "query1" + "name": "query3" }, { "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": "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": "querytext8" + "name": "querytext4" }, { "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": "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", @@ -1236,42 +1236,20 @@ ] } }, - "name": "query8" - } - ] - }, - "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" + "name": "query4" }, { "type": 1, "content": { - "json": "Deploy your WAF policy for Front Door in 'Prevention' mode. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information." + "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": "querytext5" + "name": "querytext10" }, { "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/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", @@ -1320,20 +1298,20 @@ ] } }, - "name": "query5" + "name": "query10" }, { "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": "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": "querytext6" + "name": "querytext11" }, { "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/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", @@ -1382,20 +1360,42 @@ ] } }, - "name": "query6" + "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" }, { "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 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": "querytext7" + "name": "querytext1" }, { "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/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", @@ -1444,20 +1444,20 @@ ] } }, - "name": "query7" + "name": "query1" }, { "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": "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": "querytext9" + "name": "querytext8" }, { "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/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", @@ -1506,7 +1506,7 @@ ] } }, - "name": "query9" + "name": "query8" } ] }, diff --git a/workbooks/appdelivery_checklist.en_network_counters_workbook_template.json b/workbooks/appdelivery_checklist.en_network_counters_workbook_template.json index 3956b7524..69e51b27a 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\": \"{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\": \"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}+{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\": \"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\": \"{Query1Stats:$.Success}+{Query8Stats:$.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\": \"{Query1Stats:$.Total}+{Query8Stats:$.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\": \"{Query0Stats:$.Total}+{Query2Stats:$.Total}+{Query3Stats:$.Total}+{Query4Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.Total}+{Query1Stats:$.Total}+{Query8Stats:$.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\": \"{Query0Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query4Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.Success}+{Query1Stats:$.Success}+{Query8Stats:$.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\": \"a82ba1ad-025e-459c-9443-45be59d9ba11\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"App Gateway ({Tab0Success:value}/{Tab0Total:value})\",\n \"subTarget\": \"tab0\",\n \"preText\": \"App Gateway\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"46f08fee-be56-4b54-962a-0b73fb6217cf\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Load Balancer ({Tab1Success:value}/{Tab1Total:value})\",\n \"subTarget\": \"tab1\",\n \"preText\": \"Load Balancer\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"0404c560-b05a-458e-b058-4733afe8c8e1\",\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\": \"## 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\": \"## Load Balancer\"\n },\n \"name\": \"tab1title\"\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\": \"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. 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}", + "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}", "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 3b1cae3ff..3c2bd2e4b 100644 --- a/workbooks/appdelivery_checklist.en_network_workbook.json +++ b/workbooks/appdelivery_checklist.en_network_workbook.json @@ -70,16 +70,16 @@ "style": "tabs", "links": [ { - "id": "defe4d73-e11f-4244-8fa5-abf405fc7204", + "id": "eead62f5-2b5b-412f-8ce9-e444104bb64e", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Load Balancer", + "linkLabel": "Front Door", "subTarget": "tab0", - "preText": "Load Balancer", + "preText": "Front Door", "style": "primary" }, { - "id": "2f28f5e7-3ee3-422f-bed7-43785a272c10", + "id": "ce137d79-b47b-45dc-955b-efdcb38cc867", "cellValue": "VisibleTab", "linkTarget": "parameter", "linkLabel": "App Gateway", @@ -88,12 +88,12 @@ "style": "primary" }, { - "id": "e32f8fd7-2a7f-456d-8484-0fb72afe9dbc", + "id": "4d025713-e2bd-40da-ad43-4e01514547f8", "cellValue": "VisibleTab", "linkTarget": "parameter", - "linkLabel": "Front Door", + "linkLabel": "Load Balancer", "subTarget": "tab2", - "preText": "Front Door", + "preText": "Load Balancer", "style": "primary" } ] @@ -109,22 +109,22 @@ { "type": 1, "content": { - "json": "## Load Balancer" + "json": "## Front Door" }, "name": "tab0title" }, { "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": "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": "querytext1" + "name": "querytext5" }, { "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": "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", @@ -173,20 +173,20 @@ ] } }, - "name": "query1" + "name": "query5" }, { "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": "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": "querytext8" + "name": "querytext6" }, { "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/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", @@ -235,42 +235,20 @@ ] } }, - "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" + "name": "query6" }, { "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": "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": "querytext0" + "name": "querytext7" }, { "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": "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", @@ -319,20 +297,20 @@ ] } }, - "name": "query0" + "name": "query7" }, { "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": "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": "querytext2" + "name": "querytext9" }, { "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": "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", @@ -381,20 +359,42 @@ ] } }, - "name": "query2" + "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" }, { "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": "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": "querytext3" + "name": "querytext0" }, { "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/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", @@ -443,20 +443,20 @@ ] } }, - "name": "query3" + "name": "query0" }, { "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": "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": "querytext4" + "name": "querytext2" }, { "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/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", @@ -505,20 +505,20 @@ ] } }, - "name": "query4" + "name": "query2" }, { "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": "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": "querytext10" + "name": "querytext3" }, { "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/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", @@ -567,20 +567,20 @@ ] } }, - "name": "query10" + "name": "query3" }, { "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": "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": "querytext11" + "name": "querytext4" }, { "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' | 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", @@ -629,42 +629,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": "## Front Door" - }, - "name": "tab2title" + "name": "query4" }, { "type": 1, "content": { - "json": "Deploy your WAF policy for Front Door in 'Prevention' mode. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) for further information." + "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": "querytext5" + "name": "querytext10" }, { "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/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", @@ -713,20 +691,20 @@ ] } }, - "name": "query5" + "name": "query10" }, { "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": "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": "querytext6" + "name": "querytext11" }, { "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/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", @@ -775,20 +753,42 @@ ] } }, - "name": "query6" + "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" }, { "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 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": "querytext7" + "name": "querytext1" }, { "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/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", @@ -837,20 +837,20 @@ ] } }, - "name": "query7" + "name": "query1" }, { "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": "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": "querytext9" + "name": "querytext8" }, { "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/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", @@ -899,7 +899,7 @@ ] } }, - "name": "query9" + "name": "query8" } ] }, diff --git a/workbooks/appdelivery_checklist.en_network_workbook_template.json b/workbooks/appdelivery_checklist.en_network_workbook_template.json index 32f3a2959..7005f647b 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\": \"defe4d73-e11f-4244-8fa5-abf405fc7204\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Load Balancer\",\n \"subTarget\": \"tab0\",\n \"preText\": \"Load Balancer\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"2f28f5e7-3ee3-422f-bed7-43785a272c10\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"App Gateway\",\n \"subTarget\": \"tab1\",\n \"preText\": \"App Gateway\",\n \"style\": \"primary\"\n },\n {\n \"id\": \"e32f8fd7-2a7f-456d-8484-0fb72afe9dbc\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Front Door\",\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. 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}", + "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}", "version": "1.0", "sourceId": "[parameters('workbookSourceId')]", "category": "[parameters('workbookType')]" diff --git a/workbooks/network_appdelivery_checklist.en_counters_workbook.json b/workbooks/network_appdelivery_checklist.en_counters_workbook.json index 63905ca9e..bb311ca2d 100644 --- a/workbooks/network_appdelivery_checklist.en_counters_workbook.json +++ b/workbooks/network_appdelivery_checklist.en_counters_workbook.json @@ -563,7 +563,7 @@ "style": "tabs", "links": [ { - "id": "bca18139-c8f1-42e1-ba76-c6a3631cdbb7", + "id": "d6436109-47d8-41be-b0ea-2dabed482fcd", "cellValue": "VisibleTab", "linkTarget": "parameter", "linkLabel": "Network Topology and Connectivity ({Tab0Success:value}/{Tab0Total:value})", @@ -901,7 +901,7 @@ { "type": 1, "content": { - "json": "Deploy your WAF policy for Front Door in 'Prevention' mode. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) 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": "querytext5" }, @@ -1211,7 +1211,7 @@ { "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": "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": "querytext10" }, diff --git a/workbooks/network_appdelivery_checklist.en_counters_workbook_template.json b/workbooks/network_appdelivery_checklist.en_counters_workbook_template.json index 6934006ff..fd1c006b1 100644 --- a/workbooks/network_appdelivery_checklist.en_counters_workbook_template.json +++ b/workbooks/network_appdelivery_checklist.en_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\": \"{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query4Stats:$.Success}+{Query5Stats:$.Success}+{Query6Stats:$.Success}+{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.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}+{Query4Stats:$.Total}+{Query5Stats:$.Total}+{Query6Stats:$.Total}+{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.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}+{Query3Stats:$.Total}+{Query4Stats:$.Total}+{Query5Stats:$.Total}+{Query6Stats:$.Total}+{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.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}+{Query4Stats:$.Success}+{Query5Stats:$.Success}+{Query6Stats:$.Success}+{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.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\\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\": \"bca18139-c8f1-42e1-ba76-c6a3631cdbb7\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Network Topology and Connectivity ({Tab0Success:value}/{Tab0Total:value})\",\n \"subTarget\": \"tab0\",\n \"preText\": \"Network Topology and Connectivity\",\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\": \"## Network Topology and Connectivity\"\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\": 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\": \"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\": 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\": \"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\": 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\": \"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\": 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 \"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\": 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\": \"Deploy your WAF policy for Front Door 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\": \"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\": 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 \"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\": 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 \"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\": 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\": \"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\": 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\": \"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\": 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\": \"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\": 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\": \"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\": 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 },\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}", + "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\": \"{Query0Stats:$.Success}+{Query1Stats:$.Success}+{Query2Stats:$.Success}+{Query3Stats:$.Success}+{Query4Stats:$.Success}+{Query5Stats:$.Success}+{Query6Stats:$.Success}+{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.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}+{Query4Stats:$.Total}+{Query5Stats:$.Total}+{Query6Stats:$.Total}+{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.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}+{Query3Stats:$.Total}+{Query4Stats:$.Total}+{Query5Stats:$.Total}+{Query6Stats:$.Total}+{Query7Stats:$.Total}+{Query8Stats:$.Total}+{Query9Stats:$.Total}+{Query10Stats:$.Total}+{Query11Stats:$.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}+{Query4Stats:$.Success}+{Query5Stats:$.Success}+{Query6Stats:$.Success}+{Query7Stats:$.Success}+{Query8Stats:$.Success}+{Query9Stats:$.Success}+{Query10Stats:$.Success}+{Query11Stats:$.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\\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\": \"d6436109-47d8-41be-b0ea-2dabed482fcd\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Network Topology and Connectivity ({Tab0Success:value}/{Tab0Total:value})\",\n \"subTarget\": \"tab0\",\n \"preText\": \"Network Topology and Connectivity\",\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\": \"## Network Topology and Connectivity\"\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\": 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\": \"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\": 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\": \"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\": 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\": \"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\": 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 \"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\": 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\": \"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\": 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 \"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\": 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 \"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\": 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\": \"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\": 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\": \"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\": 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\": \"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\": 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\": \"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\": 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 },\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')]" diff --git a/workbooks/network_appdelivery_checklist.en_workbook.json b/workbooks/network_appdelivery_checklist.en_workbook.json index f0e90bdc2..e53af1fee 100644 --- a/workbooks/network_appdelivery_checklist.en_workbook.json +++ b/workbooks/network_appdelivery_checklist.en_workbook.json @@ -70,7 +70,7 @@ "style": "tabs", "links": [ { - "id": "7ccaa132-1ef6-49b1-ae31-00fa9a78d667", + "id": "b57de63c-233b-4c04-b27f-5da0c8a5ad8b", "cellValue": "VisibleTab", "linkTarget": "parameter", "linkLabel": "Network Topology and Connectivity", @@ -408,7 +408,7 @@ { "type": 1, "content": { - "json": "Deploy your WAF policy for Front Door in 'Prevention' mode. Check [this link](https://learn.microsoft.com/azure/web-application-firewall/afds/waf-front-door-policy-settings) 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": "querytext5" }, @@ -718,7 +718,7 @@ { "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": "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": "querytext10" }, diff --git a/workbooks/network_appdelivery_checklist.en_workbook_template.json b/workbooks/network_appdelivery_checklist.en_workbook_template.json index 030681d7b..3c87d2808 100644 --- a/workbooks/network_appdelivery_checklist.en_workbook_template.json +++ b/workbooks/network_appdelivery_checklist.en_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\\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\": \"7ccaa132-1ef6-49b1-ae31-00fa9a78d667\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Network Topology and Connectivity\",\n \"subTarget\": \"tab0\",\n \"preText\": \"Network Topology and Connectivity\",\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\": \"## Network Topology and Connectivity\"\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\": 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\": \"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\": 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\": \"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\": 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\": \"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\": 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 \"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\": 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\": \"Deploy your WAF policy for Front Door 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\": \"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\": 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 \"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\": 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 \"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\": 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\": \"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\": 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\": \"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\": 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\": \"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\": 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\": \"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\": 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 },\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}", + "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\\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\": \"b57de63c-233b-4c04-b27f-5da0c8a5ad8b\",\n \"cellValue\": \"VisibleTab\",\n \"linkTarget\": \"parameter\",\n \"linkLabel\": \"Network Topology and Connectivity\",\n \"subTarget\": \"tab0\",\n \"preText\": \"Network Topology and Connectivity\",\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\": \"## Network Topology and Connectivity\"\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\": 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\": \"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\": 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\": \"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\": 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\": \"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\": 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 \"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\": 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\": \"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\": 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 \"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\": 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 \"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\": 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\": \"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\": 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\": \"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\": 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\": \"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\": 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\": \"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\": 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 },\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')]"

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 diff --git a/spreadsheet/macrofree/waf_checklist.ja.xlsx b/spreadsheet/macrofree/waf_checklist.ja.xlsx index f67d15dcb8ae26e447dc18f5982c0fc3f10272bc..f94dbef82dc28f29fdeb0782486591e741524a53 100644 GIT binary patch literal 204812 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