Блог

Укрепване на Docker контейнери за многотенентен хостинг: Ръководство стъпка по стъпка за изолация

Научете как да защитите Docker контейнери за многотенентни среди с практически мерки за сигурност като непривилегировани потребители, премахнати възможности, файлови системи само за четене и мрежова изолация.

Резюме

Работата с многотенентна Docker хостинг платформа изисква херметична изолация на контейнерите, за да се предотврати взаимното влияние на наемателите или избягването им към хоста. Това ръководство предоставя конкретен, стъпка по стъпка процес на укрепване, който можете да приложите днес. Ще научите как да конфигурирате непривилегировани потребители, да премахнете ненужните Linux възможности, да монтирате файлови системи само за четене, да налагате ограничения на ресурсите чрез cgroups, да сегментирате мрежи и да прилагате seccomp или AppArmor профили. Ще разгледаме и кога да допълвате контейнерите с виртуални машини за максимална сигурност. Накрая ще имате контролен списък за систематично премахване на често срещаните вектори за бягство от контейнери и поддържане на наистина изолирана многотенентна инфраструктура.

Реалният проблем с многотенентните контейнери

Docker контейнерите споделят ядрото на хоста и ако изолацията е неправилно конфигурирана, един наемател теоретично може да получи достъп до данните на друг, да използва целия CPU или дори да избяга към хоста. Като хостинг доставчик, се нуждаете от херметични граници, без да жертвате производителността на контейнерите. Много екипи започват с настройките по подразбиране на Docker, които са предназначени за разработка, а не за продукционна многотенентност. Добрата новина: със систематичен контролен списък за укрепване можете да заключите всеки контейнер до нива на изолация, близки до виртуална машина, запазвайки скоростта на Docker.

Тази статия ви превежда през всяка стъпка на укрепване с практически примери и предупреждения. Накрая ще имате повтаряем процес за разгръщане на сигурни многотенентни контейнери.

Стъпка 1: Стартирайте контейнери като непривилегирован потребител

По подразбиране Docker контейнерите работят като root. Ако контейнер бъде компрометиран, нападателят получава root привилегии вътре в контейнера и може да опита бягство от контейнера. Първо, създайте специален потребител във вашия Dockerfile и превключете към него:

FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser

Предупреждение: Някои процеси (напр. свързване към портове < 1024) изискват root. В тези случаи използвайте флага --cap-add, за да предоставите само необходимата възможност, като --cap-add=NET_BIND_SERVICE, и все пак стартирайте процеса под непривилегирован потребител.

За повече информация за основна изолация вижте нашето ръководство за постигане на истинска многотенентна изолация в Docker.

Стъпка 2: Премахнете всички Linux възможности и добавете само тези, от които се нуждаете

Linux възможностите разделят root привилегиите на малки единици. Docker контейнерите идват с набор от възможности по подразбиране, които са твърде разрешителни за многотенентен хостинг. Премахнете всички и добавете само това, от което вашето приложение се нуждае:

docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-app

Често срещани възможности, които да избягвате: SYS_ADMIN (бягство от контейнер), NET_RAW (подушване на пакети), SYS_PTRACE (дебъгване на процеси). Използвайте docker run с --security-opt no-new-privileges, за да предотвратите ескалация на привилегии чрез setuid двоични файлове.

Стъпка 3: Монтирайте кореновата файлова система като само за четене

Нападателите често записват злонамерени скриптове във файловата система на контейнера. Като направите кореновата файлова система само за четене, предотвратявате това:

docker run --read-only --tmpfs /tmp:rw,noexec,nosuid,size=64m my-app

--tmpfs създава временно монтиране с възможност за запис за директории като /tmp и /var/run. Флагът noexec предотвратява изпълнението от това монтиране. Този подход принуждава нападателите да преминават през директории с възможност за запис, които можете да наблюдавате.

Стъпка 4: Налагане на ограничения на ресурсите чрез cgroups

Неограничените контейнери могат да извършат атаки за отказ на услуга, изчерпвайки паметта или CPU на хоста. Използвайте ограниченията по време на изпълнение на Docker:

docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
  • --memory и --memory-swap задават твърди граници (без swap).
  • --cpus ограничава CPU.
  • --pids-limit предотвратява fork бомби чрез ограничаване на броя процеси.

Предупреждение: Ограниченията на ресурсите се налагат от cgroups, но не предотвратяват изтичане на данни по мрежа. Комбинирайте с мрежова изолация (следваща стъпка).

Стъпка 5: Сегментиране на мрежи с персонализирани Docker мрежи

По подразбиране Docker контейнерите споделят мостова мрежа. В многотенентна настройка трябва да изолирате мрежовия стек на всеки наемател. Създайте специална мрежа за всеки наемател:

docker network create tenant-alpha --internal
docker run --network tenant-alpha my-app

Използвайте флага --internal, за да блокирате изходящ интернет достъп, след което изложете само необходимите портове чрез -p. За по-напреднало мрежово сегментиране обмислете осигуряване на уеб приложения с Docker изолация.

Предупреждение: Вътрешните мрежи предотвратяват директна комуникация между контейнери от различни наематели, но DNS изтичания все още могат да възникнат, ако използвате хост мрежа. Придържайте се към мостови или овърлей мрежи.

Стъпка 6: Прилагане на Seccomp и AppArmor профили

Seccomp филтрира системни извиквания, а AppArmor (или SELinux) налага задължителен контрол на достъпа. Docker предоставя профил по подразбиране за seccomp, който блокира опасни системни извиквания като clone с определени флагове. За по-строга изолация създайте персонализиран профил:

docker run --security-opt seccomp=./custom.json --security-opt apparmor=docker-default my-app

Можете да генерирате базов профил с docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time и след това да го съкратите. Предупреждение: Твърде рестриктивните профили могат да нарушат легитимната функционалност. Тествайте обстойно в етап на подготовка.

Стъпка 7: Обмислете хибридна изолация с виртуални машини

Ако вашите наематели изискват абсолютна изолация (напр. регулирана индустрия), стартирайте контейнери вътре в лека виртуална машина. Инструменти като Sysbox или Kata Containers осигуряват разделяне на хардуерно ниво, без да жертват скоростта на контейнерите. Това е подходът, използван от Docker Enhanced Container Isolation (ECI). Макар че допълнителната тежест е по-голяма от обикновените контейнери, тя е значително по-малка от пълните виртуални машини за работно натоварване.

За повече информация относно избора на подходящо ниво на изолация, прочетете проектиране на многотенентна Docker архитектура.

Обобщение: Контролен списък за укрепване

  1. Изградете контейнери с непривилегирован потребител.
  2. Премахнете всички възможности, добавете само необходимите.
  3. Монтирайте файловата система само за четене с временни монтирания за запис.
  4. Задайте ограничения за памет, CPU и PID.
  5. Създайте изолирани Docker мрежи за всеки наемател.
  6. Приложете персонализирани seccomp и AppArmor профили.
  7. Оценете хибридни VM контейнери за високи нужди от сигурност.

Заключение

Укрепването на контейнери не е еднократна задача — това е постоянна дисциплина. Стъпките по-горе формират основна линия на сигурност за многотенентен хостинг. Не забравяйте, че нито една отделна мярка не гарантира безопасност; отбраната в дълбочина е ключова. Започнете с основите: непривилегировани потребители и премахнати възможности. След това добавете ограничения на ресурсите и мрежово сегментиране. За най-чувствителните работни натоварвания комбинирайте контейнери с виртуални машини. С това ръководство можете уверено да разгърнете многотенентни Docker среди, които са едновременно ефективни и сигурни.

Sources (5)