Рубрики
Uncategorized

Как справиться с секретами, такими как профессионал, используя Gitops

Одним из оснований Gitops является использование GIT в качестве источника истины для всей системы …. Теги с докером, Kubernetes, Gitops, Devops.

Одна из оснований Gitops Использование GIT в качестве источника истины для всей системы. В то время как большинство людей знакомы с практикой хранения исходного кода приложения в управлении версиями, Gitops диктует, что вы также должны хранить все другие части вашего приложения, такие как конфигурация, манифесты Kubernetes, сценарии БД, определения кластеров и т. Д.

Но как насчет секретов? Как вы можете использовать секреты с житопами? Это был один из Самые популярные вопросы от команд, которые принимают Гитопс.

Правда в том, что нет единой принятой практики о том, как секреты управляются с ГИТОП. Если у вас уже есть твердое решение такие как хранилище hashicorp Тогда было бы смысл использовать это, хотя технически это противоречит ГИТОП.

Если вы начинаете с нуля в новом проекте, есть способы хранения секретов в GIT, чтобы вы могли управлять ими, используя также принципы GITOPS. Само собой разумеется, что вы никогда не должны делать необработанные секреты в GIT.

Все решения, которые обрабатывают секреты с использованием GIT, хранят их в зашифрованной форме. Это означает, что вы можете получить лучшее из обоих миров. Секреты могут управляться с помощью Gitops, и они также могут быть надежны в любом хранилище GIT (даже общественные репозитории).

Как работают секреты Kubernetes

В контексте этой статьи мы поговорим о двух видах секретов, о Встроенные секреты Kubernetes (присутствует в каждом кластере Kubernetes) и запечатанных секретах, введенных Битнам, герметичный контроллер, Анкет

Прежде чем мы поговорим о герметичных секретах, давайте сначала поговорим о нормальных/простых секретах. Kubernetes включает в себя собственный секретный ресурс, который вы можете использовать в своем приложении. По умолчанию эти секреты никоим образом не зашифрованы, и используемое кодирование BASE64 никогда не следует рассматривать как функцию безопасности. В то время как есть способы зашифровать секреты Kubernetes внутри самого кластера Мы больше заинтересованы в шифровании их вне кластера, чтобы мы могли хранить их внешне в GIT, как требуется одним из основополагающих принципов Gitops (все хранится в GIT).

Использование секретов приложения Kubernetes является простым. Вы можете использовать те же механизмы, что и configmaps , а именно установить их в качестве файлов в вашем приложении или передавать их в качестве переменных среды.

Запечатанные секреты — это просто расширение, построенное на вершине местных секретов Kubernetes. Это означает, что после того, как шифрование/дешифрование происходит, все секреты функционируют как простые секреты Kubernetes, и именно так ваше приложение должно получить к ним доступ. Если вам не нравится, как работают простые секреты Kubernetes, вам нужно найти альтернативный механизм безопасности.

Пример приложения с секретами

В качестве примера запуска мы будем использовать простое приложение, найденное по адресу https://github.com/codefresh-contrib/gitops-secrets-sample-app . Это веб -приложение, которое считывает несколько фиктивных секретов и отображает их (не используя их каким -либо образом).

Мы решили заставить приложение прочитать секреты как файлы (из/секреты/) вместо использования переменных среды. Здесь это пути, которые используются :

[security]
# Path to key pair
private_key = /secrets/sign/key.private
public_key= /secrets/sign/key.pub

[paypal]
paypal_url = https://development.paypal.example.com
paypal_cert=/secrets/ssl/paypal.crt

[mysql]
db_con= /secrets/mysql/connection
db_user = /secrets/mysql/username
db_password = /secrets/mysql/password

Важно отметить, что приложение очень простое. Он читает только секреты по этим путям. Он ничего не знает о Kubernetes, секретных ресурсах, томе или о чем -либо еще. Вы можете запустить его на контейнере Docker (за пределами Kubernetes), и если бы правильные пути имеют секретные файлы, это просто будет работать.

В целях иллюстрации приложение загружает различные виды секретов, таких как имя пользователя/пароль, публичный/закрытый ключ и сертификат. Мы будем справляться со всеми с ними аналогичным образом.

Контроллер Bitnami, герметизированные секреты

Bitnami Запечатанные секреты Controller это контроллер Kubernetes, который вы устанавливаете в кластере и выполняют одну задачу. Он преобразует герметичные секреты (которые могут быть привержены GIT) в простые секреты (которые можно использовать в вашем приложении).

Установка контроллера проста:

helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
helm repo update
helm install sealed-secrets-controller sealed-secrets/sealed-secrets

После установки контроллер создает два клавиши самостоятельно:

  1. Частный ключ используется для секретного дешифрования. Этот ключ должен оставаться в кластере, и вы никогда не должны отдавать его никому.
  2. Общественный ключ используется для секретного шифрования. Это может (и будет использоваться) за пределами кластера, поэтому можно дать кому -то еще.

