Skip to content

Add a second age recipient so decryption does not depend on one person #294

Description

@Gerrrt

What and why

Add a second age recipient to .sops.yaml and re-key secrets/observability.sops.yaml, so that decryption does not depend on one key held by one person.

This is the implementation half of #106, which states the risk and stops where the decision starts: ".sops.yaml supports multiple recipients, so the mechanism costs nothing; what it needs is somewhere to put the second key." That sentence is still the whole of the work. #106 stays open as the risk; this issue is where the second key's home gets decided and the re-key gets done.

Three things have changed since #106 was filed on 2026-08-21, and each of them pushes the same way.

ADR-0023 makes this a dependency rather than a nice-to-have. It requires an off-estate encrypted copy of the household's photographs and documents, and then rules on the key: "the off-estate copy is encrypted, and the key that opens it cannot be the one only the operator holds. #106 is this same problem one layer down." A single-holder key is now blocking a decision that is already accepted.

ADR-0023 also rules out the home #106 proposed for it. #106 suggests oracle"an idle machine looking for a purpose, and holding a second recipient is a job that suits a machine with a slow disk and nothing else to do." ADR-0023 checked exactly that pattern and rejected it: oracle is 10.0.99.30, "the same VLAN, the same rack, the same power feed and the same room", so "every failure that motivates this document — fire, theft, flood, a mistake made with root, or simply the operator being unreachable — reaches both boxes in one event. The existing pattern therefore does not satisfy this constraint, and it is close enough to look as though it does." That reasoning is about the household archive, but it transfers to a decryption key without modification. oracle should be struck from #106's suggestion rather than inherited from it.

The handover page now depends on the answer. docs/runbooks/successor-handover.md (#124) tells an arriving operator that a successor who cannot decrypt has nothing, and has to point at #106 as an open issue rather than at a procedure. Right now the honest instruction to a technical trustee is "obtain the key from the person you are replacing", which fails in precisely the case a trustee exists for.

The decision this issue exists to make

Where the second key lives. The mechanism is settled and cheap; this is the part that is not.

Option For Against
An offline key held by the technical second named on the break-glass card Satisfies ADR-0023's off-estate constraint and the handover case in one move; the person already exists and is already named Depends on that person storing it correctly, and make secrets-verify-backup cannot be run on their behalf
A second offline key stored in a different physical location, same holder Survives fire, theft and flood at the rack Does nothing for the operator being unreachable, which is half of what ADR-0023 is about
oracle #106's own suggestion; zero human dependency Ruled out by ADR-0023's reasoning above — same rack, same power, same room

The counter-argument is in back-up-the-age-key.md and should be answered rather than dropped: "It is worth doing on the day the lab stops being a one-person project, and not before — every extra recipient is another key that can leak." The claim to weigh is whether ADR-0023 and a named technical second are that day.

Mechanism, once the home is chosen

Already documented in secrets/README.md; repeated here so the issue is self-contained.

  1. age-keygen the second keypair offline, never on the monitoring host.
  2. Add its public half to .sops.yaml as an additional recipient.
  3. sops updatekeys secrets/observability.sops.yaml from a host that can already decrypt.
  4. Prove the new key actually opens it: make secrets-verify-backup KEY=<the new key>. That target refuses the live key by device and inode and blanks the environment, so a pass means the second key did the work.
  5. Confirm the first key still decrypts too — a re-key that drops a recipient is the failure mode here.

Done when

  • The second key's home is decided and written down (the location itself stays out of the repository, as with the first — back-up-the-age-key.md explains why).
  • .sops.yaml carries two recipients and secrets/observability.sops.yaml is re-keyed.
  • Both keys independently verified with make secrets-verify-backup.
  • back-up-the-age-key.md §"What this still does not solve" updated — it currently defers this to "the day the lab stops being a one-person project", which will be the wrong text once this lands.
  • successor-handover.md §"If you do not have the age key" updated to describe a second recipient rather than a one-key recovery path.
  • secrets/README.md's second-host paragraph reviewed — it describes this same procedure for a different reason and should not end up contradicting the new text.
  • The age key has one holder and one copy #106 closed against this, or explicitly left open with what remains.

Whether ADR-0023's off-estate household archive key is this key or a separate one is in scope for the discussion here, since ADR-0023 ties them together.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions