From 27a7baa6606d5a6cf2f229ca68e441ea976f977f Mon Sep 17 00:00:00 2001 From: Administrator Date: Wed, 31 Jul 2024 12:59:44 +0000 Subject: [PATCH] docs: create DevOps/Hashicorp-Vault/Gitlab-with-vault --- DevOps/Hashicorp-Vault/Gitlab-with-vault.md | 196 ++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 DevOps/Hashicorp-Vault/Gitlab-with-vault.md diff --git a/DevOps/Hashicorp-Vault/Gitlab-with-vault.md b/DevOps/Hashicorp-Vault/Gitlab-with-vault.md new file mode 100644 index 0000000..33a15b7 --- /dev/null +++ b/DevOps/Hashicorp-Vault/Gitlab-with-vault.md @@ -0,0 +1,196 @@ +--- +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 - <