Bezpieczeństwo dla kontenerów Docker

Przyp. tłum.: Tematyka bezpieczeństwa Dockera jest jedną z nieprzemijających w nowoczesnym świecie IT. Dlatego bez zbędnych wyjaśnień przedstawiamy tłumaczenie kolejnej serii odpowiednich rekomendacji. Jeśli już interesowaliście się tym tematem, wiele z nich będzie wam znanych. A samą selekcję uzupełniliśmy listą przydatnych narzędzi oraz kilkoma zasobami do dalszego zgłębiania tematu.

Bezpieczeństwo dla kontenerów Docker

Proponuję do uwagi przewodnik po zapewnieniu bezpieczeństwa Dockera. Feedback jest mile widziany, ponieważ jest to raczej zbiór fragmentów z różnych zasobów, i nie wszystkie zostały poddane dokładnej weryfikacji. Rekomendacje są podzielone na trzy kategorie:

  1. Niezbędne środki wewnątrz systemu operacyjnego hosta przy pracy z Dockerem;
  2. Instrukcje dotyczące pliku konfiguracyjnego budowy i tworzenia kontenerów;
  3. Narzędzia do bezpieczeństwa, które mogą integrować się z specyficznymi funkcjami Docker Enterprise.


Podstawą przewodnika były różne zasoby, z których wiele wymieniono poniżej. Nie można go nazwać wyczerpującym, jednakże obejmuje wszystkie podstawy. Dodatkowe informacje można znaleźć w opisie testów CIS (link podany na końcu tego przewodnika) oraz w dokumentacji Dockera.

Benchmark Bezpieczeństwa Dockera

Docker Bench for Security automatycznie sprawdza twój Docker pod kątem zgodności z najpopularniejszymi najlepszymi praktykami. Skrypt pełni rolę dobrego testu heurystycznego bezpieczeństwa, jednak nie należy go traktować jako narzędzie do kompleksowej analizy.

OS hosta

Oczywiście, kontener Docker nie może być zabezpieczony, jeśli sama system hosta nie jest zabezpieczony. Dlatego konieczne jest przestrzeganie najlepszych praktyk w dziedzinie zapewnienia bezpieczeństwa systemów operacyjnych. Ponadto, rozsądne byłoby przeprowadzenie analizy podatności w dodatku do poniższych rekomendacji.

Zasady audytu

Twórz i używaj zasad audytu dla plików związanych z Dockerem za pomocą auditctl. Na przykład, można dodać -w /usr/bin/dockerd -k docker do /etc/audit.rules i ponownie uruchomić usługę audytu.

Tryb FIPS

Włączenie trybu FIPS sprawia, że narzędzia kryptograficzne przechodzą na algorytmy wpisane w FIPS (amerykańskie Federal Information Processing Standards — przyp. tłum.), spełniając w ten sposób normy i wymagania federalne oraz branżowe. Jeśli system operacyjny hosta obsługuje tryb FIPS, można go włączyć, wykonując następujące polecenia:

sed -i 's\/GRUB_CMDLINE_LINUX="\/GRUB_CMDLINE_LINUX="fips=1 \/g' \/etc\/default\/grub\ngrub2-mkconfig -o \/boot\/grub2\/grub.cfg && reboot

Należy również włączyć FIPS w środowisku Docker:

mkdir -p \/etc\/systemd\/system\/docker.service.d 2>&1; echo -e "[Service]n Environment="DOCKER_FIPS=1"" > \/etc\/systemd\/system\/docker.service.d\/fips-module.conf; systemctl daemon-reload; systemctl restart docker

Aby uzyskać więcej informacji, zobacz dokumentację Docker i Red Hat.

Docker Secrets

Dane poufne powinny być przechowywane jako sekrety. Odpowiednią usługę można uruchomić za pomocą polecenia docker service create:

docker service create --label com.docker.ucp.access.label=\/prod --name nginx --publish 443 --secret source=orcabank_prod_mobile.ca.pem.v1,target=ca.pem nginx

Szczegóły znajdują się w dokumentacji.

Plik konfiguracyjny Docker’a

