Доступ к внешним секретам в Gitlab CI

Бывают случаи, когда вы хотите получить доступ к существующим учетным данным из безопасного места, например, Vault от HashiCorp, AWS или другого крупного облачного провайдера, но ваш текущий CI Image не имеет установленного SDK или средств для их получения. Сохранять их второй раз в качестве переменных Gitlab или получать к ним доступ в предыдущей работе не следует, и это считается небезопасным по многим причинам. Именно поэтому я создал Gin Vals. Просто запустите Gin Vals как службу и сделайте веб-запрос к службе.

Концепция

Как следует из названия, Gin Vals сочетает в себе простые GO-зависимости для создания тонкого и простого решения для большинства провайдеров.
Vals от Variantdev — это инструмент для управления конфигурационными значениями и секретами для основных облачных провайдеров и других технологий.
Теперь нам просто нужно сделать его доступным через REST с помощью Gin Web Framework.

Использование

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

  • Vault: ref+vault://PATH/TO/KVBACKEND[?address=VAULT_ADDR:PORT&token_file=PATH/TO/FILE&token_env=VAULT_TOKEN]#/fieldkey.
  • AWS Secrets Manager: ref+awssecrets://PATH/TO/SECRET[?region=REGION&version_stage=STAGE&version_id=ID]
  • Менеджер секретов GCP: ref+gcpsecrets://PROJECT/SECRET[?version=VERSION]
  • и многое другое…

Я буду использовать простой метод echo, чтобы показать некоторые возможные способы использования Gin Vals.

Простой GET-запрос с одним значением

Самый простой способ — просто получить один секрет через GET. Добавьте строку Vals в качестве пути, и вы сможете получить значение вашего секрета в переменную.

test:
  image: bitnami/bitnami-shell:latest
  services:
    - name: patrickdomnick/gin-vals:latest
      alias: ginvals
  script:
    - export secret=$(curl -X GET "http://ginvals:9090/ref+echo://foo/bar")
    - echo secret
Вход в полноэкранный режим Выход из полноэкранного режима

Простой POST-запрос с одним значением

Более продвинутым методом будет получение множества секретов сразу в виде json-объекта. Отсюда мы можем разобрать данные с помощью таких инструментов, как jq, в зависимости от основного изображения, которое вы используете.

test:
  image: bitnami/bitnami-shell:latest
  services:
    - name: patrickdomnick/gin-vals:latest
      alias: ginvals
  script:
    - export secretJson=$(curl -H 'Content-Type: application/json' -d '{"foo": "ref+echo://foo/bar","bar": "ref+echo://bar/foo"}' -X POST "http://ginvals:9090")
Вход в полноэкранный режим Выход из полноэкранного режима

Оцените статью
Procodings.ru
Добавить комментарий