swarm-bao: keep the store forwarder's OIDC secret on the host's /run, not in the container's root
swarm-bao-forwarder-oidc still reads the secret from bao under the forwarder's own leaf, but now writes it to /run/swarm-bao-forwarder-oidc on the host (tmpfs), which the swarm-bao container bind-mounts read-only for the collector's LoadCredential. Before, it wrote it to /var/lib/nixos-containers/swarm-bao/var/lib/swarm-bao-otel-oidc/<id>.secret on persistent disk, where a superseded secret stayed after rotation and went into backups of the container root. Host tmpfiles now removes that old file. Rotation is unchanged: the ten-minute timer rewrites the file when the value differs and refresh_consumer restarts the forwarder. After a reboot the secret is fetched again; the file is not pre-created, so until the store answers the forwarder stays down (LoadCredential refuses a missing source) and resumes from its journal cursor afterwards. The container now starts after systemd-tmpfiles-resetup, since the new bind source is made there. Part of #4998 (slice 3: forwarder).
This commit is contained in:
parent
a1f99c77f8
commit
6f5bd1dc5d
3 changed files with 80 additions and 29 deletions
|
|
@ -368,9 +368,32 @@ let
|
|||
e.client_secret_file == "\${env:CREDENTIALS_DIRECTORY}/oidc-client-secret"
|
||||
&&
|
||||
unit.LoadCredential == [
|
||||
"oidc-client-secret:/var/lib/swarm-bao-otel-oidc/swarm-bao-collector.secret"
|
||||
"oidc-client-secret:/run/swarm-bao-forwarder-oidc/swarm-bao-collector.secret"
|
||||
];
|
||||
}
|
||||
{
|
||||
# A copy on persistent disk outlives the secret's rotation and lands in
|
||||
# backups of the container's root. The file is deliberately not created
|
||||
# ahead of the fetch: a placeholder would start the forwarder and have
|
||||
# its pushes refused instead of leaving it down until the store answers.
|
||||
name = "the forwarder's client secret is written to the host's /run only, and the old copy removed";
|
||||
ok =
|
||||
let
|
||||
m = baoWithCollector;
|
||||
script = m.systemd.services.swarm-bao-forwarder-oidc.script;
|
||||
mount = m.containers.swarm-bao.bindMounts."/run/swarm-bao-forwarder-oidc";
|
||||
rules = m.systemd.tmpfiles.rules;
|
||||
in
|
||||
lib.hasInfix "atomic_write_secret 0400 root:root /run/swarm-bao-forwarder-oidc/swarm-bao-collector.secret" script
|
||||
&& !(lib.hasInfix "/var/lib/nixos-containers" script)
|
||||
&& !(lib.hasInfix "/var/lib/swarm-bao-otel-oidc" script)
|
||||
&& mount.hostPath == "/run/swarm-bao-forwarder-oidc"
|
||||
&& mount.isReadOnly
|
||||
&& lib.elem "d /run/swarm-bao-forwarder-oidc 0700 root root -" rules
|
||||
&& lib.elem "r /var/lib/nixos-containers/swarm-bao/var/lib/swarm-bao-otel-oidc/swarm-bao-collector.secret" rules
|
||||
&& !(lib.any (r: lib.hasPrefix "f /run/swarm-bao-forwarder-oidc" r) rules)
|
||||
&& lib.elem "systemd-tmpfiles-resetup.service" m.systemd.services."container@swarm-bao".after;
|
||||
}
|
||||
{
|
||||
# Same 403-not-a-miss property the grafana and matrix readers are pinned
|
||||
# for: the reader's grant is one path under `services`, so a secret
|
||||
|
|
|
|||
Loading…
Reference in a new issue