swarm-bao: make the reader's identity declarable, not just the store's
`swarm-bao.nix` declared the store's half of the mTLS pair as options — `serverCertFile`, `serverKeyFile`, `clientCaFile` — and left the reader's half as a literal inside `glue-bao-tls.nix`, which only runs where `deploy.bao.enable` is set. A hive that did not host the store therefore could not read from it and could not be pointed at a certificate even when one had been placed by hand. Adds `clientCertFile`, `clientKeyFile` and `serverCaFile` beside their three server siblings, `mkDefault`ed by the glue to the leaf it already mints, and moves `glue-matrix-bao-token.nix` onto them. Its gate becomes "this host holds an identity" rather than "the store is a neighbour", and the unit ordering that names store-local units is now conditional -- `Requires=` on an absent unit fails the job. `serverCaFile` is separate from `clientCaFile` on purpose: one is the store choosing which readers to trust, the other a reader choosing which store to trust. Self-signing collapses them to one file, which is a property of that deployment and not of the pairing. Closes #3855.
This commit is contained in:
parent
d9937ee834
commit
694abf4439
6 changed files with 126 additions and 19 deletions
|
|
@ -90,6 +90,18 @@ let
|
|||
deploy.bao.enable = true;
|
||||
deploy.matrix.enable = true;
|
||||
};
|
||||
# A hive that reads from a store it does not run: no `deploy.bao.enable`, so
|
||||
# nothing here mints a leaf and the operator names one placed by hand. The
|
||||
# deployment this pairing exists to serve, and the one that was previously
|
||||
# inexpressible — the gate asked whether the store was a neighbour.
|
||||
baoRemoteReader = hive {
|
||||
deploy.matrix.enable = true;
|
||||
deploy.bao.clientCertFile = "/etc/pki/bao-client.pem";
|
||||
deploy.bao.clientKeyFile = "/etc/pki/bao-client-key.pem";
|
||||
};
|
||||
# The same hive with the identity taken away, which separates "a homeserver
|
||||
# is deployed" from "this host can authenticate to the store".
|
||||
matrixNoBaoIdentity = hive { deploy.matrix.enable = true; };
|
||||
|
||||
# A priority collision is a property of the *option*, not
|
||||
# of the merged value's interior — nix throws the moment the value is
|
||||
|
|
@ -205,6 +217,29 @@ let
|
|||
name = "a store with no homeserver beside it renders no token reader";
|
||||
ok = !(baoPkcs11.systemd.services ? swarm-bao-matrix-token);
|
||||
}
|
||||
{
|
||||
name = "a hive that names a client identity reads from a store it does not run";
|
||||
ok = baoRemoteReader.systemd.services ? swarm-bao-matrix-token;
|
||||
}
|
||||
{
|
||||
# Absence arm for the one above, and the reason the gate is the identity
|
||||
# rather than the homeserver: without it, deploying matrix anywhere would
|
||||
# render a reader that cannot authenticate.
|
||||
name = "a homeserver with no way to authenticate to the store renders no token reader";
|
||||
ok = !(matrixNoBaoIdentity.systemd.services ? swarm-bao-matrix-token);
|
||||
}
|
||||
{
|
||||
# `Requires=` on a unit that does not exist fails the job, and nothing
|
||||
# local mints certificates off-host — so this orders against nothing.
|
||||
# Eval cannot see that failure; only the empty list here stands in for it.
|
||||
name = "an off-host reader requires no unit the store's host would have provided";
|
||||
ok = baoRemoteReader.systemd.services.swarm-bao-matrix-token.requires == [ ];
|
||||
}
|
||||
{
|
||||
# Presence control for the case above: the list is conditional, not gone.
|
||||
name = "a co-located reader still orders after the local pki unit";
|
||||
ok = baoWithMatrix.systemd.services.swarm-bao-matrix-token.requires == [ "swarm-bao-pki.service" ];
|
||||
}
|
||||
];
|
||||
|
||||
bad = builtins.filter (c: !c.ok) cases;
|
||||
|
|
|
|||
Loading…
Reference in a new issue