2015-05-06 3 views
5

Мы закладываем приложение (написанное в Node.js), которое должно получить доступ к некоторым конфиденциальным данным во время выполнения (токены API для разных служб), и я не могу найти никаких рекомендованный подход для решения этой проблемы.Докеры и конфиденциальная информация, используемая во время выполнения

Некоторая информация:

  • Чувствительная информация не является в нашем коде, но он хранится на другом хранилище в зашифрованном виде.
  • В нашем текущем развертывании без Docker мы обновляем базу кода git, а затем вручную копируем конфиденциальную информацию через SSH.
  • докер изображение будет сохранено в частном, самопринятого реестр

я могу думать о некоторых различных подходах, но все они имеют некоторые недостатки:

  1. Include конфиденциальную информации в изображения Docker во время сборки. Это, безусловно, самый простой; однако он делает их доступными для всех, у кого есть доступ к изображению (я не знаю, нужно ли нам так много доверять реестру).
  2. Как 1, но имеет учетные данные в изображении только для данных.
  3. Создайте том на изображении, который ссылается на каталог в хост-системе, и вручную скопируйте учетные данные поверх SSH, как мы делаем прямо сейчас. Это тоже очень удобно, но тогда мы не можем легко развернуть новые серверы (возможно, мы могли бы использовать что-то вроде и т. Д. для их синхронизации?)
  4. Передайте информацию как переменные среды. Однако сейчас у нас есть 5 различных пар учетных данных API, что делает это немного неудобным. Самое главное, однако, нам нужно будет сохранить еще одну копию конфиденциальной информации в сценариях конфигурации (команды, которые будут выполняться для запуска изображений Docker), и это может легко создать проблемы (например, учетные данные, случайно включенные в git и т. Д.).

PS: Я провел некоторое исследование, но не смог найти ничего похожего на мою проблему. Другие вопросы (например, this one) касались важной информации, необходимой во время сборки; в нашем случае нам нужна информация во время выполнения

+0

Очень трудная задача решить правильно. Лучшее решение, которое я нашел, это хранилище Hashicorp, но проект очень новый: https://www.vaultproject.io/ –

ответ

3

Я использовал ваши варианты 3 и 4 для решения этой проблемы в прошлом. Чтобы перефразировать/уточнить:

Создайте том на изображении, который ссылается на каталог в главной системе, и вручную скопируйте учетные данные через SSH, как мы делаем прямо сейчас.

Я использую управление конфигурацией (шеф-повар или Ansible) для настройки учетных данных на хосте. Если приложение принимает файл конфигурации, нуждающийся в токенах API или учетных данных базы данных, я использую управление конфигурацией для создания этого файла из шаблона. Шеф-повар может прочитать учетные данные из зашифрованного пакета данных или атрибутов, настроить файлы на хосте, а затем запустить контейнер с томом, как описано.

Обратите внимание, что в контейнере может понадобиться оболочка для запуска приложения. Обертка копирует файл конфигурации из любого объема, установленного на том месте, где приложение ожидает его, затем запускает приложение.

Передача информации в качестве переменных окружения.Однако сейчас у нас есть 5 различных пар учетных данных API, что делает это немного неудобным. Самое главное, однако, нам нужно будет сохранить еще одну копию конфиденциальной информации в сценариях конфигурации (команды, которые будут выполняться для запуска изображений Docker), и это может легко создать проблемы (например, учетные данные, случайно включенные в git и т. Д.).

Да, это громоздко, чтобы пройти кучу ENV переменных, используя -e key=value синтаксис, но это, как я предпочитаю делать это. Помните, что переменные все еще доступны всем, у кого есть доступ к демону Docker. Если ваша команда docker run составлена ​​программно, это проще.

Если нет, используйте флаг --env-file, как обсуждалось here in the Docker docs. Вы создаете файл с парами ключ = значение, затем запускаете контейнер, используя этот файл.

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

myenv Этот файл может быть создан с помощью управления шеф/конфигурации, как описано выше.

Если вы размещаете на AWS, вы можете использовать KMS здесь. Храните либо файл env, либо файл конфигурации (который передается контейнеру в томе), зашифрованный через KMS. В контейнере используйте скрипт-оболочку, чтобы вызвать KMS, расшифровать файл, переместить его, чтобы разместить и запустить приложение. Таким образом, данные конфигурации не отображаются на диске.

+0

Но в этом случае шеф-повар еще нуждается в ключах дешифрования ... Правильно? (Тем не менее, лучше, чем иметь дешифрованные данные и безопаснее от случайного включения в GIT ...), также хорошая идея с использованием KMS, но даже если мы на AWS, мы стараемся как можно нейтральнее провайдера – Qualcuno

+0

Да, шеф-повар нуждается ключ дешифрования. Конечно, в конечном итоге это понадобится. Кроме того, не то, что вы спросили, но я [блог о моих мыслях о блокировке облаков в выпуске] (http://blog.bwhaley.com/the-fallacy-of-lock-in). –

+0

Ваше сообщение в блоге имеет смысл, но правда в том, что мы на самом деле собираемся переместить все на Azure до конца года, так что это настоящая проблема для нас :) – Qualcuno

Смежные вопросы