GitLab: Генерация JWT токена в GitLab pipeline
Начиная с версии 15.7 в GitLab есть очень полезная фича - генерация JWT токена в пайплайне. О ней и поговорим.
JWT токены как таковые - очень популярный паттерн при построении интеграций между системами, и GitLab этот тренд не обошел стороной.
В пайплайне поддерживается конструкция вида:
job1:
id_tokens:
SOME_JWT_TOKEN:
aud: "${EXTERNAL_SYSTEM_ADDRESS}"
В результате перед выполнением основного тела job будет создан JWT токен с указанным полем aud (audience claim) в заголовке и еще большим количеством полей в payload. Созданный JWT токен будет доступен job в качестве значения переменной SOME_JWT_TOKEN. Далее скрипт может например приложить этот токен к заголовку HTTP запроса.
GitLab подписывает свои JWT токены при помощи приватного ключа, а публичный ключ для валидации подписи публикует на url: <gitlab_root>/oauth/discovery/keys
Важно отметить, что в каждый токен GitLab включает тонну полезных полей, как то: projectId, branchName, environmentName и много чего еще (полный список здесь).
В чем польза
Цимес в том, что с этим подходом мы можем дать GitLab доступ во внешнюю систему, и не хранить абсолютно никаких секретов на стороне GitLab 🤩
Представим, что мы хотим предоставить нашему GitLab серверу доступ в некую внешнюю систему, тогда мы можем:
- сообщить ей URL для получения GitLab public keys
- включить аутентификацию при помощи JWT токена
- задать правила проверки токена на основании его полей, например
- aud=external-system-url
- project_id=x
- environment=production
Схема взаимодействия
Схематично использования JWT токена выглядит так:
Как можно использовать
Есть следующие варианты использования такой конструкции:
- Провайдеры секретов. Наиболее употребимый и максимально полезный сценарий - это ходить за секретами в secret providers такие как HashiCorp Vault, OpenBao и т. д. Хранить секреты россыпью в CI/CD переменных разных пайплайнов, на уровне групп и так далее в GitLab - это боль. Данный подход позволяет убрать все чувствительные данные в централизованное хранилище секретов.
- Облачные сервисы. Выкладка в облака или разворачивание инфраструктуры - это другой популярный сценарий.
- Custom applications. В роли внешней системы может быть любое свое кастомное приложение, которое поддерживает JWT аунтентификацию, в том числе разработанное внутри компании.