Files
ThothII/docs/operations/psd-server-survey-remediation-checklist.md
T

381 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PSD Server Survey — Remediation Checklist
## Purpose and authority
Questo documento permette al proprietario e a Sol di discutere, decidere e chiudere uno alla volta
i blocker emersi dal survey read-only del server PSD. È il punto di ripresa operativo tra sessioni:
registra soltanto fatti sanitizzati, decisioni, responsabili e riferimenti a evidenze protette.
Fonti normative:
- `docs/operations/psd-server-sol-orchestration-prompt.md`
- `docs/plans/2026-08-20-psd-server-deployment-program.md`
- `docs/plans/2026-08-20-psd-server-survey.md`
- `docs/superpowers/specs/2026-08-20-psd-survey-remediation-checklist-design.md`
Questo documento non autorizza modifiche a server, servizi, database, Nginx, load balancer,
Authentik, Aritmolab o repository esterni.
## Program gate
- Program result: `SURVEY_NO_GO`
- Survey report: `/var/tmp/thothii-psd-survey.fJh7DS/survey-report.md`
- Survey report SHA-256: `36461b6c7d1e44d055f24d6919e892b7017352ac9eb99ac67b9ae62f0614f8e7`
- Legacy stack: deve restare acceso e invariato durante la discussione di questa lista
- Project A remains forbidden fino a un nuovo `SURVEY_GO` e all'approvazione esplicita del proprietario
- Project B remains forbidden fino ai PASS automatico, umano e del proprietario per Project A
## Current activity and resume point
- Current activity: `1`
- Title: Rotate or revoke the exposed DWH credential safely
- Resume from: Activity 1, review the written per-installation authentication design, then prepare
its executable implementation and rotation plan
- Discussion rule: una sola attività può essere `IN_DISCUSSION`
- Allowed states: `PENDING`, `IN_DISCUSSION`, `BLOCKED`, `PASS`
## How to use this checklist
1. Leggere `Current activity` e `Resume from`.
2. Discutere soltanto l'attività corrente.
3. Non inserire password, token, cookie, chiavi private, stringhe di connessione, claim grezzi o
valori di secret.
4. Registrare solo percorsi protetti, owner, mode, timestamp, nomi o ID di oggetti, checksum ed
esiti sanitizzati.
5. Alla fine della discussione aggiornare stato, note, decisione, evidenze, blocker e prossimo
passo.
6. Spostare `Current activity` solo quando il gate dell'attività corrente è soddisfatto oppure il
proprietario decide esplicitamente di parcheggiarla come `BLOCKED`.
7. Non riaprire un'attività `PASS` salvo nuova evidenza che ne invalidi la decisione.
## Activity summary
| ID | Attività | Stato | Responsabile | Prossimo gate |
|---|---|---|---|---|
| 1 | Rotazione controllata della credenziale DWH esposta | `IN_DISCUSSION` | Proprietario del progetto | Revisionare la specifica scritta e approvare il piano eseguibile |
| 2 | Assegnazione dei responsabili dei componenti condivisi | `PENDING` | Unassigned | Elenco owner confermato |
| 3 | Risoluzione del dominio pubblico `.it` oppure `.com` | `PENDING` | Unassigned | Origine autorevole documentata |
| 4 | Topologia e responsabilità del load balancer | `PENDING` | Unassigned | Route, health, TLS, rollback e allowlist verificati |
| 5 | Accesso read-only protetto ad Authentik | `PENDING` | Unassigned | Inventario API autorizzato e redatto |
| 6 | Accesso catalog-only protetto a PostgreSQL | `PENDING` | Unassigned | Catalogo, grant e PostgREST verificati |
| 7 | Backup e rollback del vecchio ThothII | `PENDING` | Unassigned | Backup verificabile e restart recipe completa |
| 8 | Accesso Git read-only al workspace PSD | `PENDING` | Unassigned | SHA, descriptor e deploy key verificati |
| 9 | Metadati Pi e LLM verificabili | `PENDING` | Unassigned | Versione, policy e reachability redatte |
| 10 | Conservazione evidenze e nuovo survey bounded | `PENDING` | Unassigned | Nuovo report e decisione proprietario |
## Activity 1: Rotate or revoke the exposed DWH credential safely
- Status: `IN_DISCUSSION`
- Accountable owner: Proprietario del progetto (confermato dall'utente)
- Objective: sostituire o revocare in modo controllato la credenziale DWH comparsa nell'output
interno del survey, senza interrompere consumer legittimi e senza esporne nuovamente il valore.
- Why this is required: la credenziale deve essere considerata compromessa; non può essere usata
come base affidabile per completare il survey o iniziare Project A.
- Ordered actions:
1. identificare il team che gestisce la route DWH, il suo meccanismo di autenticazione e la
custodia del secret;
2. determinare il tipo di credenziale senza leggerla o copiarla in questa checklist;
3. inventariare i consumer tramite riferimenti di configurazione e secret object;
4. scegliere una transizione a doppia credenziale oppure una finestra atomica con rollback;
5. generare e distribuire il nuovo secret attraverso il meccanismo protetto approvato;
6. verificare i consumer autorizzati, l'assenza del nuovo valore nei log e la continuità del
vecchio stack;
7. revocare la vecchia credenziale e provare che non venga più accettata;
8. registrare soltanto evidenze redatte.
- Required redacted evidence:
- owner e autorizzazione della rotazione;
- tipo e identificatore non sensibile della credenziale;
- percorso protetto o secret object, senza contenuto;
- elenco dei consumer aggiornati;
- timestamp e risultati dei test positivi e negativi;
- conferma di revoca della credenziale precedente;
- procedura di rollback e relativo esito.
- Discussion notes:
- la credenziale osservata è stata identificata, senza rileggerne il valore, come chiave statica
`X-API-Key` applicata da Nginx alla route DWH REST `/dwh/`; è distinta dalle password PostgreSQL;
- `/home/chirone/chirone/etl` documenta PostgREST come integrazione HTTP esterna, mentre i processi
ETL e Superset usano PostgreSQL diretto;
- il vecchio ThothII e Chirone WP3 usano PostgreSQL diretto nei profili locali/server; Supabase
Studio è un pannello amministrativo e non appartiene al data-plane applicativo;
- il design approvato resta invariato: il Mac usa `rest_api`, il nuovo ThothII sul server PSD usa
`postgres_direct` con ruolo DWH dedicato e realmente read-only;
- la ricognizione dei repository ha rilevato materiale sensibile hardcoded in file tracciati,
senza riportarne i valori. La bonifica e la rotazione dei segreti coinvolti restano obbligatorie.
- il censimento statico non trova consumer `/dwh/` in ETL, Superset o nel Chirone WP3 attivo:
usano PostgreSQL diretto. Il vecchio container `thothii-core-1` è configurato con
`transport: direct`; i due ThothII restano comunque tecnicamente capaci di usare REST;
- i log Nginx redatti provano 18.523 richieste `/dwh/` dal 23 luglio al 19 agosto 2026:
18.481 hanno user-agent classificato `python-requests` e gli endpoint RPC corrispondono
prevalentemente a introspezione e campionamento Thoth. La sorgente è una sola, privata e
compatibile con un proxy/load balancer; non prova che esista un solo client finale;
- l'ipotesi che il traffico sia generato dal job ETL delle 03:00 è smentita: nella finestra
02:30–03:30 Europe/Rome non compare nessuna richiesta `/dwh/`. Il 99,37% del traffico è
concentrato il 13 agosto tra le 17:38 e le 20:03;
- la firma del 13 agosto corrisponde a undici preprocessing Thoth: undici `list_tables`, e
per ciascuna esecuzione 163 chiamate a ognuno dei tre RPC per-tabella più 1.180 `top_values`,
cioè 1.670 richieste per ciclo. `PROJECT_STATE.md` registra proprio il preprocessing PSD live
del 13 agosto su 163 tabelle, con più rerun e correzioni emerse durante l'esecuzione;
- il DAG ETL `nightly_etl_orchestrator` è schedulato con `0 3 * * *`, ma scrive il DWH tramite
PostgreSQL/`psycopg2` diretto. Nel codice tracciato non chiama `/dwh/`, gli RPC Thoth o
`tht workspace preprocess`, né emerge un trigger indiretto verso Thoth;
- la configurazione Nginx nominalmente attiva accetta una sola chiave tramite confronto letterale
in un endpoint `auth_request`. Non esiste una mappa a più chiavi: la doppia credenziale richiede
un refactor, backup, `nginx -t`, reload e rollback in una fase di mutazione autorizzata.
- il proprietario conferma che il ThothII sul Mac deve continuare a usare REST e che sono previste
molte altre installazioni remote, senza tunnel SSH verso Supabase. `/dwh/` è quindi
un'interfaccia remota stabile e multi-client, non una compatibilità temporanea.
- il proprietario decide di mantenere il certificato TLS corrente. L'endpoint esterno REST
presenta lo stesso certificato self-issued di Nginx, valido fino al 21 giugno 2027 e con SAN
per `supabase-aritmolab.policlinicosandonato.it`; non copre un eventuale dominio `.com`;
- il manuale di installazione deve trattare `TLS_CA_FILE` come necessario per ogni client che
non abbia già quel certificato nel proprio trust store, spiegando consegna affidabile,
verifica del fingerprint, rinnovo e aggiornamento coordinato delle installazioni;
- non esiste un ambiente di test. La rotazione dovrà quindi usare una verifica production-safe:
backup, finestra dual-key, RPC `ping` senza dati clinici, test positivo/negativo e rollback.
- il proprietario approva un componente `dwh-auth` riutilizzabile ma opzionale, incluso nel
repository senza modificare il protocollo dei client portabili o il CLI `tht`;
- su PSD `dwh-auth` avrà un lifecycle `systemd` indipendente dallo stack ThothII e comunicherà
con Nginx tramite socket Unix. Lo stop o la sostituzione di ThothII non dovrà interrompere i
client REST;
- il registro sarà composto da file protetti, versionati e aggiornati atomicamente, con un file
per generazione della chiave. Conterrà digest SHA-256 di segreti casuali da almeno 256 bit e
metadati non sensibili, senza SQLite o nuove dipendenze runtime;
- le chiavi saranno assegnate alle installazioni, non alle persone. Saranno prive di scadenza
predefinita, con scadenza opzionale e revoca manuale;
- creazione e import leggeranno o scriveranno soltanto file protetti. Nessun segreto sarà
accettato come argomento, stampato o inserito in log, JSON, documenti o repository;
- la gestione sarà fail-closed: credenziali non valide riceveranno `401`, mentre guasti del
servizio o del registro saranno mappati a `503` senza fallback permissivo;
- il proprietario conferma che le sessioni, gli indici e le cache del vecchio ThothII erano solo
test e non richiedono migrazione o attività di salvaguardia dedicate. Restano necessari il
rollback della route DWH condivisa e il rispetto del gate esplicito prima di fermare lo stack;
- il design approvato è scritto in
`docs/superpowers/specs/2026-08-20-dwh-rest-per-installation-auth-design.md` e richiede una
revisione del proprietario prima del piano di implementazione.
- Decision: il nuovo ThothII server userà PostgreSQL diretto; il Mac e le future installazioni
remote useranno REST. La chiave condivisa corrente non è un modello finale accettabile: la
rotazione esposta userà una transizione a doppia credenziale e l'architettura target assegnerà
un'identità revocabile distinta a ogni installazione. Supabase Studio non sarà usato come
trasporto. Il proprietario del progetto è accountable per coordinare la rotazione. Il meccanismo
target è il servizio server-only `dwh-auth`, indipendente dallo stack ThothII, con registro a file
e una chiave revocabile per installazione.
- Blockers: la specifica scritta attende la revisione del proprietario; mancano ancora il piano
eseguibile, la sorgente protetta per importare la chiave legacy, la procedura realizzata di
aggiornamento/verifica del Mac, la documentazione TLS completa, l'autorizzazione alla mutazione
e la revoca provata della vecchia chiave.
- Next step: dopo l'approvazione della specifica scritta, preparare il piano eseguibile di
implementazione e rotazione dual-key con test automatici, aggiornamento Mac, prova
positiva/negativa e rollback. Nessuna modifica Nginx avviene durante questa discussione.
## Activity 2: Identify accountable owners for shared components
- Status: `PENDING`
- Accountable owner: Unassigned
- Objective: associare ogni componente condiviso a una persona o a un team con autorità di lettura,
modifica, approvazione e rollback.
- Why this is required: la leggibilità di una configurazione non implica autorità a modificarla.
- Ordered actions:
1. identificare gli owner di DNS/load balancer, Nginx/certificati, Authentik,
Supabase/PostgreSQL, Aritmolab, workspace Git e backup legacy;
2. registrare il canale di approvazione e la procedura di escalation;
3. confermare separatamente chi può autorizzare Project A e Project B.
- Required redacted evidence: nomi dei team, ruoli, canali operativi e conferme di responsabilità;
nessun contatto personale sensibile.
- Discussion notes: Not discussed
- Decision: No decision recorded
- Blockers: nessun owner condiviso è stato ancora formalmente confermato.
- Next step: compilare la matrice owner/componente dopo la chiusura dell'Activity 1.
## Activity 3: Resolve the authoritative public origin
- Status: `PENDING`
- Accountable owner: Unassigned
- Objective: scegliere sulla base di evidenze l'unica origine pubblica finale tra il dominio `.it`
osservato e il dominio `.com` riportato nel piano.
- Why this is required: callback OIDC, certificato, cookie, Nginx, load balancer e sidebar devono
concordare sulla stessa origine HTTPS.
- Ordered actions:
1. ottenere la dichiarazione autorevole dell'owner DNS/load balancer;
2. verificare record DNS, route, backend, certificato e redirect;
3. confrontare l'origine con la configurazione e la sidebar di Aritmolab;
4. registrare l'origine approvata e le discrepanze da correggere in Project B.
- Required redacted evidence: hostname finale, record/route sanitizzati, SAN del certificato,
destinazione sidebar e approvazione dell'owner.
- Discussion notes: il survey ha osservato `.it`; il piano cita `.com`. La discrepanza è aperta.
- Decision: No decision recorded
- Blockers: owner DNS/load balancer non identificato e origine browser-visible non provata.
- Next step: ottenere la dichiarazione autorevole dopo l'assegnazione degli owner.
## Activity 4: Establish the load-balancer contract
- Status: `PENDING`
- Accountable owner: Unassigned
- Objective: documentare il confine effettivo del load balancer e la procedura reversibile per le
route temporanea e finale.
- Why this is required: il survey locale non ha potuto provare owner, backend, health check, TLS,
source range o allowlist.
- Ordered actions:
1. identificare superficie di configurazione e owner;
2. registrare backend, porta, health check, punto TLS e source range verso Nginx;
3. documentare deploy, validazione e rollback;
4. stabilire se una route temporanea può essere limitata agli operatori;
5. definire una prova positiva e una negativa dell'allowlist senza creare ancora la route.
- Required redacted evidence: nomi/ID delle route, backend e health check sanitizzati, ownership,
capacità di allowlist e procedura di rollback.
- Discussion notes: Not discussed
- Decision: No decision recorded
- Blockers: il load balancer non è ispezionabile dalla superficie locale autorizzata.
- Next step: coinvolgere l'owner identificato nell'Activity 2.
## Activity 5: Provide protected read-only Authentik survey access
- Status: `PENDING`
- Accountable owner: Unassigned
- Objective: permettere un inventario Authentik bounded e read-only della versione installata.
- Why this is required: applicazioni, provider, flow, mapping, gruppi, service account, permessi API
e procedura di export non sono stati verificati.
- Ordered actions:
1. identificare l'owner Authentik e la procedura di backup/export;
2. predisporre una credenziale read-only o un'esecuzione assistita dall'owner;
3. comunicare solo percorso, owner, mode e usabilità del secret;
4. inventariare nomi/ID e convenzioni senza recuperare secret write-only;
5. confrontare il comportamento con OpenAPI e documentazione della release installata.
- Required redacted evidence: versione, nomi/ID degli oggetti, permission set della credenziale,
riferimento all'export e risultati sanitizzati.
- Discussion notes: Not discussed
- Decision: No decision recorded
- Blockers: nessuna credenziale amministrativa/API utilizzabile è stata stabilita.
- Next step: ottenere dall'owner un meccanismo protetto post-rotazione.
## Activity 6: Provide protected catalog-only PostgreSQL survey access
- Status: `PENDING`
- Accountable owner: Unassigned
- Objective: verificare database, schemi, ruoli, grant, migrazioni e PostgREST con sole query di
catalogo.
- Why this is required: il runtime DWH read-only, lo stato di `thoth_sessions` e i confini Supabase
non sono provati.
- Ordered actions:
1. identificare DBA e procedura protetta di connessione;
2. verificare database, utente corrente, schemi e owner;
3. verificare i grant sullo schema `datawarehouse` senza write probe clinici;
4. verificare stato di `thoth_sessions` e migration records;
5. verificare gli schemi esposti da PostgREST;
6. registrare TLS/CA, backup e convenzioni per ruoli migrator/runtime.
- Required redacted evidence: risultati catalogici bounded, nomi dei ruoli, attributi e grant,
schemi PostgREST, riferimento a backup e TLS; nessuna stringa di connessione.
- Discussion notes: Not discussed
- Decision: No decision recorded
- Blockers: non esiste ancora un meccanismo psql approvato post-rotazione.
- Next step: far predisporre dal DBA l'accesso catalog-only.
## Activity 7: Prove legacy backup and rollback
- Status: `PENDING`
- Accountable owner: Unassigned
- Objective: dimostrare che il vecchio ThothII possa essere preservato e ripristinato prima di
qualsiasi stop.
- Why this is required: source, container, bind e network sono inventariati, ma backup verificato,
controller e restart recipe non sono disponibili.
- Ordered actions:
1. identificare owner e meccanismo lifecycle compatibile;
2. confermare assenza di lavoro utente da preservare;
3. definire contenuti, destinazione e protezione del backup;
4. definire checksum e verifica di leggibilità;
5. scrivere comandi esatti di stop/start e ordine di chiusura/ripristino route;
6. eseguire il backup soltanto nella successiva fase autorizzata, prima dello stop.
- Required redacted evidence: inventario, percorso backup, checksum, owner, restart recipe e
rollback route; nessun contenuto di secret.
- Discussion notes: il legacy stack è ancora attivo e invariato.
- Decision: No decision recorded
- Blockers: lifecycle supportato, backup owner e comandi esatti non stabiliti.
- Next step: approvare la procedura senza eseguirla durante la discussione.
## Activity 8: Provide read-only PSD workspace Git access
- Status: `PENDING`
- Accountable owner: Unassigned
- Objective: verificare il repository remoto condiviso e il suo stato corrente dal server senza
capacità di push.
- Why this is required: SHA, descriptor, trasporti, Evidence, annotazioni e scope della deploy key
non sono stati osservati dal server.
- Ordered actions:
1. identificare curator e owner della deploy key;
2. fornire un riferimento protetto alla chiave server read-only;
3. verificare remote, branch e SHA con modalità non interattiva;
4. verificare catalogo, schema v3, trasporti, Evidence e annotazioni;
5. provare che la credenziale server non possa effettuare push.
- Required redacted evidence: remote, branch, SHA, descriptor blob, stato Evidence/annotations e
attestazione read-only della deploy key.
- Discussion notes: Not discussed
- Decision: No decision recorded
- Blockers: nessun checkout workspace o deploy credential utilizzabile è stato localizzato.
- Next step: coinvolgere il curator e predisporre l'accesso server read-only.
## Activity 9: Make Pi and LLM metadata verifiable
- Status: `PENDING`
- Accountable owner: Unassigned
- Objective: verificare versione Pi, provider, modello, thinking level, riferimento credenziale e
reachability LLM senza esporre il secret.
- Why this is required: la root Pi legacy non è attraversabile dall'operatore del survey e i
default del nuovo source non provano la configurazione in esecuzione.
- Ordered actions:
1. identificare owner della configurazione Pi/LLM;
2. scegliere tra esecuzione assistita dall'owner e accesso read-only allowlisted;
3. estrarre esclusivamente metadati non sensibili;
4. eseguire un controllo bounded di reachability senza stampare credenziali;
5. registrare anche il mismatch NVML/GPU come rischio separato, non come blocker CPU.
- Required redacted evidence: versione, provider, model ID, thinking level, endpoint sanitizzato,
percorso/mode della credenziale e risultato di reachability.
- Discussion notes: host `x86_64`; due GPU NVIDIA osservate, ma `nvidia-smi` non è utilizzabile per
mismatch driver/libreria NVML. Il deployment CPU resta da valutare con le immagini pinned.
- Decision: No decision recorded
- Blockers: configurazione Pi protetta non leggibile e nessun endpoint LLM credential-free noto.
- Next step: ottenere un controllo assistito o permessi read-only mirati.
## Activity 10: Retain evidence and run the missing bounded survey checks
- Status: `PENDING`
- Accountable owner: Unassigned
- Objective: conservare le evidenze protette, ripetere soltanto i controlli mancanti e produrre una
nuova decisione verificabile.
- Why this is required: il report corrente è `SURVEY_NO_GO` e non può essere promosso per inferenza.
- Ordered actions:
1. scegliere il protected evidence root definitivo;
2. trasferire la directory del survey senza modificarne i contenuti e verificare il digest;
3. confermare che le Activity 1–9 siano `PASS` oppure abbiano una risoluzione proprietario
esplicitamente accettata;
4. eseguire solo i controlli bounded mancanti del piano survey;
5. aggiornare il report e verificarne checksum e secret hygiene;
6. chiedere la decisione esplicita del proprietario.
- Required redacted evidence: percorso finale, digest, matrice Activity 1–9, nuovi risultati
bounded, report aggiornato e decisione firmata.
- Discussion notes: Not discussed
- Decision: No decision recorded
- Blockers: dipende dalla chiusura delle Activity 1–9 e dall'approvazione del retention root.
- Next step: avviare soltanto dopo la chiusura dei blocker precedenti.
## Fresh survey and owner gate
Un nuovo `SURVEY_GO` richiede contemporaneamente:
- credenziale DWH precedente revocata e rotazione verificata;
- owner e autorità di modifica/rollback identificati;
- origine pubblica unica e load-balancer contract provati;
- accessi read-only Authentik, PostgreSQL, workspace Git e Pi/LLM verificati;
- identità DWH dimostrata read-only;
- backup e restart recipe legacy verificabili;
- risorse e percorsi della nuova installazione approvati;
- report redatto, secret-scan valido e checksum verificato;
- approvazione esplicita del proprietario.
Il PASS tecnico del survey non autorizza automaticamente Project A. L'autorizzazione deve essere
registrata separatamente.
## Change log
| Data | Attività | Modifica | Autore |
|---|---|---|---|
| 2026-08-20 | Initial | Creata checklist; Activity 1 aperta, Activity 2–10 pending | Sol |