Detect - AWS IoT
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Detect

借助 AWS IoT Device Defender Detect,您可以监控设备的行为,以识别可能表明设备遭到危害的异常行为。使用云端指标(来自 AWS IoT)和设备端指标(来自您在设备上安装的代理)的组合,您可以检测到:

  • 连接模式的变化。

  • 与未经授权或无法识别的终端节点通信的设备。

  • 入站和出站设备流量模式的变化。

您可以创建安全配置文件(其中包含设备预期行为的定义),并将它们分配到队列中的一组设备或所有设备。AWS IoT Device Defender Detect 使用这些安全配置文件来检测异常,并通过 Amazon CloudWatch 指标和 Amazon Simple Notification Service 通知发送提醒。

AWS IoT Device Defender Detect 能够检测相连设备中频繁出现的安全问题:

  • 从设备到已知恶意 IP 地址,或表示潜在恶意命令和控制渠道的未经授权终端节点的流量。

  • 表明设备正在参与 DDoS 攻击的恶意流量,例如出站流量高峰。

  • 其远程管理接口和端口支持远程访问的设备。

  • 发送到您账户的消息速率激增 (例如,来自可能导致过量按每条消息收费的流氓设备)。

使用案例:

评估攻击面

可以使用 AWS IoT Device Defender Detect 评估设备的攻击面。例如,可以识别服务端口通常成为攻击活动目标的设备(在端口 23/2323 上运行的 telnet 服务,在端口 22 上运行的 SSH 服务,在端口 80/443/8080/8081 上运行的 HTTP/S 服务)。虽然在设备上使用这些服务端口可能有合法的原因,但是它们也通常是敌人攻击面的一部分,并且具有相关风险。在 AWS IoT Device Defender Detect 向您发出攻击面提醒后,您可以将攻击面降至最低(通过消除未使用的网络服务),或运行其他评估来识别安全漏洞(例如,使用常见、默认或弱密码配置的 telnet)。

检测设备行为异常以及可能的安全根本原因

您可以使用 AWS IoT Device Defender Detect 提醒您可能表明安全违规的意外设备行为指标(开放端口数量、连接数量、意外开放端口、与意外 IP 地址的连接)。例如,TCP 连接数量高于预期,可能表明设备正被用于 DDoS 攻击。侦听的端口不是预计的端口,可能表明设备上安装了用以进行远程控制的后门。您可以使用 AWS IoT Device Defender Detect 探测设备队列的运行状况,并验证安全假设(例如,没有设备在侦听端口 23 或 2323)。

您可以启用基于机器学习 (ML) 的威胁检测,以自动识别潜在威胁。

检测配置错误的设备

从设备发送到账户的信息数量或大小激增,可能表明设备配置错误。此类设备可能会增加每条消息的费用。同样,如果设备多次授权失败,则可能要求重新配置策略。

概念

指标

AWS IoT Device Defender Detect 使用指标来检测异常行为。AWS IoT Device Defender Detect 将指标的报告值与您提供的预期值进行比较。这些指标可以从两个来源获取:云端指标和设备端指标。

使用云端指标(例如,授权失败次数、设备通过 AWS IoT 发送或接收的消息数量或大小)检测 AWS IoT 网络中的异常行为。

AWS IoT Device Defender Detect 也可以收集、聚合和监控 AWS IoT 设备生成的指标数据(例如,设备侦听的端口、发送的字节或数据包数量,或设备的 TCP 连接)。

可以只将 AWS IoT Device Defender Detect 与云端指标相结合使用。要使用设备端指标,必须首先在连接 AWS IoT 的设备或设备网关上部署 AWS IoT 开发工具包,以收集指标并发送到 AWS IoT。请参阅从设备发送指标

维度

您可以定义维度以调整行为的作用域。例如,您可以定义一个主题筛选条件维度,该维度将行为应用于与模式匹配的 MQTT 主题。有关定义要在安全配置文件中使用的维度的信息,请参阅 CreateDimension

安全配置文件

安全配置文件为账户中的一组设备(事物组)或所有设备定义异常行为,并指定在检测到异常时要执行的操作。可以使用 AWS IoT 控制台或 API 命令创建安全配置文件,并将其与一组设备关联。AWS IoT Device Defender Detect 开始记录安全相关数据,并使用安全配置文件中定义的行为检测设备行为中的异常情况。

行为

行为告诉 AWS IoT Device Defender Detect 如何识别设备是否发生异常。每个行为由名称、指标、运算符、值或统计阈值组成。对于某些指标,时间段 (durationSeconds) 也是必需的。任何设备操作与定义的行为语句不匹配时,均会触发提醒。

提醒

检测到异常时,系统会通过 CloudWatch 指标(请参阅使用 AWS IoT 指标)或 SNS 通知发送提醒通知。AWS IoT 控制台中也会显示提醒通知,以及提醒的相关信息和设备提醒历史记录。当监控的设备不再表现出异常行为,或者已经触发提醒但在较长时间内停止报告时,系统也会发送提醒。

行为

安全配置文件包含一组行为。每个行为都包含一个指标,用于指定账户中的一组设备或所有设备的正常行为。请参阅 指标CreateSecurityProfile

下面描述了 behavior 定义中使用的一些字段:

name

行为的名称。

metric

所用指标的名称(即行为评估的对象)。

