Одна из оснований 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
После установки контроллер создает два клавиши самостоятельно:
- Частный ключ используется для секретного дешифрования. Этот ключ должен оставаться в кластере, и вы никогда не должны отдавать его никому.
- Общественный ключ используется для секретного шифрования. Это может (и будет использоваться) за пределами кластера, поэтому можно дать кому -то еще.
После установки контроллера вы устанавливаете и используете свое приложение стандартным способом. Вам не нужно менять код приложения или фальсификацию с помощью ваших манифестов 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
Секрет в настоящее время является частью кластера и будет расшифрован контроллером, когда в этом нужен приложение.
Вот полная диаграмма шифрования/дешифрования:
Полный процесс — следующее:
- Вы создаете простые Kubernetes Secret локально. Вы никогда не должны совершать это нигде.
- Вы используете Kubeseal, чтобы шифровать секрет в запечатанном виде.
- Вы удаляете первоначальный секрет своей рабочей станции и применяете к кластеру запечатанный секрет.
- Вы можете при желании совершить герметичный секрет GIT.
- Вы развертываете свое приложение, которое ожидает функционирования обычных секретов Kubernetes. (Приложение не требует никаких изменений.)
- Контроллер расшифровывает герметичные секреты и передает их в ваше приложение в качестве простых секретов.
- Приложение работает как обычно.
Использование герметичных секретов с помощью 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»