Блог
Підсилення безпеки контейнерів Docker для багатоорендарного хостингу: покроковий посібник з ізоляції
Дізнайтеся, як заблокувати контейнери Docker для багатоорендарних середовищ за допомогою практичних заходів безпеки, таких як користувачі без root, відкликані можливості, файлові системи лише для читання та ізоляція мережі.

Резюме
Запуск багатоорендарної платформи хостингу Docker вимагає герметичної ізоляції контейнерів, щоб запобігти взаємодії орендарів один з одним або виходу на хост. Цей посібник надає конкретний, покроковий процес посилення безпеки, який ви можете застосувати вже сьогодні. Ви навчитеся налаштовувати користувачів без root, видаляти непотрібні можливості Linux, монтувати файлові системи лише для читання, застосовувати обмеження ресурсів через cgroups, сегментувати мережі та використовувати профілі seccomp або AppArmor. Ми також розглянемо, коли варто доповнювати контейнери віртуальними машинами для максимальної безпеки. Наприкінці ви матимете контрольний список для систематичного усунення поширених векторів втечі з контейнерів і підтримки справжньої ізоляції вашої багатоорендарної інфраструктури.
Реальна проблема з багатоорендарними контейнерами
Контейнери Docker спільно використовують ядро хоста, і якщо ізоляція налаштована неправильно, один орендар теоретично може отримати доступ до даних іншого, спожити весь процесор або навіть вирватися на хост. Як постачальник хостингу, вам потрібні герметичні межі без жертвування перевагами продуктивності контейнерів. Багато команд починають з налаштувань Docker за замовчуванням, які призначені для розробки, а не для виробничої багатоорендарності. Хороша новина: за допомогою систематичного контрольного списку посилення безпеки ви можете заблокувати кожен контейнер до рівня ізоляції, близького до віртуальних машин, зберігаючи швидкість Docker.
Ця стаття проведе вас через кожен крок посилення безпеки з практичними прикладами та застереженнями. Наприкінці ви матимете повторюваний процес для розгортання безпечних багатоорендарних контейнерів.
Крок 1: Запуск контейнерів як не-root
За замовчуванням контейнери Docker запускаються від імені root. Якщо контейнер скомпрометовано, зловмисник отримує привілеї root всередині контейнера і може спробувати втечу з контейнера. Спочатку створіть виділеного користувача у вашому Dockerfile і переключіться на нього:
FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser
Застереження: Деякі процеси (наприклад, прив'язка до портів < 1024) вимагають root. У таких випадках використовуйте прапорець --cap-add, щоб надати лише необхідну можливість, наприклад --cap-add=NET_BIND_SERVICE, і все одно запускайте процес під не-root користувачем.
Для отримання додаткової інформації про базову ізоляцію дивіться наш посібник із досягнення справжньої багатоорендарної ізоляції в 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
Незбалансовані контейнери можуть здійснювати атаки на відмову в обслуговуванні, виснажуючи пам'ять або процесор хоста. Використовуйте обмеження часу виконання Docker:
docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
--memoryта--memory-swapвстановлюють жорсткі ліміти (без свопу).--cpusобмежує процесор.--pids-limitзапобігає вибухам форків, обмежуючи кількість процесів.
Застереження: Обмеження ресурсів застосовуються 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, забезпечують апаратне розділення без жертвування швидкістю контейнерів. Це підхід, який використовується в Enhanced Container Isolation (ECI) від Docker. Хоча накладні витрати вищі, ніж у звичайних контейнерів, вони значно нижчі, ніж у повноцінних ВМ на одне навантаження.
Для отримання додаткової інформації про вибір правильного рівня ізоляції прочитайте проектування багатоорендарної архітектури Docker.
Збірка всього разом: Контрольний список посилення безпеки
- Створюйте контейнери з не-root користувачем.
- Видаліть усі можливості, додайте лише необхідні.
- Змонтуйте файлову систему лише для читання з тимчасовими записуваними носіями.
- Встановіть ліміти пам'яті, процесора та PID.
- Створіть ізольовані мережі Docker на орендаря.
- Застосуйте власні профілі seccomp та AppArmor.
- Оцініть гібридні контейнери ВМ для високих потреб безпеки.
Висновок
Посилення безпеки контейнерів — це не одноразове завдання, а постійна дисципліна. Зазначені вище кроки формують базовий рівень безпеки для багатоорендарного хостингу. Пам'ятайте, що жоден окремий захід не гарантує безпеки; ключовим є захист у глибину. Почніть з основ: не-root користувачі та відкликані можливості. Потім додайте обмеження ресурсів і сегментацію мережі. Для найчутливіших навантажень поєднуйте контейнери з ВМ. З цим посібником ви зможете впевнено розгортати багатоорендарні середовища Docker, які є одночасно ефективними та безпечними.
