Pyrite ENMenu Scarica l'alpha
Indice della documentazione

Documentazione · riferimento

Sicurezza e note operative

Cosa sapere per far funzionare bene Pyrite in rete locale, cosa fa il motore per proteggere app e dati e cosa resta compito di chi costruisce e approva le app.

01 /Stesso indirizzo per portale e app

L'accesso unico si basa su un cookie di sessione del motore. Il browser lega i cookie al nome del server e non alla porta, quindi portale e app condividono la sessione solo se vengono aperti con lo stesso nome.

Se apri il portale con http://192.168.1.20:8080/ e un'app con http://server-app:8101/, per il browser sono due posti diversi e l'app chiede di nuovo il login. Scegli una forma, o sempre l'IP o sempre il nome, e usala dappertutto: preferiti, collegamenti, email. Gli indirizzi di questo esempio sono inventati.

Se ogni app ha il suo nome (Regole di rete), chi apre un'app senza essere entrato passa dal portale, scrive la password una volta e torna da solo all'app: nessun cookie vale per tutto il dominio. Con nome e porta non cambia niente (vedi Accesso: un solo accesso, tentativi sbagliati, la console).

02 /Firewall e porte

03 /Solo rete interna

Prima di tutto la rete locale

Senza un certificato il motore lavora in HTTP e password e dati viaggiano in chiaro sulla rete locale. L'HTTPS si accende dalla pagina Certificati: un certificato per il motore e per tutte le porte delle app (CA aziendale, file .pfx o .pem, o una CA interna creata da Pyrite). Si può avere anche Let's Encrypt (con il DNS di Cloudflare o con la porta 443) e più di un certificato: vedi HTTPS e certificati. Si possono aprire alcune app a internet (Regole di rete), ma solo con HTTPS acceso, un'app alla volta e solo per dati non sensibili. La console da internet non si apre mai.

04 /Amministrazione centralizzata

05 /La console e i livelli

L'import di persone e gruppi da Excel (pagina Persone) rispetta i livelli: un Admin aggiunge solo persone di livello Utente, solo in gruppi che può modificare e solo con accessi alle app che gestisce (per lui un'app non sua «non esiste»); nessuno può importare un Proprietario. È solo aggiunta e tutto o niente; le password provvisorie sono in un file che si scarica una volta, per 10 minuti, e non finiscono in eventi, risposte o note.

L'import intelligente della scheda «Importa» scrive direttamente nel database dell'app, come il server: le regole API e le rotte dell'app non contano. Per questo un'app che tiene i dati in ordine con le sue rotte o i suoi hook (spostamenti, storici, stati) deve dire in app.json, campo import.consoleCollections, le sole raccolte in cui la console può importare e annullare ([] = nessuna); senza, la scheda avvisa che si vedono tutte. È tutto o niente, in due tempi, con il tetto di 50.000 righe e 60 secondi di scritture, e «Annulla» toglie tutto l'import ma si ferma se record di altri sono collegati a quelli importati o se dei record sono cambiati dopo. Dalle pagine delle app serve una ricetta approvata dall'amministratore (toolAccess), con i limiti di righe. I file JSON si leggono con tetti di dimensione (128 MB il file, 16 MB per elemento).

06 /Accessi e sessioni

07 /Le chiusure di sicurezza delle app

Ogni app con database gira in un processo separato, con i suoi dati. In più il motore la chiude dentro tre recinti:

  1. Una chiave per ogni app. Il motore parla con ogni app con una chiave sua, diversa da quella delle altre. L'app la riceve all'avvio e la toglie subito dalle variabili d'ambiente, così i suoi script non la vedono.
  2. Porta interna chiusa. La porta interna di un'app risponde solo alle richieste che arrivano dal motore con la chiave giusta. Un'altra app, o un altro programma sul server, non la può usare per scavalcare la porta d'ingresso.
  3. Script confinati. Gli script dell'app (hook e migrazioni) non avviano programmi e non chiudono il processo. Leggono file solo dentro la cartella dell'app e li scrivono solo nella sua cartella dei dati, state: la scheda app.json, il codice in release e i log per loro sono in sola lettura, quindi un'app non può cambiarsi da sola accesso, ruoli o strumenti. Non possono nemmeno usare il database per aprire o scrivere file fuori dalla cartella. Non passano dai collegamenti: un percorso che attraversa un collegamento simbolico o una giunzione di Windows dentro la cartella dell'app è rifiutato, anche se porta dentro la cartella. Fa eccezione solo la cartella state stessa, che l'amministratore può spostare su un altro disco con una giunzione (vedi dati, backup e spazio su disco).

Gli strumenti del motore che le app usano dai loro script, come l'import, lavorano dentro gli stessi confini: file della cartella dell'app e database dell'app.

Un'app non può chiamare il motore (console, portale) né un'altra app dello stesso server: riceve un rifiuto (403) e nella console compare un evento. Il limite, detto chiaro: il recinto riduce molto quello che uno script può fare, ma è una difesa dentro il programma. Lo script gira nello stesso processo del motore di quell'app, con lo stesso utente di Windows. La garanzia piena, un utente di Windows per ogni app, non c'è in questa versione: vedi Che cosa può fare un'app.

Rete in uscita

Un quarto recinto riguarda quello che gli script dell'app chiamano fuori dal server. Gli script raggiungono solo gli indirizzi che l'app dichiara in app.json, campo network (allow: in https; allowHttp: anche in http, solo per sistemi interni che non hanno https). Senza network non raggiungono nessun indirizzo. Il motore controlla anche l'indirizzo vero dopo la risoluzione del nome, e un nome scritto per intero può portare anche a un server della rete interna (con l'asterisco solo indirizzi pubblici). La scheda «Rete in uscita» di ogni app ha due modi: Blocca e Avvisa (passa tutto, e il motore conta quello che bloccherebbe). Le app partono in Blocca. La pagina AI mostra le chiamate ai modelli AI e i costi.

Rotte lente

Il motore aspetta al massimo 4 minuti e 50 secondi la risposta di una rotta degli script di un'app. Poi risponde lui con un 504 dal testo chiaro (un 502 se l'app chiude la connessione senza rispondere, anche di colpo); un'app ferma o in riavvio dà il solito 503. Il motore non ripete mai una richiesta già inviata: la rotta può aver finito il lavoro lo stesso, quindi prima di riprovare si controlla. Il 504 e il 502 lasciano un avviso nello Storico del motore. Il motore riusa le connessioni verso le app, così sotto carico non dà falsi «non disponibile».

08 /Cosa il motore non controlla

Il motore decide chi entra in un'app e la tiene nel suo recinto. Il resto dipende dall'app e da chi la approva.

09 /Credenziali e password

10 /Dati, backup e spazio su disco