Lockstep

Security model

What the tool holds

Data Where For how long
Vault tokens Encrypted, httpOnly, SameSite=Lax session cookie (Fernet: AES-128-CBC + HMAC-SHA256; key derived from LOCKSTEP_SESSION_KEY) Until the session (8 h by default) or the token expires; removed on Sign out
Pending OIDC login Same cookie Single use, at most 10 minutes
Secret values Server memory, during one request Dropped as each secret is compared or copied
Passwords (userpass/LDAP, keystores) Server memory, during one request Not stored, not logged

There is no database and no server-side session store. The browser can't read or alter the cookie's contents.

What the browser receives

Exports hold values

A secret-engine export is the one thing Lockstep produces that contains values in bulk. The server builds it with the user's own token (so it holds only what they can read), sends it to their browser as a download, and keeps nothing.

What the tool writes

Only Apply in the review dialog and Import write, and only:

Every attempted write is audit-logged, without values. Tokens the tool created (userpass, LDAP, OIDC, Kubernetes) are revoked on Sign out; pasted tokens are left alone.

Web protections

The command line

lockstep compare, apply, export and import use your own Vault tokens on your own machine. Nothing goes through a Lockstep server. - Tokens: read from the environment, a token file or ~/.vault-token, never from arguments. A token the CLI makes by logging in (userpass/LDAP) is revoked when the command ends. It never stores tokens. - Reports: hold paths, key names, versions and what kind of value each key holds, never values. They aren't signed, because the person running apply writes with their own permissions and confirms each key. Treat a report from someone else like any change request: read it before you apply it, for example with --dry-run. - Writes: apply follows the web app's rules. It reads the source fresh, writes with check-and-set, never deletes, and appends audit lines to --audit-log if you give it a file. - Values on screen: they only appear with --show-values.

Kubernetes service account sign-in

This lets users act as the tool's identity rather than their own. It's off by default and can be pinned to specific roles. Read the trade-offs before enabling it.

Vault policies

The tool needs only what each person or role is meant to do. Example policies, with app-config as the mount:

# Compare (read-only)
path "app-config/metadata"   { capabilities = ["list"] }
path "app-config/metadata/*" { capabilities = ["read", "list"] }   # tree, versions, "last changed"
path "app-config/data/*"     { capabilities = ["read"] }           # values (and older versions)
path "sys/mounts"            { capabilities = ["read"] }           # optional: full mount list
# Also copy into this mount
path "app-config/data/*"     { capabilities = ["read", "create", "update"] }

The default policy already allows sys/internal/ui/mounts (mount list fallback), sys/capabilities-self (permission checks in the copy review) and token self-lookup and revocation.

Supply chain

View or edit this page on GitHub