The Registry¶
The registry lists every credential a set of systems needs, without values. It validates against rules that are the same whether you write JSON or build it in Go, and its JSON Schema is generated from the Go types.
One Entry per Secret, Place and Environment¶
The staging and production copies of a key are two entries, because they
are created, stored and rotated separately. IDs are stable and unique,
conventionally system/environment/NAME, using letters, digits and
._/:@-.
Fields¶
Identity¶
| Field | Required | Meaning |
|---|---|---|
id |
yes | Stable, unique ID |
name |
yes | Display name, often the variable or parameter name |
description |
What it is for | |
system |
yes | The system that owns it |
environment |
prod, staging and so on; empty for one shared by every environment |
|
kind |
yes | What it is; see Kinds |
status |
yes | planned, active or retired |
sensitivity |
low, medium, high or critical |
|
owner |
yes | The person or role who creates and rotates it |
tags, links |
Free labels, and title plus url links |
Where It Comes From¶
issuer is who issues the value: type (such as self, aws, github),
account, and console, the URL where a person manages it.
generation is how the value is made:
| Field | Meaning |
|---|---|
method |
random, keypair, issued (by the issuer), derived (built from others, listed in dependsOn) or federated (no stored value) |
spec |
The shape, such as "32 random bytes, hex" |
where |
Where it is made, such as "the operator's machine, straight into the parameter store" |
command |
The command that makes it |
steps |
Console steps, in order, when there is no command |
Where It Lives and Who Uses It¶
stores lists every place the value is kept. Each has a type (such as
aws-ssm, github-actions, password-manager, host-file), a path,
an account, a console and a role:
| Role | Meaning |
|---|---|
primary |
The source of truth. Every credential needs one, unless federated |
backup |
An offline copy, such as in a password manager |
rendered |
Written from the primary at deploy time, where consumers read it |
install says, in a sentence or a command, how the value gets into that
store. The reports put it in each credential's next step, so write it for
the person who will do it.
consumers lists who reads it: system, component, and via, such as
env SESSION_KEY.
What It Can Do¶
| Field | Meaning |
|---|---|
entitlements |
What the issuer grants it: resource, access, note, such as a token's scopes |
exposure |
What a holder of the value can do, in a sentence |
revocation |
How to revoke it quickly |
dependsOn |
IDs it is built from, such as a connection string from a password |
reaches |
IDs a holder of this one can read, use or replace, such as every parameter an AWS identity can read |
dependsOn and reaches together let each report show what a leak
exposes in all, following links through other credentials, and which
credentials expose this one.
Rotation and Handling¶
rotation says when the value is replaced:
| Policy | Meaning |
|---|---|
scheduled |
Every intervalDays |
on-expiry |
Before the issuer's expiry, recorded with an expires event |
on-demand |
Only on compromise or need |
procedure and impact describe how a rotation is done and what it
interrupts.
handling says who does each stage, human or system:
| Stage | Meaning |
|---|---|
generate |
Makes the value |
distribute |
Gets it from its primary store to its consumers |
rotate |
Replaces it |
automation names the systems doing the system stages. The reports
count how many credentials need a person for at least one stage, how many
are fully automatic, and how many rotations a person does in a year.
Accounts¶
A person's login that controls other credentials, such as the owner of a
code-hosting organization or a cloud root user, is an entry of kind
account. Give it protections (such as "hardware security key",
"MFA") and recovery (how to regain access, or that it cannot be), and
list in reaches what it controls. The plan lists every account's
protections, and a verified event ticks them off.
Kinds¶
kind, issuer.type and stores[].type are open sets: any lowercase
slug is valid, and these are the well-known values the reports and the
schema suggest.
- kind:
random-secret,password,private-key,certificate,connection-string,oauth-client,api-token,personal-access-token,access-key,encryption-key,ssh-key,federated,account. - issuer type:
self,aws,cloudflare,github,google-cloud,postgres,stripe,registrar. - store type:
aws-ssm,aws-secrets-manager,aws-kms,github-actions,password-manager,pulumi-config,host-file,local-file,none.
Validation¶
credspec validate reports every problem at once, each with its entry's
ID:
- required fields are present and IDs are unique;
- closed sets hold only their values, and open sets are slugs;
- every credential has a
primarystore, unless federated; scheduledhasintervalDaysabove zero, and other policies have none;dependsOnandreachesname existing IDs, never the entry itself;- link and console URLs are absolute
httpsURLs.
A registry file refuses unknown fields, so a misspelled field is an error rather than silently ignored.