Sto lavorando a un progetto che implementa simulazioni distribuite: il codice arbitrario viene eseguito su più nodi e i risultati vengono successivamente raccolti e aggregati.
Ogni nodo è un'istanza di una macchina virtuale Ubuntu Linux ed esegue un processo principale che si occupa di inoltrare il codice da eseguire a un numero di processi di lavoro (1 per ogni core).
Questa domanda riguarda come assicurarsi che ciascun lavoratore operi in un ambiente sandbox senza ricorrere all'uso di un'istanza di macchina virtuale per ognuno di essi. I requisiti esatti per i lavoratori sono:
- fs : nessuna autorizzazione di scrittura, autorizzazione di sola lettura limitata a una singola directory (e sottocartelle)
- net : sono consentite solo comunicazioni locali (IPC, TCP, qualunque cosa ...)
- mem : limite sull'utilizzo della memoria (nessuna memoria di scambio) uccide se supera il limite mem
- cpu : solo 1 core consentito, uccidi se oltre il limite di tempo
Non dovrebbero essere imposte altre limitazioni: il lavoratore dovrebbe essere in grado di caricare librerie dinamiche (dalla cartella di sola lettura), generare nuovi thread o processi, chiamare la funzione di sistema, ecc ecc ma i limiti devono essere ereditati dalle entità generate / caricate e dovrebbe applicarsi in modo sommario (ad esempio non possiamo avere un lavoratore che genera due thread che usano 800 MB ciascuno, il limite di memoria per tale lavoratore è 1 GB).
Va da sé che il lavoratore non dovrebbe avere modo di aumentare i propri diritti.
Ho trascorso molto tempo a recensire le alternative disponibili (SELinux, AppArmor, cgroups, ulimit, namespace Linux, LXC, Docker, ...) per la soluzione più semplice che soddisfa i miei requisiti ma la mia esperienza sul campo è limitata.
Comprensione attuale: LXC e Docker sono un po 'difficili per il mio caso d'uso e non sono completamente sicuri 1 . AppArmor preferibile a SELinux a causa della configurazione più semplice, usalo per restrizioni fs e net; i cgroup preferibili a ulimit (che opera su un singolo processo), lo hanno usato per le restrizioni mem e cpu.
È questo il modo più semplice per raggiungere il mio obiettivo? Posso usare esclusivamente AppArmor o cgroups? C'è qualche ovvio buco nella sicurezza nel mio modello? La linea guida dovrebbe essere "il lavoratore può abbattere se stesso ma nient'altro" .