id: services
title: The component that can mint a hostname is not the component serving agent data
status: open
crates: [didbot-serve, didbot-pds, didbot-tls, didbot-dns]
dependsOn: []
exitCriterion: >
The process serving com.atproto.* traffic holds neither the zone
credential nor the ACME account key, and losing it does not stop a
certificate from renewing or a name from resolving. #
services #
docs/deployment.md states the current shape plainly:
the zone credential "lives beside" the signing keys, "reachable from the
process" because the server writes its own DNS records. One process holds the
signing keys, the zone credential, the ACME account key and every agent's
repository. Its own configuration-tiers table has one row for all of it.
Compromise that process and you can serve arbitrary did.json documents, pass
DNS-01 for any name in the zone, and sign as any account it holds — three
different kinds of total control, from one exposure.
This is not fleet. Fleet is several whole personal data servers — separate zones, separate keys, separate operators' worth of blast radius, operated as a set from above. This is one deployment, decomposed so that the piece which can mint a hostname and answer a DNS-01 challenge is not the piece an attacker reaches by finding a bug in repository-write handling. Ten small blast radii and one smaller one are different problems, and an epic that tried to be both would serve neither well.
What is one process today, and why that is the risk worth naming first #
docs/deployment.md's posture table already grades this: moving agents off
the server host is "the step that matters and the cheapest", because it moves
the keys and the zone credential off the machine running agent code. That
step says nothing about the server host itself, where the same three
capabilities still sit together:
- DNS issuance.
crates/didbot-dns'sRoute53Dnsholds the credential that writes the zone — scoped to one hosted zone, per the IAM policy indocs/deployment.md, but reachable from whatever process imports the crate. - TLS issuance.
crates/didbot-tlsholds the ACME account key and orders certificates, including the wildcard pair agent-accounts describes per zone. - Repository serving.
crates/didbot-pdsandcrates/didbot-servehold every account's signing keys and answer everycom.atproto.*request, including from the public internet, unauthenticated, for a good fraction of the surface.
Only the third of these needs to be reachable by an arbitrary caller. The first two need to be reachable by nothing except the provisioning and renewal paths that call them.
Done #
Nothing closed yet.