将 Azure 连接到您的资产清单
Azure 连接器会读取您 Azure 订阅中面向互联网的资源,并将其保存在 Ostorlab 资产清单中, 以便您将它们作为攻击面的一部分进行扫描和跟踪。它只需要内置的 读者(Reader)角色。
本页介绍 Azure 云连接器。关于 Azure DevOps CI/CD 集成,请参阅 Azure DevOps。
连接器会收集什么?
连接器会读取 Azure Resource Graph 和 Azure DNS 管理 API。私有地址将被跳过。
| 资源 | 保留的内容 |
|---|---|
| 订阅 | 每个被读取的订阅都会成为一个云节点,作为其他节点的父节点 |
| 公共 IP 地址 | IPv4 和 IPv6 地址,如有 DNS 标签则包含其主机名 |
| 负载均衡器和应用程序网关 | 公共 IP 地址所关联的前端 |
| 虚拟机 | 公共 IP 地址通过其网络接口所关联的机器 |
| Azure DNS | 公共 DNS 区域及其 A、AAAA 和 CNAME 记录(通配符记录将被跳过) |
不会收集数据库、CDN、存储、AKS、Functions 和 Front Door。资源的公共 IP 地址和主机名 会成为普通的 IP 资产和域名资产,平台的其他功能可以对它们进行扫描。
开始之前我需要什么?
- 包含集成功能的 Ostorlab 套餐。 否则 Ostorlab 会返回“Your organisation does not have the necessary permissions to run this integration.”
- 您的 Microsoft Entra 租户 ID,以及要连接的 订阅 或 管理组 的 ID。
- Azure CLI(
az),例如在 Azure Cloud Shell 中,并已登录到拥有该范围的租户。 - 该范围上的所有者或用户访问管理员角色,用于分配读者角色。根据租户设置,向目录添加外部应用程序可能还需要目录管理员角色,例如应用程序管理员。
- 导入资产的 Ostorlab 所有者。 如有需要,请先创建一个。
在 Azure 中设置访问权限
打开 Library > Integrations,选择 云 类别,然后选择 Azure 卡片(而不是 Azure DevOps)。配置选项卡以 第 1 步:准备您的 Azure 租户 开头。

两种方式都是 az 脚本,使用您选择的 SCOPE 运行:
/subscriptions/<subscription id>:针对单个订阅;/providers/Microsoft.Management/managementGroups/<group id>:针对管理组,涵盖其下的所有订阅。
请将 SCOPE 的值放在单引号中,例如 SCOPE='/providers/Microsoft.Management/managementGroups/<group id>':管理组 ID 可以包含括号,不加引号时 shell 会报错。

选项 1:Ostorlab 多租户应用程序(推荐)
Ostorlab 会在您的租户中注册自己的多租户应用程序,并且无需任何密码即可完成身份验证。
- 在 第 1 步 中,点击 Ostorlab 多租户应用程序:下载设置文件。您将获得
ostorlab-azure-reader.sh。要使用的参数 区块显示脚本所使用的 Ostorlab 应用程序 ID 和 Ostorlab 租户 ID。 -
在 Cloud Shell 中运行:
SCOPE='/subscriptions/<subscription id>' bash ostorlab-azure-reader.sh -
如果租户中尚无 Ostorlab 应用程序,脚本会先进行注册,然后在该范围上为其分配内置的 读者 角色(在 Azure 传播新主体期间会重试),并输出
Tenant id: <您的租户 ID>。请复制该值。
选项 2:带客户端密码的应用注册
如果您希望自己拥有该应用程序,请使用此方式。
- 在 第 1 步 中,点击 带客户端密码的应用注册:下载设置文件。您将获得
ostorlab-azure-service-principal.sh。 -
以同样的方式运行:
SCOPE='/subscriptions/<subscription id>' bash ostorlab-azure-service-principal.sh -
脚本会创建一个名为
ostorlab-cloud-connector-sub-<subscription id>(或ostorlab-cloud-connector-mg-<group id>)的应用注册,在该范围上为其分配 读者 角色,并输出tenant_id、client_id、client_secret和scope_id。将它们对应到连接器表单:tenant_id-> 租户 IDclient_id-> 客户端 IDclient_secret-> 客户端密码scope_id(订阅 GUID 或管理组 ID)-> 订阅 ID 或 管理组 ID- 每个范围都有自己的应用程序。对同一范围再次运行脚本会替换客户端密码,因此请用新密码更新连接器。请在密码过期前进行轮换。
Tip
客户端密码会静态加密,并且不会在 Ostorlab 中再次显示。
添加连接器
-
在 配置 选项卡的 第 2 步:Azure 连接器 下,点击 添加连接器(或 添加另一个连接器)。

-
填写表单,然后点击 创建。

| 字段 | 填写内容 |
|---|---|
| 名称 | 组织内唯一的名称,例如 生产 Azure。 |
| 范围 | 订阅 或 管理组。 |
| 订阅 ID 或 管理组 ID | 订阅的 GUID,或管理组的 ID(1 到 90 个字母、数字、连字符、下划线、句点或括号)。将收集管理组下的所有订阅。 |
| 凭据类型 | Ostorlab 多租户应用程序 或 带客户端密码的应用注册。 |
| 租户 ID | Microsoft Entra 租户 GUID,在设置脚本末尾输出。 |
| 客户端 ID 和 客户端密码 | 仅应用注册方式。 |
| 所有者 | 必填。导入的资产将归属于此所有者。 |
| 位置 | 导入资产的可选位置。 |
| 启用 | 计划同步会跳过已停用的连接器。 |
测试连接
在连接器所在行点击 测试连接。测试只会从您的范围读取数据,不会导入任何内容。

