使用 Azure 策略和计划大规模创建诊断设置

要监视 Azure 资源,需要为每个资源创建诊断设置。 如果具有多个资源,则可能难以管理此资源。 要简化大规模创建和应用诊断设置的过程,请使用 Azure Policy 为新资源和现有资源自动生成诊断设置。

每种 Azure 资源类型都会在诊断设置中列出一组唯一的类别。 因此,每种资源类型都需要单独的策略定义。 某些资源类型具有无需修改便可分配的内置策略定义。 对于其他资源类型,可以创建自定义定义。

Azure Monitor 的内置策略定义

每种资源类型通常具有三个内置策略定义,对应于要将诊断发送到的三个目标:

  • Log Analytics 工作区
  • Azure 存储帐户
  • 事件中心

根据所需的目标为资源类型分配策略。

我们开发了一组基于审核日志类别组的内置策略和计划,只需几个步骤即可帮助你应用诊断设置。

有关 Azure Monitor 内置策略的完整列表,请参阅Azure Monitor 的 Azure Policy 内置定义

自定义策略定义

对于没有内置策略的资源类型,你需要创建自定义策略定义。 可以在 Azure 门户中手动创建新策略,其方法是复制某个现有的内置策略,然后针对资源类型进行修改。 也可以使用 PowerShell 库中的脚本以编程方式创建策略。

脚本 Create-AzDiagPolicy 为可使用 PowerShell 或 Azure CLI 安装的特定资源类型创建策略文件。 使用以下过程可为诊断设置创建自定义策略定义:

  1. 请确保已安装 Azure PowerShell

  2. 使用以下命令安装脚本:

    Install-Script -Name Create-AzDiagPolicy
    
  3. 通过使用参数指定要将日志发送到何处来运行该脚本。 系统会提示你指定订阅和资源类型。

    例如,若要创建将日志发送到 Log Analytics 工作区和事件中心的策略定义,请使用以下命令:

    Create-AzDiagPolicy.ps1 -ExportLA -ExportEH -ExportDir ".\PolicyFiles"  
    

    另外,还可以在命令中指定订阅和资源类型。 例如,若要为 SQL Server 数据库创建将日志发送到 Log Analytics 工作区和事件中心的策略定义,请使用以下命令:

    Create-AzDiagPolicy.ps1 -SubscriptionID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -ResourceType Microsoft.Sql/servers/databases  -ExportLA -ExportEH -ExportDir ".\PolicyFiles"  
    
  4. 此脚本为每个策略定义创建单独的文件夹。 每个文件夹包含名为 azurepolicy.json、azurepolicy.rules.json 和 azurepolicy.parameters.json 的三个文件 。 若要在 Azure 门户中手动创建策略,可以复制并粘贴 azurepolicy.json 的内容,因为它包括整个策略定义。 通过 PowerShell 或 Azure CLI 从命令行使用其他两个文件创建策略定义。

    以下示例演示了如何通过 PowerShell 和 Azure CLI 安装策略定义。 每个示例包括元数据,用于指定一个“监视”类别,以便将新策略定义与内置策略定义分组到一起。

    New-AzPolicyDefinition -name "Deploy Diagnostic Settings for SQL Server database to Log Analytics workspace" -policy .\Apply-Diag-Settings-LA-Microsoft.Sql-servers-databases\azurepolicy.rules.json -parameter .\Apply-Diag-Settings-LA-Microsoft.Sql-servers-databases\azurepolicy.parameters.json -mode All -Metadata '{"category":"Monitoring"}'
    
    az policy definition create --name 'deploy-diag-setting-sql-database--workspace' --display-name 'Deploy Diagnostic Settings for SQL Server database to Log Analytics workspace'  --rules 'Apply-Diag-Settings-LA-Microsoft.Sql-servers-databases\azurepolicy.rules.json' --params 'Apply-Diag-Settings-LA-Microsoft.Sql-servers-databases\azurepolicy.parameters.json' --subscription 'AzureMonitor_Docs' --mode All
    

计划

与为每个策略定义创建分配不同,一种常见的策略是创建一个计划,在其中包括策略定义,以便为每个 Azure 服务创建诊断设置。 根据你管理环境的方式,在计划与管理组、订阅或资源组之间创建分配。 此策略具有以下优势:

  • 为计划创建单个分配,而不是为每个资源类型创建多个分配。 对多个监视组、订阅或资源组使用同一计划。
  • 当需要添加新的资源类型或目标时,只需修改计划即可。 例如,你最初的要求可能是仅将数据发送到 Log Analytics 工作区,但之后想要添加事件中心。 请修改计划,而不要创建新分配。

有关创建计划的详细信息,请参阅创建和分配计划定义。 请考虑以下建议:

  • 将“类别”设置为“监视”,以将其与相关的内置和自定义策略定义分组到一起 。
  • 使用一个通用的计划参数,而不是为计划中包含的策略定义指定 Log Analytics 工作区和事件中心的详细信息。 此参数使你可以轻松地为所有策略定义指定一个通用值,并根据需要更改该值。

Screenshot that shows settings for initiative definition.

分配

根据要监视的资源的范围,将计划分配给 Azure 管理组、订阅或资源组。 管理组可用于限定策略范围,尤其是当你的组织有多个订阅时。

Screenshot of the settings for the Basics tab in the Assign initiative section of the Diagnostic settings to Log Analytics workspace in the Azure portal.

通过使用计划参数,你可以同时为计划中的所有策略定义指定工作区或任何其他详细信息。

Screenshot that shows initiative parameters on the Parameters tab.

补救

该计划将在创建时应用于每台虚拟机。 修正任务将该计划中的策略定义部署到现有资源,因此,你可以为已创建的任何资源创建诊断设置。

使用 Azure 门户创建分配时,可以选择同时创建修正任务。 有关修正的详细信息,请参阅使用 Azure Policy 修正不合规资源

Screenshot that shows initiative remediation for a Log Analytics workspace.

疑难解答

指标类别不受支持

部署诊断设置时,你会收到一条错误消息,类似于“指标类别‘xxxx’不受支持”。 即使以前的部署成功,也可能会收到此错误。

在使用资源管理器模板、REST API、Azure CLI 或 Azure PowerShell 时,会出现此问题。 通过 Azure 门户创建的诊断设置将不受影响,因为只会显示受支持的类别名称。

此问题由对基础 API 的最新更改引起。 除了一些特定 Azure 服务以外,不支持而且也从未支持过除“AllMetrics”以外的指标类别。 过去,部署诊断设置时,将忽略其他类别名称。 Azure Monitor 后端将这些类别重定向到了“AllMetrics”。 从 2021 年 2 月开始,对后端进行了更新,以明确确认提供的指标类别是否准确。 此更改导致一些部署出现失败。

如果收到此错误,请更新部署,将任何指标类别名称替换为“AllMetrics”以解决此问题。 如果部署之前添加了多个类别,则应只保留具有“AllMetrics”引用的类别。 如果仍出现此问题,请通过 Azure 门户联系 Azure 支持。

由于 resourceID 中包含非 ASCII 字符,设置消失

诊断设置不支持包含非 ASCII 字符的 resourceID(例如,Preproducción)。 由于无法重命名 Azure 中的资源,因此创建不包含非 ASCII 字符的新资源将是唯一选项。 如果这些字符在一个资源组中,可以将其下的资源移到新的资源组。 否则,你需要重新创建该资源。

后续步骤