跳转至

任务 阅读约 10 分钟

将 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 租户 开头。

显示 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. 在 第 1 步 中,点击 Ostorlab 多租户应用程序:下载设置文件。您将获得 ostorlab-azure-reader.sh。要使用的参数 区块显示脚本所使用的 Ostorlab 应用程序 ID 和 Ostorlab 租户 ID。
  2. 在 Cloud Shell 中运行:

    SCOPE='/subscriptions/<subscription id>' bash ostorlab-azure-reader.sh
    
  3. 如果租户中尚无 Ostorlab 应用程序,脚本会先进行注册,然后在该范围上为其分配内置的 读者 角色(在 Azure 传播新主体期间会重试),并输出 Tenant id: <您的租户 ID>。请复制该值。

选项 2:带客户端密码的应用注册

如果您希望自己拥有该应用程序,请使用此方式。

  1. 在 第 1 步 中,点击 带客户端密码的应用注册:下载设置文件。您将获得 ostorlab-azure-service-principal.sh。
  2. 以同样的方式运行:

    SCOPE='/subscriptions/<subscription id>' bash ostorlab-azure-service-principal.sh
    
  3. 脚本会创建一个名为 ostorlab-cloud-connector-sub-<subscription id>(或 ostorlab-cloud-connector-mg-<group id>)的应用注册,在该范围上为其分配 读者 角色,并输出 tenant_id、client_id、client_secret 和 scope_id。将它们对应到连接器表单:

    • tenant_id -> 租户 ID
    • client_id -> 客户端 ID
    • client_secret -> 客户端密码
    • scope_id(订阅 GUID 或管理组 ID)-> 订阅 ID 或 管理组 ID
    • 每个范围都有自己的应用程序。对同一范围再次运行脚本会替换客户端密码,因此请用新密码更新连接器。请在密码过期前进行轮换。

Tip

客户端密码会静态加密,并且不会在 Ostorlab 中再次显示。

添加连接器

  1. 在 配置 选项卡的 第 2 步:Azure 连接器 下,点击 添加连接器(或 添加另一个连接器)。

    添加另一个连接器按钮

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

    高亮显示租户 ID 的添加连接器表单

字段 填写内容
名称 组织内唯一的名称,例如 生产 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。

  1. 打开 Inventory > Assets。
  2. 打开搜索面板,进入 Tags 选项卡,将标签名称设为 cloud、值设为 azure,然后点击 Search。

    将 cloud 标签设为 azure 后筛选的资产清单

  3. 要缩小列表范围,可按连接器添加的其他标签筛选:azure:account(订阅 GUID)、azure:region(例如 westeurope,或 global)、azure:resource(Azure 资源 ID)和 azure:connector(连接器 ID)。

单个订阅的资产:IP、主机名和云节点

追踪发现路径

打开某个云节点(例如负载均衡器),可查看其目标、标签、所有者和位置。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 记录。

后续步骤