Skip to content

Hardening: anchoring, signatures, SSO, on-prem

Checkpoints you cannot rewrite

A signed checkpoint proves the ledger head at a moment. Publishing it somewhere you do not control proves it later, even against an operator with database access.

attest checkpoint                                    # HMAC (ATTEST_LEDGER_KEY) or Ed25519 (pip install "attest[signing]")
attest anchor --git ~/audit-anchors                  # commit {scope, seq, hash, signed_at} into a git repo
attest anchor --file /mnt/worm/attest-anchors.jsonl  # append-only file (WORM bucket, shared drive)
attest anchor --url https://anchor.example/v1 --verify   # HTTP transparency / timestamping service

FileAnchor, GitAnchor, HttpAnchor implement publish(cp) and lookup(cp); verify_anchor() checks the anchored (scope, seq, hash) matches. Ed25519 (attest.ledger.signing) gives public-key signatures anyone can verify offline; HMAC stays the zero-dependency default.

SSO (OIDC)

Set OIDC_ISSUER, OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_REDIRECT_URI, ATTEST_SESSION_SECRET on the cloud. GET /auth/login → provider → /auth/callback sets a signed session cookie that acts as an approver for the org whose domain / sso_domains matches the email; emails in sso_admins become admins (sso_default_role changes the default). Works with Okta, Entra, Google, Auth0, Keycloak; SAML IdPs through their OIDC bridge.

On-prem

deploy/on-prem/docker-compose.yml: API + dashboard on one host, SQLite on a volume, no external services. See deploy/on-prem/README.md. The SDK itself is offline-first (SQLite ledger, YAML policy, console gate) and syncs through an outbox when a cloud is reachable.

SOC 2 readiness

See the checklist: what Attest provides per control area and what stays with the operator.