10 zasad bezpieczeństwa kontenerów - Linux Polska

Docker

10 zasad bezpieczeństwa kontenerów

17/11/2016
Podziel się

Wprowadzenie do mechanizmów bezpieczeństwa kontenerów

Kontenery są coraz chętniej stosowane przy tworzeniu nowoczesnych środowisk aplikacyjnych. Należy jednak pamiętać, że nie stanowią one panaceum na wszystkie możliwe problemy. Bezpieczeństwo to kruchy stan, wymagający ciągłego działania, do którego dążymy, ale który nie jest trwały i dany na zawsze.

Bezpieczeństwo wymaga używania nowoczesnych narzędzi w rozważny i przemyślany sposób. Może są to truizmy, ale należy o nich pamiętać, gdy chcemy w pełni wykorzystać potencjał jaki oferuje nam technologia. Aby móc dobrze zabezpieczyć naszą instalacje dockera powinniśmy zdawać swoje sprawę z następujących właściwości kontenerów:

  • Jądro ( kernel ) systemu gospodarza odpowiada za izolacje i separacje bezpieczeństwa kontenerów. Realizuje to poprzez mechanizmy przestrzeni nazw ( namespace ) oraz cgroupy.
  • Z punktu widzenia kernel systemu gospodarza każdy kontener jest zwykłym procesem tak jak każde inne zadanie działające w systemie
  • Kontenery są zarządzane przez serwis ( demona ) docker’a. W związku z tym, sam serwis systemowy dockera stanowi dodatkowy element potencjalnie podatny na atak.
  • Każdy z kontenerów „posiada” swój własny stos sieciowy IP. Należy pamiętać aby odpowiednio zabezpieczy każdy kontener przed atakiem poprzez sieć IP.
  • W każdym przypadku gdy mechanizmy selinux’a są dostępne na maszynie gospodarza, należy je używać aby wzmocnić bezpieczeństwo.

Świadomość potencjalnych źródeł problemów pozwala zdefiniować tzw powierzchnie ataku i odpowiednio dobrze przygotować się do dobrego zaprojektowania środowiska aby łatwiej było utrzymać odpowiedni poziom bezpieczeństwa. Pomogą man w tym tzw. zasady dobrych praktyk.

Dobre praktyki dotyczące bezpieczeństwa kontenerów

  1. Stosuj zasadę wielowarstwowej ochrony. Podziel kontenery na grupy według użytkownika który je uruchamia, aplikacje lub poziomu krytyczności przetwarzanych danych. Separuj grupy kontenerów przy pomocy maszyn wirtualnych.
  2. Uważaj na binaria mające suid/sgid. Analizuj które z nich są naprawdę potrzebne. Jeśli istnieje taka możliwość, usuwaj je z obrazu maszyny. W przypadku tych które pozostaną sprawdza czy nie stwarzają zagrożenia ani nie otwierają nowego wektora ataku.
  3. Uważaj na zasoby maszyny gospodarza. Pamiętaj, że wszystkie kontenery mają takie same udziały ( cpu shares ) w zasobach procesora. W niektórych przypadkach należy to zmodyfikować aby osiągnąć optymalne dopasowania obciążenia do charakteru stosowanych aplikacji.
  4. Pamiętaj aby zawsze zweryfikować w trakcie pobierania ( docker pull ) sumę kontrolną obrazu. Jest to szczególnie istotne gdy pobieramy obrazy z internetu lub publicznych repozytoriów. Nie ufaj obrazą których sama/sam nie przygotowałeś
  5. W miarę możliwość zawsze staraj się uruchamiać kontener w systemie plików w trybie tylko do odczytu.
  6. W miarę możliwość nigdy nie uruchamiaj aplikacji wewnątrz kontenera jako „root”. Staraj się dodać „zwykłego” użytkownika i uruchamiać aplikacje z jego uprawnieniami.
  7. Uruchamiaj w kontenerze tylko pojedynczą aplikacje. Nie uruchamiaj złożonych systemów w pojedynczym kontenerze. Buduj mikro-serwisy. Jeden kontener – jedno zadanie.
  8. Używaj gdy tylko istnieje taka możliwość mechanizmów selinux’a jakie oferuje system gospodarza jak i hosta virtualizującego aby wprowadzić dodatkową warstwę bezpiecznej separacji. W przypadku środowiska hybrydowego virtualizowanego / kontenerowego mechanizm selinux/svirt zapewni dodatkową bardzo silną warstwę bezpieczeństwa.
  9. Nie ufaj sieci. Każdy kontener ma swój własny stos sieciowy i obowiązkowo powinien zadbać o swoje bezpieczeństwo sieciowe. Nie zapominaj o tym gdy konfigurujesz kontenery.
  10. Przygotuj się na awarie. Nie ufaj danym. Błędy się zdarzają. Staraj się do tego przygotować.

Bezpieczny Docker

Kontenery poprzez swoją bardzo dużą elastyczność i stosunkową „lekkość” pozwalają na bardzo plastyczne i kreatywne podejście do kwestii bezpieczeństwa. Budowanie złożonych aplikacji w oparciu o koncepcje mikro-serwisów opartych o kontenery pozwala na zapewnienie dużej separacji poszczególnych elementów danego systemu, oraz zwiększa jego odporność na awarię pojedynczych elementów naszej aplikacji. Możliwość szybkiego ponownego uruchomienia kontenera, zapewnienie systemu plików do odczytu oraz inne wymieniowe powyżej mechanizmy i metody „utwardzenia” kontenerów pozwalają na minimalizowanie potencjalnych dróg ataku jak i na bardziej dynamiczne reagowania na potencjalne lub rzeczywiste ataki.

Oczywiście, nie ma bezawaryjnego oprogramowania, ale przemyślany projekt i użycie nowoczesnego narzędzia jakim są kontenery docker’owe umożliwia tworzenie wydajnego i bezpiecznego środowiska do tworzenia nowoczesnych aplikacji.

Zobacz również

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

    Skontaktuj się z nami