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.

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:
- Niezbędne środki wewnątrz systemu operacyjnego hosta przy pracy z Dockerem;
- Instrukcje dotyczące pliku konfiguracyjnego budowy i tworzenia kontenerów;
- 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
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 — 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 && rebootNależ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 dockerAby uzyskać więcej informacji, zobacz dokumentację i .
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 nginxSzczegóły znajdują się w .
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_IDAby dowiedzieć się więcej o tworzeniu wtyczek autoryzacyjnych, zobacz w .
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 .
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 1SELinux
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-enableW 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/bashInterfejsy 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 nginxScache'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 .
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 — . Włączenie Docker Trust w Enterprise Engine opisano szczegółowo w .
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źć .
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 .
Inne materiały
Dodatkowe informacje na temat najlepszych praktyk bezpieczeństwa Dockera można znaleźć na . Rekomendujemy również pobranie .
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 (napisanego przez Billa Doerrfelda z Doerrfeld.io).
NB: Więcej o wielu omawianych tutaj projektach przeczytasz również w artykule „».
- — już wspomniany na początku artykułu skrypt, który sprawdza kontenery Docker pod kątem zgodności z powszechnymi praktykami zapewnienia bezpieczeństwa.

- — 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.
- — rozwiązanie zapewniające bezpieczeństwo sieci na poziomie jądra, oparte na technologii filtracji pakietów sieciowych BPF.
- — 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.
- — cał Ecosystema zaprojektowana do tworzenia i utrzymania polityk bezpieczeństwa na różnych platformach. Do sprawdzania kontenerów oferuje narzędzie
oscap-docker. - — 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.
- — 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.
- — 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.
- — 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.
- — 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 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 „», fragmenty której są dostępne bezpłatnie .
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 * — zob. sekcję „Bezpieczeństwo”.

* O samym tym zasobie pisaliś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 .
P.S. od tłumacza
Przeczytaj także na naszym blogu:
- «»;
- «»;
- «»;
- «»;
- «»;
- «».
Źródło: habr.com

