Как стать автором
Обновить

Секреты в kubernetes используя Hashicorp Vault + External Secrets Operator

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров10K
Всего голосов 26: ↑26 и ↓0+26
Комментарии17

Комментарии 17

Мы в своё время тоже столкнулись с данным вопросом - т.к. тоже используем Vault + k8s (точнее GKE, но там различия минимальны), перепробовали разные варианты, но все показались небезопасными, так что в итоге написали своё решение - Vault Secret Fetcher, который действует более секьюрным образом - загрузившись через sidecar init container предоставляет секреты как environment variables доступные только приложению. Т.е. даже имея доступ к поду и проломившись в контейнер не получится сдампить env vars.

xargs --null --max-args=1 echo < /proc/<pid>/environ
А если так?

Так переменные будет видно

При вызове syscall.Exec, который вызывает glibc'шный execve, данные в /proc/<pid>/ обновляются под новую вызванную программу, в том числе обновляется /proc/<pid>/environ

Пруф

1) 2 простые программы на go:
- exec будет устанавливать переменную окружения FOO и вызывать другую программу через syscall.Exec
- sleep будет просто спать

2) Запускаем в контейнере и "проваливаемся" туда

docker run --rm -it --name envvar -u 2000:2000 -v $(pwd):/app ubuntu:20.04 /app/exec /app/sleep
docker exec -it envvar bash

3) Проверяем

А вот если установить переменную окружения через os.Setenv и не вызывать другую программу, а продолжать работать в текущей, то значение такой переменной придётся уже искать в памяти с помощью какого-нибудь gdb

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

Спасибо Вам за полезный комментарий!

Вы им пользовались? Если да, то поделитесь, пожалуйста, его плюсами и минусами.

Понял, в любом случае, спасибо! Возьмем на заметку.

Bank vaults умеет мутировать также и секреты. И даже конфигмапы (ну вдруг).

Спасибо за комментарий. Да, знаем.

Тем не менее ESO нам показался более простым в настройке и выполняет все необходимые функции.

А CSI чем не мил?

Спасибо за комментарий. CSI не пробовали. Он тоже поддерживает синхронизацию с секретами k8s, но не умеет обновлять их.

ESO имеет такую возможность. В ExternalSecret есть параметр "refreshInterval". Указываешь время, с какой периодичностью он будет сканировать внешний api на наличие обновлений.

Вроде как не желали как файл хранить и в env

А как перезапускать pod-ы если изменилось содержимое cm/secret?

А то получается изменяется значение а код продолжает работать с предыдущим значением

Можно просто рестарт деплоймента сделать :)

И всё же интерсно. Как вы настроили unseal при рестарте? Использовали autounseal или отдельный под типа vault-unseal?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий