swarm-logs: authenticate as the agent with its own queue secret
swarm-logs reads `swarm/agents/<agent>/queue` from the swarm secret store with the agent's own store certificate (the read hive-agent makes for its queue connection) and presents it as `Bearer swarm-agent.<agent>.<secret>`, which the gateway's swarm-logs-auth checks. On a 401 it reads the secret again and retries once, so a secret re-minted between the read and the check does not fail the query. The OIDC mint against the hive's shared `hive-<h>-agent` client is gone from swarm-logs, along with the unused `HIVE_AGENT_OIDC_CA_FILE` anchor. logs.nix now gates on the store address instead of the queue's token endpoint and wraps the binary with the paths queue-identity.nix gives the harness; the host forwards the query URL wherever it forwards a store identity. The shared client is still delivered into containers; removing that is Part of #4459.
This commit is contained in:
parent
1f4736e79b
commit
0f53e9be6c
12 changed files with 260 additions and 331 deletions
|
|
@ -7,13 +7,11 @@
|
|||
# and a default inside the binary would be an address we hope points at
|
||||
# something.
|
||||
#
|
||||
# ⚠️ Gated on the queue being configured as well as on the query URL, because
|
||||
# the identity this CLI presents IS the queue's: one per-hive machine client,
|
||||
# one credential pair, delivered once. A swarm with a log store and no agent
|
||||
# credential has nothing for this to authenticate as, and installing a binary
|
||||
# that can only fail would be worse than leaving it off PATH — an agent would
|
||||
# read the 401 as "no logs", which is the exact confusion the store's machine
|
||||
# route was added to end.
|
||||
# ⚠️ Gated on the secret store's address as well as on the query URL, because
|
||||
# the identity this CLI presents is the agent's own queue secret, read from the
|
||||
# store with the certificate ./bao.nix keeps. Without a store there is nothing
|
||||
# to authenticate as, and a binary that can only fail would read its 401 as
|
||||
# "no logs".
|
||||
{
|
||||
lib,
|
||||
pkgs,
|
||||
|
|
@ -22,22 +20,22 @@
|
|||
}:
|
||||
let
|
||||
cfg = config.services.hyperhive.agent.logs;
|
||||
queueCfg = config.services.hyperhive.agent.queue;
|
||||
configured = cfg.queryUrl != null && queueCfg.tokenEndpoint != null;
|
||||
baoCfg = config.services.hyperhive.agent.bao;
|
||||
configured = cfg.queryUrl != null && baoCfg.addr != null;
|
||||
|
||||
# The four coordinates `swarm-logs` reads, all-or-none on its side. Bound
|
||||
# here as one attrset so the wrapper below cannot set three of them: a
|
||||
# half-set environment is the failure the binary reports as a deployment
|
||||
# bug, and it should not be reachable from the module that sets it.
|
||||
# The same store coordinates ./queue-identity.nix gives the harness, except
|
||||
# the CA: `%d` expands only inside a unit, so it is spelled as the harness
|
||||
# unit's credentials directory, which the agent user's shells can read.
|
||||
#
|
||||
# 🩸 Two of these are credential **paths**. Neither the id nor the secret
|
||||
# is read here — a value in `--set` lands in the wrapper script, which is
|
||||
# in the world-readable nix store.
|
||||
# 🩸 Paths and a name only. A value in `--set` lands in the wrapper script,
|
||||
# which is in the world-readable nix store.
|
||||
wrapperEnv = {
|
||||
HIVE_AGENT_LOGS_QUERY_URL = cfg.queryUrl;
|
||||
HIVE_AGENT_OIDC_TOKEN_ENDPOINT = queueCfg.tokenEndpoint;
|
||||
HIVE_AGENT_OIDC_CLIENT_ID_FILE = queueCfg.clientIdFile;
|
||||
HIVE_AGENT_OIDC_CLIENT_SECRET_FILE = queueCfg.clientSecretFile;
|
||||
HIVE_AGENT_NAME = config.services.hyperhive.agent.user.name;
|
||||
BAO_ADDR = baoCfg.addr;
|
||||
BAO_CLIENT_CERT = baoCfg.clientCertFile;
|
||||
BAO_CLIENT_KEY = baoCfg.clientKeyFile;
|
||||
BAO_CACERT = "/run/credentials/hive-agent.service/hive-agent-bao-server-ca";
|
||||
};
|
||||
|
||||
# Same shape `swarm-controller.nix` wraps `swarmctl` in — `symlinkJoin` +
|
||||
|
|
@ -71,12 +69,6 @@ in
|
|||
Set by the generated meta flake from the host's own
|
||||
{option}`services.hyperhive.swarm.victorialogs.domain`.
|
||||
|
||||
⚠️ The **whole URL**, not a host to build one from, because this same
|
||||
string is also the audience `swarm-logs` mints its token for. Two
|
||||
spellings of one address present as a valid token refused at the
|
||||
store — the rule `swarm-otel.nix` already states over its own push
|
||||
targets.
|
||||
|
||||
`null` means this hive has not been given the log store's address for
|
||||
its agents, and `swarm-logs` is then not installed at all. Deliberately
|
||||
not defaulted: a guessed address resolves cleanly to the wrong place.
|
||||
|
|
|
|||
Loading…
Reference in a new issue