--- title: Аутентификация и чтение секретов в HashiCorp's Vault через GitLab CI description: published: true date: 2024-07-31T12:59:36.391Z tags: vault, gitlab editor: markdown dateCreated: 2024-07-31T12:59:36.391Z --- ​ Источник: https://habr.com/ru/companies/nixys/articles/512754/ Этот туториал демонстрирует пример аутентификации, конфигурации и чтения секретов с HashiCorp’s Vault через GitLab CI/CD. **Требования** Туториал предполагает, что вы знакомы с GitLab CI/CD и Vault. Чтобы ему последовать, вам понадобятся: - Аккаунт в GItLab - Запущенный Vault сервер и доступ для настройки аутентификации и создания ролей и политик. Для каждой задачи (job) генерируется свой уникальный токен JSON Web Token (JWT), доступный только как значение переменной окружения CI_JOB_JWT конкретной задачи. Данный JWT может быть использован для аутентификации в Vault при помощи метода JWT Auth. Пример того, как выглядит JWT в дешифрованном виде: ```json {    "jti": "c82eeb0c-5c6f-4a33-abf5-4c474b92b558", # Уникальный идентификатор токена    "iss": "gitlab.example.com",                   # Issuer, т.е. домен вашего инстанса GitLab    "iat": 1585710286,                             # Время выдачи     "nbf": 1585798372,                             # Не валиден до    "exp": 1585713886,                             # Не велиден после    "sub": "22",                                   # Subject (project id)    "namespace_id": "1",    "namespace_path": "mygroup",    "project_id": "22",    "project_path": "mygroup/myproject",    "user_id": "42",    "user_login": "myuser",    "user_email": "myuser@example.com"    "pipeline_id": "1212",    "job_id": "1212",    "ref": "auto-deploy-2020-04-01",               # Название Git-refs для этой задачи    "ref_type": "branch",                          # Тип Git-refs, это либо(branch) либо тег(tag)    "ref_protected": "true"                        # true, если это ветка protected, иначе false   } ``` Токен кодируется по стандарту RS256 и подписывается приватным ключом OpenID Connect вашего GitLab инстанса, причем этот ключ периодически изменяется без вашего ведома. И, если приватный ключ был изменен, при cледующем запуске задания новый JWT будет подписан с новым ключом. Срок валидности токена будет устанавливаться в соотвествии с таймаутом вашего задания, а если он не задан, то срок валидности будет 5 минут. Вы можете использовать этот JWT-токен и URL (https://gitlab.example.com/-/jwks) как конечную точку JWKS для аутентификации на Vault сервере, если для него настроен соответствующий метод JWT-аутентификации. При настройке ролей в Vault, вы можете задавать значения bound_claims для сопоставления их с полями из JWT и, таким образом, дополнительно ограничить то, к каким секретам какой процесс CI будет иметь доступ. Для получения доступа к Vault можно использовать либо его CLI, либо выполнять запросы к API (через curl или другой клиент). **Пример** Предположим, у вас есть пароли для ваших баз данных, отличающиеся для production и staging окружений и они хранятся в Vault, который доступен по адресу http://vault.example.com:8200. Ваш пароль для stage это pa$$w0rd и real-pa$$w0rd для prod: ``` $ vault kv get -field=password secret/myproject/staging/db   pa$$w0rd $ vault kv get -field=password secret/myproject/production/db   real-pa$$w0rd ``` Разрешим для нашего Vault-сервера метод аутентификации через JWT: ``` $ vault auth enable jwt   Success! Enabled jwt auth method at: jwt/ ``` Создаем policy, которые дают доступ на чтение к нужным нам секретам: ```bash $ vault policy write myproject-staging - <