Комментарии 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
Спасибо Вам за полезный комментарий!
С недавних пор HashiCorp предлагает родной оператор https://github.com/hashicorp/vault-secrets-operator
Вы им пользовались? Если да, то поделитесь, пожалуйста, его плюсами и минусами.
Я только установил и проверил, что работает. Глубокого тестирования не делал. Какое-то сравнение видел здесь https://www.hashicorp.com/blog/kubernetes-vault-integration-via-sidecar-agent-injector-vs-csi-provider
Bank vaults умеет мутировать также и секреты. И даже конфигмапы (ну вдруг).
А CSI чем не мил?
Спасибо за комментарий. CSI не пробовали. Он тоже поддерживает синхронизацию с секретами k8s, но не умеет обновлять их.
ESO имеет такую возможность. В ExternalSecret есть параметр "refreshInterval". Указываешь время, с какой периодичностью он будет сканировать внешний api на наличие обновлений.
Вроде как не желали как файл хранить и в env
А как перезапускать pod-ы если изменилось содержимое cm/secret?
А то получается изменяется значение а код продолжает работать с предыдущим значением
И всё же интерсно. Как вы настроили unseal при рестарте? Использовали autounseal или отдельный под типа vault-unseal?
Секреты в kubernetes используя Hashicorp Vault + External Secrets Operator