Рубрики
Uncategorized

Как настроить хранилище с Kubernetes

В нашем не очень идеальном мире мы склонны оставлять все наши секреты приложения (пароли, токены API) Exp … Помечено Kubernetes, Security, Architecture, DevOps.

В нашем не очень идеальном мире мы склонны оставлять все наши секреты приложения (пароли, токены 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»