dimension

您可以定义维度以调整行为的作用域。例如,您可以定义一个主题筛选条件维度,该维度将行为应用于与模式匹配的 MQTT 主题。要定义要在安全配置文件中使用的维度,请参阅 CreateDimension

criteria

确定设备与 metric 相关的行为是否正常的标准。

comparisonOperator

将评估的事物 (metric) 与标准(valuestatisticalThreshold)关联在一起的运算符。

可能的值为:“less-than”、“less-than-equals”、“greater-than”、“greater-than-equals”、“in-cidr-set”、“not-in-cidr-set”、“in-port-set”和“not-in-port-set”。并非所有运算符对于每个指标都是有效的。针对 CIDR 集和端口的运算符仅用于与此类实体有关的指标。

value

metric 进行比较的值。根据不同的指标类型,应当包含 count(一个值)、ports(CIDR 列表)或 cidrs(端口列表)。

statisticalThreshold

作为行为违规判断依据的统计阈值。此字段包含一个 statistic 字段,后者具有以下可能的值:“p0”、“p0.1”、“p0.01”、“p1”、“p10”、“p50”、“p90”、“p99”、“p99.9”、“p99.99”或“p100”。

statistic 表示一个百分位数。它解析为用于确定符合行为的值。在指定持续时间 (durationSeconds) 内从与此安全配置文件关联的所有报告设备收集指标一次或多次,并根据该数据计算百分位数。之后,收集设备的测量值并在相同的持续时间内累积。如果设备的结果值高于或低于 (comparisonOperator) 与指定百分位数关联的值,则认为设备与行为相符。否则,该设备违反了该行为。

百分位数表示所有考虑的测量值中低于相关值的百分比。例如,如果与“p90”(第 90 个百分位数)相关的值是 123,则 90% 的测量值都低于 123。

durationSeconds

使用此参数为具有时间维度的条件(例如,NUM_MESSAGES_SENT)指定评估行为的时间段。对于 statisticalThreshhold 指标比较,这是一个时间段,期间将收集所有设备的测量值以确定 statisticalThreshold 值,然后为每个设备确定其行为在比较中的排名方式。

consecutiveDatapointsToAlarm

如果设备在指定数量的连续数据点违反了行为,则会发出警报。如果未指定,默认值为 1。(这与 AWS IoT 控制台不同,后者在默认情况下会显示值 3,但可以进行覆盖。)

consecutiveDatapointsToClear

如果发出提醒后,违规设备不再违反指定数量的连续数据点的行为,则警报将被解除。如果未指定,默认值为 1。(这与 AWS IoT 控制台不同,后者在默认情况下会显示值 3,但可以进行覆盖。)

指标

aws:message-byte-size

消息中的字节数。

More info (1)

使用此指标指定从设备传输到 AWS IoT 的每条消息的最大或最小大小(以字节为单位)。

来源:云端

运算符:less-than | less-than-equals | greater-than | greater-than-equals

值:非负整数

单位:字节

{ "name": "Max Message Size", "metric": "aws:message-byte-size", "criteria": { "comparisonOperator": "less-than", "value": { "count": 1024 }, "consecutiveDatapointsToAlarm": 3, "consecutiveDatapointsToClear": 3 } }

例 使用 statisticalThreshold 的示例

{ "name": "Large Message Size", "metric": "aws:message-byte-size", "criteria": { "comparisonOperator": "less-than", "statisticalThreshold": { "statistic": "p90" }, "durationSeconds": 300, "consecutiveDatapointsToAlarm": 3, "consecutiveDatapointsToClear": 3 } }

如果设备在连续 3 个 5 分钟时段内,传输的消息累积大小超过针对该安全配置文件行为报告的所有其他设备累积大小的 90%,则会发出警报。

 

aws:num-messages-received/aws:num-messages-sent

设备在给定时间段内接收或发送的消息数量。

More info (2)

使用此指标指定给定时间段内 AWS IoT 与各个设备之间可发送或接收的最大或最小消息数量。

来源:云端

运算符:less-than | less-than-equals | greater-than | greater-than-equals

值:非负整数

单位:消息

持续时间:非负整数,有效值为 300、600、900、1800 或 3600 秒

{ "name": "Out bound message count", "metric": "aws:num-messages-sent", "criteria": { "comparisonOperator": "less-than", "value": { "count": 50 }, "durationSeconds": 300, "consecutiveDatapointsToAlarm": 2, "consecutiveDatapointsToClear": 2 } }

例 使用 statisticalThreshold 的示例

{ "name": "Out bound message rate", "metric": "aws:num-messages-sent", "criteria": { "comparisonOperator": "less-than", "statisticalThreshold": { "statistic": "p99" }, "durationSeconds": 300, "consecutiveDatapointsToAlarm": 2, "consecutiveDatapointsToClear": 2 } }

 

aws:all-bytes-out

给定时间段内从设备发出的出站字节数量。

More info (3)

使用此指标指定给定时间段内设备应该发送的最大或最小出站流量(以字节为单位)。

来源:设备端

运算符:less-than | less-than-equals | greater-than | greater-than-equals

值:非负整数

单位:字节

持续时间:非负整数,有效值为 300、600、900、1800 或 3600 秒

