swarm-logs-auth: rate-limit verification and cache positive verdicts
Any request on logs.<swarm> carrying a well-formed swarm-agent bearer made swarm-logs-auth do a bao cert login and KV read before it could refuse, with no cap on the rate. nginx now applies limit_req (zone swarm_logs_agent_auth, keyed by client address, 5r/s burst 20 nodelay by default) on the internal location that forwards to swarm-logs-auth, answering 403 when over, since auth_request passes through only 401/403 and swarm-logs retries a 401. The authelia path and the query location carry no limit. swarm-logs-auth remembers bearers it has granted, keyed by SHA-256 of the bearer, for --verdict-ttl seconds (deploy.victorialogs.authVerdictTtl, 60 by default), holding at most 4096 and evicting the oldest. Denials are never remembered. A replaced or deleted queue secret therefore keeps working at the log store for up to the TTL after its last check. Closes #5190
This commit is contained in:
parent
3be6096c26
commit
8be4030d03
9 changed files with 367 additions and 51 deletions
|
|
@ -544,6 +544,27 @@ let
|
|||
&& lib.hasInfix "--socket /run/swarm-logs-auth/auth.sock" unit.serviceConfig.ExecStart
|
||||
&& l ? "= /__hive_authelia";
|
||||
}
|
||||
{
|
||||
# Every agent bearer the responder has not recently granted costs a
|
||||
# store login and read, so its location carries the per-address limit.
|
||||
# The responder gets the grant TTL from the option. The query and
|
||||
# authelia locations carry no limit of their own.
|
||||
name = "agent bearer checks are rate-limited per address and granted for a TTL";
|
||||
ok =
|
||||
let
|
||||
l = allLocal.services.nginx.virtualHosts."logs.t.local".locations;
|
||||
http = allLocal.services.nginx.appendHttpConfig;
|
||||
unit = allLocal.systemd.services.swarm-logs-auth;
|
||||
in
|
||||
lib.hasInfix "limit_req_zone $binary_remote_addr zone=swarm_logs_agent_auth:1m rate=5r/s;" http
|
||||
&&
|
||||
lib.hasInfix "limit_req zone=swarm_logs_agent_auth burst=20 nodelay;"
|
||||
l."= /__swarm_logs_agent_auth".extraConfig
|
||||
&& lib.hasInfix "limit_req_status 403;" l."= /__swarm_logs_agent_auth".extraConfig
|
||||
&& !(lib.hasInfix "limit_req" l."^~ /select/logsql/".extraConfig)
|
||||
&& !(lib.hasInfix "limit_req" l."= /__hive_authelia".extraConfig)
|
||||
&& lib.hasInfix "--verdict-ttl 60" unit.serviceConfig.ExecStart;
|
||||
}
|
||||
{
|
||||
# The responder reads the store as itself, with the leaf the store's
|
||||
# host mints for it.
|
||||
|
|
|
|||
Loading…
Reference in a new issue