Attesto

Enterprise Edge

Local Vault

Local Vault è un customer edge component outbound-only per connector secret storage, source attestation signing, offline spooling, event relay, optional customer-side witness operation e, in Local Vault 2.x, il provenance mode di Attesto 3, in cui le capsules restano sull'host edge e solo i commitments raggiungono la piattaforma. Non è HashiCorp Vault.

Responsibilities

La provenance locale delle immagini usa il provider isolato e il registro keyed cifrato descritti nella guida AttestoMark Image.

Installare ed eseguire

Installa Local Vault sull’host edge controllato dal cliente. Le coordinate runtime possono arrivare da flag o variabili d’ambiente, ma signing keys, spool encryption keys e connector credentials devono arrivare dal secret manager locale di deployment. Non inserirle in shell history, configurazione frontend o docs Attesto.

L'installazione raccomandata è il canale container firmato: un installer a comando singolo scarica l'immagine del vault bloccata per digest, crea le directory di state e config e installa un wrapper attesto-local-vault così che ogni comando CLI giri in modo trasparente nel container. Richiede Docker (Docker Desktop su macOS e Windows).

# Linux / macOS
curl -fsSL https://get.attesto.eu/local-vault/install.sh | sh

# Windows (PowerShell)
irm https://get.attesto.eu/local-vault/install.ps1 | iex

# Image pinned by digest (override: ATTESTO_LOCAL_VAULT_IMAGE):
# git.attesto.eu/attesto/local-vault@sha256:5799e7f0669c9b42a55a338f4233cfa5afb5aa6a2627c2c50f7545a41bff1551

Su macOS e Windows il vault e la sua provider sandbox solo-Linux girano nella VM Linux di Docker Desktop; le garanzie di isolamento valgono all'interno di quella VM. Un processo nativo macOS o Windows non le porterebbe — è esattamente per questo che gli installer sono wrapper di container. Disinstallazione: rimuovi il wrapper, rimuovi l'immagine con docker rmi e, solo se l'evidenza non serve più, elimina la directory di state — install.sh --help stampa i comandi esatti.

Su macOS e Linux lo stesso wrapper container si installa anche tramite Homebrew. Gli hash della formula sono copiati alla lettera dal manifest del canale firmato con cosign e Homebrew li impone a ogni installazione; i caveats ripetono il requisito Docker e la nota di onestà qui sopra:

brew tap attesto/attesto https://git.attesto.eu/attesto/homebrew-attesto.git
brew trust attesto/attesto
brew install attesto-local-vault

Su host Debian/Ubuntu e Fedora/RHEL, i pacchetti nativi installano lo stesso wrapper come /usr/bin/attesto-local-vault, eseguendo la stessa immagine bloccata per digest. Il deb dipende da un engine compatibile con Docker (docker-ce | docker.io | podman-docker); rpm non può esprimere quell'alternativa tra repository, quindi si limita a raccomandare docker — l'engine resta richiesto a runtime. Verifica il manifest firmato, controlla l'hash del pacchetto, poi installa:

curl -fsSLO https://get.attesto.eu/local-vault/2.0.1/SHA256SUMS
curl -fsSLO https://get.attesto.eu/local-vault/2.0.1/SHA256SUMS.sig
cosign verify-blob --key https://get.attesto.eu/cosign.pub --insecure-ignore-tlog --signature SHA256SUMS.sig SHA256SUMS

# Debian / Ubuntu (run the install as root)
curl -fsSLO https://get.attesto.eu/local-vault/2.0.1/attesto-local-vault_2.0.1-1_all.deb
sha256sum -c --ignore-missing SHA256SUMS
apt install ./attesto-local-vault_2.0.1-1_all.deb

# Fedora / RHEL (run the install as root)
curl -fsSLO https://get.attesto.eu/local-vault/2.0.1/attesto-local-vault-2.0.1-1.noarch.rpm
sha256sum -c --ignore-missing SHA256SUMS
dnf install ./attesto-local-vault-2.0.1-1.noarch.rpm

Il canale wheel Python resta disponibile per gli host che eseguono il vault nativamente su Linux:

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

Controllo salute

Eseguire attesto-local-vault doctor dopo il bootstrap e durante operator troubleshooting. Il doctor controlla config, secrets locali, permessi di secrets.env, encrypted spool readback, regole HTTPS della relay URL, raggiungibilità del backend, server clock skew, header server Date non validi e dead-letter depth. I failures restituiscono un codice diverso da zero. I warnings mantengono lo spool utilizzabile, ma devono essere esaminati dall'operatore.

attesto-local-vault doctor

Enrollment

Un tenant owner o admin crea un enrollment token breve con POST /v2/tenant/local-vault/enrollment-tokens. L'edge host scambia quel token su POST /v2/local-vault/enroll e riceve installation metadata più la credential necessaria per outbound relay. Gli enrollment tokens sono single-use; Attesto salva solo il loro hash dopo la creazione.

Conferma di consegna

Local Vault marca un item come delivered solo quando Attesto restituisce un receipt JSON 2xx con localVaultAck.envelopeHash, stream binding e canonical event id corrispondenti. Un proxy 2xx, malformed body, mismatched receipt o revoked installation resta una delivery fallita soggetta a retry o dead-letter policy.

