(Haftungsausschluss:Ich bin nicht eine Autorität auf OpenVZ. Diese Antwort ist eigensinniger als meine Antworten normalerweise, also zögern Sie nicht zu kritisieren!)
OpenVZ könnte insofern "sicherer" sein, als es sich nicht in den gesamten Kernel integriert, so dass seine Angriffsfläche etwas geringer ist. Im Wesentlichen diente OpenVZ jedoch als Inspiration für Namespaces und damit letztendlich für LXC und Docker. Ich glaube nicht, dass es noch lange so weitergehen wird, dass diese umfassenderen Lösungen, nun ja, vollständig sind.
Wie von WhiteWinterWolf betont, besteht einer der großen Unterschiede darin, dass LXC endlich den Benutzernamensraum verwenden kann, wodurch unprivilegierten Benutzern die Möglichkeit eröffnet wird, Container auszuführen, und sichergestellt wird, dass enthaltener Code, der aus dem Container ausbricht, die Privilegien von nicht privilegierten Benutzern behält. Außerdem können Namespace-basierte Container schließlich vollständig mit SELinux gekennzeichnet sein. Docker-Container sind dies normalerweise bereits, und Dan Walsh arbeitet an einer Möglichkeit, SELinux automatisch eine zusätzliche Isolationsebene zwischen Containern erzwingen zu lassen, indem zufällig generierte Kategorien für enthaltene Prozesse verwendet werden.
Zusammenfassend sind Container also besser, weil:- Sie einige Container-Ausbrüche teilweise vereiteln können (sie auf eine unprivilegierte UID beschränken), wodurch Privilegien-Eskalationen innerhalb des Containers irrelevant werden.- Sie werden besser unterstützt und aktiver entwickelt, und vor allem werden sie profitieren stark von der SELinux-Unterstützung.
Und sie sind schlimmer, weil:- Ihr TCB sehr groß ist, über den gesamten Kernel hinweg, und ab und zu Fehler auftreten, die zu Exploits und Ausbrüchen führen.- Der Benutzer-Namensraum scheint mir eine Art Grenzfall zu sein. Normalerweise erreichen Sie eine Rechteausweitung über einen Fehler im SCI (den Sie nach Ihrem Ausbruch reproduzieren könnten) oder verwirrte Stellvertreterangriffe auf einen privilegierten Dienst (die wahrscheinlich von vornherein außerhalb Ihres Containers bestehen bleiben). Daher müssten Sie diese UID, die den Container ausführt, immer noch streng auf die Ausführung von Containern beschränken.
Zusammenfassend lässt sich sagen, dass Sie die Verteidigung weiterhin gründlich üben und darüber nachdenken, wie Sie enthaltene Prozesse mit der Außenwelt interagieren lassen und wie Sie Container ausführen. Es gibt Unterschiede, aber wie Sie sehen, sind sie eher minimal.