Następujące ustawienia można dodać do pliku konfiguracyjnego /etc/docker/daemon.json:

  • "icc":false — wyłącza wymianę danych między kontenerami, aby uniknąć niepotrzebnego wycieku informacji.
  • log-level: "info" — rejestruje wszystkie logi oprócz debugowania.
  • {
      "log-driver": "syslog",
      "log-opts": {
        "syslog-address": "udp:\/\/1.2.3.4:1111"
      }
    }

    — umożliwia zdalne rejestrowanie logów, przesyła je pod wskazany adres. Działa tylko wtedy, gdy uruchomiono demon syslog. Akceptowane są opcje TCP i UDP. Istnieje również możliwość podłączenia dla każdego konkretnego kontenera. W tym celu ustawia się specjalny znak przy uruchamianiu Docker’a (--log-opt syslog-address=ADDRESS).

  • "userns-remap": "Your_User" — zapobiega podnoszeniu uprawnień (privilege escalation), izolując przestrzeń nazw pod konkretnego użytkownika.

Bezpieczeństwo na poziomie transportu

Możliwość podłączenia do demona Docker’a (jeśli zdalny dostęp jest wymagany) powinna być dostępna tylko dla użytkowników z uprawnieniami do danych uwierzytelniających TLS klienta.

Wtyczki autoryzacyjne

Określ, którym użytkownikom jakie polecenia mają być dozwolone, i stwórz odpowiednią wtyczkę autoryzacyjną dla Docker’a. Następnie uruchom demon Docker’a i dodaj wtyczkę:

dockerd --authorization-plugin=PLUGIN_ID

Aby dowiedzieć się więcej o tworzeniu wtyczek autoryzacyjnych, zobacz w dokumentacji.

Opcje demona

Demon Docker’a działa z zestawem domyślnych parametrów.

  • --live-restore — ten parametr pomaga skrócić czas przestoju kontenerów podczas wyłączania lub ponownego uruchamiania systemu. Ułatwia to ich łatanie lub aktualizację z minimalnym przestojem;
  • --userland-proxy=false — gdy hairpin NAT jest dostępny lub używany, proxy w przestrzeni użytkownika staje się zbędną usługą, która jedynie zwiększa liczbę możliwych wektorów ataku;
  • --no-new-privileges — zapobiega uzyskaniu dodatkowych uprawnień przez kontenery za pomocą suid lub sguid;
  • --seccomp-profile /path/to/profile — jeśli masz własny profil seccomp, możesz go zastosować za pomocą tej flagi. Dowiedz się więcej o Seccomp i Dockerze tutaj.

Konfiguracja kontenerów i plików budowy

Tworzenie użytkownika

Upewnij się, że dla kontenera został utworzony użytkownik i uruchamiaj go pod tym użytkownikiem (NIE uruchamiaj kontenera jako root).

Zdalny dostęp

Zabroń zdalnego dostępu do demona. Jeśli jest to konieczne, zabezpiecz to certyfikatami.

Izolacja przestrzeni nazw użytkownika

Szczególnie ważne jest, aby upewnić się, że przestrzeń nazw użytkownika w Dockerze jest izolowana, ponieważ domyślnie jest współdzielona z przestrzenią nazw hosta. W niektórych przypadkach można to wykorzystać do podniesienia uprawnień lub nawet do wydostania się poza kontener. Można zrealizować izolację przestrzeni nazw użytkownika poprzez edytowanie pliku konfiguracyjnego (jak opisano powyżej w sekcji „Plik konfiguracyjny Dockera”). Dodatkowe wzmianki o tym problemie są spowodowane jego znaczeniem.

Healthchecki

Healthcheck (sprawdzanie stanu) to potężne narzędzie, które pozwala sprawdzać integralność kontenera. Jest konfigurowane w Dockerfile za pomocą instrukcji HEALTHCHECK. Healthchecki pozwalają upewnić się, że kontener działa prawidłowo. W poniższym przykładzie sprawdzenie stanu zakończy się 0, jeśli serwer działa, i 1, jeśli „padł”:

HEALTHCHECK CMD curl --fail http://localhost || exit 1

SELinux

