Передача секретів до контейнера Docker


26

У мене є базове зображення докера, яке використовується для запуску програмного забезпечення для аналізу зображень. Для кожного контейнера, створеного із зображення, існує набір параметрів конфігурації, деякі з яких є секретами (ключі шифрування, інформація про клієнта тощо), які використовуються програмним забезпеченням для аналізу та розповсюдження оброблених зображень. Як я можу безпечно передати ці секрети в контейнер?


Сейф Хашикорпа
030

Відповіді:


23

У вас є 3 способи отримання секретів для програми всередині докерного контейнера. Перші 2 включають конфігурацію докера. Останнє - це, щоб ваші програми безпосередньо отримували секрети з секретного магазину.

1 - змінні середовища

Відповідно до посібника "Додаток 12 Фактор" , секрети просто налаштовані, і їх завжди слід встановлювати в оточенні. Ви можете встановити свої секрети як змінні середовища під час запуску докера, а ваша програма звертається до них звідти.

2 - змонтовані обсяги

Ви можете мати свої секрети у певному файлі конфігурації / секретів, а потім змонтуйте їх до свого примірника як змонтований том .

3 - Витяг із секретного магазину

Як згадувалося @ 030, ви можете використовувати Hashicorp Vault (або "Менеджер секретів Amazon", або будь-яку подібну службу).
Ваш додаток або додаткова коляска може безпосередньо отримувати необхідні йому секрети, не маючи справу з будь-якою конфігурацією контейнера Docker. Цей метод дозволить вам використовувати динамічно створені секрети (дуже приваблива особливість таких систем) і не турбуватися про перегляд секретів у файловій системі або перевірку змінних env контейнера докера.

Особиста думка

Я вважаю, що змінні env - це шлях. Це простіше в управлінні, і ви все одно можете витягнути з таємного магазину на зразок Hashicorp Vault, якщо у вас є система побудови CI, витягуйте секрети під час збирання та встановлюйте їх під час розгортання. Ви отримуєте найкраще з обох світів, і додаткова перевага вашим розробникам не потребує написання коду програми для отримання секретів. Розробники повинні бути зосереджені на їх функціональності коду, а не на таких адміністративних завданнях, як отримання паролів.

Код вашої програми має бути зосереджений на власній функціональності додатка, а не на вирішенні завдань, таких як отримання паролів. Так само, як і 12 додатків фактора.

Редагувати: змінив останнє речення, щоб видалити значення програми для Developer vs SysAdmin. Самі завдання повинні бути окремими з точки зору коду, але DevOps - це приблизно ті самі особи, які мають на увазі і не повинні бути обмеженими.

Особиста думка (оновлення)

Відмінний коментар Пер @ Дірка ( Передача секретів до контейнера Docker ), є дуже сильний аргумент, щоб надати пріоритет секретному магазину над ENV vars, через те, що він не бажає їх витікати.


2
Це сприяє силосу. DevOps робить речі разом, а не кидаючи речі на стіну.
030

2
Код повинен бути відключений від компонентів інфраструктури. Дійсні люди могли кодувати як автоматизацію інфраструктури, так і базу коду додатків, але самі завдання повинні бути окремими. Я бачу, що останнє речення моєї оригінальної відповіді було силосним від чортів, людей. Це є помилкою. Я відредагую це, щоб було зрозуміліше.
BoomShadow

7
Введення секретів у змінні середовища пропонує різні можливості для їх протікання. Кілька прикладів: кожен, хто має доступ до демона Docker на машині, на якій працює контейнер, може бачити їх за допомогою команд inspectабо exec. Змінні середовища часто потрапляють до stdoutабо в журнали під час роботи в якомусь режимі налагодження. Усі породжені дочірні процеси можуть прочитати та викрити їх, що може бути поза вашим контролем. Більше інформації, наприклад, тут: diogomonica.com/2017/03/27/…
Дірк

1
Я також стикаюся з цим питанням. Я не розумію, що навіть якщо ви використовуєте сховище облікових даних для захисту своїх секретів, ви все одно повинні мати автентифікацію, щоб отримати доступ до цього сховища, і це, ймовірно, вимагає певної таємниці. Це ж занепокоєння стосується використання файлу KeyStore, захищеного паролем. Ми завжди застрягли в тому, щоб передати принаймні "мета-дані" в оточенні?
Wheezil

1
@Weezil мета-обліковий запис простіше захистити, ніж багато конкретних облікових даних. ви можете часто і автоматично обертати мета-дані. метаповноваження може перейти до сховища, що знаходиться на захищеному хості, і може мати такі речі, як ip whitelist, щоб він приймав лише з'єднання з вашої виробничої підмережі. ви також можете переконатися, що в сховищі використовується шифрування в режимі спокою та шифрування під час польоту та взаємне закріплення tsl та сертифікатів та всі інші найкращі практики, які роблять речі більш безпечними.
simbo1905

1

Є ще один варіант лише за допомогою труби:

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_

По-перше, створіть демон-докер за -iдопомогою команди, команда read Aбуде висіти в очікуванні на вхід з /proc/1/fd/0; Потім запустіть другу команду docker, прочитавши секрет від stdin та переспрямуйте на останній процес вивішування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.