{ "name": "TCP outbound traffic", "metric": "aws:all-bytes-out", "criteria": { "comparisonOperator": "less-than", "value": { "count": 4096 }, "durationSeconds": 300, "consecutiveDatapointsToAlarm": 5, "consecutiveDatapointsToClear": 4 } }

例 使用 statisticalThreshold 的示例

{ "name": "TCP outbound traffic", "metric": "aws:all-bytes-out", "criteria": { "comparisonOperator": "less-than", "statisticalThreshold": { "statistic": "p50" }, "durationSeconds": 900, "consecutiveDatapointsToAlarm": 5, "consecutiveDatapointsToClear": 4 } }

 

aws:all-bytes-in

给定时间段内发往设备的入站字节数量。

More info (4)

使用此指标指定给定时间段内设备应该接收的最大或最小入站流量(以字节为单位)。

来源:设备端

运算符:less-than | less-than-equals | greater-than | greater-than-equals

值:非负整数

单位:字节

持续时间:非负整数,有效值为 300、600、900、1800 或 3600 秒

{ "name": "TCP inbound traffic", "metric": "aws:all-bytes-in", "criteria": { "comparisonOperator": "less-than", "value": { "count": 4096 }, "durationSeconds": 300, "consecutiveDatapointsToAlarm": 1, "consecutiveDatapointsToClear": 3 } }

例 使用 statisticalThreshold 的示例

{ "name": "TCP inbound traffic", "metric": "aws:all-bytes-in", "criteria": { "comparisonOperator": "less-than", "statisticalThreshold": { "statistic": "p90" }, "durationSeconds": 300, "consecutiveDatapointsToAlarm": 1, "consecutiveDatapointsToClear": 3 } }

 

aws:all-packets-out

给定时间段内从设备发出的出站数据包数量。

More info (5)

使用此指标指定给定时间段内设备应该发送的最大或最小出站总流量。

来源:设备端

运算符:less-than | less-than-equals | greater-than | greater-than-equals

值:非负整数

单位:数据包

持续时间:非负整数。有效值为 300、600、900、1800 或 3600 秒。

{ "name": "TCP outbound traffic", "metric": "aws:all-packets-out", "criteria": { "comparisonOperator": "less-than", "value": { "count": 100 }, "durationSeconds": 300, "consecutiveDatapointsToAlarm": 1, "consecutiveDatapointsToClear": 3 } }

例 使用 statisticalThreshold 的示例

{ "name": "TCP outbound traffic", "metric": "aws:all-packets-out", "criteria": { "comparisonOperator": "less-than", "statisticalThreshold": { "statistic": "p90" }, "durationSeconds": 300, "consecutiveDatapointsToAlarm": 1, "consecutiveDatapointsToClear": 3 } }

 

aws:all-packets-in

给定时间段内发往设备的入站数据包数量。

More info (6)

使用此指标指定给定时间段内设备应该接收的最大或最小入站总流量。

来源:设备端

运算符:less-than | less-than-equals | greater-than | greater-than-equals

值:非负整数

单位:数据包

持续时间:非负整数。有效值为 300、600、900、1800 或 3600 秒。

{ "name": "TCP inbound traffic", "metric": "aws:all-packets-in", "criteria": { "comparisonOperator": "less-than", "value": { "count": 100 }, "durationSeconds": 300, "consecutiveDatapointsToAlarm": 2, "consecutiveDatapointsToClear": 1 } }

使用 statisticalThreshold 的示例

{ "name": "TCP inbound traffic", "metric": "aws:all-packets-in", "criteria": { "comparisonOperator": "less-than", "statisticalThreshold": { "statistic": "p90" }, "durationSeconds": 300, "consecutiveDatapointsToAlarm": 2, "consecutiveDatapointsToClear": 1 } }

 

aws:num-authorization-failures

给定时间段内授权失败次数。

More info (7)

使用此指标指定给定时间段内每个设备允许的最大授权失败次数。如果从设备发往 AWS IoT 的请求遭到拒绝(例如,设备试图发布到某个主题,但没有足够的权限),则会发生授权失败。

来源:云端

单位:失败次数

运算符:less-than | less-than-equals | greater-than | greater-than-equals

值:非负整数

单位:失败次数

持续时间:非负整数。有效值为 300、600、900、1800 或 3600 秒。

{ "name": "Authorization Failures", "metric": "aws:num-authorization-failures", "criteria": { "comparisonOperator": "less-than", "value": { "count": 5 }, "durationSeconds": 300, "consecutiveDatapointsToAlarm": 2, "consecutiveDatapointsToClear": 1 } }

例 使用 statisticalThreshold 的示例

{ "name": "Authorization Failures", "metric": "aws:num-authorization-failures", "criteria": { "comparisonOperator": "less-than", "statisticalThreshold": { "statistic": "p50" }, "durationSeconds": 300, "consecutiveDatapointsToAlarm": 2, "consecutiveDatapointsToClear": 1 } }

 

aws:source-ip-address

设备连接到 AWS IoT 的 IP 地址。

More info (8)

使用此指标指定一组允许(以前称为列入白名单)或拒绝(以前称为列入黑名单)的 CIDR,每个设备必须或不得通过它们连接到 AWS IoT。

来源:云端

运算符:in-cidr-set | not-in-cidr-set

值:CIDR 列表

单位:n/a

