Blog
Wzmacnianie kontenerów Docker dla hostingu wielodostępowego: Przewodnik izolacji krok po kroku
Dowiedz się, jak zabezpieczyć kontenery Docker w środowiskach wielodostępowych za pomocą praktycznych środków bezpieczeństwa, takich jak użytkownicy niebędący rootem, usunięte uprawnienia, systemy plików tylko do odczytu i izolacja sieci.

Podsumowanie
Uruchomienie platformy hostingowej Docker z wieloma dzierżawcami wymaga szczelnej izolacji kontenerów, aby zapobiec wzajemnemu zakłócaniu się dzierżawców lub ucieczce do hosta. Ten przewodnik przedstawia konkretny, krok po kroku proces wzmacniania, który możesz zastosować już dziś. Nauczysz się konfigurować użytkowników niebędących rootem, usuwać niepotrzebne możliwości Linuksa, montować systemy plików jako tylko do odczytu, egzekwować limity zasobów za pomocą cgroups, segmentować sieci oraz stosować profile seccomp lub AppArmor. Omówimy również, kiedy uzupełnić kontenery maszynami wirtualnymi dla maksymalnego bezpieczeństwa. Pod koniec będziesz mieć listę kontrolną do systematycznego eliminowania typowych wektorów ucieczki z kontenerów i utrzymywania prawdziwie izolowanej infrastruktury wielodostępowej.
Rzeczywisty problem z kontenerami wielodostępowymi
Kontenery Docker współdzielą jądro hosta, a jeśli izolacja jest źle skonfigurowana, jeden dzierżawca może teoretycznie uzyskać dostęp do danych innego, zużyć całe CPU, a nawet wydostać się na host. Jako dostawca hostingu potrzebujesz szczelnych granic bez poświęcania korzyści wydajnościowych kontenerów. Wiele zespołów zaczyna od domyślnych ustawień Docker, które są zaprojektowane do rozwoju, a nie do produkcji wielodostępowej. Dobra wiadomość: dzięki systematycznej liście kontrolnej wzmacniania możesz zamknąć każdy kontener do poziomu izolacji zbliżonego do VM, zachowując szybkość Docker.
Ten artykuł przeprowadzi Cię przez każdy krok wzmacniania z praktycznymi przykładami i zastrzeżeniami. Pod koniec będziesz mieć powtarzalny proces wdrażania bezpiecznych kontenerów wielodostępowych.
Krok 1: Uruchamianie kontenerów jako użytkownik niebędący rootem
Domyślnie kontenery Docker działają jako root. Jeśli kontener zostanie naruszony, atakujący zyskuje uprawnienia roota wewnątrz kontenera i może próbować ucieczki. Najpierw utwórz dedykowanego użytkownika w swoim Dockerfile i przełącz się na niego:
FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser
Zastrzeżenie: Niektóre procesy (np. wiązanie portów < 1024) wymagają roota. W takich przypadkach użyj flagi --cap-add, aby przyznać tylko potrzebną możliwość, np. --cap-add=NET_BIND_SERVICE, i nadal uruchamiaj proces jako użytkownik niebędący rootem.
Więcej na temat podstawowej izolacji znajdziesz w naszym przewodniku na temat osiągnięcia prawdziwej izolacji wielodostępowej w Dockerze.
Krok 2: Usuń wszystkie możliwości Linuksa i dodaj tylko te, których potrzebujesz
Możliwości Linuksa dzielą uprawnienia roota na małe jednostki. Kontenery Docker mają domyślny zestaw możliwości, który jest zbyt permisywny dla hostingu wielodostępowego. Odrzuć wszystkie i dodaj tylko te, które wymaga twoja aplikacja:
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-app
Typowe możliwości do unikania: SYS_ADMIN (ucieczka z kontenera), NET_RAW (podsłuchiwanie pakietów), SYS_PTRACE (debugowanie procesów). Użyj docker run z --security-opt no-new-privileges, aby zapobiec eskalacji uprawnień przez binaria setuid.
Krok 3: Zamontuj główny system plików jako tylko do odczytu
Atakujący często zapisują złośliwe skrypty do systemu plików kontenera. Ustawiając główny system plików jako tylko do odczytu, zapobiegasz temu:
docker run --read-only --tmpfs /tmp:rw,noexec,nosuid,size=64m my-app
--tmpfs tworzy tymczasowy zapisywalny mont dla katalogów takich jak /tmp i /var/run. Flaga noexec uniemożliwia wykonywanie z tego montu. To podejście zmusza atakujących do manewrowania przez zapisywalne katalogi, które możesz monitorować.
Krok 4: Egzekwuj limity zasobów za pomocą cgroups
Nieograniczone kontenery mogą przeprowadzać ataki typu denial-of-service, wyczerpując pamięć hosta lub CPU. Użyj ograniczeń czasu wykonania Docker:
docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
--memoryi--memory-swapustawiają twarde limity (bez swap).--cpusogranicza CPU.--pids-limitzapobiega bombom forkowym poprzez ograniczenie liczby procesów.
Zastrzeżenie: Limity zasobów są egzekwowane przez cgroups, ale nie zapobiegają wyciekowi danych przez sieć. Połącz z izolacją sieci (następny krok).
Krok 5: Segmentuj sieci za pomocą niestandardowych sieci Docker
Domyślnie kontenery Docker współdzielą sieć mostkową. W konfiguracji wielodostępowej musisz odizolować stos sieciowy każdego dzierżawcy. Utwórz dedykowaną sieć dla każdego dzierżawcy:
docker network create tenant-alpha --internal
docker run --network tenant-alpha my-app
Użyj flagi --internal, aby zablokować wychodzący dostęp do internetu, a następnie wystaw tylko niezbędne porty przez -p. Aby uzyskać bardziej zaawansowaną segmentację sieci, rozważ zabezpieczanie aplikacji webowych za pomocą izolacji Docker.
Zastrzeżenie: Sieci wewnętrzne zapobiegają bezpośredniej komunikacji między kontenerami różnych dzierżawców, ale wycieki DNS mogą nadal wystąpić, jeśli używasz sieci hosta. Trzymaj się sieci mostkowych lub nakładkowych.
Krok 6: Zastosuj profile seccomp i AppArmor
Seccomp filtruje wywołania systemowe, a AppArmor (lub SELinux) egzekwuje obowiązkową kontrolę dostępu. Docker udostępnia domyślny profil seccomp, który blokuje niebezpieczne wywołania systemowe, takie jak clone z określonymi flagami. Dla bardziej rygorystycznej izolacji utwórz niestandardowy profil:
docker run --security-opt seccomp=./custom.json --security-opt apparmor=docker-default my-app
Możesz wygenerować bazowy profil za pomocą docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time, a następnie go przyciąć. Zastrzeżenie: Zbyt restrykcyjne profile mogą złamać legalną funkcjonalność. Przetestuj dokładnie w środowisku staging.
Krok 7: Rozważ hybrydową izolację za pomocą maszyn wirtualnych
Jeśli twoi dzierżawcy wymagają absolutnej izolacji (np. branża regulowana), uruchom kontenery wewnątrz lekkiej maszyny wirtualnej. Narzędzia takie jak Sysbox lub Kata Containers zapewniają separację na poziomie sprzętu bez poświęcania szybkości kontenerów. Jest to podejście stosowane przez Enhanced Container Isolation (ECI) Docker. Chociaż narzut jest wyższy niż w przypadku gołych kontenerów, jest znacznie niższy niż w przypadku pełnych VM na obciążenie.
Aby dowiedzieć się więcej o wyborze odpowiedniego poziomu izolacji, przeczytaj projektowanie architektury Docker wielodostępowego.
Wszystko razem: Lista kontrolna wzmacniania
- Buduj kontenery z użytkownikiem niebędącym rootem.
- Odrzuć wszystkie możliwości, dodaj tylko wymagane.
- Zamontuj system plików tylko do odczytu z tymczasowymi zapisywalnymi montami.
- Ustaw limity pamięci, CPU i PID.
- Utwórz izolowane sieci Docker dla każdego dzierżawcy.
- Zastosuj niestandardowe profile seccomp i AppArmor.
- Oceń hybrydowe kontenery VM dla potrzeb wysokiego bezpieczeństwa.
Podsumowanie
Wzmacnianie kontenerów to nie jednorazowe zadanie — to ciągła dyscyplina. Powyższe kroki stanowią podstawę bezpieczeństwa dla hostingu wielodostępowego. Pamiętaj, że żaden pojedynczy środek nie gwarantuje bezpieczeństwa; kluczowa jest obrona w głąb. Zacznij od podstaw: użytkownicy niebędący rootem i usunięte możliwości. Następnie dodaj limity zasobów i segmentację sieci. Dla najbardziej wrażliwych obciążeń połącz kontenery z maszynami wirtualnymi. Dzięki temu przewodnikowi możesz z pewnością wdrożyć wielodostępowe środowiska Docker, które są zarówno wydajne, jak i bezpieczne.
