使用自定义规则自定义检测器

编辑

自定义规则 – 或 Kibana 所称的作业规则 – 使您能够根据特定于领域的知识更改异常检测器的行为。

自定义规则描述了检测器何时应采取特定操作而不是遵循其默认行为。要指定何时规则使用scopeconditions。您可以将scope视为规则的分类规范,而conditions是数值部分。规则可以具有范围、一个或多个条件,或范围和条件的组合。有关规范详细信息的完整列表,请参阅创建异常检测作业 API 中的custom_rules对象

指定自定义规则范围

编辑

假设我们正在配置异常检测作业以检测 DNS 数据泄露。我们的数据包含字段“subdomain”和“highest_registered_domain”。我们可以使用看起来像high_info_content(subdomain) over highest_registered_domain的检测器。如果我们运行这样的作业,我们可能会在经常使用的域上发现很多异常,而我们有理由相信这些域是安全的。作为安全分析师,我们对这些异常不感兴趣。理想情况下,我们可以指示检测器跳过我们认为安全的域的结果。使用具有范围的规则可以帮助我们实现这一点。

首先,我们需要创建一个安全域列表。这些列表在机器学习中称为过滤器。过滤器可以在异常检测作业之间共享。

您可以在 Kibana 中的异常检测 > 设置 > 过滤器列表或使用put filter API创建过滤器

PUT _ml/filters/safe_domains
{
  "description": "Our list of safe domains",
  "items": ["safe.com", "trusted.com"]
}

现在,我们可以创建异常检测作业,并指定一个使用safe_domains过滤器为highest_registered_domain字段的范围。

PUT _ml/anomaly_detectors/dns_exfiltration_with_rule
{
  "analysis_config" : {
    "bucket_span":"5m",
    "detectors" :[{
      "function":"high_info_content",
      "field_name": "subdomain",
      "over_field_name": "highest_registered_domain",
      "custom_rules": [{
        "actions": ["skip_result"],
        "scope": {
          "highest_registered_domain": {
            "filter_id": "safe_domains",
            "filter_type": "include"
          }
        }
      }]
    }]
  },
  "data_description" : {
    "time_field":"timestamp"
  }
}

随着时间的推移,当我们看到更多数据和更多结果时,我们可能会遇到想要添加到过滤器中的新域。我们可以在 Kibana 中的异常检测 > 设置 > 过滤器列表或使用更新过滤器 API执行此操作。

POST _ml/filters/safe_domains/_update
{
  "add_items": ["another-safe.com"]
}

请注意,我们可以在scope中使用任何partition_field_nameover_field_nameby_field_name字段。

在以下示例中,我们对多个字段进行范围限定。

PUT _ml/anomaly_detectors/scoping_multiple_fields
{
  "analysis_config" : {
    "bucket_span":"5m",
    "detectors" :[{
      "function":"count",
      "partition_field_name": "my_partition",
      "over_field_name": "my_over",
      "by_field_name": "my_by",
      "custom_rules": [{
        "actions": ["skip_result"],
        "scope": {
          "my_partition": {
            "filter_id": "filter_1"
          },
          "my_over": {
            "filter_id": "filter_2"
          },
          "my_by": {
            "filter_id": "filter_3"
          }
        }
      }]
    }]
  },
  "data_description" : {
    "time_field":"timestamp"
  }
}

当所有三个范围限定字段的值都包含在引用的过滤器中时,此类检测器将跳过结果。

指定自定义规则条件

编辑

假设一个检测器正在查找 CPU 利用率中的异常。对于长时间空闲的机器,CPU 的微小变化可能会导致异常结果,其中actual值非常小,例如 0.02。根据我们对 CPU 利用率行为的了解,我们可能会确定具有如此小的实际值的异常对调查没有意义。

现在让我们配置一个异常检测作业,该作业具有一个规则,用于跳过 CPU 利用率低于 0.20 的结果。

PUT _ml/anomaly_detectors/cpu_with_rule
{
  "analysis_config" : {
    "bucket_span":"5m",
    "detectors" :[{
      "function":"high_mean",
      "field_name": "cpu_utilization",
      "custom_rules": [{
        "actions": ["skip_result"],
        "conditions": [
          {
            "applies_to": "actual",
            "operator": "lt",
            "value": 0.20
          }
        ]
      }]
    }]
  },
  "data_description" : {
    "time_field":"timestamp"
  }
}

当有多个条件时,它们将使用逻辑AND组合。当我们希望规则应用于某个范围时,这很有用。我们创建一个具有两个条件的规则,每个条件对应于所需范围的一端。

这是一个示例,其中计数检测器在计数大于 30 且小于 50 时跳过结果。

PUT _ml/anomaly_detectors/rule_with_range
{
  "analysis_config" : {
    "bucket_span":"5m",
    "detectors" :[{
      "function":"count",
      "custom_rules": [{
        "actions": ["skip_result"],
        "conditions": [
          {
            "applies_to": "actual",
            "operator": "gt",
            "value": 30
          },
          {
            "applies_to": "actual",
            "operator": "lt",
            "value": 50
          }
        ]
      }]
    }]
  },
  "data_description" : {
    "time_field":"timestamp"
  }
}

作业生命周期中的自定义规则

编辑

自定义规则仅影响应用规则后创建的结果。假设我们已经配置了一个异常检测作业,并且它已经运行了一段时间。在观察其结果后,我们决定可以使用规则来消除一些不感兴趣的结果。我们可以使用更新异常检测作业 API来执行此操作。但是,我们添加的规则仅对从添加规则的那一刻起创建的任何结果有效。过去的结果不受影响。

使用自定义规则与过滤数据

编辑

使用规则似乎只是过滤馈送到异常检测作业的数据的另一种方法。例如,在分区字段值位于过滤器中的情况下跳过结果的规则听起来等同于具有过滤掉此类文档的查询。但是,存在根本区别。当数据在到达作业之前被过滤时,就好像它们对作业来说从未存在过一样。使用规则,数据仍然到达作业并影响其行为(取决于规则操作)。

例如,具有skip_result操作的规则意味着所有数据仍然被建模。另一方面,具有skip_model_update操作的规则意味着即使模型没有被规则匹配的数据更新,也会创建结果。