Outbound relay flow

  1. La customer source crea un attestation event.
  2. Local Vault firma e archivia l'event nell'encrypted spool.
  3. Local Vault relay l'event a POST /v2/local-vault/installations/{installation_id}/events su https://verify.attesto.eu.
  4. Attesto restituisce il Proofstream receipt.
  5. Local Vault registra receipt state e mantiene retry metadata finché delivery è completa.
{
  "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

Lo spool preserva events durante network outages. Replay è ordinato e idempotent: la stessa source reference e body possono essere retried, ma changed content per la stessa source reference viene rifiutato.

StateSignificato
queuedArchiviato localmente e in attesa di relay.
relayingOutbound request in corso.
receiptedAttesto ha restituito un Proofstream receipt.
conflictSource reference replayed con canonical content diverso.

Security model

Customer witness mode

Quando abilitato, Local Vault può firmare monotonic checkpoints per i suoi tenant streams. Una policy 2-of-3 può combinare statements Attesto-operated, customer-operated e assurance witness, così nessun singolo service viene trattato come unica source of history.

In witness mode, Local Vault firma checkpoint statements solo quando estendono il last accepted checkpoint per il tenant stream. Un conflict crea fork visibility lato cliente.

I witness checkpoint statements sono inviati a POST /v2/local-vault/installations/{installation_id}/witness/checkpoints e accettati solo quando l'installation è enabled, scoped al tenant e monotonic per lo stream.

Comando witness

Usa il comando operatore per firmare un monotonic checkpoint statement o restituire fork evidence per un checkpoint in conflitto. Il comando stampa solo materiale pubblico receipt/fork; non stampa mai la 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"

Provenance mode (Attesto 3)

Local Vault 2.x gira in una di tre modalità, commutate con attesto-local-vault mode --set legacy-relay|provenance|shadow. legacy-relay è il flusso di relay descritto sopra. In modalità provenance il vault costruisce una capsule per asset con il suo Rust edge core fissato, esegue i provider abilitati dentro la provider sandbox (AttestoMark Image, Audio e Video, C2PA) o come daemon misurati (l'inference gateway che trasporta AttestoMark Text), valuta la policy multi-segnale, conserva la capsule nel capsule store locale cifrato e inoltra un envelope ATTESTO-PROVENANCE-001 che porta solo commitments: il subject commitment, la capsule root, le root di claims, evidence e policy-results, il key id dell'installazione, il suo livello di assurance firmato e, a L1/L2, un'attestation reference. Contenuto grezzo, prompt, nomi dei file e output dei provider non lasciano mai l'host; la piattaforma non può restituire una capsule perché non ne conserva mai una. shadow esegue entrambe le lane per una migrazione guidata da attesto-local-vault migration status|advance|roll-back|cutover-evidence; non esiste --force, per scelta.

attesto-local-vault mode --set provenance
attesto-local-vault provenance self-test
attesto-local-vault provenance relay-loop

Il vault inoltra a POST /v2/local-vault/installations/{installation_id}/provenance-events, il percorso che l'oggetto installazione annuncia come provenanceEndpointPath; la firma Ed25519 dell'envelope è la credenziale. La piattaforma risponde con il receipt Proofstream più un provenanceAck. Lo stream deve essere un provenance stream creato con POST /v2/provenance/streams sotto una witness policy dichiarata prima con PUT /v2/tenant/witness/policies/{policy_id}; la guida API elenca ogni route.

Livelli di assurance e hardware custody

LivelloRichiedeCosa verifica la piattaforma
L0Una chiave software (predefinita).La firma Ed25519.
L1La stessa chiave Ed25519 custodita in un token PKCS#11, non estraibile.Un attestation record pkcs11-key-custody firmato dalla chiave.
L2L1 più un quote TPM 2.0 sulla misurazione del vault: versione del vault, checksum dell'edge core, provider manifests e signing key.La firma del quote, il suo legame con il measurement digest e l'attestation key.
L3Mai firmato da un vault.Derivato dal verificatore da L2 più un witness quorum raggiunto sul checkpoint che lo contiene; l'anchoring non promuove mai un livello.

L'algoritmo di firma non cambia tra i livelli. Un attestation record (ATTESTO-VAULT-ATTESTATION-001) viene registrato su POST /v2/local-vault/installations/{installation_id}/attestations; la piattaforma lo verifica e rifiuta un envelope L1/L2 che non può sostanziare. L2 non significa che l'host non possa essere compromesso: significa che un TPM ha firmato una dichiarazione su ciò che il vault ha misurato all'avvio. I provider PKCS#11 e TPM 2.0 sono esercitati in continuous integration contro SoftHSM2 e swtpm, doppioni software di quelle interfacce; nessuna installazione di produzione ha ancora firmato con hardware, e l'installazione del rollout first-party firma con una chiave software a L0.

Key lifecycle e revoca

Revocare un'installazione (DELETE /v2/tenant/local-vault/installations/{installation_id}) registra l'orologio della piattaforma come istante di revoca e lo pubblica su GET /v2/local-vault/installations/{installation_id}/key-status, pubblico di proposito affinché un verificatore che non è utente del tenant possa controllare le prove offline. La revoca viene valutata rispetto al platform receipt time di ogni evento, mai rispetto all'occurred_at dichiarato dal vault, con un confine inclusivo; una dichiarazione antecedente alla revoca il cui receipt non lo è riceve il flag suspect_backdated. Un verifier bundle su un provenance stream porta il key lifecycle del momento della sua costruzione, quindi una revoca successiva non è nel bundle.

Stato del rollout

La provenance lane è attiva in produzione. La fase A del rollout controllato è stata eseguita in produzione il 2026-08-23 con un tenant first-party: 15 receipts, 0 rilevamenti di privacy canary sui body HTTP, nei log del backend e in 92 tabelle del database, lo stream con checkpoint e witness. Il rollback per lane, che riporta i nuovi eventi alla legacy lane e non riscrive nulla, è stato provato contro la produzione. Le fasi da B a D, comprese le migrazioni dei design partner e il passaggio predefinito delle nuove configurazioni a provenance, non sono iniziate.

Offline e online modes