(Disclaimer:io non un'autorità su OpenVZ. Questa risposta è più supponente di quanto lo siano di solito le mie risposte, quindi sentiti libero di criticare!)
OpenVZ potrebbe essere "più" sicuro in quanto non si integra con l'intero kernel, quindi la sua superficie di attacco è leggermente inferiore. Tuttavia, essenzialmente OpenVZ è ciò che è servito da ispirazione per gli spazi dei nomi e quindi, in definitiva, LXC e Docker. Non credo che durerà a lungo ora che quelle soluzioni più complete sono, beh, complete.
Come sottolineato da WhiteWinterWolf, una delle grandi differenze è che LXC riesce finalmente a utilizzare lo spazio dei nomi utente, aprendo la possibilità agli utenti non privilegiati di eseguire contenitori e garantendo che il codice contenuto che esce dal contenitore mantenga i privilegi degli utenti non privilegiati. Inoltre, i contenitori basati sullo spazio dei nomi potrebbero eventualmente essere completamente etichettati con SELinux. Normalmente i container Docker lo sono già e Dan Walsh sta lavorando a un modo per fare in modo che SELinux applichi automaticamente un ulteriore livello di isolamento tra i container utilizzando categorie generate casualmente per i processi contenuti.
Quindi, in sintesi, i container sono migliori perché:- Possono contrastare parzialmente alcuni breakout di container (limitandoli a un UID non privilegiato), rendendo irrilevanti le escalation di privilegi all'interno del container.- Sono più supportati e sviluppati più attivamente, e in particolare traggono grande vantaggio dal supporto di SELinux.
E sono peggio perché:- Il loro TCB è molto grande, in tutto il kernel e di tanto in tanto si verificano bug che portano a exploit e breakout. - Lo spazio dei nomi degli utenti mi sembra una specie di caso limite. Di solito ottieni l'escalation dei privilegi tramite un bug nella SCI (che saresti in grado di riprodurre dopo il tuo breakout) o confusi attacchi delegati a un servizio privilegiato (che probabilmente continueranno a esistere al di fuori del tuo contenitore in primo luogo). Quindi dovresti comunque limitare strettamente l'UID che esegue il contenitore ai contenitori in esecuzione.
In sintesi, continua a praticare la difesa in profondità e continua a pensare a come lasci che i processi contenuti interagiscano con il mondo esterno e come gestisci i container. Le differenze esistono ma come puoi vedere sono piuttosto minime.