WvdS Vault
Vault è l'unico luogo per i segreti operativi della famiglia di pacchetti: conservati cifrati, con data di scadenza, rotazione per consegna e un registro degli accessi. Senza di esso le credenziali si trovano in tanti punti quanti sono i pacchetti. Il pacchetto si rivolge agli amministratori che devono inserire segreti, sostituirli e dimostrarne l'uso.
Primi passi
Avvio rapido: depositare il primo segreto e farvi riferimento — la via più breve al primo risultato, in tre passi.
Verificare i prerequisiti → Stabilire la sorgente della chiave → Scegliere uno schema → Dimostrare gli accessi
Attività frequenti
| Che cosa volete | Per chi | Dove si fa | Istruzioni |
|---|---|---|---|
| inserire o modificare un segreto | amministrazione | Amministrazione > Cassaforte | Cinque schemi |
| sostituire un segreto secondo piano | amministrazione | Amministrazione > Cassaforte | Rotazione |
| cambiare la sorgente della chiave | amministrazione | – | Cambiare la sorgente della chiave |
| dimostrare chi ha avuto accesso e quando | amministrazione | Amministrazione > Cassaforte | Il registro degli accessi |
| capire il secondo fattore prima dell'accesso | amministrazione | – | Secondo fattore |
| sapere che cosa la cassaforte non fa | amministrazione | – | Che cosa la cassaforte non fa |
Scopo
Un luogo per i segreti operativi della suite: conservati cifrati, con data di scadenza,
rotazione per consegna e un registro degli accessi. Senza di esso le credenziali si trovano in
tanti punti quanti sono i plugin, in tante forme quante ne hanno inventate i loro autori — e almeno
una di queste è testo in chiaro in conf/local.php.
Servizio registrato (vedi Core): vault.secrets. Le voci risiedono tramite
Storage in data/dwdo/.
Che cosa la cassaforte esplicitamente non fa
Il confine viene per primo, perché in una cassaforte è l'informazione più importante.
Con la sorgente della chiave predefinita salt la chiave principale è derivata dal salt di
istanza del wiki. Quel salt risiede sotto data/meta/ — lo stesso ramo della banca dati della
cassaforte sotto data/dwdo/.
data/ contiene chiave e testo cifrato
insieme. Chi possiede quell'archivio raggiunge i segreti. Da questo il plugin non protegge.
Ciò da cui protegge è tutto quanto sta al di qua: una pagina che ha rivelato troppo, un permesso di accesso ai file impostato troppo largo, un plugin che registra la propria configurazione, una banca dati consegnata a uno sviluppatore.
Questa classe di esposizione si può abbandonare del tutto scegliendo un'altra sorgente della
chiave — vedi Configurazione. env e file collocano la chiave fuori da data/ e
quindi fuori dal backup del wiki.
Cinque schemi, una decisione dell'amministratore
Un plugin che ha bisogno di una password non riceve un valore, riceve un riferimento. Quale sorgente usi un'installazione lo decide quindi l'amministratore, non l'autore di ogni singolo plugin.
| Riferimento | Significato |
|---|---|
vault:{identificativo} | Voce di questa cassaforte |
env:{nome} | Variabile d'ambiente |
file:{percorso} | File al di sotto della directory configurata in file_root |
enc:… | Valore depositato cifrato direttamente |
plain:… | Testo in chiaro, esplicitamente contrassegnato come tale |
La risoluzione avviene dall'interno del proprio plugin tramite SecretRef; il risultato distingue
due casi che non vanno confusi:
| Risultato | Significato |
|---|---|
null | non era configurato nulla |
SecretRefException | qualcosa era configurato e non ha potuto essere riscattato |
Configurazione
| Impostazione | Predefinito | Significato |
|---|---|---|
keysource | salt | Origine della chiave principale: salt, env o file |
keysource_ref | vuoto | Nome della variabile per env, percorso del file per file; con salt senza effetto |
file_root | vuoto | Directory radice entro cui i riferimenti file: devono restare. Vuoto disattiva del tutto lo schema |
log_page_size | 100 | Righe per pagina nel registro degli accessi |
log_keep_days | 365 | Età a partire dalla quale i record di accesso scadono; 0 li conserva in permanenza |
file_root è vuoto per impostazione predefinita e quindi chiuso in caso di guasto. Un
riferimento è configurazione fornita dall'amministratore; senza una radice che lo racchiuda,
file: sarebbe uno strumento per leggere file arbitrari travestito da segreto.
salt è il predefinito perché non richiede configurazione — ed è il più debole dei tre.
env e file sono entrambi copiabili su un'altra macchina e un altro sistema operativo. È
proprio questo requisito a escludere gli archivi legati alla macchina (DPAPI, TPM, portachiavi):
una cassaforte la cui chiave non può lasciare il computer è irrecuperabile dopo un guasto hardware
— backup presente e illeggibile.
Cambiare la sorgente della chiave
Il cambio è supportato e di per sé innocuo: ogni valore porta un'impronta della chiave con cui è stato cifrato, mai la chiave stessa. Le voci esistenti continuano quindi a decifrarsi, e le nuove scritture usano la nuova sorgente.
L'ordine è vincolante:
- Modificare l'impostazione.
- Eseguire la ricifratura nella schermata di amministrazione.
- Solo dopo rimuovere il vecchio materiale di chiave.
La schermata segnala tramite keyUsage() quante voci si trovano ancora sotto la vecchia impronta.
Sono esattamente quelle che diventerebbero illeggibili con una rimozione anticipata.
Rotazione: due scomparti, quattro passi
Una voce ha due scomparti. Un nuovo valore viene dapprima predisposto e non commuta nulla; solo l'adozione lo rende il valore valido.
stage()— predisporre un nuovo valore, l'esercizio in corso continua a usare quello vecchiopromote()— rendere valido il valore predisposto
Il registro degli accessi
Per ogni lettura, scrittura e adozione una riga con l'agente, la voce, l'operazione e l'esito — e mai un valore. È questa la differenza tra una cassaforte e un file cifrato.
Il servizio vault.secrets rilascia esclusivamente la lettura (read(), has()) e
vincola l'agente. Un plugin che ha bisogno di una password non può quindi né ruotarne una né
attribuire una lettura a qualcun altro.
La pulizia passa per l'esecuzione delle attività dell'indicizzatore, cioè durante le normali chiamate di pagina. Su un wiki senza traffico i record restano quindi semplicemente lì.
Secondo fattore prima di ogni accesso al materiale segreto
Garantito tramite l'Identity Plugin Contract v1 (descrizione del contratto): un ponte
do=wkvault_stepup con un elenco di categorie cablato in modo fisso.
| Categoria | Vale per |
|---|---|
create | Creare una voce |
rotate | Predisporre un valore |
delete | Eliminare una voce |
rekey | Cambiare la sorgente della chiave e ricifrare tutto |
La verifica avviene due volte — in lettura quando la schermata viene disegnata e di nuovo
all'invio — e in entrambi i casi in aggiunta all'elenco di accesso di DokuWiki, mai al suo
posto. Senza wkidentity il pacchetto si comporta in modo invariato.
Il ponte non accetta mai un requisito fornito dal chiamante, solo un nome del proprio elenco; un nome sconosciuto produce un rifiuto, mai «nessun requisito».
Prerequisiti
- PHP 8.2 o più recente.
- Diritti di amministratore per la schermata di amministrazione.
Lo schema crea due tabelle, “vault.secret” e “vault.zugriff”, ciascuna in modo idempotente. Il punto fa parte del nome e separa il modulo, da quando tutti i moduli tengono le proprie tabelle in una banca dati comune; in SQL deve stare sempre tra virgolette, perché altrimenti SQLite lo legge come separatore di banca dati e non trova la tabella.
Limiti
- La sorgente della chiave predefinita condivide il backup con i dati — vedi sopra.
- Un segreto scaduto viene comunque consegnato. La scadenza è un invito, non una salvaguardia: rifiutare la consegna a una data stabilita fermerebbe contemporaneamente l'invio della posta, le banche dati e l'accesso al repository, e per giunta per un motivo amministrativo.
- Predisporre non commuta nulla. Lo fa solo l'adozione. È la forma costruttiva, non una mancanza.
- La cassaforte non può revocare nulla presso il fornitore. Completare una rotazione invalidando la vecchia credenziale resta compito dell'amministratore.
- Materiale di chiave perduto significa valori perduti. Per costruzione non esiste una via di recupero.
- La pulizia dipende dall'indicizzatore del wiki.
Dati del pacchetto
Plugin: wkvault
Spazio dei nomi: lib/plugins/wkvault/
Autore: Wolfgang van der Stille Wolfgang.van.der.Stille@gmail.com (The White Knight Labs)
Licenza: GPL 2