Finns det några anmärkningsvärda skillnader mellan LXC (Linux-containrar) och FreeBSD ”-fängelser när det gäller säkerhet, stabilitet & prestanda?
Först titta, båda tillvägagångssätt ser väldigt lika ut.
Kommentarer
- LXC är en ganska ny teknik, så jag förväntar mig bättre säkerhet och stabilitet med fängelser. till och med en gissning om prestanda. Det finns några kända säkerhetsproblem med LXC som kan lindras med exempelvis selinux. Jag gillar dock personligen LXC.
- @ PavelŠimerda Jag hörde just om LXC idag, men jag var förvånad över att ta reda på att både Heroku och förmodligen Google App Engine redan använder LXC.
- Om du ' precis stött på LXC bör du ta en titt på Docker som använder LXC under motorhuven: docker.io/the_whole_story
- Docker gör n ot använder lxc längre.
- @nwildner det ' använder inte liblxc längre, men det använder exakt samma begrepp: kärnnamnsytor.
Svar
Oavsett det snygga namnet som används här, båda är lösningar på ett specifikt problem: En bättre segregeringslösning än klassisk Unix chroot . Operativsystemnivå virtualisering, behållare, zoner eller till och med ”chroot with steroids” är namn eller kommersiella titlar som definierar samma koncept för användarutrymme, men med olika funktioner.
Chroot introducerades den 18 mars 1982 , månader före lanseringen av 4.2 BSD , som ett verktyg för att testa dess installations- och byggsystem, men idag har det fortfarande sina brister. Eftersom det första målet med chroot bara var att tillhandahålla en newroot -väg, avslöjades andra aspekter av systemet som behövde isoleras eller kontrolleras (nätverk, processvy, I / O-genomströmning). Det var här de första behållarna (virtualisering på användarnivå) dök upp.
Båda teknikerna (FreeBSD Jails och LXC) använder användarutrymmeisolering för att ge ytterligare ett säkerhetsskikt. Denna indelning kommer att säkerställa att en bestämd process endast kommunicerar med andra processer i samma behållare på samma värd, och om någon nätverksresurs används för att uppnå kommunikation ”utanför världen” kommer alla att vidarebefordras till det tilldelade gränssnittet / kanalen som denna behållare har.
Funktioner
FreeBSD-fängelser:
- Anses vara stabil teknik, eftersom det är en funktion i FreeBSD sedan 4.0;
- Det tar det bästa av ZFS-filsystem vid den punkt där du kan klona fängelser och skapa fängelsemallar för att enkelt distribuera fler fängelser. Några mer ZFS galenskap ;
- Väl dokumenterad och utvecklas ;
- Hierarkiska fängelser gör att du kan skapa fängelser i ett fängelse (vi måste gå djupare!). Kombinera med
allow.mount.zfs
för att uppnå mer kraft och andra variabler somchildren.max
definierar max barnfängelser. - rctl (8) hanterar resursgränser för fängelser (minne, CPU, disk, …);
- FreeBSD-fängelser hanterar Linux användarutrymme ;
- Nätverksisolering med
vnet
, vilket gör att varje fängelse har sin egen nätverksstack, gränssnitt, adressering och dirigeringstabeller; -
nullfs
för att hjälpa till att länka mappar till de som finns på den verkliga servern till ett fängelse; - ezjail för att hjälpa till med massdistribution och hantering av fängelser;
- Massor av kärnavstämningar (
sysctl
).security.jail.allow.*
-parametrar begränsar åtgärderna för rotanvändaren för det fängelset. - Kanske kommer FreeBSD-fängelser att utvidga några av VPS-projektets funktioner som live migration inom en snar framtid.
- Det finns en viss ansträngning av ZFS och Docker integration löpning. Fortfarande experimentellt.
- FreeBSD 12 stöder bhyve inuti ett fängelse och pf inuti ett fängelse, vilket skapar ytterligare isolering av dessa verktyg
- Massor av intressanta verktyg har utvecklats under de senaste åren. Några av dem är indexerade på detta blogginlägg .
- Alternativ: FreeBSD VPS-projekt
Linux-behållare (LXC):
- Ny ”i kärnteknik” men godkänd av stora (speciellt Canonical);
- Behöriga behållare från LXC 1.0, gör ett stort steg in i säkerhet inuti behållare;
- UID- och GID-kartläggning inuti containrar;
- Kärnans namnområden för att separera IPC, mount, pid, nätverk och användare. Dessa namnutrymmen kan hanteras på ett fristående sätt, där en process som använder olika nätverksnamnutrymme inte nödvändigtvis kommer att isoleras på andra aspekter som lagring;
- Kontrollgrupper (cgroups) för att hantera resurser och gruppera dem. CGManager är killen för att uppnå det.
- Apparmor / SELinux-profiler och Kernel-funktioner för bättre genomdrivning av Kernel-funktioner som är tillgängliga för containrar. Seccomp är också tillgängligt på lxc-behållare för att filtrera systemanrop. Andra säkerhetsaspekter här .
-
Live migreringsfunktionalitet utvecklas. Det är väldigt svårt att säga när det är klart för produktionsanvändning, eftersom docker / lxc måste hantera användarutrymme, pausa, ögonblicksbild, migrera och konsolidera – ref1 , ref2 .Livsmigrering fungerar med grundläggande behållare (ingen enhetsgenomgång varken komplexa nättjänster eller speciella lagringskonfigurationer). - API-bindningar för att möjliggöra utveckling i python3 och 2, lua, Go, Ruby och Haskell
- Centraliserat ”Vad är nytt” -området. Ganska användbart när du behöver kontrollera om något fel har åtgärdats eller om en ny funktion har begåtts. Här .
- Ett intressant alternativ kan vara lxd , som under huven fungerar med lxc men den har några fina funktioner som en REST-API, OpenStack-integration osv.
- En annan intressant saken är att Ubuntu verkar leverera zfs som standardfilsystem för containrar på 16.04 . För att hålla projekten i linje lanserade lxd version 2.0 och några av funktionerna är zfs relaterade .
- Alternativ : OpenVZ , Docker
- Docker . Observera här att Docker använder namnområden, cgroups skapar ”per app” / ”per programvara” isolering Viktiga skillnader här . Medan LXC skapar behållare med flera processer minskar Docker en behållare så mycket som möjligt till en enda process och hanterar den sedan genom Docker.
- Ansträngning för att integrera Docker med SELinux och minska kapaciteten i en container för att göra den säkrare – Docker och SELinux, Dan Walsh
- Vad är skillnaden mellan Docker, LXD och LXC
Docker använder inte längre lxc. De har nu en specifik lib som heter runc som hanterar integrationen med låga nivåer av kärnnamn och cgroups-funktioner direkt.
Ingen av teknikerna är ett säkerhetsmedel, men båda är ganska bra sätt att isolera en miljö som inte kräver fullständig virtualisering på grund av blandad operativsystemsinfrastruktur. Säkerhet kommer efter en hel del dokumentation läsning och implementering av kärnan tunables, MAC och isoleringar som dessa OS-Level virt erbjuder dig.
Se även:
- Handgjorda containrar
- BSD nu: Allt du behöver veta om fängelser
- ezjail – Fängelseadministrationsram
- En kort historik över behållare: Från 1970-talet till 2017
- Docker anses vara skadlig – Bra artikel om säkerhetscirkus kring containerteknologier.
Kommentarer
- Det är värt att nämna att det inte finns några ansträngningar från lxc att tillhandahålla ordentlig gästisolering. lxd försöker dock ge isolering som BSD-fängelser eller Solaris-zoner.
- lxd är en " bättre upplevelse " från LXC och lägger till andra funktioner ovanpå den. Det verkar dock trevligt att citera den här lilla killen här
- @allquixotic menar du om du använder oförändrad konfiguration skapad från mallar? Det var sant men behöriga (användaraktiverade) behållare var tillgängliga med LXC 1.x och kunde till och med startas automatiskt vid systemstart, förutsatt att de ägdes av
root
(och därmed ligger på den systemomfattande platsen för containrar.