{ "name": "Denied source IPs", "metric": "aws:source-ip-address", "criteria": { "comparisonOperator": "not-in-cidr-set", "value": { "cidrs": [ "12.8.0.0/16", "15.102.16.0/24" ] } } }

 

aws:destination-ip-addresses

一组目标 IP 地址。

More info (9)

使用此指标指定一组允许(以前称为列入白名单)或拒绝(以前称为列入黑名单)的 CIDR,每个设备必须或不得通过它们进行通信。

来源:设备端

运算符:in-cidr-set | not-in-cidr-set

值:CIDR 列表

单位:n/a

示例:

{ "name": "Denied destination IPs", "metric": "aws:destination-ip-addresses", "criteria": { "comparisonOperator": "not-in-cidr-set", "value": { "cidrs": [ "12.8.0.0/16", "15.102.16.0/24" ] } } }

 

aws:listening-tcp-ports / aws:listening-udp-ports

设备正在侦听的 TCP 或 UDP 端口。

More info (10)

使用此指标指定一组允许(以前称为列入白名单)或拒绝(以前称为列入黑名单)的 TCP/UDP 端口,每个设备必须或不得通过它们进行侦听。

来源:设备端

运算符:in-port-set | not-in-port-set

值:端口列表

单位:n/a

示例:

{ "name": "Listening TCP Ports", "metric": "aws:listening-tcp-ports", "criteria": { "comparisonOperator": "in-port-set", "value": { "ports": [ 443, 80 ] } } }

 

aws:num-listening-tcp-ports / aws:num-listening-udp-ports

设备正在侦听的 TCP 或 UDP 端口数量。

More info (11)

使用此指标指定每个设备应该侦听的最大或最小 TCP 或 UDP 端口数量。

来源:设备端

运算符:less-than | less-than-equals | greater-than | greater-than-equals

值:非负整数

单位:端口

示例:

例 使用 statisticalThreshold 的示例

{ "name": "Max TCP Ports", "metric": "aws:num-listening-tcp-ports", "criteria": { "comparisonOperator": "less-than-equals", "statisticalThreshold": { "statistic": "p90" }, "durationSeconds": 300, "consecutiveDatapointsToAlarm": 2, "consecutiveDatapointsToClear": 1 } }

 

aws:num-established-tcp-connections

设备的 TCP 连接数。

More info (12)

使用此指标指定每个设备应该具有的最大或最小活动 TCP 连接数量。(所有 TCP 状态)

来源:设备端

运算符:less-than | less-than-equals | greater-than | greater-than-equals

值:非负整数

单位:连接

{ "name": "TCP Connection Count", "metric": "aws:num-established-tcp-connections", "criteria": { "comparisonOperator": "less-than", "value": { "count": 3 }, "consecutiveDatapointsToAlarm": 3, "consecutiveDatapointsToClear": 3 } }

例 使用 statisticalThreshold 的示例

{ "name": "TCP Connection Count", "metric": "aws:num-established-tcp-connections", "criteria": { "comparisonOperator": "less-than", "statisticalThreshold": { "statistic": "p90" }, "durationSeconds": 900, "consecutiveDatapointsToAlarm": 3, "consecutiveDatapointsToClear": 3 } }

 

aws:num-connection-attempts

设备在给定时间段内尝试建立连接的次数。

More info (13)

使用此指标指定每个设备尝试建立连接的最大或最小次数。成功和失败的尝试都会计算在内。

来源:云端

运算符:less-than | less-than-equals | greater-than | greater-than-equals

值:非负整数

单位:连接尝试次数

持续时间:非负整数。有效值为 300、600、900、1800 或 3600 秒。

{ "name": "Connection Attempts", "metric": "aws:num-connection-attempts", "criteria": { "comparisonOperator": "greater-than", "value": { "count": 5 }, "durationSeconds": 600, "consecutiveDatapointsToAlarm": 1, "consecutiveDatapointsToClear": 2 } }

例 使用 statisticalThreshold 的示例

{ "name": "Connection Attempts", "metric": "aws:num-connection-attempts", "criteria": { "comparisonOperator": "greater-than", "statisticalThreshold": { "statistic": "p10" }, "durationSeconds": 300, "consecutiveDatapointsToAlarm": 1, "consecutiveDatapointsToClear": 2 } }

 

aws:num-disconnects

设备在给定时间段内与 AWS IoT 断开连接的次数。

More info (14)

使用此指标来指定设备在给定时间段内与 AWS IoT 断开连接的最大或最小次数。

来源:云端

运算符:less-than | less-than-equals | greater-than | greater-than-equals

值:非负整数

单位:连接断开次数

持续时间:非负整数。有效值为 300、600、900、1800 或 3600 秒。

{ "name": "Disconnections", "metric": "aws:num-disconnects", "criteria": { "comparisonOperator": "greater-than", "value": { "count": 5 }, "durationSeconds": 600, "consecutiveDatapointsToAlarm": 1, "consecutiveDatapointsToClear": 2 } }

例 使用 statisticalThreshold 的示例

{ "name": "Disconnections", "metric": "aws:num-disconnects", "criteria": { "comparisonOperator": "greater-than", "statisticalThreshold": { "statistic": "p10" }, "durationSeconds": 300, "consecutiveDatapointsToAlarm": 1, "consecutiveDatapointsToClear": 2 } }

