2015-08-26 3 views
8

У меня есть контейнер, в котором используются контейнеры, которым требуется доступ к конфиденциальной информации, такой как ключи API и пароли БД. Сейчас эти чувствительные значения встроены в определениях контроллера, как так:Заполнение докерных контейнеров с конфиденциальной информацией с использованием кубернетов

env: 
- name: DB_PASSWORD 
    value: password 

, которые затем доступны внутри контейнера Докер в качестве переменной в $DB_PASSWORD окружающей среды. Все довольно легко.

Но, читая их документацию по адресу Secrets, они явно заявляют, что внесение в ваше определение чувствительных значений конфигурации нарушает наилучшую практику и потенциально является проблемой безопасности. Единственная другая стратегия, которую я могу думать о следующем:

  • создать ключ OpenPGP каждого сообщества пользователей или имен
  • использования crypt установить значение конфигурации в etcd (который шифруется с помощью закрытого ключа)
  • создать kubernetes секрет, содержащий закрытый ключ, like so
  • ассоциировать этот секрет с контейнером (это означает, что закрытый ключ будет доступен, как смонтировать тома), like so
  • когда контейнер I , он будет обращаться к файлу внутри жесткого диска для частного ключа и использовать его для дешифрования значений conf, возвращаемых из etcd.
  • это можно затем добавить в confd, который заполняет локальные файлы в соответствии с определением шаблона (например, в качестве файлов конфигурации Apache или WordPress)

Это кажется довольно сложным, но более безопасным и гибким, поскольку значения больше не будут статическими и сохранены в виде открытого текста.

Так что мой вопрос, и я знаю, что это не совсем объективный вопрос, является ли это абсолютно необходимым или нет? Только админы смогут просматривать и выполнять определения RC в первую очередь; поэтому, если кто-то нарушил хозяина кубернетов, у вас есть другие проблемы, о которых нужно беспокоиться. Единственное преимущество, которое я вижу, заключается в том, что нет никакой опасности секретов, связанных с файловой системой в открытом тексте ...

Есть ли еще какие-либо способы для заполнения контейнеров Docker секретной информацией безопасным способом?

+0

@larsks Но не будет ли файл определения секретности хранить учетные данные в виде открытого текста? Или в base64, который может быть легко декодирован. – hohner

+0

Да, и я неправильно понял, что вы уже воспользовались этим API. Итак, неважно ... – larsks

+0

Как я понимаю, Секреты - это способ передачи конфиденциальной информации, но у нее есть свои ограничения. Тем не менее, это лучше, чем просто передавать конфиденциальную информацию непосредственно в переменных ENV. – MrE

ответ

4

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

Затем вы можете использовать любой из множества механизмов для передачи этой конфигурации в вашу задачу, например. если переменные среды source secret/config.sh; ./mybinary - это простой способ.

Я не думаю, что вы получаете дополнительную защиту, сохраняя секретный ключ как секрет.

+1

Ну, вот почему я не уверен, что это хорошая идея: 1. Я думаю, что размещение секреты в отдельных файлах немного неуклюжи, так как большинство приложений не обрабатывают конфиденциальные данные. Вам нужно будет написать дополнительную логику загрузки, что неудобно. 2. Монтирование файлов томов и их включение в env слишком статичны. Я бы предпочел, чтобы моя конфигурация приложения хранилась динамически в etcd, используя 'crypt' для шифрования. 3. Из безопасности POV, я думаю, что требуется дополнительное время и знания для доступа лучше, чем давать им их в открытом виде. – hohner

+0

a Секрет может быть только длиной 256 символов ... так хорошо работает для паролей и ключей, возможно, но не для таких вещей, как сертификаты и т. Д. ... это может быть намного дольше. – MrE

+1

Секретный * ключ * может быть только 256 символов; нет никаких ограничений на секретные * данные *. – lavalamp

2

Я лично разрешаю пользователю удаленный keymanager, который ваше программное обеспечение может получить через сеть через соединение HTTPS. Например, Keywhiz или Vault, вероятно, соответствовали бы счету.

Я бы разместил keymanager в отдельной изолированной подсети и настроил брандмауэр только для доступа к IP-адресам, которые, как я ожидал, нуждались в ключах.Оба KeyWhiz и Vault поставляются с механизмом ACL, поэтому вам вообще не нужно ничего делать с брандмауэрами, но это не больно, чтобы рассмотреть его - однако ключ здесь состоит в том, чтобы размещать keymanager в отдельной сети и возможно даже отдельный хостинг-провайдер.

Ваш локальный файл конфигурации в контейнере будет содержать только URL-адрес ключевой службы и, возможно, учетные данные для извлечения ключа из диспетчера ключей - учетные данные будут бесполезны для злоумышленника, если он не соответствует ACL/IP-адреса.

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