Mi piacerebbe creare un'istanza Docker indurita, principalmente per l'esecuzione di micro-servizi come applicazioni golang compilate staticamente. Quello che sto cercando è di proteggere il sistema operativo host da un contenitore e contenitori rogue l'uno dall'altro. Ho provato a riassumere la situazione con il seguente scenario.
Scenario:
Abbiamo un server con un SO minimo come Alpine Linux (SO basato su busybox), con SElinux e grsec installati, attivati e configurati correttamente.
Su questo server esegue un'istanza Docker con 2 contenitori in esecuzione, A e B e un volume V.
Il contenitore A contiene un'applicazione staticamente compilata senza dipendenze, collegata in rete a Internet pubblica (app Web o API pubblica). Questa applicazione contiene un bug ENORME come l'esecuzione di codice arbitrario / upload / shell inversa, il peggio che si possa pensare. Questo contenitore è anche collegato in rete al volume V come destinazione di caricamento, database, ecc.
Il SO host contiene un flag che può essere letto solo quando root (applicato da SElinux).
Il contenitore B contiene anche un flag e un'applicazione, ma nessuna connessione con il mondo esterno.
Attaccante:
- Umano, conosce l'enorme bug nell'applicazione.
- Vuole ottenere le bandiere. I dati in V non sono importanti.
- Non è un'agenzia di spionaggio ma è ancora uno specialista di sicurezza di alto livello.
- Potrebbe avere accesso ad alcuni giorni zero di cui non siamo a conoscenza.
Ipotesi:
- Il kernel linux ha dei bug ma grsec è sufficiente per coprirlo. Non può essere un vettore di attacco a meno che grsec non sia disattivato
- Grsec e SElinux non hanno bug e non sono configurati in modo errato.
- Una root utente nel contenitore è root fuori dal contenitore (forse un giorno questo non sarà più vero ...)
- Docker è una finestra mobile reale. Nessun bug noto ma è stato interessato da bug in passato e potrebbe ripetersi.
- Un sistema di log per indagini future è già impostato correttamente.
Obiettivo:
- Proteggi le bandiere. Probabilmente non è possibile dal momento che assumiamo che Docker abbia bug.
- Riduzione della superficie di attacco.
- Rendi difficile la vita dell'attaccante.
- Imposta un allarme che si attiva se l'attaccante cerca di ottenere le bandiere. Preferibilmente prima che riesca a prenderli.
Domande:
- Quanto sono realistiche le mie ipotesi?
- Come conseguiresti questi obiettivi?
- Quali sono i miei seguenti suggerimenti?
- Qualche consiglio di sicurezza generale per Docker?
I miei suggerimenti:
- Configura SElinux come nessun utente può scrivere su A e nessun utente può eseguire file su V.
-
Usa un'immagine Docker estremamente minimale, senza alcuna area utente. Qualcosa come:
FROM scratch COPY app / ENTRYPOINT ["/app"]
-
Privilegiare l'escalation prima di eseguire l'app. (Non sei sicuro di quale sia il modo corretto per farlo ...)
- Un falso utente busybox-land? Qualcosa che potrebbe attivare un allarme se proviamo a chiamare
/bin/sh
,/bin/ls
o qualcosa del genere.