swarm: OIDC clients registered wherever authelia runs; nats + matrix secrets from bao
The three client registrations move into glue-{controller,nats,matrix}-oidc-client.nix,
gated only on deploy.authelia.enable and reading their ids from swarm.* options,
so the host running authelia registers every one of them whichever host runs
the service. The matrix callback is a new read-only swarm.matrix.sso.redirectUri,
read by both the homeserver's config and its client entry.
swarm-secret-publish now also publishes the queue's and the homeserver's minted
secrets to swarm/services/<id>/oidc/client. The queue host reads its responder's
secret there with swarm-bao-nats-auth-oidc under the responder's own leaf
(swarm-nats-auth role gains that one read path), and the homeserver's host with
swarm-bao-matrix-oidc under matrix-ctl's leaf (swarm-matrix-ctl role gains its
one read path). The host-file copies are gone: swarm-nats-auth-secrets now
delivers only the callout seeds and the store identity, and
hive-matrix-oidc-secret is removed. A fetch unit whose leaf is unset still
renders and fails naming the option pair.
Closes #4943
This commit is contained in:
parent
72d0d8ccba
commit
962da3b784
20 changed files with 702 additions and 293 deletions
48
nix/host-modules/glue-controller-oidc-client.nix
Normal file
48
nix/host-modules/glue-controller-oidc-client.nix
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
# Glue: register the swarm controller as an OIDC client wherever authelia runs.
|
||||
#
|
||||
# ONE PAIRING PER FILE — swarm-controller ← authelia, and nothing else. Deleting
|
||||
# this leaves a controller whose token requests authelia answers with a 401, and
|
||||
# no minted secret for swarm-secret-publish to put in the store.
|
||||
#
|
||||
# ⚠️ Gated on authelia being HERE, and NOT on this host running the controller.
|
||||
# A client is a row in THIS host's provider config, so it is declared where that
|
||||
# config is rendered; ./swarm-controller.nix's `config` hangs off
|
||||
# `deploy.swarm-controller.enable`, which answers a question about a different
|
||||
# host. Same shape as ./glue-grafana-oidc-client.nix.
|
||||
#
|
||||
# Registered whether or not the swarm runs a controller: nothing in `swarm.*`
|
||||
# records that, so the cost of a swarm without one is one unused client and one
|
||||
# unused minted secret.
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
hyperhiveCfg = config.services.hyperhive;
|
||||
deployCfg = hyperhiveCfg.deploy;
|
||||
queueClientId = hyperhiveCfg.swarm.controller.queueClientId;
|
||||
in
|
||||
{
|
||||
config = lib.mkIf deployCfg.authelia.enable {
|
||||
# One declaration, two readers: the id is the read-only option the
|
||||
# controller authenticates under, so a mismatch cannot be introduced here.
|
||||
services.hyperhive.swarm.authelia.oidc.clients = [
|
||||
{
|
||||
id = queueClientId;
|
||||
description = "HyperHive swarm controller";
|
||||
# `client_credentials`: a daemon authenticating as itself, with nobody
|
||||
# to redirect. Declared rather than inferred from an empty redirect
|
||||
# list, because authelia permits only the grants a client names and an
|
||||
# omitted `grant_types` means authorization-code alone.
|
||||
kind = "machine";
|
||||
# Its own id as its own permitted audience. The controller mints a
|
||||
# token for `SWARM_CONTROLLER_OTEL_AUDIENCE` (./swarm-controller.nix),
|
||||
# and ./swarm-otel.nix's `oidc/swarm` authenticator checks for this
|
||||
# same id; either half without the other is a 401 several layers from
|
||||
# this line.
|
||||
audience = [ queueClientId ];
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
Loading…
Reference in a new issue