使用 Azure IoT 和 OSConfig 管理主机防火墙

重要

2022 年 6 月 28 日发布的版本 1.0.3) (包括对可能影响现有用户的成员名称的重大更改。 有关详细信息,请参阅: 成员名称在版本 1.0.3 中从 PascalCase 转换为 camelCase

目标受众

本文旨在支持使用 Azure IoT 预配或管理设备 的人员。 如果这听起来不像你,请考虑查看 OSConfig 的受众文档

防火墙概述

安装 OSConfig 后,可以使用 Azure IoT 服务执行多个基本的防火墙管理任务。 例如:

  • 检查防火墙是否 处于活动状态
  • 确保存在某些 规则 , (创建(如果不存在) )
  • 确保在找到) 时删除某些规则 不存在 (
  • 许多已部署设备的规则与已知良好的设备进行比较
  • 为入站和出站流量设置默认流量策略

防火墙图标

提示

如果此处提供了对象模型引用,则可以跳过“参考”信息的用例示例

用例示例

这些示例可用作适应独特环境的起点。

每个示例包括用于在Azure 门户中工作的步骤和屏幕截图,以及用于使用 Azure CLI 的 bash。

每个示例还包括一个设备 (的变体,例如故障排除方案) ,或许多设备 (,例如配置预配或报告方案) 。

预期内容

在单个设备说明中,你将直接在设备的 OSConfig 孪生中读取和写入报告和所需属性。 在大规模指令中,你将使用IoT 中心配置 (也称为自动设备管理或 ADM) 将所需属性推送到多个孪生体,并使用IoT 中心查询 (独立使用,或者将配置附加到配置作为指标) 来观察来自设备的结果。

在实时系统上尝试示例的先决条件

如果使用本文进行参考,则无需先决条件。 可以查看示例、复制属性名称等。

若要尝试实时系统上的示例 (建议) ,请执行以下步骤:

  1. 创建 免费的 Azure 帐户 或使用现有帐户

  2. 将至少一台已启用 OSConfig 的设备连接到IoT 中心

    提示

    若要使用附加 (虚拟) 设备轻松创建IoT 中心,请参阅在 5 分钟内使用 Azure IoT) 实验室环境创建 OSConfig (

  3. 准备好按照示例中的Azure 门户说明或 Azure CLI 说明进行操作:

如果希望使用Azure 门户

  1. 登录到Azure 门户并访问IoT 中心的“概述”页屏幕截图,其中显示了来自 Azure 门户的IoT 中心和设备

-OR - 如果希望使用 Azure CLI

  1. 建议:通过登录到 Azure 门户将 Azure Cloud Shell用作 bash 环境,然后在 bash 模式屏幕捕获中启动 Azure Cloud Shell,从 Azure 门户打开Cloud Shell
  2. 可选:如果想要使用自己的 bash 环境而不是Cloud Shell,请安装 Azure CLI 并登录
  3. 通过运行确保 Azure IoT 扩展准备就绪 az extension add --name azure-iot

示例 A.主机防火墙是否处于活动状态?

state下面的properties.reported.Firewall属性指示主机防火墙是否处于活动状态。 例如,它指示主机防火墙引擎是否已启用,并且 筛选器 表中至少有一个规则存在。 有关包括可能值的详细信息 state ,请参阅: 参考信息

  1. 在IoT 中心的门户页中,选择左侧导航中的设备。 如果除了 OSConfig 之外,设备还IoT Edge安装,请选择IoT Edge而不是设备

  2. 单击安装了 OSConfig 的设备。

  3. “模块标识 ”下,单击 osconfig

  4. 单击 “模块标识孪生 ”,浏览 JSON 到 properties.reported.Firewall.state。 在以下屏幕截图示例中,可以看到 state: enabled

    显示如何使用门户检查特定设备的防火墙状态的屏幕截图

示例 B. 创建防火墙规则

此示例使用 desiredRules 防火墙模块的函数。 我们创建了一个新规则,允许从设备到子网 10.9.9.0/24 的出站 tcp 端口 443 流量。

有关 (的详细信息 desiredRules ,包括处理多个规则和规则删除) 请参阅本文后面的 防火墙 desiredRules 参考

  1. 在设备的 osconfig 模块孪生中使用 Azure 门户, properties.desired 添加或修改一个 FirewalldesiredRules 节点,如下所示。 根据 JSON 标准,可能需要在末尾添加逗号以与其他所需属性集成(如果存在)。

    "Firewall": {
       "desiredRules": [
          {
             "desiredState": "present",
             "action": "accept",
             "direction": "out",
             "protocol": "tcp",
             "destinationAddress": "10.9.9.0/24",
             "destinationPort": 443
          }
       ]
    }
    

    显示如何使用门户为单个设备配置防火墙规则的屏幕截图

  2. 大约 30 秒后,可以验证是否已从模块孪生本身成功进行更改。 刷新模块孪生视图,然后滚动查找properties,然后reported,然后FirewallconfigurationStatusstate以及desiredRules

    显示如何使用门户读取单个设备的防火墙配置的报告属性的屏幕截图

示例 C.将许多设备的防火墙状态指纹与已知良好的设备进行比较

fingerprint 属性支持快速比较以大规模检查符合性。 无需从所有设备检索所有规则,然后实现多对多比较策略。 只需检查指纹是否与预期相互匹配的设备相同。 例如,可以在已部署的设备与已知良好的参考设备之间进行比较。

在单设备示例中,我们只需检索该值,这意味着你正在执行带外比较。 在大规模示例中,我们将使用 IoT 中心 Query 的 GROUP BY 运算符来显示车队的通用性或分歧。

不适用,请参阅 Azure 门户,大规模。

参考信息

对象模型说明

本部分介绍孪生属性和相应的行为。

提示

OSConfig 参考文档适用于具有或不使用数字孪生定义语言的工具, (DTDL) 数据模型的增强视角。 有关详细信息,请参阅: 关于普通所需/报告视图和 DTDL 增强视图

用于报告和审核方案的防火墙报告/只读属性 ()
  • 路径properties.reported.Firewall (Firewall 组件、只读属性)

  • 说明:OSConfig 的防火墙模块检测到的主机防火墙的状态

  • 成员

    名称 类型 说明
    configurationStatus 字符串枚举 表示达到所需配置的失败/成功状态。 仅当所需的配置属性(如 desiredRulesdesiredDefaultPolicies 已设置)时才有意义。 在撰写本文时可能的值是 successfailure以及 unknown
    configurationStatusDetail 字符串 基础 API 或工具(如 iptable)返回的文本。 旨在提供对错误输入参数等的第一级见解,而无需通过诊断日志进行组合。
    defaultPolicies (对象数组,请参阅示例有效负载) 表示防火墙的默认数据包交接,这些数据包不符合任何特定规则。 在 iptable 的上下文中,这映射到筛选器表的输入和输出链的链策略。 在其他防火墙引擎中,这将根据需要映射到防火墙引擎行为。 例如,某些防火墙引擎没有明确的策略概念,并且本质上会删除不符合任何规则的流量。
    指纹 字符串 • 设备上所有防火墙规则列表的不透明指纹
    • 用于将大量设备与已知良好的设备进行比较
    注意:在 2022 年 10 月版本之前的 OSConfig 版本中,此属性称为“firewallFingerprint”
    state 字符串枚举 主机防火墙的高级状态。 可能的值为:
    unknown
    enabled
    disabled
    其逻辑 enabled 是检测到活动防火墙引擎,并在 FILTER 表中至少有一个规则。
    注意:在 2022 年 10 月版本之前的 OSConfig 版本中,此信息显示为“firewallState” (而不是“state”) ,值是整数 (而不是字符串) 。
  • ) 孪生properties.reported部分所示的示例有效负载 (

    "Firewall": {
        "configurationStatus": "success",
        "configurationStatusDetail": "",
        "defaultPolicies": [
           {
              "direction": "in",
              "action": "accept"
           },
           {
              "direction": "out",
              "action": "accept"
           }
        ],
        "fingerprint": "c30d8b8bf5327a8a325a686e0c4bbf73b1bd33a72779af88827e8ea256caddb2",
        "state": "enabled"
    }
    
防火墙 desiredRules

注意

与任何防火墙管理一样,在阻止流量时要小心。 你有权阻止设备继续与IoT 中心或其他管理通道的连接。 在这种情况下,可能需要对设备进行本地访问才能恢复。

  • 路径properties.desired.Firewall.desiredRules (Firewall 组件、 desiredRules 可写属性)

  • 说明:规则描述符的有序列表。 列表中的每个规则描述符可以包含以下成员。

  • 每个规则描述符的成员

    名称 类型 说明
    desiredState 字符串枚举 始终是必需的。 可能的值 present (意味着,如果匹配规则尚不存在) ,则应创建此类规则,或者 absent (表示应删除与此描述符匹配的设备上的任何现有规则(如果找到)。 对于设备中不存在匹配规则的规则描述符 desiredState: "present" ,新规则将添加到设备上的规则列表顶部。 对于上下文,可以将这视为类似于 iptables -Iiptables -A。 如果存在desiredRules多个desiredState: "present"规则描述符,则会添加这些描述符,以便保留顺序。 换句话说,顶部规则 desiredRules 位于设备上的规则列表顶部,下一个规则 desiredRules 将遵循设备上的规则列表中,依此而行。
    action 字符串枚举 始终是必需的。 可能的值为 acceptdropreject
    direction 字符串枚举 始终是必需的。 可能的值为 inout
    protocol 字符串枚举 始终是必需的。 可能的值为 anyudptcpicmp。 请注意, any 表示任何流量 (,而不是表示“tcp 和 udp,而不是其他 IP 协议) 。 因此, protocol: "any" 不得包含 sourcePortdestinationPort
    sourceAddress 字符串 IP 地址或 CIDR 范围。 如果未指定,则生成的规则将匹配任何地址
    sourcePort integer 与以下位置 protocol: tcp 的规则 protocol:udp相关: 不得包含在其他规则中。 指定在相关规则中包含的端口号。 如果未包含,则指示应与任何端口号匹配的规则。
    destinationAddress 字符串 IP 地址或 CIDR 范围。 如果未指定,生成的规则将匹配任何地址
    destinationPort integer 与以下位置 protocol: tcp 的规则 protocol:udp相关: 不得包含在其他规则中。 指定在相关规则中包含的端口号。 如果未包含,则指示应与任何端口号匹配的规则。

) 孪生properties.desired部分所示的示例有效负载 (

以下规则表示以下管理员意图:

  1. “我的本地管理员子网为 10.9.9.0/24,因此我希望设备允许从那里传入端口 22 (SSH) ”

  2. “我的旧管理员子网为 10.24.24.0/24,因此,如果任何设备仍有允许从那里删除端口 22 (SSH) 的规则,我希望删除此类规则”

  3. 注意:管理员可能希望此处的第三个规则阻止 SSH 从任何位置 (上述例外) ,但在本示例中,我们将使用默认删除策略,使此类规则冗余。 desiredDefaultPolicies请参阅本文档后面的示例。

    "Firewall": {
       "desiredRules": [
          {
             "desiredState": "present",
             "action": "accept",
             "direction": "in",
             "protocol": "tcp",
             "sourceAddress": "10.9.9.0/24",
             "destinationPort": 22
          },
          {
             "desiredState": "absent",
             "action": "accept",
             "direction": "in",
             "protocol": "tcp",
             "sourceAddress": "10.24.24.0/24",
             "destinationPort": 22
          }
       ]
    }
    

请注意,当管理工作流设置properties.desired.Firewall.desiredRules (组件时,desiredRules从 DTDL 角度) Firewall可写属性时,设备会通过向其中添加属性desiredRules来确认收到相同的属性properties.reported.Firewall。 该属性的值包括原始 desiredRules 有效负载的副本以及版本号和状态代码。 基于IoT 中心的管理工作流可用于确定所需状态是否已到达设备。 这只是确认。 若要确定设备是否已成功达到所需状态,另请参阅并查看configurationStatusconfigurationStatusDetail

防火墙 desiredDefaultPolicies

注意

与任何防火墙管理一样,在阻止流量时要小心。 你有权阻止设备继续与IoT 中心或其他管理通道的连接。 在这种情况下,可能需要对设备进行本地访问才能恢复。

默认策略需要特别小心的应用程序。 例如,在基于 iptable 的系统上,策略分别应用于每个数据包,而无需考虑现有连接。 换句话说,除了阻止新的入站连接) 阻止来自远程系统的响应之外,入站默认策略 drop 还将 (。 这使得设备不可能使用需要双向数据包流的 TCP) 等协议 (进行出站通信。 请勿在未首先确保存在特定规则的情况下在或out策略上in设置为actiondrop启用这两个方向上所需的所有数据包。

  • 路径properties.desired.Firewall.desiredDefaultPolicies (Firewall 组件、 desiredDefaultPolicies 可写属性)

  • 说明:包含两个项目的数组,描述入站流量和出站流量 (接受或删除所需的默认行为) 。

  • 每个项的成员

    名称 类型 说明
    direction 字符串枚举 可能的值为 inout
    action 字符串枚举 始终是必需的。 可能的值为 acceptdrop

) 孪生properties.desired部分所示的示例有效负载 (

"Firewall": {
   "desiredDefaultPolicies": [
      {"direction": "in", "action": "drop"},
      {"direction": "out", "action": "accept"}
   ]
}

请注意,当管理工作流设置properties.desired.Firewall.desiredDefaultPolicies (组件时,desiredDefaultPolicies从 DTDL 角度) Firewall可写属性时,设备将通过向其中添加desiredDefaultPolicies属性确认收到相同的属性properties.reported.Firewall。 该属性的值包括原始有效负载的副本以及版本号和状态代码。 基于IoT 中心的管理工作流可以使用此工作流来确定所需状态是否已到达设备。 这只是回执和处理的确认。 有关达到所需状态的成功或失败的详细信息,请参阅 configurationStatusconfigurationStatusDetail

其他信息和常见问题解答

“替换所有内容”用例怎么样?

在某些情况下,管理员可能希望对设备的防火墙规则网络列表施加绝对控制。 想象一种意图,例如,“只有规则 X、Y 和 Z 应存在:应定期删除其他进程 (设备上预先存在的或随时间推移创建的任何其他规则) 。目前,OSConfig 防火墙模块不直接提供此用例。 删除特定规则可以通过和"desiredState": "absent"完成desiredRules,但没有明确的全部替换功能。 如果要添加此类功能,请参阅扩展性文档。https://github.com/Azure/azure-osconfig

后续步骤

有关 OSConfig 方案和功能的概述,请参阅:

有关特定实际示例,请参阅: