如何监控身份验证尝试
自 3.8.0 版本引入原生 Prometheus 支持以来,我们一直在不断改进 RabbitMQ 内置的监控功能。监控代理及其客户端对于在问题影响其他环境并最终影响最终用户之前检测问题至关重要。
RabbitMQ 3.8.10 通过 Prometheus 端点和 HTTP API 暴露客户端身份验证尝试指标。
默认行为是返回以下受支持协议的总认证尝试次数、失败次数和成功次数:AMQP 0-9-1、AMQP 1.0 和 MQTT。可以将代理配置为同时跟踪每次认证尝试的来源,包括远程 IP 地址、用户名和协议。由于 AMQP 1.0 授权中没有地址信息,因此在非聚合模式下会报告为空的源 IP。
配置
RabbitMQ 始终会跟踪每个集群节点上的认证尝试总数,并按协议进行聚合。
可以通过 高级配置文件 (advanced config) 添加针对单个地址/用户/协议组合的认证尝试跟踪。
[
{rabbit, [{track_auth_attempt_source, true}]}
]
启用此选项时必须格外小心。
通过指标跟踪源 IP、用户名和协议可能会导致高基数(high cardinality),这意味着 RabbitMQ 节点上的内存使用量会增加。由于没有明确的标准来从 RabbitMQ 基于内存的 ETS 指标存储中清除这些指标,因此不建议在生产集群中定期跟踪认证源。此规则的唯一例外是当远程 IP 地址和用户的数量被保证是有界限的情况。
可以使用 CLI 命令来启用/禁用远程来源跟踪。这使得即时排查故障变得容易,而无需重启节点。
CLI 命令可在 rabbitmqctl 和 rabbitmq-diagnostics 中找到。
| 命令 | 用法 |
|---|---|
disable_auth_attempt_source_tracking | 禁用对认证尝试的对等 IP 地址和用户名的跟踪 |
enable_auth_attempt_source_tracking | 启用对认证尝试的对等 IP 地址和用户名的跟踪 |
reset_node_auth_attempt_metrics | 重置目标节点上的认证尝试指标 |
list_node_auth_attempt_stats | 列出目标节点上的认证尝试情况 |
我们要特别指出 reset_node_auth_attempt_metrics 命令。在禁用源跟踪后,此命令对于重置存储在 RabbitMQ 节点内存中的所有认证尝试指标非常有用。
HTTP API
管理插件上有两个 HTTP API 端点用于查询认证尝试。
第一个端点始终处于启用状态,返回每个协议的认证尝试总数。
GET /api/auth/attempts/{node}
[{
"protocol":"http",
"auth_attempts":553,
"auth_attempts_failed":0,
"auth_attempts_succeeded":553
},
{
"protocol":"amqp091",
"auth_attempts":12,
"auth_attempts_failed":10,
"auth_attempts_succeeded":2
}]
第二个端点要求启用认证尝试源跟踪功能。它提供了按来源细分的尝试统计数据。
GET /api/auth/attempts/{node}/source
[{
"remote_address":"127.0.0.1",
"username":"guest",
"protocol":"http",
"auth_attempts":533,
"auth_attempts_failed":0,
"auth_attempts_succeeded":533
},
{
"remote_address":"127.0.0.1",
"username":"roger",
"protocol":"amqp091",
"auth_attempts":10,
"auth_attempts_failed":10,
"auth_attempts_succeeded":0
},
{
"remote_address":"127.0.0.1",
"username":"bugs",
"protocol":"amqp091",
"auth_attempts":2,
"auth_attempts_failed":0,
"auth_attempts_succeeded":2
}]
可以使用 DELETE HTTP 请求重置认证尝试指标,例如 DELETE /api/auth/attempts/{node}/source
Prometheus HTTP
Prometheus HTTP 端点(默认为 https://:15692/metrics)会捕获相同的认证指标。
# TYPE rabbitmq_auth_attempts_total counter
# HELP rabbitmq_auth_attempts_total Total number of authorization attempts
rabbitmq_auth_attempts_total{protocol="amqp091"} 2
# TYPE rabbitmq_auth_attempts_succeeded_total counter
# HELP rabbitmq_auth_attempts_succeeded_total Total number of successful authentication attempts
rabbitmq_auth_attempts_succeeded_total{protocol="amqp091"} 0
# TYPE rabbitmq_auth_attempts_failed_total counter
# HELP rabbitmq_auth_attempts_failed_total Total number of failed authentication attempts
rabbitmq_auth_attempts_failed_total{protocol="amqp091"} 2
要获取源详细信息,还必须配置 rabbitmq_prometheus 插件以返回 对象指标 (per-object metrics)。
# TYPE rabbitmq_auth_attempts_total counter
# HELP rabbitmq_auth_attempts_total Total number of authorization attempts
rabbitmq_auth_attempts_total{protocol="amqp091"} 5
# TYPE rabbitmq_auth_attempts_succeeded_total counter
# HELP rabbitmq_auth_attempts_succeeded_total Total number of successful authentication attempts
rabbitmq_auth_attempts_succeeded_total{protocol="amqp091"} 0
# TYPE rabbitmq_auth_attempts_failed_total counter
# HELP rabbitmq_auth_attempts_failed_total Total number of failed authentication attempts
rabbitmq_auth_attempts_failed_total{protocol="amqp091"} 5
# TYPE rabbitmq_auth_attempts_detailed_total counter
# HELP rabbitmq_auth_attempts_detailed_total Total number of authorization attempts with source info
rabbitmq_auth_attempts_detailed_total{remote_address="::ffff:127.0.0.1",username="guest",protocol="amqp091"} 1
# TYPE rabbitmq_auth_attempts_detailed_succeeded_total counter
# HELP rabbitmq_auth_attempts_detailed_succeeded_total Total number of successful authorization attempts with source info
rabbitmq_auth_attempts_detailed_succeeded_total{remote_address="::ffff:127.0.0.1",username="guest",protocol="amqp091"} 0
# TYPE rabbitmq_auth_attempts_detailed_failed_total counter
# HELP rabbitmq_auth_attempts_detailed_failed_total Total number of failed authorization attempts with source info
rabbitmq_auth_attempts_detailed_failed_total{remote_address="::ffff:127.0.0.1",username="guest",protocol="amqp091"} 1
