Attesto

Enterprise Edge

Local Vault

Local Vault to outbound-only customer edge component dla connector secret storage, source attestation signing, offline spooling, event relay i opcjonalnego customer-side witness operation. To nie jest HashiCorp Vault.

Responsibilities

Instalacja i uruchomienie

Zainstaluj Local Vault na kontrolowanym przez klienta hoście edge. Współrzędne runtime mogą pochodzić z flag lub zmiennych środowiskowych, ale signing keys, spool encryption keys i connector credentials muszą pochodzić z lokalnego deployment secret managera. Nie umieszczaj ich w shell history, konfiguracji frontendu ani docs Attesto.

pipx install attesto-local-vault

export ATTESTO_LOCAL_VAULT_SPOOL_DB=/var/lib/attesto/local-vault.sqlite3
export ATTESTO_LOCAL_VAULT_INSTALLATION_ID="$ATTESTO_LOCAL_VAULT_INSTALLATION_ID"
export ATTESTO_LOCAL_VAULT_RELAY_URL="https://verify.attesto.eu/v2/local-vault/installations/$ATTESTO_LOCAL_VAULT_INSTALLATION_ID/events"
export ATTESTO_LOCAL_VAULT_KEY_ID="$ATTESTO_LOCAL_VAULT_KEY_ID"

attesto-local-vault drain-loop

Kontrola zdrowia

Uruchom attesto-local-vault doctor po bootstrapie oraz podczas operator troubleshooting. Doctor sprawdza config, lokalne secrets, uprawnienia secrets.env, encrypted spool readback, reguły HTTPS dla relay URL, osiągalność backendu, server clock skew, nieprawidłowe nagłówki serwera Date oraz dead-letter depth. Failures zwracają non-zero exit code. Warnings pozostawiają spool używalny, ale operator musi je przejrzeć.

attesto-local-vault doctor

Enrollment

Tenant owner albo admin tworzy krótkotrwały enrollment token przez POST /v2/tenant/local-vault/enrollment-tokens. Edge host wymienia ten token w POST /v2/local-vault/enroll i otrzymuje installation metadata oraz credential potrzebny do outbound relay. Enrollment tokens są single-use; Attesto po utworzeniu zapisuje tylko ich hash.

Potwierdzenie dostarczenia

Local Vault oznacza element jako delivered tylko wtedy, gdy Attesto zwróci 2xx JSON receipt z pasującym localVaultAck.envelopeHash, stream binding i canonical event id. Proxy 2xx, malformed body, mismatched receipt albo revoked installation pozostają nieudaną dostawą pod retry lub dead-letter policy.

Outbound relay flow

  1. Customer source tworzy attestation event.
  2. Local Vault podpisuje i zapisuje event w encrypted spool.
  3. Local Vault relay event do POST /v2/local-vault/installations/{installation_id}/events na https://verify.attesto.eu.
  4. Attesto zwraca Proofstream receipt.
  5. Local Vault zapisuje receipt state i przechowuje retry metadata do zakończenia delivery.
{
  "source_ref": "local-source-2026-0001",
  "event_type": "source.attestation",
  "payload_hash": "sha256-hex",
  "local_signature": {
    "alg": "Ed25519",
    "kid": "local-vault-key-epoch",
    "signature": "hex-encoded-signature"
  }
}

Encrypted spool

Spool zachowuje events podczas network outages. Replay jest uporządkowany i idempotent: ta sama source reference i body mogą być retried, ale changed content dla tej samej source reference jest odrzucany.

StateZnaczenie
queuedZapisane lokalnie i oczekujące na relay.
relayingOutbound request jest w toku.
receiptedAttesto zwróciło Proofstream receipt.
conflictSource reference została replayed z inną canonical content.

Security model

Customer witness mode

Po włączeniu Local Vault może podpisywać monotonic checkpoints dla swoich tenant streams. Policy 2-of-3 może łączyć Attesto-operated, customer-operated i assurance witness statements, aby żaden pojedynczy service nie był traktowany jako jedyna source of history.

W witness mode Local Vault podpisuje checkpoint statements tylko wtedy, gdy rozszerzają last accepted checkpoint dla tenant stream. Conflict tworzy fork visibility po stronie klienta.

Witness checkpoint statements są wysyłane do POST /v2/local-vault/installations/{installation_id}/witness/checkpoints i akceptowane tylko wtedy, gdy installation jest enabled, scoped do tenant i monotonic dla streamu.

Komenda witness

Użyj komendy operatora, aby podpisać monotonic checkpoint statement albo zwrócić fork evidence dla konfliktowego checkpointu. Komenda wypisuje tylko publiczny materiał receipt/fork; nigdy nie wypisuje private signing key.

attesto-local-vault --witness-db /var/lib/attesto/local-vault-witness.sqlite3 \
  witness-checkpoint \
  --tenant-id ten_... \
  --stream-id str_... \
  --checkpoint-id chk_... \
  --checkpoint-seq-no 42 \
  --checkpoint-hash "$CHECKPOINT_HASH" \
  --previous-checkpoint-hash "$PREVIOUS_CHECKPOINT_HASH"

Offline i online modes