在Microsoft Defender for Cloud创建自定义标准和建议

重要

注意:根据世纪互联发布的公告2026 年 8 月 18 日,中国地区的 Azure 中将正式停用所有 Microsoft Defender for Cloud 功能。

Microsoft Defender for Cloud 中的安全建议可帮助你改善并加强安全态势。 建议基于针对为已启用 Defender for Cloud 的 Azure 订阅定义的安全标准的评估。

本文介绍如何进行以下操作:

  • 使用 Kusto 查询语言 (KQL) 查询为Azure创建自定义建议。
  • 将自定义建议分配给自定义安全标准。

开始之前

  • 要创建新的安全标准,需要对订阅具有所有者权限。
  • 需要具有安全管理员权限才能创建自定义建议。
  • 若要基于 Kusto 查询语言(KQL)创建自定义建议,必须启用 Defender 云安全状况管理(CSPM)计划。 所有客户都可以基于 Azure Policy 创建自定义建议。
  • 查看 Azure 云中的支持以获取自定义建议。

创建自定义建议

创建自定义建议,包括修正步骤、严重性,以及应将建议分配到的标准。 使用 KQL 添加建议逻辑。 可以使用一个简单的查询编辑器和内置的查询模板,可以根据需要进行调整,也可以从头开始编写 KQL 查询。

创建自定义建议:

  1. 登录到 Azure 门户

  2. 转到相关订阅的 Microsoft Defender for Cloud>环境设置>。

  3. 选择 “安全策略>+ 创建自定义建议”。

    Microsoft Defender for Cloud 策略页面的屏幕截图,其中突出显示了“创建自定义建议”。

  4. 输入详细信息:必需:名称、范围、严重性和安全问题。 可选:说明、修正。

  5. 选择下一步

  6. 输入 KQL 查询,或选择“ 打开查询编辑器”。

    自定义建议流的屏幕截图,其中包含用于启动 KQL 编辑器的“打开查询编辑器”操作。

  7. 选择下一步

  8. 选择建议的相关标准。

    Microsoft Defender for Cloud 建议详细信息窗格的屏幕截图,显示名称、严重性和已分配标准字段。

  9. 选择下一步

  10. 选择要分配的自定义标准。

  11. 选择“查看并创建”

  12. 查看建议详细信息。

  13. 选择创建

    Microsoft Defender for Cloud“审阅和创建”页面的屏幕截图,显示提交前的建议摘要。

使用查询编辑器

建议使用查询编辑器来创建建议查询。 还可以使用提供的 查询模板和示例 来查看示例查询,并了解如何生成自己的查询。

  • 使用编辑器可以帮助你在开始使用查询之前先构建并测试它。
  • 选择“操作方法”,以获取有关构建查询的帮助,以及其他说明和链接
  • 编辑器包含内置建议查询示例,可用于帮助生成自己的查询。 数据显示的结构与 API 中相同。
  1. 选择 “新建查询”。

    查询编辑器的屏幕截图,其中选择了“新建查询”以开始编写建议查询。

  2. 使用示例查询模板及其说明,或从页面下半部分选择一个示例内置建议查询以开始使用。

  3. 选择“运行查询”,测试已创建的查询

  4. 查询准备就绪后,将其从编辑器剪切并粘贴到 “建议”查询 窗格中。

  5. 继续执行“ 创建自定义建议”部分中的步骤 7。

查询模板和示例

查询编辑器包含内置示例,本节中的模板演示如何构建常见的安全检查。 每个模板返回范围中的资源,并将不合规的资源 UNHEALTHY标记为 。 在此模板模式中,仅编辑 condition 表达式,并保持 HealthStatus 行不变。

注意

本部分中的模板使用Azure资源类型。 对于 AWS 和 GCP 资源,请将 Environment == 'Azure' 更改为 Environment == 'AWS'Environment == 'GCP'并更新 Identifiers.Type以匹配环境中的资源类型。

识别缺少强制治理标记的虚拟机,例如成本中心或所有者信息。

RawEntityMetadata
| where Environment == 'Azure' and Identifiers.Type =~ 'Microsoft.Compute/virtualMachines'
| extend condition = (isnull(Record.tags["CostCenter"]) or isnull(Record.tags["Owner"]))
| extend HealthStatus = iff(condition, 'UNHEALTHY', 'HEALTHY')
| project Id, Name, Environment, Identifiers, AdditionalData, Record, HealthStatus

