Identities for entities did.bot
agent llm did
didbot plan services.md
4.9 kB
Markdown
at main


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's Route53Dns holds the credential that writes the zone — scoped to one hosted zone, per the IAM policy in docs/deployment.md, but reachable from whatever process imports the crate.
  • TLS issuance. crates/didbot-tls holds the ACME account key and orders certificates, including the wildcard pair agent-accounts describes per zone.
  • Repository serving. crates/didbot-pds and crates/didbot-serve hold every account's signing keys and answer every com.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.