Docker come sandbox per codice non attendibile

33

Ho creato un'applicazione web che, tra le altre cose, consente agli utenti di scrivere, compilare ed eseguire codice (Java, C #). L'applicazione crea un contenitore Docker per ogni utente in cui avviene la compilazione e l'esecuzione del codice. Ho preso le seguenti misure per proteggere il contenitore:

  • Questo contenitore non ha dati persistenti o condivisi
  • Non ha accesso all'API docker (che è protetta con TLS)
  • Non ci sono informazioni all'interno del contenitore che l'utente non dovrebbe conoscere
  • L'utente non sarà a conoscenza del fatto che il compilatore si trova all'interno di un contenitore

Posso considerare sicuro questo contenitore per l'esecuzione di codice non affidabile? Esistono metodi conosciuti per effettuare il rendering della macchina host all'interno del contenitore in una configurazione come questa?

    
posta Hartger 11.12.2015 - 11:28
fonte

3 risposte

29

tl; dr : le soluzioni contenitore non garantiscono mai e non garantiranno mai l'isolamento completo, ma se necessario, utilizza la virtualizzazione.

Approccio bottom up e top down

Docker (e lo stesso vale per le soluzioni di container simili) non garantisce l'isolamento completo e non può essere confuso con la virtualizzazione. L'isolamento dei container si ottiene aggiungendo alcune barriere tra loro, ma utilizzare ancora risorse condivise come il kernel. La virtualizzazione d'altra parte ha risorse condivise molto più piccole, che sono ora più facili da comprendere e ben collaudate, spesso arricchite da funzionalità hardware per limitare l'accesso. Docker stesso descrive questo nel articolo di sicurezza Docker come

One primary risk with running Docker containers is that the default set of capabilities and mounts given to a container may provide incomplete isolation, either independently, or when used in combination with kernel vulnerabilities.

Considera la virtualizzazione un approccio top-down

Per la virutalizzazione, si inizia con un isolamento praticamente completo e si forniscono alcune interfacce ben protette e ben descritte; questo significa che puoi essere piuttosto sicuro che uscire da una macchina virtuale è difficile. Il kernel non è condiviso, se hai qualche exploit del kernel che ti permette di uscire dalle restrizioni dell'utente, l'hypervisor è fino a quando ti trovi tra te e altre macchine virtuali.

Questo non implica un perfetto isolamento. Ancora e ancora, si riscontrano problemi con l'hypervisor, ma la maggior parte di questi sono attacchi molto complicati con un ambito limitato che sono difficili da eseguire (ma esistono anche molto critici, "facili da sfruttare".

I contenitori d'altra parte sono di tipo bottom-up

Con i container, si inizia dall'esecuzione di applicazioni sullo stesso kernel, ma si aggiungono barriere (namespace del kernel, cgroups, ...) per isolarli meglio. Mentre questo fornisce alcuni vantaggi come overhead inferiore, è molto più difficile "essere sicuri" di non aver dimenticato nulla, il Kernel di Linux è un software molto grande e complesso. E il kernel stesso è ancora condiviso, se c'è un exploit nel kernel, è probabile che si possa scappare all'host (e / o altri contenitori).

Utenti all'interno e all'esterno dei contenitori

Specialmente pre- Docker 1.9 che dovrebbe ottenere gli spazi dei nomi utente significa praticamente "radice del contenitore ha anche i privilegi di root dell'host "non appena viene trovata un'altra barriera mancante nella macchina Docker (o l'exploit del kernel). Ci sono stati tali problemi prima , dovresti aspettarti di più per venire e suggerimento Docker che

take care of running your processes inside the containers as non-privileged users (i.e., non-root).

Se sei interessato a maggiori dettagli, estep ha pubblicato un buon articolo su http://integratedcode.us spiegando gli spazi dei nomi degli utenti .

Limitare l'accesso root (ad esempio, forzando un utente non privilegiato durante la creazione dell'immagine o almeno utilizzando i nuovi spazi dei nomi utente) è una misura di sicurezza necessaria e basilare per fornire isolamento e potrebbe dare soddisfacente isolamento tra i contenitori. Usando utenti con restrizioni e spazi dei nomi utente, l'escape sull'host diventa molto più difficile, ma non si deve essere sicuri che ci sia solo un altro modo non ancora considerato di uscire da un contenitore (e se questo include l'utilizzo di un problema di sicurezza senza patch nel kernel ), e non dovrebbe essere usato per eseguire codice non affidabile.

    
risposta data 11.12.2015 - 12:02
fonte
12

Mentre la risposta di @ jens-erat ha il punto di alto livello corretto che la virtualizzazione fornisce un isolamento superiore alle soluzioni di containerizzazione come la finestra mobile, non è una configurazione in bianco e nero.

Da un lato c'è stato un numero di ospiti - > host breakout nella tecnologia di virtualizzazione (ad esempio la vulnerabilità " Venom " nei driver dei dispositivi floppy virtuali) così come qualsiasi controllo di sicurezza l'isolamento fornito dalla virtualizzazione non è al 100%.

Nell'ottica di rafforzare l'installazione della finestra mobile per migliorare l'isolamento e ridurre il rischio, è possibile adottare una serie di misure per proteggere l'installazione della finestra mobile.

  1. La finestra mobile ha alcune buone indicazioni di sicurezza disponibili su hardening. C'è una (poco aggiornata) Guida alla sicurezza CIS e anche benchdocker che può essere utilizzato per rivedere le configurazioni

  2. A seconda del modo in cui la tua applicazione opera (ad esempio, come viene attivato il codice per la compilazione) è possibile modificare l'operazione della finestra mobile per ridurre le possibilità di attività dannose. Ad esempio, supponendo che il codice arrivi a livello di host, potresti essere in grado di negare l'accesso alla rete al contenitore ( --net none switch su docker run ). Puoi anche verificare se puoi eliminare ulteriori capacità per ridurre il processo in esecuzione nel contenitore può fare.

  3. Considera l'utilizzo di profili AppArmor per limitare le risorse. AppArmor può essere utilizzato per limitare ciò che può essere fatto nel contenitore e puoi usare strumenti come bane per generare profili per le tue applicazioni.

  4. Inoltre, consiglierei di implementare un monitoraggio a livello di host per cercare un eventuale accesso malevolo. Come sapete cosa i contenitori dovrebbero / non dovrebbero fare, avere un monitoraggio relativamente severo vi avviserà di ogni possibile breakout

Un'altra area che potrebbe essere produttiva per rafforzare questo tipo di configurazione è l'uso di sistemi host e immagini del contenitore. Minore è il codice esposto, minore è la superficie di attacco. Qualcosa come CoreOS o Ubuntu Snappy Core potrebbe valere la pena guardare

    
risposta data 13.12.2015 - 13:03
fonte
1

La mia soluzione sarebbe qualcosa come SmartOS. Il motivo è che SmartOS supporta Docker, KVM e zone. Pertanto, è possibile utilizzarli in combinazione per impedire l'esecuzione di codice dannoso oltre un contenitore Docker. Dopo tutto, i container Docker sono ancora file su un filesystem.

    
risposta data 31.07.2018 - 11:14
fonte

Leggi altre domande sui tag