使用维度确定安全配置文件中指标的作用域

维度是您可以定义的属性,用于获取安全配置文件中有关指标和行为的更精确数据。您通过提供用作筛选条件的值或模式来定义作用域。例如,您可以定义一个主题筛选条件维度,该维度仅将指标应用于与特定值(例如“data/bulb/+/activity”)匹配的 MQTT 主题。有关定义要在安全配置文件中使用的维度的信息,请参阅 CreateDimension

维度值支持 MQTT 通配符。MQTT 通配符可帮助您同时订阅多个主题。有两种不同类型的通配符:单级 (+) 和多级 (#)。例如,维度值 Data/bulb/+/activity 创建一个和与 + 处于同一级别的所有主题匹配的订阅。维度值还支持 MQTT 客户端 ID 替换变量 ${iot:Clientid}。

TOPIC_FILTER 类型的维度与以下云端衡量指标集兼容:

  • 发送的消息数量

  • 收到的消息数量

  • 消息字节大小

  • Source IP address

  • 授权失败次数

如何在 AWS CLI 上使用维度

创建维度并将其应用于安全配置文件行为

  1. 首先创建维度,然后再将其附加到安全配置文件。使用 CreateDimension 命令创建维度:

    aws iot create-dimension \ --name TopicFilterForAuthMessages \ --type TOPIC_FILTER \ --string-values device/+/auth

    此命令的输出如下所示:

    { "arn": "arn:aws:iot:us-west-2:123456789012:dimension/TopicFilterForAuthMessages", "name": "TopicFilterForAuthMessages" }
  2. 使用 UpdateSecurityProfile 将维度添加到现有安全配置文件中,或使用 CreateSecurityProfile 将维度添加到新的安全配置文件中。在以下示例中,我们创建了一个新的安全配置文件,用于检查 TopicFilterForAuthMessages 的消息是否在 128 字节以下,并保留发送到非身份验证主题的消息数。

    aws iot create-security-profile \ --security-profile-name ProfileForConnectedDevice \ --security-profile-description "Check to see if messages to TopicFilterForAuthMessages are under 128 bytes and retains the number of messages sent to non-auth topics." \ --behaviors "[{\"name\":\"CellularBandwidth\",\"metric\":\"aws:message-byte-size\",\"criteria\":{\"comparisonOperator\":\"less-than\",\"value\":{\"count\":128},\"consecutiveDatapointsToAlarm\":1,\"consecutiveDatapointsToClear\":1}},{\"name\":\"Authorization\",\"metric\":\"aws:num-authorization-failures\",\"criteria\":{\"comparisonOperator\":\"less-than\",\"value\":{\"count\":10},\"durationSeconds\":300,\"consecutiveDatapointsToAlarm\":1,\"consecutiveDatapointsToClear\":1}}]" \ --additional-metrics-to-retain-v2 "[{\"metric\": \"aws:num-authorization-failures\",\"metricDimension\": {\"dimensionName\": \"TopicFilterForAuthMessages\",\"operator\": \"NOT_IN\"}}]"

    此命令的输出如下所示:

    { "securityProfileArn": "arn:aws:iot:us-west-2:1234564789012:securityprofile/ProfileForConnectedDevice", "securityProfileName": "ProfileForConnectedDevice" }

    您也可以从文件加载参数,而不是将其作为命令行参数值完全键入,以节省时间。有关更多信息,请参阅从文件加载 AWS CLI 参数。下面显示了扩展 JSON 格式的 behavior 参数:

    [ { "criteria": { "comparisonOperator": "less-than", "consecutiveDatapointsToAlarm": 1, "consecutiveDatapointsToClear": 1, "value": { "count": 128 } }, "metric": "aws:message-byte-size", "metricDimension": { "dimensionName:": "TopicFilterForAuthMessages" }, "name": "CellularBandwidth" } ]

查看具有某个维度的安全配置文件

  • 使用 ListSecurityProfiles 命令查看具有特定维度的安全配置文件:

    aws iot list-security-profiles \ --dimension-name TopicFilterForAuthMessages

    此命令的输出如下所示:

    { "securityProfileIdentifiers": [ { "name": "ProfileForConnectedDevice", "arn": "arn:aws:iot:us-west-2:1234564789012:securityprofile/ProfileForConnectedDevice" } ] }

更新维度

  • 使用 UpdateDimension 命令更新维度:

    aws iot update-dimension \ --name TopicFilterForAuthMessages \ --string-values device/${iot:ClientId}/auth

    此命令的输出如下所示:

    { "name": "TopicFilterForAuthMessages", "lastModifiedDate": 1585866222.317, "stringValues": [ "device/${iot:ClientId}/auth" ], "creationDate": 1585854500.474, "type": "TOPIC_FILTER", "arn": "arn:aws:iot:us-west-2:1234564789012:dimension/TopicFilterForAuthMessages" }

删除维度

  1. 要删除维度,请先将其从附加到的任何安全配置文件中分离。使用 ListSecurityProfiles 命令查看具有特定维度的安全配置文件。

  2. 要从安全配置文件中删除维度,请使用 UpdateSecurityProfile 命令。输入要保留的所有信息,但排除维度:

    aws iot update-security-profile \ --security-profile-name ProfileForConnectedDevice \ --security-profile-description "Check to see if authorization fails 10 times in 5 minutes or if cellular bandwidth exceeds 128" \ --behaviors "[{\"name\":\"metric\":\"aws:message-byte-size\",\"criteria\":{\"comparisonOperator\":\"less-than\",\"value\":{\"count\":128},\"consecutiveDatapointsToAlarm\":1,\"consecutiveDatapointsToClear\":1}},{\"name\":\"Authorization\",\"metric\":\"aws:num-authorization-failures\",\"criteria\":{\comparisonOperator\":\"less-than\",\"value\"{\"count\":10},\"durationSeconds\":300,\"consecutiveDatapointsToAlarm\":1,\"consecutiveDatapointsToClear\":1}}]"

    此命令的输出如下所示:

    { "behaviors": [ { "metric": "aws:message-byte-size", "name": "CellularBandwidth", "criteria": { "consecutiveDatapointsToClear": 1, "comparisonOperator": "less-than", "consecutiveDatapointsToAlarm": 1, "value": { "count": 128 } } }, { "metric": "aws:num-authorization-failures", "name": "Authorization", "criteria": { "durationSeconds": 300, "comparisonOperator": "less-than", "consecutiveDatapointsToClear": 1, "consecutiveDatapointsToAlarm": 1, "value": { "count": 10 } } } ], "securityProfileName": "ProfileForConnectedDevice", "lastModifiedDate": 1585936349.12, "securityProfileDescription": "Check to see if authorization fails 10 times in 5 minutes or if cellular bandwidth exceeds 128", "version": 2, "securityProfileArn": "arn:aws:iot:us-west-2:123456789012:securityprofile/Preo/ProfileForConnectedDevice", "creationDate": 1585846909.127 }
  3. 分离维度后,使用 DeleteDimension 命令删除维度:

    aws iot delete-dimension \ --name TopicFilterForAuthMessages

如何在控制台中使用维度

创建维度并将其应用于安全配置文件行为

  1. AWS IoT 控制台中的导航窗格中,展开 Defend (防护),展开 Detect (检测),然后选择 Security profiles (安全配置文件)

  2. Security profiles (安全配置文件) 页面上,选择 Create (创建) 以添加新的安全配置文件,或选择 Edit (编辑) 以将维度应用于现有安全配置文件。

  3. Expected behaviors (预期行为) 页面上,在 Metric (指标) 下选择五个云端指标维度支持之一。此时将显示 Dimension (维度)Dimension operator (维度运算符) 框。有关支持的云端指标的信息,请参阅使用维度确定安全配置文件中指标的作用域

  4. Dimension (维度) 下拉列表下,选择 Add dimension (添加维度)

  5. Create a new dimension (创建新维度) 页面上,输入新维度的详细信息。Dimensions values (维度值) 支持 MQTT 通配符 # 和 + 以及 MQTT 客户端 ID 替换变量 ${iot:Clientid}。

  6. 选择保存

  7. 您还可以将维度添加到 Additional Metrics to retain (要保留的其他指标) 下的指标。

  8. 在其他必填字段中输入信息以完成行为的创建,然后选择 Next (下一步)

  9. 完成剩余步骤以完成安全配置文件的创建。

查看违规项

  1. AWS IoT 控制台 的导航窗格中,展开 Defend (防护) ,然后展开 Detect (检测)。然后选择 Violations (违规)

  2. Behavior (行为) 列中,将鼠标悬停在要查看其违规信息的行为上。

查看和更新您的维度

  1. AWS IoT 控制台中的导航窗格中,展开 Defend (防护),展开 Detect (检测),然后选择 Dimensions (维度)

  2. 选择要编辑的维度。

  3. 选择 Actions (操作)Edit (编辑)

    
            控制台中维度下拉列表的图像。

删除维度

  1. AWS IoT 控制台中的导航窗格中,展开 Defend (防护),展开 Detect (检测),然后选择 Dimensions (维度)

  2. 选择要删除的维度。

  3. 通过选中 Used in (用于) 列,确认维度未附加到安全配置文件。如果维度附加到安全配置文件,请打开左侧的 Security profiles (安全配置文件) 页面,然后编辑维度附加到的安全配置文件。删除该维度时,还会删除行为。如果要保留此行为,请选择省略号,然后选择 Copy (复制)。然后,您可以继续删除该行为。如果要删除其他维度,请按照本节中的步骤操作。

    
            维度删除页面的图像。
  4. 选择 Actions (操作)Delete (删除)

监控未注册设备的行为

AWS IoT Device Defender Detect 使得识别未在 AWS IoT 注册表中注册的设备的异常行为成为可能。您可以定义特定于以下目标类型之一的安全配置文件:

  • 所有设备

  • 所有已注册的设备(AWS IoT 注册表中的事物)

  • 所有未注册的设备

  • 事物组中的设备

安全配置文件为账户中的设备定义一组预期行为,并指定在检测到异常时要执行的操作。安全配置文件应附加到最具体的目标,以便您精细控制要针对该配置文件评估哪些设备。

未注册的设备在整个设备生命周期内必须提供一致的 MQTT 客户端标识符或事物名称(对于报告设备指标的设备),以便所有违规和指标都归属到相同设备。

重要

如果事物名称包含控制字符,或事物名称的长度超过 128 字节的 UTF-8 编码字符,则将拒绝设备报告的消息。

如何使用 AWS IoT Device Defender detect

  1. 可以只将 AWS IoT Device Defender Detect 与云端指标相结合使用,但如果计划使用设备报告的指标,必须首先在连接 AWS IoT 的设备或设备网关上部署 AWS IoT 开发工具包。有关更多信息,请参阅从设备发送指标

  2. 在定义行为并创建警报之前,请先考虑查看设备生成的指标。AWS IoT 可以从设备收集指标,因此您可以首先识别账户中的一组设备或所有设备的常见或异常行为。使用 CreateSecurityProfile,但只指定您感兴趣的那些 additionalMetricsToRetain。此时不要指定 behaviors

    使用 AWS IoT 控制台查看设备指标,以了解设备的典型行为。

  3. 为安全配置文件创建一组行为。行为包含为账户中的一组设备或所有设备指定正常行为的指标。有关更多信息以及示例,请参阅 指标。创建一组行为后,可以使用 ValidateSecurityProfileBehaviors 进行验证。

  4. 使用 CreateSecurityProfile 操作创建包含行为的安全配置文件。当设备违反行为时,可以使用 alertTargets 参数向目标(SNS 主题)发送提醒。(如果使用 SNS 发送提醒,请注意系统将根据您 AWS 账户的 SNS 主题配额统计数量。)大规模的违规项可能会超过您的 SNS 主题配额。也可以使用 CloudWatch 指标检查违规。有关更多信息,请参阅

  5. 使用 AttachSecurityProfile 操作将安全配置文件附加到一组设备(事物组)、账户中所有已注册的事物、所有未注册的事物或所有设备。AWS IoT Device Defender Detect 开始检测异常行为,如果检测到任何行为违规,则发送提醒。您可能想要将安全配置文件附加到所有未注册的事物,例如,您希望与不在账户事物注册表中的移动设备进行交互。您可以根据需求,为不同设备组定义不同的行为集。

    要将安全配置文件附加到一组设备,必须指定包含这些设备的事物组的 ARN。事物组 ARN 采用以下格式。

    arn:aws:iot:region:account-id:thinggroup/thing-group-name

    要将安全配置文件附加到 AWS 账户中所有已注册的事物(忽略未注册的事物),必须指定以下格式的 ARN:

    arn:aws:iot:region:account-id:all/registered-things

    要将安全配置文件附加到所有未注册的事物,必须指定以下格式的 ARN。

    arn:aws:iot:region:account-id:all/unregistered-things

    要将安全配置文件附加到所有设备,必须指定以下格式的 ARN。

    arn:aws:iot:region:account-id:all/things
  6. 也可以使用 ListActiveViolations 操作跟踪违规项,从而了解对于给定的安全配置文件或目标设备,检测到了哪些违规项。

    使用 ListViolationEvents 操作查看在指定时间段内检测到哪些违规项。可以按照安全配置文件或设备筛选这些结果。

  7. 如果设备违反定义的行为过于频繁或太不频繁,那么应该调整行为定义。

  8. 要查看您设置的安全配置文件和正在监控的设备,请使用 ListSecurityProfilesListSecurityProfilesForTargetListTargetsForSecurityProfile 操作。

    使用 DescribeSecurityProfile 操作获取有关安全配置文件的更多详细信息。

  9. 要更新安全配置文件,请使用 UpdateSecurityProfile 操作。使用 DetachSecurityProfile 操作从账户或目标事物组分离安全配置文件。使用 DeleteSecurityProfile 操作完全删除安全配置文件。

权限

本部分包含有关如何设置管理 AWS IoT Device Defender Detect 所需的 IAM 角色和策略的信息。有关更多信息,请参阅 IAM 用户指南

授予 AWS IoT Device Defender detect 向 SNS 主题发布提醒的权限

如果在 CreateSecurityProfile 中使用 alertTargets 参数,则必须为 IAM 角色指定两个策略:一个权限策略和一个信任策略。权限策略授予 AWS IoT Device Defender 向 SNS 主题发布通知的权限。信任策略授予 AWS IoT Device Defender 代入所需角色的权限。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "sns:Publish" ], "Resource":[ "arn:aws:sns:region:account-id:your-topic-name" ] } ] }
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "iot.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

