agents: re-pull the agent's own bao mTLS leaf on a timer
swarm-controller re-issues an agent's store leaf at half its validity, but the running container kept presenting the copy its hive delivered at start, so a re-issued leaf reached the agent only on its next restart. hive-agent-bao-identity now seeds a live copy of the pair in its own runtime directory from the delivered credentials, and re-runs every 10 minutes: it logs in with the live leaf, reads its own swarm/agents/<agent>/bao-mtls (a read render_agent already grants), and when the leaf changed, logs in with the new pair and swaps it in only if the store accepts it. Every unit in the container that logs in to the store presents the live pair: hive-agent (queue-identity.nix), hive-matrix-daemon, hive-subagent-daemon, hive-agent-forge-token, hive-agent-forge-accounts and hive-agent-github-token. They keep loading the server CA as a credential. The long-running daemons are ordered after the refresher so the live pair exists when they start. It renews only while the held leaf is still valid: the login that reads the new leaf is made with the current one. Refs #5017
This commit is contained in:
parent
20509685a0
commit
c6717bccb0
17 changed files with 308 additions and 166 deletions
|
|
@ -8,12 +8,12 @@
|
|||
//! the controller's own record, [`queue::AgentCredential::minted_at`]; a secret
|
||||
//! without one is stamped, value unchanged ([`SecretStep::Backfill`]).
|
||||
//!
|
||||
//! Either replacement reaches the agent at its next start, when the container
|
||||
//! is handed the certificate and fetches the secret; nothing pulls either into
|
||||
//! a running container. The old certificate stays valid until it expires. The
|
||||
//! old secret stops working at once: the queue checks it only at `CONNECT`, so
|
||||
//! an open connection is unaffected, but a reconnect before that restart
|
||||
//! presents the old secret and is denied.
|
||||
//! A running agent re-reads its certificate every ten minutes under the one it
|
||||
//! holds (`nix/agent-modules/bao.nix`); the old one stays valid until it
|
||||
//! expires. A new secret reaches the agent at its next start, when the
|
||||
//! container fetches it. The old secret stops working at once: the queue checks
|
||||
//! it only at `CONNECT`, so an open connection is unaffected, but a reconnect
|
||||
//! before that restart presents the old secret and is denied.
|
||||
//!
|
||||
//! [`spawn`]'s pass, once the queue is up and every [`RECONCILE_INTERVAL`],
|
||||
//! inserts a job per agent with anything due: `MintAgentIdentity` for the
|
||||
|
|
|
|||
Loading…
Reference in a new issue