输出列:Id、、NameEnvironmentIdentifiersAdditionalDataRecordHealthStatus

评估逻辑: 缺少所需标签的机器其 HealthStatus 设置为 UNHEALTHY,并显示为不合规发现。 同时设置了两个标签的计算机已将 HealthStatus 设为 HEALTHY

KQL 输出架构要求

在编写查询之前,请先了解所需的输出架构。 这就是Microsoft Defender for Cloud解释结果并将结果映射到资源的方式。

所需的输出列:

类型 Purpose
Id 字符串(必需) Defender for Cloud 用于引用该资源的资源标识符。
Name 字符串(必需) 在发现中显示的人工可读资源名称。
Environment 字符串(必需) 云环境:AzureAWSGCP
Identifiers 动态(必需) 从源记录传递的资源类型和标识符。
AdditionalData 动态(必需) 从源记录透传而来的补充资源元数据。
Record 动态(必需) 包含所有属性的完整资源记录。
HealthStatus 字符串(必需) 评估结果: UNHEALTHY (不符合)或 HEALTHY (合规)。

始终以:| project Id, Name, Environment, Identifiers, AdditionalData, Record, HealthStatus 结束你的查询。

评估映射:

每个查询必须为每个资源设置一个 HealthStatus 值。 使用 iff() 函数评估条件并分配状态:

| extend condition = (your condition here)
| extend HealthStatus = iff(condition, 'UNHEALTHY', 'HEALTHY')

在这种模式下,仅编辑 condition 表达式。 保持 HealthStatus 这一行不变:

| extend HealthStatus = iff(condition, 'UNHEALTHY', 'HEALTHY')

其中 HealthStatusUNHEALTHY 的资源会在 Defender for Cloud 中显示为非合规结果。 其中HealthStatusHEALTHY的资源是合规的,并且不会出现在结果中。

重要

始终将 HealthStatus 设置为 'UNHEALTHY''HEALTHY' 中的一个。 返回作用域内的所有资源。 Defender for Cloud使用 HealthStatus 列来确定符合性。 省略结果集中的资源被视为无数据,而不是正常。

常见错误和修复:

  • 缺少必需的列: 如果缺少七个必需列中的任何一个,查询将失败。 始终以 | project Id, Name, Environment, Identifiers, AdditionalData, Record, HealthStatus. 结尾。
  • 错误HealthStatus值: 只有 'UNHEALTHY''HEALTHY' 是有效值(区分大小写)。 其他值或 null 会导致分析错误。
  • 属性路径不正确: 属性应通过 Record.properties.* 访问,而不是直接访问。 例如,使用 Record.properties.httpsOnly 而不是 properties.httpsOnly
  • 资源类型区分大小写: 使用 =~(不区分大小写匹配)进行 Identifiers.Type 比较。 例如,Identifiers.Type =~ 'Microsoft.Storage/storageAccounts'
  • 跨订阅的空属性:在配置各异的订阅中测试你的查询。 在属性可能不存在时,使用 isnull() 检查。

大规模使用自定义建议

在Azure门户中创建自定义建议最适合大多数用户。 该接口提供方便的 KQL 编辑器和内置验证工具。 需要跨多个环境或订阅部署建议时,编程方法也很有用。

通过 API 自动执行

如果预先验证了 KQL 查询并想要自动创建自定义建议,则可以使用 Microsoft Defender for Cloud API。 使用此方法,可以快速部署建议,确保它们在整个云环境中保持一致且可缩放。

  • 优势:您可以自动化并扩展自定义建议的部署。
  • 何时使用:此方法非常适合大规模实现,在这种大规模实现中,需要在多个环境中一致地应用建议。

有关使用 API 管理自定义建议的详细信息,请参阅 Defender for Cloud 复合 API 参考

创建自定义标准

可将自定义建议分配给一个或多个自定义标准。

创建自定义标准:

  1. 登录到 Azure 门户

  2. 转到相关订阅的 Microsoft Defender for Cloud>环境设置>。

  3. 选择“安全策略”“+创建”>“标准”。>

  4. 选择要添加到自定义标准的建议。

  5. (可选)对于Azure订阅,请查看“源”列。

    Microsoft Defender for Cloud 中的自定义标准创建页面,显示可供选择的建议列表。

  6. 选择创建

使用 Azure Policy 创建和增强自定义建议(旧版)

对于 Azure 订阅,可以使用 Azure Policy 创建自定义建议和标准并对其进行增强。 这是一项旧功能,建议使用新的自定义建议功能。