您还需要附加至 IAM 用户的 IAM 权限策略,以允许该用户传递角色。请参阅向用户授予权限以将角色传递给 AWS 服务

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::account-id:role/Role_To_Pass" } ] }

从设备发送指标

AWS IoT Device Defender Detect 可以收集、聚合和监控 AWS IoT 设备生成的指标数据,以识别表现出异常行为的设备。本部分介绍如何将指标从设备发送到 AWS IoT Device Defender。

必须在 AWS IoT 连接的设备或设备网关上安全部署 AWS IoT 开发工具包,以收集设备端指标。AWS IoT Device Defender 提供代理示例,您在创建自己的代理时可将其用作示例。如果您无法提供设备指标,仍可以基于云端指标获得有限的功能。

请注意以下几点:

  • C 中当前提供有设备指标报告代理示例,网址为:https://github.com/aws-samples/aws-iot-device-defender-agent-c。GitHub 上的 Python 中也有设备指标报告代理示例,网址为: https://github.com/aws-samples/aws-iot-device-defender-agent-sdk-python。具体来说,请参阅 greengrass_defender_agent.py 文件。

  • 要使用代理示例或创建自己的自定义代理,必须安装 AWS IoT 设备开发工具包。要查找适用于您的开发语言的资源,请参阅 AWS IoT Core 资源

  • 所有代理必须创建与 AWS IoT 的连接,并将指标发布到以下预留的 AWS IoT Device Defender MQTT 主题之一:

    $aws/things/THING_NAME/defender/metrics/json

    或者

    $aws/things/THING_NAME/defender/metrics/cbor

    AWS IoT Device Defender 将使用下列主题之一回复指标报告的接收状态:

    $aws/things/THING_NAME/defender/metrics/json/accepted
    $aws/things/THING_NAME/defender/metrics/cbor/accepted
    $aws/things/THING_NAME/defender/metrics/json/rejected
    $aws/things/THING_NAME/defender/metrics/cbor/rejected
  • 要报告指标,设备必须在 AWS IoT 中注册为事物。

  • 一般而言,设备应该每 5 分钟发送一次指标报告。设备限制为每 5 分钟一个指标报告。(设备无法在每 5 分钟内生成多个指标报告。)

  • 设备必须报告当前指标。不支持历史指标报告。

  • 可以使用作业设置设备指标报告代理实例的指标报告间隔。AWS IoT Device Defender 代理 C 样本中包含一个示例。有关更多信息,请参阅 README.md