将运行四项检查:
| 检查 | 验证内容 |
|---|---|
| 凭据 | Ostorlab 已作为多租户应用程序通过 Microsoft Entra ID 完成身份验证,或已用客户端密码换取令牌,并获得有效令牌。 |
| 权限 | Ostorlab 已在该范围上查询 Resource Graph,并报告可读取的资源数量。 |
| 范围 | 将要读取的订阅。对于管理组,则是其下的所有订阅。无法读取的订阅会在消息中列出。 |
| 示例资源 | Ostorlab 读取该范围内的一个公共 IP 地址。该范围内没有公共 IP 地址时,检查也会通过。 |

同步连接器
每个已启用的连接器每十二小时自动同步一次。要立即导入,请在连接器所在行点击 立即同步。

提示消息会确认作业(同步已开始(作业 ...))。如果连接器已停用,或同一连接器的同步已在运行,则同步会被拒绝。

查看同步运行记录和错误
点击 最近的同步 查看连接器的运行记录。

| 列 | 含义 |
|---|---|
| 状态 | 运行中、成功、部分成功(部分范围失败,其余已导入)或 失败(同步未能完成,例如凭据被拒绝)。 |
| 资源 | 本次运行中发现的资源。 |
| 已创建、已更新 | 新增和变更的资产与节点。已创建数量除节点外,还包括 IP 资产和主机名资产。 |
| 已过期 | 因本次运行中未发现而被连接器标记为 cloud:stale 的资源。 |
| 错误 | 范围错误的数量。点击可列出这些错误。 |
对于管理组,无法读取的订阅算作一个错误(例如“Subscription ... could not be read.”),其他订阅仍会被读取:运行以 部分成功 结束。

Note
从 Azure 中消失的资源,只有在没有任何范围错误的运行之后才会被标记为 cloud:stale。它们永远不会从资产清单中删除。当之后的同步再次发现该资源时,此标签会被移除。
保持 运行中 超过两小时的运行会被视为已停止:它不再阻止新的同步,并会在下一次计划同步时被标记为 失败。
在资产清单中查看资产
导入的资产归属于您选择的所有者和位置。每个资产都带有标签 cloud:azure。
- 打开 Inventory > Assets。
-
打开搜索面板,进入 Tags 选项卡,将标签名称设为
cloud、值设为azure,然后点击 Search。
-
要缩小列表范围,可按连接器添加的其他标签筛选:
azure:account(订阅 GUID)、azure:region(例如westeurope,或global)、azure:resource(Azure 资源 ID)和azure:connector(连接器 ID)。

追踪发现路径
打开某个云节点(例如负载均衡器),可查看其目标、标签、所有者和位置。Discovery Path 卡片显示该节点的来源:Azure 订阅,然后是其父资源。 节点的公共地址和主机名在各自的发现路径中会列出该节点,因此您始终可以知道是哪个订阅的哪个资源暴露了它们。

编辑、暂停或删除连接器
-
编辑 可更改名称、凭据类型、所有者、位置和 启用 开关。已保存的客户端密码留空表示保留,输入新值则表示替换。

-
关闭 启用 可在保留连接器的同时暂停计划同步。
- 删除 会移除连接器:已导入的资产保留在资产清单中,之后的同步将停止。
- 若还要移除 Ostorlab 在 Azure 中的访问权限,请删除该范围上 Ostorlab 应用程序(或您自己的应用注册)的 读者 角色分配;如果不再需要,还可删除应用注册或企业应用程序。
故障排除
| 现象 | 检查内容 |
|---|---|
| 脚本以“SCOPE must be a subscription or a management group, not a nested resource path”停止 | 将 SCOPE 设置为 /subscriptions/<id> 或 /providers/Microsoft.Management/managementGroups/<id>,不要更深的路径。 |
| 脚本提示“Could not assign Reader” | 您需要该范围上的所有者或用户访问管理员角色。授予角色后请重新运行脚本。 |
| 脚本无法添加 Ostorlab 应用程序 | 您的租户限制了外部应用程序。请让目录管理员(例如应用程序管理员)来运行它。 |
| 凭据 检查失败 | 租户 ID 有误、缺少读者角色分配,或(客户端密码方式)密码已过期或被替换。请重新运行脚本并更新连接器。 |
| 权限 检查失败 | 读者角色尚未分配到该范围,或尚未传播。请等待几分钟后再次测试。 |
| 范围 检查列出了“could not be read”的订阅 | 主体在该订阅上没有读者角色。请在管理组或该订阅上分配读者角色。 |
| 与 GUID 有关的表单错误 | 租户 ID、订阅 ID 和客户端 ID 都是 GUID,例如 00000000-0000-0000-0000-000000000000。 |
| “The cloud connector is disabled.” | 在连接器的编辑表单中打开 启用。 |
| “A sync of this cloud connector is already running.” | 等待正在运行的同步完成。 |
| 缺少您期望的资源 | 连接器只保留公共 IP 地址、其负载均衡器、应用程序网关和虚拟机,以及公共 Azure DNS 记录。 |