2015-05-06 13 views
5

Przystańmy do dokowania aplikacji (napisanej w Node.js), która będzie wymagać dostępu do niektórych poufnych danych w czasie wykonywania (tokeny API dla różnych usług) i nie mogę znaleźć żadnych zalecane podejście do radzenia sobie z tym.Docker i poufne informacje używane w czasie wykonywania

Niektóre informacje:

  • Wrażliwe informacje nie są w naszym kodzie, ale jest utrzymany w innym repozytorium w formie zaszyfrowanej.
  • W naszym obecnym wdrożeniu, bez Docker, aktualizujemy kod z git, a następnie ręcznie kopiujemy wrażliwe informacje przez SSH.
  • ilustracje dokowane będą przechowywane w prywatnym, self-hosted rejestru

mogę myśleć o kilku różnych podejść, ale wszystkie z nich mają pewne wady:

  1. zawierać poufne informacje obrazy Dockera w czasie kompilacji. Jest to z pewnością najłatwiejszy; jednak sprawia, że ​​są one dostępne dla każdego, kto ma dostęp do obrazu (nie wiem, czy powinniśmy tak bardzo ufać rejestrze).
  2. Podobnie jak 1, ale ma poświadczenia w obrazie tylko do odczytu.
  3. Utwórz wolumin na obrazie, który prowadzi do katalogu w systemie hosta, i ręcznie skopiuj poświadczenia za pośrednictwem SSH, tak jak teraz. Jest to również bardzo wygodne, ale nie możemy łatwo rozprowadzić nowych serwerów (może moglibyśmy użyć czegoś takiego, jak itd. do zsynchronizowania ich?)
  4. Przekaż informacje jako zmienne środowiskowe. Jednak mamy teraz 5 różnych par referencji API, co sprawia, że ​​jest to trochę niewygodne. Co najważniejsze jednak, musielibyśmy zachować kolejną kopię poufnych informacji w skryptach konfiguracyjnych (polecenia, które będą wykonywane w celu uruchamiania obrazów Docker), a to z łatwością może powodować problemy (np. Poświadczenia przypadkowo zawarte w git, itp.).

PS: Zrobiłem pewne badania, ale nie mogłem znaleźć niczego podobnego do mojego problemu. Inne pytania (takie jak this one) dotyczyły poufnych informacji potrzebnych podczas budowania; w naszym przypadku potrzebujemy informacji w czasie wykonywania

+0

Bardzo trudny problem do rozwiązania. Najlepsze rozwiązanie, jakie znalazłem, to skarbiec Hashicorp, ale projekt jest bardzo nowy: https://www.vaultproject.io/ –

Odpowiedz

3

Użyłem twoich opcji 3 i 4, aby rozwiązać ten problem w przeszłości. Aby ponownie sformułować/rozwinąć:

Utwórz wolumin na obrazie, który prowadzi do katalogu w systemie hosta, i ręcznie skopiuj poświadczenia za pośrednictwem SSH, tak jak teraz.

Używam konfiguracji zarządzania (Chef lub Ansible), aby skonfigurować poświadczenia na hoście. Jeśli aplikacja pobiera plik konfiguracyjny wymagający tokenów interfejsu API lub referencji bazy danych, używam zarządzania konfiguracją, aby utworzyć ten plik z szablonu. Szef kuchni może odczytywać poświadczenia z zaszyfrowanej torby z danymi lub atrybutami, konfigurować pliki na hoście, a następnie uruchamiać kontener z taką samą objętością, jak opisujesz.

Należy pamiętać, że w kontenerze może być konieczne otwieranie aplikacji. Opakowanie kopiuje plik konfiguracyjny z dowolnego woluminu podłączonego do miejsca, w którym aplikacja tego oczekuje, a następnie uruchamia aplikację.

Przekaż informacje jako zmienne środowiskowe.Jednak mamy teraz 5 różnych par referencji API, co sprawia, że ​​jest to trochę niewygodne. Co najważniejsze jednak, musielibyśmy zachować kolejną kopię poufnych informacji w skryptach konfiguracyjnych (polecenia, które będą wykonywane w celu uruchamiania obrazów Docker), a to z łatwością może powodować problemy (np. Poświadczenia przypadkowo zawarte w git, itp.).

Tak, to nieporęczne przekazywanie wielu zmiennych env przy użyciu składni -e key=value, ale tak wolę to zrobić. Pamiętaj, że zmienne są nadal dostępne dla każdego, kto ma dostęp do demona Docker. Jeśli twoje polecenie docker run jest skomponowane programowo, jest to łatwiejsze.

Jeśli nie, użyj flagi --env-file zgodnie z omówieniem here in the Docker docs. Tworzysz plik z parami klucz = wartość, a następnie uruchamiasz kontener używając tego pliku.

$ cat >> myenv << END 
FOO=BAR 
BAR=BAZ 
END 
$ docker run --env-file myenv 

To myenv plików mogą być tworzone przy użyciu funkcji zarządzania kucharz/config, jak opisano powyżej.

Jeśli prowadzisz hosting w AWS, możesz wykorzystać tutaj usługę KMS. Zachowaj plik env lub plik konfiguracyjny (który jest przekazywany do kontenera w woluminie) zaszyfrowany za pośrednictwem KMS. W kontenerze użyj skryptu opakowania, aby wywołać usługę KMS, odszyfrować plik, przenieść go w miejsce i uruchomić aplikację. W ten sposób dane konfiguracyjne nie są widoczne na dysku.

+0

Ale w tym przypadku szef kuchni nadal potrzebuje kluczy odszyfrowywania ... Prawidłowe? (Wciąż lepsze niż odszyfrowanie danych i bezpieczniejsze przed przypadkowym włączeniem do GIT ...), dobry pomysł z wykorzystaniem KMS, ale mimo że jesteśmy na AWS, staramy się być jak najbardziej neutralnym dostawcą. – Qualcuno

+0

Tak, potrzeby szefa kuchni klucz deszyfrowania. Coś ostatecznie będzie tego potrzebowało. Ponadto, nie o to pytałeś, ale [zapisałem swoje myśli na temat blokady chmury w wydaniu] (http://blog.bwhaley.com/the-fallacy-lock-in). –

+0

Twój wpis na blogu ma sens, ale prawda jest taka, że ​​zamierzamy przenieść wszystko na platformę Azure przed końcem roku, więc jest to dla nas prawdziwy problem :) – Qualcuno

Powiązane problemy