Modello di runtime e sicurezza dei plugin di Emdash CMS
Comprendi come EmDash separa l'esecuzione dei plugin fidati e sandboxati, e perché Dynamic Workers è fondamentale per i confini di sicurezza.
Perché esiste questo modello
La maggior parte degli ecosistemi di plugin per CMS fallisce sullo stesso confine: le estensioni girano con troppi privilegi.
EmDash affronta questo problema separando le modalità di esecuzione dei plugin e rendendo espliciti i confini delle capacità.
Due classi di esecuzione
Plugin fidati
- caricati come parte del runtime dell’applicazione
- adatti a codice che possiedi o di cui ti fidi completamente
- operativamente semplici, ma la sicurezza dipende dalla tua disciplina di revisione
Plugin sandboxati
- eseguiti in ambienti worker isolati
- progettati per logiche di estensione non fidate o semi-fidate
- limitati da capacità esplicite, limiti di runtime e regole di rete
La postura di sicurezza dipende meno dall’intento del plugin e più dalle garanzie di isolamento del runtime.
Dynamic Workers nell’architettura
Dynamic Workers è il meccanismo di isolamento usato per l’esecuzione sandbox su Cloudflare.
Senza questo, la modalità sandbox non è disponibile e dovresti operare solo con l’assunzione di plugin fidati.
In termini pratici:
- Piano gratuito: il CMS core funziona, la modalità plugin sandboxata no
- Piano a pagamento con Dynamic Workers: il modello sandbox diventa disponibile
Modello delle capacità: privilegio minimo per impostazione predefinita
Un plugin dovrebbe dichiarare solo ciò che gli serve:
- leggere contenuti
- scrivere in domini di contenuto specifici
- chiamare endpoint di rete in uscita
- attivare hook di workflow selezionati
Se una capacità non è concessa, l’operazione deve fallire in modo deterministico. Questo è un requisito di progettazione, non una cortesia “best effort”.
// Esempio: mantieni esplicito l'ambito delle capacità
export default definePlugin({
id: "notify-on-publish",
capabilities: ["read:content", "email:send"]
});
Guardrail di runtime che contano
Sicurezza e affidabilità dipendono entrambe da limiti rigidi:
- limiti di CPU e tempo reale impediscono handler fuori controllo
- tetti di memoria limitano abusi e perdite accidentali
- policy di rete bloccano tentativi arbitrari di esfiltrazione
Questi controlli trasformano i guasti dei plugin in incidenti circoscritti invece che in indisponibilità della piattaforma.
Modello di minaccia in una pagina
Presupponi che qualsiasi plugin di terze parti possa contenere:
- comportamenti malevoli
- dipendenze obsolete
- bug logici in condizioni di eventi non comuni
Il runtime dei plugin dovrebbe quindi garantire:
- contenimento del raggio d’impatto
- operazioni privilegiate negate per impostazione predefinita
- risultati di esecuzione verificabili
La fiducia deve essere guadagnata tramite policy, non concessa con l’installazione.
Modello operativo sul piano gratuito
Se lavori senza supporto sandbox:
- mantieni minimo il set di plugin
- preferisci plugin first-party o revisionati internamente
- esegui revisioni di dipendenze e permessi ai gate di rilascio
- isola, dove possibile, le integrazioni rischiose in servizi esterni
Questo è un modello praticabile per molti team, ma richiede una disciplina di governance più rigorosa.
Criteri decisionali: quando richiedere la modalità sandbox
Considera la modalità sandbox obbligatoria quando:
- installi su larga scala plugin di autori esterni
- la compliance richiede evidenze di isolamento più forti
- il rischio di business in caso di compromissione plugin è significativo
Considera la modalità sandbox opzionale quando:
- la superficie dei plugin è ridotta e completamente auditata
- il team controlla end-to-end la pipeline di rilascio
Checklist pratica di governance
Prima di abilitare qualsiasi plugin in produzione:
- documenta proprietario e scopo del plugin
- rivedi capacità richieste ed endpoint in uscita
- definisci responsabile e procedura di rollback
- valida il comportamento in staging con iniezione di errori
La sicurezza dei plugin non è una decisione architetturale una tantum. È un processo operativo supportato da confini di runtime.