Jeśli SELinux jest wspierany przez system operacyjny hosta, utwórz lub zaimportuj politykę SELinux i uruchom Docker w trybie demona z włączonym SELinux:

docker daemon --selinux-enable

W takim przypadku kontenery Docker można uruchamiać z parametrami bezpieczeństwa, na przykład:

docker run --interactive --tty --security-opt label=level:TopSecret centos /bin/bash

Interfejsy sieciowe

Domyślnie Docker nasłuchuje na wszystkich interfejsach sieciowych. Ponieważ w większości przypadków ruch oczekiwany jest tylko na jednym z nich, takie podejście nieuzasadnionnie zwiększa ryzyko ataku. Dlatego podczas uruchamiania kontenera można przypisać jego porty do konkretnych interfejsów na hoście:

docker run --detach --publish 10.2.3.4:49153:80 nginx

Scache'owane wersje obrazów

Podczas pobierania obrazów upewnij się, że lokalna pamięć podręczna odpowiada zawartości repozytorium. W przeciwnym razie możesz otrzymać przestarzałą wersję obrazu lub obraz zawierający luki bezpieczeństwa.

Most sieciowy

Domyślny model sieciowy, docker0, jest podatny na ataki typu ARP-spoofing i MAC-flooding. Aby rozwiązać ten problem, utwórz most sieciowy zgodnie z własnymi specyfikacjami, jak opisano tutaj.

Ostrzeżenie o gnieździe Dockera

Nigdy nie udostępniaj gniazda Dockera wewnątrz kontenera. W przeciwnym razie kontener zyska możliwość wykonywania poleceń Dockera, a tym samym powiązania z systemem operacyjnym hosta i kontrolowania go. Nie rób tego.

Konfigurowanie Docker Enterprise

Docker Trust

Docker Trust umożliwia generowanie kluczy, za pomocą których można weryfikować kryptograficzną integralność obrazów. Klucze Docker Trust można wykorzystać do podpisywania obrazów Docker prywatnymi kluczami, które są weryfikowane publicznymi kluczami na serwerze Notary. Dodatkowe informacje — tutaj. Włączenie Docker Trust w Enterprise Engine opisano szczegółowo w tej sekcji dokumentacji.

Skanowanie luk

Docker Enterprise ma wbudowany skaner luk, który umożliwia pobranie bazy CVE do offline'owego skanowania luk w obrazach. Regularne skanowanie obrazów pomaga uczynić je bardziej bezpiecznymi: użytkownik natychmiast otrzymuje powiadomienia o znalezionych lukach. Więcej informacji na ten temat można znaleźć tutaj.

Przyp. tłum.: Istnieją także Open Source'owe skanery luk w obrazach Dockera, przykłady których można znaleźć na końcu materiału.

Integracja LDAP i UCP

Universal Control Plane można zintegrować z LDAP. Rezultatem będzie uproszczony system uwierzytelniania, który eliminuje niepotrzebne dublowanie. Więcej informacji na ten temat można znaleźć w artykule Integrate with an LDAP directory.

Inne materiały

Dodatkowe informacje na temat najlepszych praktyk bezpieczeństwa Dockera można znaleźć na docs.docker.com. Rekomendujemy również pobranie testów Center for Internet Security dla Dockera.

Bonus od tłumacza

Jako logiczne uzupełnienie tego artykułu publikujemy listę 10 popularnych narzędzi Open Source do zapewnienia bezpieczeństwa w Docker. Został on zapożyczony z innego artykułu (napisanego przez Billa Doerrfelda z Doerrfeld.io).

