重要
注意:根据世纪互联发布的公告,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 查询。
创建自定义建议:
登录到 Azure 门户。
转到相关订阅的 Microsoft Defender for Cloud>环境设置>。
选择 “安全策略>+ 创建自定义建议”。
输入详细信息:必需:名称、范围、严重性和安全问题。 可选:说明、修正。
选择下一步。
输入 KQL 查询,或选择“ 打开查询编辑器”。
选择下一步。
选择建议的相关标准。
选择下一步。
选择要分配的自定义标准。
选择“查看并创建”。
查看建议详细信息。
选择创建。
使用查询编辑器
建议使用查询编辑器来创建建议查询。 还可以使用提供的 查询模板和示例 来查看示例查询,并了解如何生成自己的查询。
- 使用编辑器可以帮助你在开始使用查询之前先构建并测试它。
- 选择“操作方法”,以获取有关构建查询的帮助,以及其他说明和链接。
- 编辑器包含内置建议查询示例,可用于帮助生成自己的查询。 数据显示的结构与 API 中相同。
选择 “新建查询”。
使用示例查询模板及其说明,或从页面下半部分选择一个示例内置建议查询以开始使用。
选择“运行查询”,测试已创建的查询。
查询准备就绪后,将其从编辑器剪切并粘贴到 “建议”查询 窗格中。
继续执行“ 创建自定义建议”部分中的步骤 7。
查询模板和示例
查询编辑器包含内置示例,本节中的模板演示如何构建常见的安全检查。 每个模板返回范围中的资源,并将不合规的资源 UNHEALTHY标记为 。 在此模板模式中,仅编辑 condition 表达式,并保持 HealthStatus 行不变。
注意
本部分中的模板使用Azure资源类型。 对于 AWS 和 GCP 资源,请将 Environment == 'Azure' 更改为 Environment == 'AWS' 或 Environment == 'GCP'并更新 Identifiers.Type以匹配环境中的资源类型。
KQL 输出架构要求
在编写查询之前,请先了解所需的输出架构。 这就是Microsoft Defender for Cloud解释结果并将结果映射到资源的方式。
所需的输出列:
| 列 | 类型 | Purpose |
|---|---|---|
Id |
字符串(必需) | Defender for Cloud 用于引用该资源的资源标识符。 |
Name |
字符串(必需) | 在发现中显示的人工可读资源名称。 |
Environment |
字符串(必需) | 云环境:Azure、AWS 或 GCP。 |
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')
其中 HealthStatus 为 UNHEALTHY 的资源会在 Defender for Cloud 中显示为非合规结果。 其中HealthStatus为HEALTHY的资源是合规的,并且不会出现在结果中。
重要
始终将 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 参考。
创建自定义标准
可将自定义建议分配给一个或多个自定义标准。
创建自定义标准:
登录到 Azure 门户。
转到相关订阅的 Microsoft Defender for Cloud>环境设置>。
选择“安全策略”“+创建”>“标准”。>
选择要添加到自定义标准的建议。
(可选)对于Azure订阅,请查看“源”列。
选择创建。
使用 Azure Policy 创建和增强自定义建议(旧版)
对于 Azure 订阅,可以使用 Azure Policy 创建自定义建议和标准并对其进行增强。 这是一项旧功能,建议使用新的自定义建议功能。
创建自定义建议和标准(旧版)
可以通过在Azure Policy中创建策略定义和计划,并在Defender for Cloud中载入自定义建议和标准Defender for Cloud。
若要使用 Azure Policy 创建自定义建议或标准(旧版):
- 在 Azure Policy 门户中创建一个或多个策略定义,或以编程方式创建。
- 创建策略计划,其中包含自定义策略定义。
将该倡议作为自定义标准(旧版)接入
策略分配由 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 查询的详细信息: