Indurimento / riduzione della superficie di attacco per un contenitore Docker

13

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.
posta Matthieu 29.08.2016 - 22:24
fonte

1 risposta

8

Ti rimando ai Benchmark CIS per le linee guida sull'indurimento. L'attuale Benchmark CIS per Docker può essere trovato qui . Questi sono uno standard industriale accettato per l'indurimento di base. Offrono anche linee guida per Linux e altri, server Web, DB, ecc.

    
risposta data 29.08.2016 - 22:35
fonte

Leggi altre domande sui tag