审计日志

Solr 能够记录进入系统的所有 HTTP 请求的审计跟踪。审计记录器是可插拔的,以适应任何可能的格式或日志目标。

审计跟踪(也称为审计日志)是与安全相关的按时间顺序排列的记录、记录集和/或记录目标和来源,它们提供文档证据,证明在任何时候影响特定操作、过程、事件或设备的活动顺序。
— 维基百科
https://en.wikipedia.org/wiki/Audit_trail

配置审计日志

审计日志在 security.json 中的 auditlogging 键下配置。

下面的示例使用插件默认值来配置同步审计日志到 Solr 的默认日志文件。

{
  "auditlogging":{
    "class": "solr.SolrLogAuditLoggerPlugin"
  }
}

默认情况下,任何审计日志插件都会在后台异步记录日志,以避免减慢请求速度。要使审计日志同步进行,请添加参数 async,其值为 false

使用异步日志记录时,您可以选择配置队列大小、线程数以及队列已满时是否应该阻止或丢弃事件

{
  "auditlogging":{
    "class": "solr.SolrLogAuditLoggerPlugin",
    "async": true,
    "blockAsync" : false,
    "numThreads" : 2,
    "queueSize" : 4096,
    "eventTypes": ["REJECTED", "ANONYMOUS_REJECTED", "UNAUTHORIZED", "COMPLETED", "ERROR"]
  }
}

审计日志参数

这些参数是

class

必需

默认值:无

审计日志插件类名。可以是 solr.SolrLogAuditLoggingPluginsolr.MultiDestinationAuditLogger(在下面的链接多个记录器部分中描述)。

async

可选

默认值:true

定义是否异步记录事件。为了避免减慢请求速度,此值默认为 true。但是,如果您对系统的性能特性有信心,并且需要同步记录事件,您可以将其更改为 false

blockAsync

可选

默认值:false

定义如果队列已满,是否应阻止请求。默认值 false 将丢弃未记录的事件。仅当 async=true 时使用。

numThreads

可选

默认值:2

用于审计日志的线程数。如果服务器可用的 CPU 核心数大于 4,则默认值会修改为 CPU 核心数 / 2。仅当 async=true 时使用。

queueSize

可选

默认值: 4096

队列的大小。仅当 async=true 时使用。

eventTypes

可选

默认值: ["REJECTED", "ANONYMOUS_REJECTED", "UNAUTHORIZED", "COMPLETED", "ERROR"]

要记录的事件类型。有关类型选项,请参阅下面的事件类型部分。

muteRules

可选

默认值:无

定义不应记录(静音)事件的情况。可能的规则可以排除来自特定用户、IP、路径或请求参数的请求。有关静音规则选项,请参阅下面的静音特定事件部分。

事件类型

可以使用 eventTypes 参数配置记录的事件类型。默认情况下,仅记录最终事件类型 REJECTEDANONYMOUS_REJECTEDUNAUTHORIZEDCOMPLETEDERROR

以下是框架触发的事件类型

事件类型 用法

AUTHENTICATED

用户成功通过身份验证

REJECTED

身份验证请求被拒绝

ANONYMOUS

请求以未知用户身份继续

ANONYMOUS_REJECTED

来自未知用户的请求被拒绝

AUTHORIZED

授权成功

UNAUTHORIZED

授权失败

COMPLETED

请求成功完成

ERROR

由于错误,请求未执行

静音特定事件

配置参数 muteRules 允许您静音某些事件的日志记录。您可以指定多个规则和规则的组合,这些规则将导致静音。您可以按请求类型、用户名、集合名称、路径、请求参数或 IP 地址进行静音。

以下示例使用 muteRules 静音三种请求类别的审计日志记录:任何 SEARCH 请求、用户 johndoe 发出的任何请求以及来自 IP 地址 192.168.0.10 的任何请求

{
  "auditlogging":{
    "class": "solr.SolrLogAuditLoggerPlugin",
    "muteRules": [ "type:SEARCH", "user:johndoe", "ip:192.168.0.10" ]
  }
}

静音规则也可以是一个列表,在这种情况下,列表中的所有项都必须为 true 才会发生静音。下面的配置有三个静音规则

{
  "auditlogging":{
    "class": "solr.SolrLogAuditLoggerPlugin",
    "muteRules": [
      "ip:192.168.0.10", (1)
      [ "path:/admin/collections", "param:action=LIST" ], (2)
      [ "path:/admin/collections", "param:collection=test" ] (3)
    ]
  }
}
1 这将静音来自客户端 IP 192.168.0.10 的所有事件。
2 此规则将静音具有 action=LIST 的集合 API 请求。
3 最后一个规则将静音名为 test 的集合的集合 API 请求。

请注意如何将单个字符串规则与必须全部匹配的规则列表混合使用

静音规则的选项包括

  • type:<请求类型>: 按名称区分的请求类型:ADMINSEARCHUPDATESTREAMINGUNKNOWN

  • collection:<集合名称>: 按名称区分的集合。

  • user:<用户 ID>: 按用户 ID 区分的用户。

  • path:</handler 的路径>: 相对于 /solr 的请求路径,或者对于搜索或更新请求,则相对于集合。路径是前缀匹配的,即 /admin 也会静音任何子路径。

  • ip:<IP 地址>: 一个 IPv4 地址。

  • param:<参数>=<值>: 一个请求参数。这很可能主要与 path 规则结合使用,如上面的示例所示。

链接多个记录器

使用 MultiDestinationAuditLogger,可以在链中配置多个审计记录器插件,以记录到多个目的地。

{
  "auditlogging":{
    "class" : "solr.MultiDestinationAuditLogger",
    "plugins" : [
      { "class" : "solr.SolrLogAuditLoggerPlugin" },
      { "class" : "solr.MyOtherAuditPlugin",
        "customParam" : "value"
      }
    ]
  }
}

请注意,记录到备用目的地需要使用自定义的审计记录插件进行定义。请参阅 AuditLoggerPlugin 中的基类的 Javadoc。

指标

审计日志插件会记录有关日志请求计数和计时以及异步记录器的队列大小的指标。指标键都记录在 SECURITY 类别上,并且每个指标名称都以 /auditlogging 的范围和记录器的类名作为前缀,例如,SolrLogAuditLoggerPlugin。各个指标是

  • count: (仪表) 记录写入的审计日志的数量和速率。

  • errors: (仪表) 记录错误的数量和速率。

  • lost: (仪表) 记录如果队列已满且 blockAsync=false 时丢失的事件的数量和速率。

  • requestTimes: (计时器) 记录审计日志记录性能的延迟和百分位数。

  • totalTime: (计数器) 记录花费在日志记录上的总时间。

  • queueCapacity: (量规) 记录异步日志记录队列的最大大小。

  • queueSize: (量规) 记录当前在队列中等待的事件数。

  • queuedTime: (计时器) 记录事件在队列中等待的时间量。将其与 requestTimes 指标相加将显示从事件到日志记录完成的总时间。

  • async: (量规) 说明此记录器是否处于异步模式。

如果您遇到非常高的请求速率并且具有较慢的审计记录器插件,您可能会看到 queueSizequeuedTime 指标增加,并可能开始丢弃事件(由 lost 计数增加显示)。在这种情况下,您可能需要增加 numThreads 设置。