W jednym z poprzednich postów opisałem mechanizm Docker Configs. Pozwala on na umieszczenie zawartości dowolnego pliku w kontenerze działającym w klastrze Swarm. Zawartość pliku definiujemy jako obiekt klastra. Jest jeszcze drugi wart uwagi mechanizm Docker Secrets. Wykorzystujemy go, aby zarządzań i przekazywać w bezpieczny sposób do kontenera wrażliwe informacje takie jak hasła czy klucze SSH.
Jak zabezpieczyć wrażliwe dane?
Istnieje szereg wrażliwych informacji, do których aplikacja uruchomiona w kontenerze musi mieć dostęp. Takimi informacjami są na przykład login i hasło do bazy danych, z którą aplikacja się łączy, Może to też być plik z kluczem SSH czy certyfikatem SSL lub dowolnie inny plik, który wymaga ochrony. W jakiś sposób musimy przekazać jego zawartość do aplikacji działającej wewnątrz kontenera. Można to zrobić w sposób niebezpieczny umieszczając pliki bezpośrednio w obrazie kontenera (tak nigdy nie rób!), montując z lokalnego lub zdalnego systemu plików czy poprzez opisany przeze mnie mechanizm Docker Configs.
Wszystkie powyższe rozwiązania mają tą wadę, że nie są zbyt bezpieczne. Nie zapewniają praktycznie żadnej ochrony tak wrażliwym plikom, a wręcz w wielu przypadkach obniżają. Możemy stosować dodatkowe mechanizmy szyfrowania czy zabezpieczania zawartości tych plików, albo skorzystać z wbudowanego mechanizmu Docker Secrets.
Docker Secrets to mechanizm dostępny tylko w trybie Swarm. Nie skorzystamy z niego w wersji stand-alone silnika konteneryzacji. Dzieje się tak dlatego, że dane. które przechowujemy w usłudze Docker Secrets zostaną zaszyfrowane za pomocą infrastruktury PKI i kluczy, które zostały wygenerowane w momencie uruchomienia trybu Swarm. Ich zarządzaniem zajmują się węzły typu manager. Zatem wprowadzona za pomocą mechanizmu Docker Secrets informacja jest zabezpieczona i odpowiednio rozproszona pomiędzy węzły zarządzające.
Tworzymy obiekt Docker Secrets
Ponieważ mechanizm Docker Secret jest dostępny tylko w klastrze Swarm musimy taki klaster. Nic nie stoi na przeszkodzie, by klaster składał się tylko z jednego węzła. W ten sposób wykorzystamy mechanizm Docker Secret na pojedynczym serwerze.
Obiekt typu secret tworzymy poleceniem docker secret create
wskazując plik z danymi. Możemy też wprowadzić dane za pomocą strumienia stdin
.
docker secret create TAJNE_DANE /home/user/plik_z_danymi.txt
Listę utworzonych obiektów wyświetlimy poleceniem docker secret ls
. Natomiast docker secret inspect
pokaże nam szczegółowe informacje na temat obiektu. Samych zaś przechowywanych w obiekcie danych za pomocą żadnego polecenia nie odczytamy. Dostępne one będą dopiero bezpośrednio w uruchomionym kontenerze. Utworzony obiekt w każdej chwili usuniemy poleceniem docker secret rm
.
Zdeszyfrowane dane z obiektów Docker Secret umieszczane są w katalogu /run/secrets
. Poszczególne obiekty znajdują się w plikach o nawach odpowiadającym nazwom obiektów.
Pamiętajmy, że bezpieczeństwo danych, które przechowujemy w usłudze Docker Secrets jest wprost zależne od bezpieczeństwa całego klastra Docker Swarm.