设备指标文档规范

整体结构

长名称

短名称

必需

类型

约束

备注

header

hed

Y

Object

格式正确的报告所必需的完整数据块。

metrics

met

Y

Object

格式正确的报告所必需的完整数据块。

标头数据块

长名称

短名称

必需

类型

约束

备注

report_id

rid

Y

Integer

单调递增值。推荐采用纪元时间戳。

version

v

Y

String

Major.Minor

添加字段时为次要增量。如果指标移除,则为主要增量。

指标数据块:

TCP 连接

长名称

短名称

父元素

必需

类型

约束

备注

tcp_connections

tc

metrics

N

Object

established_connections

ec

tcp_connections

N

List<Connection>

已建立 TCP 状态

connections

cs

established_connections

N

List<Object>

remote_addr

rad

connections

Y

Number

ip:port

IP 可能是 IPv6 或 IPv4

local_port

lp

connections

N

Number

>= 0

local_interface

li

connections

N

String

接口名称

total

t

established_connections

N

Number

>= 0

已建立的连接数

侦听 TCP 端口

长名称

短名称

父元素

必需

类型

约束

备注

listening_tcp_ports

tp

metrics

N

Object

ports

pts

listening_tcp_ports

N

List<Port>

> 0

port

pt

ports

N

Number

> 0

端口应该是大于 0 的数字

interface

if

ports

N

String

接口名称

total

t

listening_tcp_ports

N

Number

>= 0

侦听 UDP 端口

长名称

短名称

父元素

必需

类型

约束

备注

listening_udp_ports

up

metrics

N

Object

ports

pts

listening_udp_ports

N

List<Port>

> 0

port

pt

ports

N

Number

> 0

端口应该是大于 0 的数字

interface

if

ports

N

String

接口名称

total

t

listening_udp_ports

N

Number

>= 0

网络统计数据

长名称

短名称

父元素

必需

类型

约束

备注

network_stats

ns

metrics

N

Object

bytes_in

bi

network_stats

N

Number

Delta Metric, >= 0

bytes_out

bo

network_stats

N

Number

Delta Metric, >= 0

packets_in

pi

network_stats

N

Number

Delta Metric, >= 0

packets_out

po

network_stats

N

Number

Delta Metric, >= 0

以下 JSON 结构使用长名称。

{ "header": { "report_id": 1530304554, "version": "1.0" }, "metrics": { "listening_tcp_ports": { "ports": [ { "interface": "eth0", "port": 24800 }, { "interface": "eth0", "port": 22 }, { "interface": "eth0", "port": 53 } ], "total": 3 }, "listening_udp_ports": { "ports": [ { "interface": "eth0", "port": 5353 }, { "interface": "eth0", "port": 67 } ], "total": 2 }, "network_stats": { "bytes_in": 29358693495, "bytes_out": 26485035, "packets_in": 10013573555, "packets_out": 11382615 }, "tcp_connections": { "established_connections": { "connections": [ { "local_interface": "eth0", "local_port": 80, "remote_addr": "192.168.0.1:8000" }, { "local_interface": "eth0", "local_port": 80, "remote_addr": "192.168.0.1:8000" } ], "total": 2 } } } }

例 使用短名称的 JSON 结构示例

{ "hed": { "rid": 1530305228, "v": "1.0" }, "met": { "tp": { "pts": [ { "if": "eth0", "pt": 24800 }, { "if": "eth0", "pt": 22 }, { "if": "eth0", "pt": 53 } ], "t": 3 }, "up": { "pts": [ { "if": "eth0", "pt": 5353 }, { "if": "eth0", "pt": 67 } ], "t": 2 }, "ns": { "bi": 29359307173, "bo": 26490711, "pi": 10014614051, "po": 11387620 }, "tc": { "ec" : { "cs": [ { "li": "eth0", "lp": 80, "rad": "192.168.0.1:8000" }, { "li": "eth0", "lp": 80, "rad": "192.168.0.1:8000" } ], "t": 2 } } } }