NB: Więcej o wielu omawianych tutaj projektach przeczytasz również w artykule „33+ narzędzi do zabezpieczeń Kubernetes».

  1. Docker Bench for Security — już wspomniany na początku artykułu skrypt, który sprawdza kontenery Docker pod kątem zgodności z powszechnymi praktykami zapewnienia bezpieczeństwa.

    Bezpieczeństwo dla kontenerów Docker

  2. Clair — prawdopodobnie najpopularniejsze narzędzie do statycznej analizy podatności w kontenerze. Wykorzystuje do tego liczne bazy danych podatności CVE (w tym śledzi główne dystrybucje Linuksa, takie jak Red Hat, Debian, Ubuntu). Oferuje API dla programistów i prostą możliwość rozszerzania funkcji (poprzez dodanie „sterowników”). Używane w popularnym publicznym rejestrze obrazów kontenerów (odpowiednika Docker Hub) — Quay.io.
  3. Cilium — rozwiązanie zapewniające bezpieczeństwo sieci na poziomie jądra, oparte na technologii filtracji pakietów sieciowych BPF.
  4. Anchore — narzędzie do analizy zawartości obrazów pod kątem bezpieczeństwa na podstawie bazy CVE. Ponadto umożliwia stosowanie polityk użytkownika (na podstawie różnych danych, w tym białych/czarnych list, zawartości plików itp.) do oceny bezpieczeństwa kontenerów.
  5. OpenSCAP Workbench — cał Ecosystema zaprojektowana do tworzenia i utrzymania polityk bezpieczeństwa na różnych platformach. Do sprawdzania kontenerów oferuje narzędzie oscap-docker.
  6. Dagda — narzędzie do skanowania kontenerów Docker pod kątem podatności, trojanów, wirusów i złośliwego oprogramowania. Bazy danych CVE obejmują kontrole zależności od OWASP, bazę Red Hat Oval oraz repozytorium exploitów Exploit Database.
  7. Notary — framework do podpisywania obrazów Docker, pierwotnie stworzony w Docker Inc (a następnie przekazany do rozwoju w CNCF). Jego użycie pozwala na delegowanie ról i rozdzielanie odpowiedzialności w kontenerach, a także weryfikację integralności kryptograficznej obrazów.
  8. Grafaes — API do metadanych, zaprojektowane do zarządzania wewnętrznymi politykami bezpieczeństwa. Na przykład, pozwala na poprawę działania skanerów bezpieczeństwa kontenerów. Shopify używa tego API do zarządzania metadanymi swoich 500 tysięcy obrazów.
  9. Sysdig Falco — narzędzie dla Kubernetes, które śledzi zachowanie systemu: aktywność w kontenerach, na hostach, w sieci. Umożliwia ciągłe kontrole w infrastrukturze, wykrywanie anomalii i wysyłanie alertów w odpowiedzi na wszelkie wywołania systemowe w Linuksie.
  10. Banyanops Collector — jeszcze jedno narzędzie do statycznej analizy obrazów kontenerów Docker. Umożliwia „zaglądanie” w pliki obrazu, zbieranie niezbędnych danych, stosowanie odpowiednich polityk itp.

Kolejny dobry zbiór praktycznych zaleceń na temat tego, jak uczynić Docker bezpieczniejszym, można znaleźć w w tym artykule firmie Aqua Security. Wiele jej porad pokrywa się z już wcześniej wspomnianymi, ale są też inne. Na przykład, autorzy proponują zorganizowanie monitoringu aktywności w kontenerach i wskazują, na co zwrócić uwagę podczas korzystania z Docker Swarm.

Dla chętnych, aby jeszcze dokładniej zgłębić ten temat, w zeszłym roku ukazała się książka „Docker Security: Quick Reference», fragmenty której są dostępne bezpłatnie tutaj.

Wreszcie, aby praktycznie zapoznać się z niektórymi aspektami bezpieczeństwa Dockera: profilami Seccomp i wykorzystaniem capabilities jądra Linuxa w kontenerach — można przeprowadzić odpowiednie laboratoria na zasobie Play with Docker* — zob. sekcję „Bezpieczeństwo”.

Bezpieczeństwo dla kontenerów Docker

* O samym tym zasobie pisaliśmy opowiadaliśmy dwa lata temu, a w listopadzie 2018 roku miała miejsce bardzo ciekawa (z punktu widzenia bezpieczeństwa) historia. Krótko mówiąc, specjaliści z CyberArk Software Ltd. udało się go złamać: uzyskali możliwość wykonywania poleceń poza kontenerami, tzn. na systemie gospodarza. Doskonała ilustracja problemu bezpieczeństwa w Dockerze, prawda? O wszystkich szczegółach zdarzenia przeczytaj tutaj.

P.S. od tłumacza

Przeczytaj także na naszym blogu:

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster