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
|
|
@ -135,6 +135,56 @@ let
|
|||
lib.elem "swarm-collector" (clients secretPublisherHere)
|
||||
&& !(lib.elem "swarm-collector" (clients otelBaoRemoteAuthelia));
|
||||
}
|
||||
{
|
||||
# Registration follows authelia, not the service: the IdP host below runs
|
||||
# no controller, queue or homeserver (the first arms), and still lists all
|
||||
# three clients. The last arm is the control — a host with no IdP lists
|
||||
# none of them.
|
||||
name = "an authelia host running no controller, queue or homeserver registers all three clients";
|
||||
ok =
|
||||
let
|
||||
d = secretPublisherRemote.services.hyperhive.deploy;
|
||||
clients = m: map (c: c.id) m.services.hyperhive.swarm.authelia.oidc.clients;
|
||||
byId =
|
||||
id:
|
||||
lib.findFirst (
|
||||
c: c.id == id
|
||||
) null secretPublisherRemote.services.hyperhive.swarm.authelia.oidc.clients;
|
||||
controller = byId "swarm-controller";
|
||||
nats = byId "swarm-nats";
|
||||
matrix = byId "tuwunel";
|
||||
in
|
||||
!d.swarm-controller.enable
|
||||
&& !d.nats.enable
|
||||
&& !d.matrix.enable
|
||||
&& controller.kind == "machine"
|
||||
&& controller.audience == [ "swarm-controller" ]
|
||||
&& nats.kind == "machine"
|
||||
&&
|
||||
matrix.redirectUris == [
|
||||
"https://chat.t.local/_matrix/client/unstable/login/sso/callback/tuwunel"
|
||||
]
|
||||
&& matrix.tokenEndpointAuthMethod == "client_secret_post"
|
||||
&& !(lib.any (id: lib.elem id (clients grafanaRemoteAuthelia)) [
|
||||
"swarm-controller"
|
||||
"swarm-nats"
|
||||
"tuwunel"
|
||||
]);
|
||||
}
|
||||
{
|
||||
# The other half of the queue's and the homeserver's one route: the
|
||||
# publisher on an IdP host that runs neither carries both secrets to the
|
||||
# paths their readers fetch.
|
||||
name = "the publisher on an authelia host carries the queue's and homeserver's secrets";
|
||||
ok =
|
||||
let
|
||||
s = secretPublisherRemote.systemd.services.swarm-secret-publish.script;
|
||||
in
|
||||
lib.hasInfix "secret/swarm/services/swarm-nats/oidc/client" s
|
||||
&& lib.hasInfix "/swarm-nats.secret" s
|
||||
&& lib.hasInfix "secret/swarm/services/tuwunel/oidc/client" s
|
||||
&& lib.hasInfix "/tuwunel.secret" s;
|
||||
}
|
||||
{
|
||||
# Both ends of a wire nothing at eval time carries end to end: the
|
||||
# publisher on authelia's host writes the path the reader on the
|
||||
|
|
|
|||
Loading…
Reference in a new issue