Przekazywanie tajemnic do kontenera Docker

26

Mam podstawowy obraz dokera, który służy do uruchamiania oprogramowania do analizy obrazu. Dla każdego kontenera utworzonego z obrazu istnieje zestaw ustawień konfiguracyjnych, z których niektóre są tajne (klucze szyfrowania, informacje o kliencie itp.), Które są używane przez oprogramowanie do analizy i dystrybucji przetworzonych obrazów. Jak mogę bezpiecznie przekazać te tajemnice do kontenera?

PrestonM
źródło
Skarbiec Hashicorp
030

Odpowiedzi:

23

Masz 3 metody na uzyskanie tajemnic do aplikacji w kontenerze dokera. Pierwsze 2 dotyczą konfiguracji dokera. Ostatnim jest, aby Twoje aplikacje bezpośrednio pobierały sekrety z tajnego sklepu.

1 - Zmienne środowiskowe

Zgodnie z przewodnikiem „The 12 Factor App” sekrety są jedynie konfiguracją i zawsze powinny być ustawione w środowisku. Możesz ustawić swoje sekrety jako zmienne środowiskowe podczas uruchamiania dokera, a aplikacja będzie od nich uzyskiwać dostęp.

2 - Zamontowane woluminy

Możesz mieć swoje sekrety w jednym pliku konfiguracji / sekretów, a następnie zamontować je w instancji jako zamontowany wolumin .

3 - Pobierz z tajnego sklepu

Jak wspomniano w @ 030, możesz korzystać z Hashicorp Vault (lub „Amazon Secrets Manager” lub dowolnej podobnej usługi).
Twoja aplikacja lub aplikacja pomocnicza może pobrać sekrety, których potrzebuje bezpośrednio, bez konieczności zajmowania się jakąkolwiek konfiguracją kontenera Docker. Ta metoda pozwoliłaby Ci korzystać z dynamicznie tworzonych sekretów (bardzo atrakcyjna funkcja takich systemów) i bez obawy, że sekrety będą widoczne z systemu plików lub ze sprawdzenia zmiennych env kontenera dokera.

Osobista opinia

Wierzę, że zmienne env to droga. Łatwiej jest nim zarządzać i nadal możesz pobierać z tajnego sklepu, takiego jak Hashicorp Vault, jeśli masz system kompilacji CI, wyciągaj sekrety podczas kompilacji i ustaw je podczas wdrażania. Dostajesz to, co najlepsze z obu światów, a także dodatkową korzyść dla programistów, którzy nie muszą pisać kodu aplikacji w celu uzyskania tajemnic. Deweloperzy powinni skupić się na swojej funkcjonalności kodu, a nie na zadaniach administracyjnych, takich jak pobieranie haseł.

Kod aplikacji powinien koncentrować się na samej funkcjonalności aplikacji, a nie na zadaniach zaplecza, takich jak pobieranie haseł. Podobnie jak w przypadku 12 aplikacji Factor.

Edycja: zmieniono ostatnie zdanie, aby usunąć wpływ silosu na programistę vs SysAdmin. Same zadania powinny być oddzielone od perspektywy kodu, ale DevOps dotyczy tych samych osób, pamiętając o nich i nie ograniczając się do nich.

Osobista opinia (aktualizacja)

Według doskonałego komentarza @ Dirka ( Przekazywanie tajemnic do kontenera Docker ) istnieje bardzo silny argument, aby nadać priorytet tajnemu sklepowi nad zmiennymi ENV, ponieważ nie chce się ich ujawniać.

BoomShadow
źródło
2
To promuje silosy. DevOps robi rzeczy razem, zamiast rzucać nimi o ścianę.
030
2
Kod należy usunąć z komponentów infrastruktury. Rzeczywiste osoby mogą kodować zarówno automatyzację infrastruktury, jak i bazę kodu aplikacji, ale same zadania powinny być oddzielne. Widzę, że ostatnim zdaniem mojej pierwotnej odpowiedzi było zbieranie się od twórców, ludzi. To jest błąd. Zredaguję to, aby było jaśniej.
BoomShadow,
7
Wpisywanie sekretów do zmiennych środowiskowych daje różne możliwości ich wycieku. Kilka przykładów: każdy, kto ma dostęp do demona Docker na komputerze z uruchomionym kontenerem, może zobaczyć go za pomocą poleceń inspectlub exec. Zmienne środowiskowe często są zrzucane do stdoutlub do plików dziennika podczas działania w trybie debugowania. Wszystkie odrodzone procesy potomne mogą je czytać i ujawniać, co może być poza twoją kontrolą. Więcej informacji np. Tutaj: diogomonica.com/2017/03/27/…
Dirk
1
Zmagam się również z tym pytaniem. Nie rozumiem, że nawet jeśli korzystasz ze skarbca referencji, aby zabezpieczyć swoje sekrety, nadal musisz się uwierzytelnić, aby uzyskać dostęp do tego skarbca, a to prawdopodobnie wymaga pewnej tajemnicy. To samo dotyczy korzystania z pliku KeyStore chronionego hasłem. Czy zawsze tkwimy w przekazywaniu przynajmniej „meta-referencji” w środowisku?
Wheezil
1
@Wheezil meta-uwierzytelnienie jest łatwiejsze do zabezpieczenia niż wiele konkretnych poświadczeń. możesz często i automatycznie obracać meta referencje. dane uwierzytelniające meta mogą przejść do skarbca, który znajduje się na bezpiecznym hoście i może zawierać takie elementy, jak biała lista ip, aby akceptował tylko połączenia z podsieci produkcyjnych. możesz również upewnić się, że skarbiec używa szyfrowania w spoczynku i szyfrowania w locie oraz wzajemnego przypinania tsl i certyfikatów oraz wszystkich innych najlepszych praktyk, które zwiększają bezpieczeństwo.
simbo1905
1

Jest inna opcja tylko przy użyciu potoku:

docker run -d -i --name $n alpine sh -c 'read A; echo "[$A]"; exec some-server'
docker exec -i $n sh -c 'cat > /proc/1/fd/0' <<< _a_secret_

Najpierw utwórz demona dokera -i, polecenie read Azawiesi się, czekając na dane wejściowe z /proc/1/fd/0; Następnie uruchom drugie polecenie dokera, odczytując sekret ze standardowego wejścia i przekierowując do ostatniego zawieszającego się procesu.

James ZM Gao
źródło