创建自定义建议和标准(旧版)

可以通过在Azure Policy中创建策略定义和计划,并在Defender for Cloud中载入自定义建议和标准Defender for Cloud。

若要使用 Azure Policy 创建自定义建议或标准(旧版):

  1. Azure Policy 门户中创建一个或多个策略定义,或以编程方式创建。
  2. 创建策略计划,其中包含自定义策略定义。

将该倡议作为自定义标准(旧版)接入

策略分配由 Azure Policy 用于将 Azure 资源分配到策略或计划。

若要将计划载入到 Defender for Cloud 中的自定义安全标准,需要在请求正文中包含 "ASC":"true",如下所示。 ASC 字段用于将该计划接入 Microsoft Defender for Cloud。

载入自定义计划:

引入自定义项目的示例

PUT https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/policySetDefinitions/{policySetDefinitionName}?api-version=2021-06-01

请求正文(JSON):

{
    "properties": {
      "displayName": "Cost Management",
      "description": "Policies to enforce low cost storage SKUs",
      "metadata": {
        "category": "Cost Management",
        "ASC":"true"
      },
      "parameters": {
        "namePrefix": {
          "type": "String",
          "defaultValue": "myPrefix",
          "metadata": {
            "displayName": "Prefix to enforce on resource names"
          }
        }
      },
      "policyDefinitions": [
        {
          "policyDefinitionId": "/subscriptions/<Subscription ID>/providers/Microsoft.Authorization/policyDefinitions/7433c107-6db4-4ad1-b57a-a76dce0154a1",
          "policyDefinitionReferenceId": "Limit_Skus",
          "parameters": {
            "listOfAllowedSKUs": {
              "value": [
                "Standard_GRS",
                "Standard_LRS"
              ]
            }
          }
        },
        {
          "policyDefinitionId": "/subscriptions/<Subscription ID>/providers/Microsoft.Authorization/policyDefinitions/ResourceNaming",
          "policyDefinitionReferenceId": "Resource_Naming",
          "parameters": {
            "prefix": {
              "value": "[parameters('namePrefix')]"
            },
            "suffix": {
              "value": "-LC"
            }
          }
        }
      ]
    }
  }

有关删除工作分配的示例

此示例演示如何删除分配:

DELETE https://management.chinacloudapi.cn/{subscription}/providers/Microsoft.Authorization/policyAssignments/{policyAssignmentName}?api-version=2018-05-01

改进自定义推荐(旧版)

通过 Microsoft Defender for Cloud 提供的内置建议包括严重性级别和修正说明等详细信息。 如果要将此类型的信息添加到 Azure 的自定义建议中,请使用 REST API。

可添加的两种类型的信息为:

  • RemediationDescription - 字符串
  • Severity - 枚举 [低、中、高]

对于属于自定义计划一部分的策略,应将元数据添加到策略定义中。 它应位于“securityCenter”属性中,如下所示:

{
  "metadata": {
    "securityCenter": {
      "RemediationDescription": "Custom description goes here",
      "Severity": "High"
    }
  }
}

下面是包含 metadata/securityCenter 属性的另一个自定义策略示例:

{
"properties": {
"displayName": "Security - ERvNet - AuditRGLock",
"policyType": "Custom",
"mode": "All",
"description": "Audit required resource groups lock",
"metadata": {
  "securityCenter": {
    "RemediationDescription": "Resource Group locks can be set via Azure Portal -> Resource Group -> Locks",
    "Severity": "High"
 }
},
"parameters": {
  "expressRouteLockLevel": {
    "type": "String",
    "metadata": {
      "displayName": "Lock level",
      "description": "Required lock level for ExpressRoute resource groups."
    },
    "allowedValues": [
      "CanNotDelete",
      "ReadOnly"
    ]
  }
},
"policyRule": {
  "if": {
    "field": "type",
    "equals": "Microsoft.Resources/subscriptions/resourceGroups"
  },
  "then": {
    "effect": "auditIfNotExists",
    "details": {
      "type": "Microsoft.Authorization/locks",
      "existenceCondition": {
        "field": "Microsoft.Authorization/locks/level",
        "equals": "[parameters('expressRouteLockLevel')]"
      }
    }
  }
}
}
}

有关另一个 securityCenter 属性示例,请参阅 评估元数据的 REST API 示例

后续步骤

可使用以下链接了解有关 Kusto 查询的详细信息: