Рубрики
Uncategorized

Создание безопасной интеграции CI/CD с Azure

Защита вашей инфраструктуры имеет решающее значение для успеха вашего бизнеса. Неспособность получить безопасность … Tagged с помощью Azure, CICD, DevOps, Terraform.

Защита вашей инфраструктуры имеет решающее значение для успеха вашего бизнеса. Неспособность серьезно относиться к безопасности может привести к серьезным ущербам, включая штрафы, потерю доверия клиентов или неспособность выполнять важные бизнес -функции. Рост инфраструктуры как инструментов кода и систем CI/CD позволил разработчикам интегрировать управление инфраструктурой в наши типичные рабочие процессы разработки, улучшая качество и скорость доставки.

В то же время, чтобы управлять вашей инфраструктурой, система CI/CD использовала, нуждается в доступе к конфиденциальным учетным данным. В SpaceLift мы стремимся дать нашим пользователям максимальный баланс между гибкостью и безопасностью. Из -за этого мы предоставляем несколько вариантов подключения ваших подписок Azure к Azure, включая установку статических учетных данных, используя нашу полностью управляемую интеграцию, а также использование частных работников, чтобы вообще избежать обмена учетными данными.

В этом посте я хотел дать вам обзор того, как Комплексная интеграция Azure Работает с технической точки зрения, а также обсуждать некоторые проблемы, с которыми мы столкнулись и решали при разработке и разработке. Как система CI/CD, мы делаем довольно много работы для интеграции с другими системами, которые используют наши пользователи. Иногда, как и в случае с лазурной, все становится нетривиальным. Если вы стремитесь узнать больше, читайте дальше, не требуется знаний о лазуре!

Давайте начнем с быстрого описания того, как наш Облачная интеграция Работа. Общий рабочий процесс очень прост и выглядит примерно так:

Разрушив требования, мы должны иметь возможность получить учетные данные управления для учетной записи облачного поставщика пользователя и передавать их в Terraform через переменные среды, и в этот момент Terraform может запустить доступ к инфраструктуре клиента.

Примечание: Для простоты в этом посте используется Terraform во всех своих примерах, но этот общий подход также относится к другим инструментам, которые мы поддерживаем, например, Pulumi Анкет

Концепция интеграции Azure состояла в том, чтобы предоставить аналогичный опыт на нашем AWS и GCP Интеграции, но для наших клиентов Azure. На следующей диаграмме показан упрощенный план того, как работает интеграция AWS:

AWS предоставляет возможность временно Примите роль в другой учетной записи AWS. Это позволяет нашим пользователям создавать роль в IAM с любыми разрешениями, которые они могут захотеть дать пространство. Затем они могут установить доверительные отношения для этой роли с нашей учетной записью AWS, которая позволит нашей учетной записи AWS взять на себя роль. Ролевая предположение предоставляет нам необработанные учетные данные AWS и беспрепятственно работает с любыми инструментами AWS, включая поставщика Terraform AWS. Это дополнительно позволяет нам указать продолжительность достоверности, поэтому каждый запуск может получить свои собственные учетные данные, которые ограничены до короткого периода времени.

Хотя Azure не имеет такой же возможности, он предоставляет еще один подход, называемый Azure Active Directory, которые позволяют создавать учетные записи услуг. Azure Ad Applications — это ресурсы, которые позволяют пространству пространства для беспрепятственного управления доступом к ресурсам Azure клиента.

Стоит объяснить несколько фрагментов терминологии, которые используются на протяжении всей остальной части этого поста:

  • Azure Active Directory (Azure AD) — компонент управления идентификацией и доступом Azure.
  • Справочник/арендатор — индивидуальный случай Azure AD, принадлежащий компании или отделу.
  • Подписка — контейнер для любых вычислительных ресурсов Azure. Это примерно соответствует учетной записи AWS. Подписка связана с одним арендатором Azure AD, но несколько подписок могут быть связаны с одним и тем же арендатором.
  • Azure Ad Application — Способ создания внешней интеграции с Azure AD.
  • Корпоративное приложение — Приложение Azure Ad Application, которое было установлено в Azure Ad Adant другого пользователя.
  • Сервис принципал — Сервисная учетная запись, которая автоматически создается при установке Azure Ad Application. Это может быть использовано для предоставления разрешений, которые позволяют приложению управлять ресурсами Azure.
  • Microsoft Graph API — Основной API для управления Azure AD -ресурсами.

Мы поставили несколько целей для интеграции:

  • Облегчение упрощения клиентам управлять инфраструктурой Azure с помощью пространства.
  • Автоматическая обработка ротации учетных данных, чтобы клиентам не приходилось иметь дело с этим самим или использовать очень долгоживущие учетные данные, чтобы полностью его избежать.
  • Предоставление механизмов для клиентов для настройки гранулированных разрешений в Azure для разных стеков или различных типов прогонов (например, PRS против отслеживаемых пробежек).

Первоначально наша идея состояла в том, чтобы создать единый Приложение для рекламы с мультитенантом:

Идея заключалась в том, что мы генерируем токен доступа, который можно было бы использовать только для конкретного каталога клиентов, и передать этот токен поставщику RM Terraform Azure во время пробежек. В конце концов, мы должны были пересмотреть наш подход из -за следующих вопросов:

  • Terraform Azure RM -провайдер Не поддерживает аутентификацию через токен доступа. Вместо этого вы должны предоставить основные учетные данные для учетной записи — либо секрет клиента, либо сертификат клиента. В нашем случае это означало бы передачу учетных данных для нашего собственного мультитенантного приложения в SpaceLift Runs. Поскольку это приложение было бы установлено в Azure Ad Andants любого пользователя SpaceLift, который настроил интеграцию, это могло бы позволить пользователям получить доступ к учетным записям Azure другого пользователя.
  • Интеграция была бы менее гибкой. Использование одного мультитенантного приложения рекламы позволило бы клиентам создать более одной интеграции Azure на арендатора Active Directory. Возможность создания нескольких интеграций на арендатора полезна, потому что она позволяет применяться к различным разрешениям Azure к каждой интеграции.

После нескольких дней мозгового штурма на альтернативном подходе мы придумали новую архитектуру. Мы могли бы программно генерировать новое приложение Azure AD на нашей стороне для каждой интеграции Azure, созданной пользователями SpaceLift. Таким образом, наличие доступа к учетным данным для приложения Azure Ad приведет только к тому, чтобы получить доступ к одному арендатору Azure Ad на стороне пользователя. Этот подход позволяет передавать клиентские секреты в SpaceLift Runs, не опасаясь утечки разрешений на меж пользователя. Окончательный дизайн закончился, как показано на следующей диаграмме:

Приложения устанавливаются в арендатор активного каталога клиента через процесс, называемый Административное согласие Анкет После того, как согласие администратора будет завершено, принципала услуги создается в Azure Azure Active Directory, которому пользователь может предоставить разрешения. Это позволяет пользователям определять точный уровень доступа, который SpaceLift имеет к своим ресурсам.

Следующий вопрос, с которым мы столкнулись, был связан с созданием учетных данных для пробега. Как описано в Документация поставщика , поставщик Azure RM может быть настроен путем установки определенных переменных среды. Первоначально мы приняли базовый подход к попытке генерировать учетные данные во время пробега. Это то, что мы делаем для наших интеграций AWS и GCP, поэтому мы не ожидали серьезных проблем. Сделанные шаги выглядели примерно так:

  1. Запустить.
  2. Создайте новый секрет клиента с коротким временем истечения.
  3. Заполните необходимые переменные среды.
  4. Выполнить терраформ.

Казалось, это сработало … но только некоторые из них.

При тестировании интеграции происходили странные вещи. В качестве примера, планирование Фаза для пробега удастся, но применить не удастся с ошибкой разрешений из Azure. После расследования мы пришли к выводу, что это было вызвано возможная последовательность в Azure Ad.