После установки контроллера вы устанавливаете и используете свое приложение стандартным способом. Вам не нужно менять код приложения или фальсификацию с помощью ваших манифестов Kubernetes. Если ваше приложение может использовать секреты Vanilla Kubernetes, то оно также может работать с запечатанными секретами.

Должно быть ясно, что контроллер не входит в прямой контакт с вашим приложением. Он преобразует запечатанные секреты в секреты Kubernetes, а затем ваше приложение зависит от вашего приложения. Приложение даже не знает, что его секреты были первоначально зашифрованы в GIT.

Шифруйте ваши секреты

Мы видели, как контроллер расшифровывает секреты. Но как мы зашифруем секреты в первую очередь? Контроллер поставляется с соответствующим исполняемом файлом Kubeseal, созданным для этой цели.

Это единственный бинар, поэтому вы можете установить его, копировав его в свой любимый каталог (вероятно, в переменной вашего пути)

wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.16.0/kubeseal-linux-amd64 -O kubeseal
sudo install -m 755 kubeseal /usr/local/bin/kubeseal

Kubeseal выполняет противоположную работу от контроллера. Это требует существующего секрета Kubernetes и шифрует его. Kubeseal запрашивает открытый ключ, который был создан во время процесса установки из кластера, и шифрует все секреты с этим ключом.

Это означает, что:

  • Kubeseal нуждается в доступе к кластеру, чтобы зашифровать секреты. (Ожидается, что кубеконфиг, как kubectl.)
  • Зашифрованные секреты могут использоваться только в кластере, который использовался для процесса шифрования.

Последний пункт очень важен, поскольку это означает, что все секреты специфичны для кластера. Пространство имен приложения также используется по умолчанию, поэтому секреты являются кластерами и конкретными пространствами имен.

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

Чтобы использовать Kubeseal, просто возьмите любой существующий секрет в формате Yaml или JSON и зашифруйте его:

kubeseal -n my-namespace < .db-creds.yml > db-creds.json

Это создает герметичный секрет, который представляет собой пользовательский ресурс Kubernetes, специфичный для контроллера. Этот файл безопасен для совершения в GIT или хранить в другой внешней системе. Затем вы можете применить секрет на кластере

kubectl apply -f db-creds.json -n my-namespace

Секрет в настоящее время является частью кластера и будет расшифрован контроллером, когда в этом нужен приложение.

Вот полная диаграмма шифрования/дешифрования:

Полный процесс — следующее:

  1. Вы создаете простые Kubernetes Secret локально. Вы никогда не должны совершать это нигде.
  2. Вы используете Kubeseal, чтобы шифровать секрет в запечатанном виде.
  3. Вы удаляете первоначальный секрет своей рабочей станции и применяете к кластеру запечатанный секрет.
  4. Вы можете при желании совершить герметичный секрет GIT.
  5. Вы развертываете свое приложение, которое ожидает функционирования обычных секретов Kubernetes. (Приложение не требует никаких изменений.)
  6. Контроллер расшифровывает герметичные секреты и передает их в ваше приложение в качестве простых секретов.
  7. Приложение работает как обычно.

Использование герметичных секретов с помощью Gitops CodeFresh

Используя контроллер запечатанных секретов, мы, наконец, можем сохранить все наши секреты в GIT (в зашифрованной форме) прямо вдоль конфигурации приложения.

В примере репозитория вы можете посмотреть на папку https://github.com/codefresh-contrib/gitops-secrets-sample-app/tree/main/safe-to-commit И у него есть все проявления приложения, включая секреты.

Вы можете просто указывать CodeFresh Gitops UI в эту папку и развернуть приложение За один шаг:

После завершения развертывания вы можете увидеть компоненты приложения на панели панели Gitops:

И если вы запустите приложение, вы увидите, что он правильно читает все секреты:

С этого момента приложение следует за всеми принципами Gitops. Если вы внесете какие -либо изменения в GIT (включая изменение секретов), кластер будет обновлен. И если вы что -то измените в кластере (даже секретах), Gitops CodeFresh обнаружит изменение.

Принятие контроллера запечатанных секретов в производстве

Секретное вращение — это сложный процесс, который не следует воспринимать легкомысленно. Мы объяснили основы запечатанных секретов в этой статье, но если вы хотите использовать контроллер в производстве, вам нужно прочитать Документация и принять во внимание другие аспекты, такие как секретное ротация и обработка ключей.

Для получения более подробной информации об использовании контроллера с Gitops CodeFresh, см. Наша пример страница Анкет

Новичок в codefresh? Создайте свою бесплатную учетную запись сегодня !

Оригинал: «https://dev.to/codefreshio/how-to-handle-secrets-like-a-pro-using-gitops-1cbp»