В нашем не очень идеальном мире мы склонны оставлять все наши секреты приложения (пароли, токены API), обнаруженные в нашем исходном коде. Хранение секретов на видении не такая хорошая идея, не так ли? Мы, в DeepSource, приняли эту проблему, включив надежную систему управления секретами в нашу инфраструктуру с первого дня. В этом посте объясняется, как настроить секретное управление в Kubernetes с Hashicorp Vault.
Что такое хранилище?
Vault выступает в качестве центрального управляемого услуги, которая занимается шифрованием и хранением всех ваших секретов инфраструктуры. Управление управляет всеми секретами в секретных двигателях. В своем распоряжении в Vault есть набор секретных двигателей, но ради краткости мы будем придерживаться секретного двигателя KV (ключа).
Обзор
Приведенный выше дизайн изображает кластер с тремя узлами с одним активным узлом, двумя резервными узлами и Agent Consul Agent Sidecar, развернутые разговоры от имени узла Vault в кластер с пятью узлами Consul Server. Архитектура также может быть распространена на зону многоэтажной зоны, что делает ваш кластер, чтобы быть устойчивым к ошибкам.
Вам может быть интересно, почему мы используем консул -сервер, когда архитектура уже немного сложна, чтобы обернуть голову. Убежище требуется бэкэнд для хранения всех зашифрованных данных в состоянии покоя. Это может быть ваш бэкэнд файловой системы, облачный провайдер, база данных или кластер консул.
Сила консула заключается в том, что он устойчив к неисправности и очень масштабируемый. Используя консул в качестве бэкэнда для хранилища, вы получаете лучшее из обоих. Консул используется для прочного хранения зашифрованных данных в состоянии покоя и обеспечивает координацию, чтобы хранилище было очень доступно и устойчиво к неисправности. Vault обеспечивает управление политикой более высокого уровня, секретный лизинг, регистрацию аудита и автоматическое отмену.
Клиент общается с сервером Vault через HTTPS, сервер Vault обрабатывает запросы и направляет его в агент консула по адресу Loopback. Агенты клиентов консула служат интерфейсом для сервера консула, очень легкие и поддерживают собственное состояние. Сервер Consul сохраняет секреты, зашифрованные в состоянии покоя.
Кластер сервера консул по существу нечетно, так как они необходимы для поддержания согласованности и устойчивости к разломам с использованием консенсусного протокола. Протокол консенсуса в основном основан на Плот: В поисках понятного алгоритма консенсуса Анкет Для визуального объяснения плота вы можете обратиться к Тайная жизнь данных Анкет
Убежище на Kubernetes — ослабление вашего выхода из операционных сложностей
Почти вся инфраструктура DeepSource работает на Kubernetes. От анализа пройдет до инфраструктуры VPN, все работает в широко распределенной среде, а Kubernetes помогает нам достичь этого. Для настройки хранилища в Kubernetes Hashicorp настоятельно рекомендует использовать диаграммы Helm для развертывания Vault и Consul на Kubernetes, а не использовать мирские манифесты.
Предварительные условия
Для этой настройки нам требуется kubectl и Хелм Установлен вместе с локальным minikube Настройка для развертывания.
$ kubectl version Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.3", GitCommit:"b3cbbae08ec52a7fc73d334838e18d17e8512749", GitTreeState:"clean", BuildDate:"2019-11-14T04:24:29Z", GoVersion:"go1.12.13", Compiler:"gc", Platform:"darwin/amd64"} Server Version: version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.8-gke.33", GitCommit:"2c6d0ee462cee7609113bf9e175c107599d5213f", GitTreeState:"clean", BuildDate:"2020-01-15T17:47:46Z", GoVersion:"go1.12.11b4", Compiler:"gc", Platform:"linux/amd64"}
$ helm version version.BuildInfo{Version:"v3.0.1", GitCommit:"7c22ef9ce89e0ebeb7125ba2ebf7d421f3e82ffa", GitTreeState:"clean", GoVersion:"go1.13.4"}
$ minikube version minikube version: v1.5.2 commit: 792dbf92a1de583fcee76f8791cff12e0c9440ad
Настройка
Давайте запустим Minikube.
$ minikube start --memory 4096 😄 minikube v1.5.2 on Darwin 10.15.2 ✨ Automatically selected the 'hyperkit' driver (alternates: [virtualbox]) 🔥 Creating hyperkit VM (CPUs=2, Memory=4096MB, Disk=20000MB) ... 🐳 Preparing Kubernetes v1.16.2 on Docker '18.09.9' ... 🚜 Pulling images ... 🚀 Launching Kubernetes ... ⌛ Waiting for: apiserver 🏄 Done! kubectl is now configured to use "minikube"
-Мемория
Установлен на 4096 МБ, чтобы убедиться, что достаточно памяти для развертывания всех ресурсов. Процесс инициализации занимает несколько минут, поскольку он получает необходимые зависимости и запускает загрузки несколько контейнерных изображений.
Проверьте состояние вашего кластера Minikube,
$ minikube status host: Running kubelet: Running apiserver: Running kubeconfig: Configured
хост
, Кубелет
, Апизервер
должен сообщить, что они работают. При успешном исполнении, kubectl
будет автоматически настроен для связи с этим недавно запущенным кластером.
Рекомендуемый способ запустить хранилище на Kubernetes с Хелм -диаграмма Анкет Это устанавливает и настраивает все необходимые компоненты для запуска хранилища в нескольких разных режимах. Давайте установим диаграмму Helm Vault (этот пост развертывает версию 0.3.3) с PODS, префиксированными с именем свод
:
$ helm install --name vault \ --set "server.dev.enabled=true" \ https://github.com/hashicorp/vault-helm/archive/v0.3.0.tar.gz NAME: vault LAST DEPLOYED: Fri Feb 8 11:56:33 2020 NAMESPACE: default STATUS: DEPLOYED RESOURCES: .. NOTES: .. Your release is named vault. To learn more about the release, try: $ helm status vault $ helm get vault
Чтобы проверить, получите все стручки в пространстве имен по умолчанию:
$ kubectl get pods NAME READY STATUS RESTARTS AGE vault-0 1/1 Running 0 80s vault-agent-injector-5945fb98b5-tpglz 1/1 Running 0 80s
Создание секрета
Приложения, которые вы развернете на более поздних шагах, ожидают, что Vault хранит имя пользователя и пароль, хранящийся на пути внутренняя/база данных/config
Анкет Для создания этого секрета требуется, чтобы секретный двигатель KV был включен, а имя пользователя и пароль помещалось на указанный путь.
Запустите интерактивную сеанс оболочки на Vault-0
Струк:
$ kubectl exec -it vault-0 /bin/sh / $
Ваша системная подсказка заменяется новой подсказкой /$
Анкет Команды, выпущенные в этом подсказке, выполняются на Vault-0
контейнер.
Включить секреты KV-V2 на пути внутреннего:
/ $ vault secrets enable -path=internal kv-v2 Success! Enabled the kv-v2 secrets engine at: internal/
Добавить секрет пользователя и пароль на пути Внутренний/exampleApp/config
:
$ vault kv put internal/database/config username="db-readonly-username" password="db-secret-password" Key Value --- ----- created_time 2019-12-20T18:17:01.719862753Z deletion_time n/a destroyed false version 1
Убедитесь, что секрет определяется на пути внутренняя/база данных/config
:
$ vault kv get internal/database/config ====== Metadata ====== Key Value --- ----- created_time 2019-12-20T18:17:50.930264759Z deletion_time n/a destroyed false version 1 ====== Data ====== Key Value --- ----- password db-secret-password username db-readonly-username
Сделайте Kubernetes знакомыми для хранилища
Хранилище предоставляет Аутентификация Kubernetes Метод, который позволяет клиентам аутентифицировать с токеном учетной записи службы Kubernetes.
Включить метод аутентификации Kubernetes:
/ $ vault auth enable kubernetes Success! Enabled kubernetes auth method at: kubernetes/
Vault принимает этот токен услуги от любого клиента в кластере Kubernetes. Во время аутентификации Vault подтверждает, что токен учетной записи службы действителен, запросив настройку конечной точки Kubernetes.
Настройте метод аутентификации Kubernetes для использования токена учетной записи службы, местоположения хоста Kubernetes и его сертификата:
/ $ vault write auth/kubernetes/config \ token_reviewer_jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \ kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443" \ kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt Success! Data written to: auth/kubernetes/config
token_reviewer_jwt
и kubernetes_ca_cert
Справочные файлы, записанные в контейнер Kubernetes. Переменная среды Kubernetes_port_443_tcp_addr
Ссылки внутренний сетевой адрес хоста Kubernetes. Чтобы клиент прочитал секретные данные, определенные на предыдущем этапе, на внутренней/базе данных/конфигурации, требует предоставления возможности чтения для пути Внутренний/Data/Database/Config
Анкет
Запишите политику с именем внутреннее приложение
Это обеспечивает возможность чтения для секретов на пути Внутренняя/Data/Database/Config
/ $ vault policy write internal-app - <
Теперь создайте роль аутентификации Kubernetes под названием Internal-App:
/ $ vault write auth/kubernetes/role/internal-app \ bound_service_account_names=internal-app \ bound_service_account_namespaces=default \ policies=internal-app \ ttl=24h Success! Data written to: auth/kubernetes/role/internal-app
Роль соединяет учетную запись службы Kubernetes, внутреннее приложение
и пространство имен, по умолчанию
, с политикой хранилища, внутреннее приложение
Анкет Токены, возвращенные после аутентификации, действительны для 24 часы.
Наконец, выйдите из капсула Vault-0:
/ $ exit $
Создать учетную запись службы Kubernetes
Роль аутентификации Vault Kubernetes определила учетную запись службы Kubernetes с именем внутреннее приложение
Анкет Эта учетная запись сервиса еще не существует.
Посмотреть учетную запись службы, определенная в SharepleApp-service-account.yml
:
$ kubectl get serviceaccounts NAME SECRETS AGE default 1 43m vault 1 34m vault-agent-injector 1 34m
Примените определение учетной записи службы, чтобы создать его:
$ kubectl apply --filename service-account-internal-app.yml serviceaccount/internal-app created
Убедитесь, что учетная запись сервиса была создана: Имя учетной записи службы здесь соответствует имени, назначенному bound_service_account_names
Поле при создании внутреннее приложение
Роль при настройке аутентификации Kubernetes.
Секретная инъекция от коляска до подачи заявления
Просмотреть развертывание для приложения OrgChart:
$ cat deployment-01-orgchart.yml apiVersion: apps/v1 kind: Deployment metadata: name: orgchart labels: app: vault-agent-injector-demo spec: selector: matchLabels: app: vault-agent-injector-demo replicas: 1 template: metadata: annotations: labels: app: vault-agent-injector-demo spec: serviceAccountName: internal-app containers: - name: orgchart image: jweissig/app:0.0.1
Название нового развертывания — Оргчарт
. spec.template.spec.serviceaccountname
Определяет учетную запись службы внутреннее приложение
запустить этот контейнер под.
Примените развертывание, определенное в развертывание-01-orgchart.yml
:
$ kubectl apply --filename deployment-01-orgchart.yml deployment.apps/orgchart created
Приложение работает как стручка в по умолчанию
Пространство имен.
Получите все стручки внутри по умолчанию
Пространство имен:
$ kubectl get pods NAME READY STATUS RESTARTS AGE orgchart-69697d9598-l878s 1/1 Running 0 18s vault-0 1/1 Running 0 58m vault-agent-injector-5945fb98b5-tpglz 1/1 Running 0 58m
Инжектор Vault-Agent ищет развертывания, которые определяют конкретные аннотации. Ни одна из этих аннотаций не существует в текущем развертывании. Это означает, что в контейнере OrgChart не присутствует никаких секретов в рамках Orgchart-69697D9598-L878S
капсул
Убедитесь, что никаких секретов не записано в Оргчарт
контейнер в Orgchart-69697D9598-L878S
Струк:
$ kubectl exec orgchart-69697d9598-l878s --container orgchart -- ls /vault/secrets ls: /vault/secrets: No such file or directory command terminated with exit code 1
Развертывание запускает POD с учетной записью службы Kubernetes Internal-App в пространстве имен по умолчанию. Инжектор агента Vault изменяет развертывание только в том случае, если он содержит очень специфический набор аннотаций. Существующее развертывание может иметь свое определение, чтобы включить необходимые аннотации.
Посмотреть патч развертывания развертывание-02-инъекционные secrets.yml
:
$ cat deployment-02-inject-secrets.yml spec: template: metadata: annotations: vault.hashicorp.com/agent-inject: "true" vault.hashicorp.com/role: "internal-app" vault.hashicorp.com/agent-inject-secret-database-config.txt: "internal/data/database/config"
Эти Аннотации Определите частичную структуру схемы развертывания и префикс с помощью Vault.hashicorp.com.
Агент-инъекция
Включает службу инжектора агента Vaultроль
Роль аутентификации Vault Cubernetesроль
Создана роль хранилища, которая отображается в учетной записи службы K8SАгент-инъекционный секрет-филепат
Префиксы пути файла,База данных-config.txt
написано в/хранилище/секреты
. Значения — это путь к секрету, определенный в хранилище.
Установите развертывание Orgchart, определенное в развертывание-02-инъекционные secrets.yml
:
$ kubectl patch deployment orgchart --patch "$(cat deployment-02-inject-secrets.yml)" deployment.apps/orgchart patched
Этот новый стручок теперь запускает два контейнера. Контейнер приложения, названный Оргчарт
и контейнер агента Vault, названный Vault-Agent
Анкет
Просмотреть журналы контейнера Vault-Agent в orgchart-599cb74d9c-s8hhm
Струк:
$ kubectl logs orgchart-599cb74d9c-s8hhm --container vault-agent ==> Vault server started! Log data will stream in below: ==> Vault agent configuration: Cgo: disabled Log Level: info Version: Vault v1.3.1 2019-12-20T19:52:36.658Z [INFO] sink.file: creating file sink 2019-12-20T19:52:36.659Z [INFO] sink.file: file sink configured: path=/home/vault/.token mode=-rw-r----- 2019-12-20T19:52:36.659Z [INFO] template.server: starting template server 2019/12/20 19:52:36.659812 [INFO] (runner) creating new runner (dry: false, once: false) 2019/12/20 19:52:36.660237 [INFO] (runner) creating watcher 2019-12-20T19:52:36.660Z [INFO] auth.handler: starting auth handler 2019-12-20T19:52:36.660Z [INFO] auth.handler: authenticating 2019-12-20T19:52:36.660Z [INFO] sink.server: starting sink server 2019-12-20T19:52:36.679Z [INFO] auth.handler: authentication successful, sending token to sinks 2019-12-20T19:52:36.680Z [INFO] auth.handler: starting renewal process 2019-12-20T19:52:36.681Z [INFO] sink.file: token written: path=/home/vault/.token 2019-12-20T19:52:36.681Z [INFO] template.server: template server received new token 2019/12/20 19:52:36.681133 [INFO] (runner) stopping 2019/12/20 19:52:36.681160 [INFO] (runner) creating new runner (dry: false, once: false) 2019/12/20 19:52:36.681285 [INFO] (runner) creating watcher 2019/12/20 19:52:36.681342 [INFO] (runner) starting 2019-12-20T19:52:36.692Z [INFO] auth.handler: renewed auth token
Агент Vault управляет жизненным циклом токена и секретным поиском. Секрет отображается в контейнере Orgchart на пути /vault/secrets/database-config.txt
Анкет
Наконец, просмотрите секрет, написанный в контейнере Orgchart:
$ kubectl exec orgchart-599cb74d9c-s8hhm --container orgchart -- cat /vault/secrets/database-config.txt data: map[password:db-secret-password username:db-readonly-user] metadata: map[created_time:2019-12-20T18:17:50.930264759Z deletion_time: destroyed:false version:2]
Секрет успешно присутствует в контейнере. Секреты, введенные в контейнер, могут быть дополнительно матрицами в соответствии с потребностями применения.
Прямо сейчас вы должны очень хорошо оценить значимость хранилища в очень динамичной облачной инфраструктуре, удаляя операционные накладные расходы в управлении секретами приложений и сервисного обслуживания и разрешению вашей инфраструктуре изящно масштабировать.
Вот Ссылка к фактическому сообщению.
Оригинал: «https://dev.to/deepsource/how-to-setup-vault-with-kubernetes-ig9»