Вы можете визуализировать проблему, используя следующую диаграмму (Примечание: это просто иллюстрация, и она не предназначена для того, чтобы быть полностью точным):

В приведенном выше примере шаг 2 может добиться успеха или выйти из строя в зависимости от того, удалось ли секрет повторить Azure Ad Server, на который его запрос направляется. Первоначально мы попытались проверить, можно ли использовать секрет, выполнив запрос API, и повторно повторив, пока запрос не преуспеет с использованием экспоненциального отбора. Вскоре мы поняли, что даже тогда последующие запросы могут быть направлены в другой экземпляр Azure AD, который до сих пор не получил секрет нового клиента и потенциально не удается.

Даже если бы можно было проверить, когда секрет был полностью воспроизведен, ожидание завершения репликации добавило бы минимум 30 секунд, и, возможно, еще один несколько минут Анкет Из -за этого мы решили перенести генерацию полномочий и вращение из потока прогона и в запланированную задачу:

Запланированная задача работает один раз в час, генерирует секреты с истечением 24 часов и пытается генерировать новый секрет для интеграции примерно за 2 часа до истечения старого секрета. Это допускает вращение полномочий, всегда сохраняя действительный секрет.

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

Когда запуск запускается, мы стараемся найти секрет интеграции с большим количеством времени до истечения. Мы также избегаем использования новых секретов примерно через 10 минут после генерации, чтобы избежать возможных проблем с согласованностью, вызванных архитектурой Azure AD.

Вы можете визуализировать секретный жизненный цикл, используя следующую диаграмму:

Кроме того, при создании новой интеграции мы сразу же генерируем секрет. Это помогает гарантировать, что секрет будет успешно распространяться в Azure AD к моменту запуска пробега.

Последняя серьезная проблема, с которой мы столкнулись, — это выяснить, как реализовать ротацию учетных данных для нашей собственной учетной записи управления. Сама интеграция использует основную сумму Azure AD Service для управления приложениями для клиентов с использованием API Microsoft Graph. Поскольку мы запускаем большую часть нашей собственной инфраструктуры в AWS, у нас не было возможности использовать Управляемая идентичность обслуживания , это означает, что нам нужно было самостоятельно обработать вращение полномочий. Кроме того, наша цель состояла в том, чтобы автоматизировать процесс, чтобы избежать разработчиков периодически выполнять ручную задачу и снизить риск забыть об продлении полномочий до истечения срока действия.

В конце концов, мы решили принять относительно простой подход хранения сертификата в менеджере Secrets и написания запланированной задачи, чтобы периодически проверять, готов ли сертификат к истечению, аналогично подходу, которые мы использовали для секретов клиента для интеграции. Если это так, запланированная задача генерирует новый сертификат и загружает его как в Secrets Manager, так и Azure Ad:

Части системы, которые необходимо использовать клиентский сертификат для аутентификации периодически проверять обновленный сертификат. Как и в случае с секретной ротацией клиента, мы избегаем использования нового сертификата в течение приблизительно 10 минут, чтобы предоставить сертификат пропагандировать сертификат по всей Azure AD.

Подобно тому, что происходит с помощью секретов клиента Integration, Secrets Manager использует службу управления ключами AWS, чтобы зашифровать сертификат в состоянии покоя.

Надеемся, что этот пост дал вам представление о внутренних органах интеграции SpaceLift от Azure, наряду с некоторыми проблемами, которые мы должны были решить при ее реализации. Как вы, вероятно, заметили, мы готовы пойти на все, чтобы обеспечить безопасный и приятный опыт для наших пользователей. Чтобы узнать больше, взгляните на нашу документацию по интеграции Azure, доступную по адресу Документация по пространству Анкет

Оригинал: «https://dev.to/spacelift/building-a-secure-cicd-integration-with-azure-2km6»