Хорошая стратегия для обмена секретами между сборками клиент-сервер

В качестве примера возьмем следующий случай.

У вас есть уровень RESTful API, защищенный с помощью OAuth2. С другой стороны, чтобы пользователи могли аутентифицироваться в ваших API, вам необходимо запросить токен доступа (например, grant_type=password).

Чтобы запросить токен доступа к паролю, клиентскому приложению требуется клиент OAuth (пара ключ + секрет).

Теперь вы настроили все для использования непрерывной интеграции и непрерывного развертывания.

Во время разработки сборки скрипт сборки создает тестовые данные, включая клиентов OAuth. Очевидно, что если сборка создает тестовые данные, она предварительно удаляет все данные, созданные во время автоматических тестов.

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

Думайте, что интерфейс и серверная часть создаются разными сценариями сборки.

Заключение и вопрос

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

Некоторые идеи

  1. Переменные среды операционной системы. Я мог бы хранить эти секреты в переменных среды машины сборки. То есть клиентская инфраструктура всегда будет создаваться и развертываться с использованием самых современных секретов.

  2. То же, что и № 1, но эти секреты хранятся в общем каталоге на машине сборки.


person Matías Fidemraizer    schedule 15.12.2016    source источник


Ответы (2)


Что касается системы сборки TFS/VSTS (TFS 2015 или более поздней версии)/выпуска (TFS 2017 или VSTS), вам просто нужно установить флажок Разрешить сценариям доступ к токену OAuth на вкладке «Параметры/Общие» определения сборки или среды выпуска, затем вы можете получить доступ Токен OAuth с использованием $(System.AccessToekn) в каждой задаче.

введите здесь описание изображения

введите здесь описание изображения

Что касается другой системы, лучшим подходом является сохранение токена доступа в переменных системной среды и удаление его в конце, что аналогично значению переменной общего доступа для других задач сборки/выпуска с использованием "##vso[task.setvariable variable=testvar;]testvalue" (PowerShell) в TFS или VSTS.

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

person starian chen-MSFT    schedule 18.12.2016
comment
Эй, спасибо за ваши усилия. Кажется, что первая часть вашего ответа вообще не отвечает на мой вопрос. Я не пытаюсь поделиться токеном доступа TFS, речь идет о совместном использовании токена носителя, необходимого для моей собственной инфраструктуры. С другой стороны, я пробовал подход с переменными среды, но у меня не получалось, потому что, поскольку и клиентское приложение, и серверная сборка работают с одним и тем же агентом сборки, я не мог видеть обновленную переменную среды до перезапуска агента. service... Так что я закончил сериализацию этих учетных данных в JSON, а затем сохранил файлы в общеизвестном месте - person Matías Fidemraizer; 18.12.2016
comment
@MatíasFidemraizer сериализовать токен в JSON нормально, вы можете опубликовать ответ. - person starian chen-MSFT; 19.12.2016
comment
Я понимаю. Я добавил это. В любом случае, я ценю ваши усилия! - person Matías Fidemraizer; 19.12.2016

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

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

person Matías Fidemraizer    schedule 19.12.2016