Что такое Vault и зачем он нужен написал в своём ТГ канале
Присоединяйся
Цель: Построить цепочку выпуска сертификатов.
Можно облегчить задачу и поместить один сертификат как wildcard для всех приложений, но это противоречит безопасности, так как если серт будет скомпроментирован придётся его заменять на всех сервисах (приложениях), поэтому мы пойдём путём Best Practices и для каждого приложения будет выпускаться свой ключ и свой сертификат.
Требования:
- Готовый Kubernetes-кластер (или K3S)
- Установленный HashiCorp Vault
- корпоративный Root CA, который подпишет CSR от Vault как Intermediate CA
Данный гайд - это часть общего взаимодействия. Vault из этого мануала может быть установлен и сконфигурирован как отдельно так и совместно с общим планом.

План действий:
- Включить PKI в Vault
- Сгенерировать CSR
- Подписать CSR на Windows Root CA как Intermediate CA
- Загрузить signed.crt в Vault
- Назначить default issuer
- Настроить pki/config/urls
- Создать роль pki/roles/k8s-domain
- Создать policy cert-manager
- Включить auth/kubernetes
- Настроить reviewer service account и auth/kubernetes/config
- Создать роль auth/kubernetes/role/cert-manager
Шаг 1. Вход в Vault
Авторизуемся в Vault с помощью Root Token из init-vault.json
| |
Шаг 2. Включение PKI secrets engine
Чтобы Vault обладал функциями pki их нужно включить:
| |
Шаг 3. Генерация CSR для Intermediate CA
Vault будет работать как подчиненный (SubCA) центр сертификации. Поэтому сделаем запрос к главному ЦА, и станем SubCA который сможет раздавать сертификаты.
Здесь указывайте ваш домен, на который будут выпускаться сертификаты.
Создаём запрос на сертификат для CA.
| |
Скопировать CSR из pod наружу, подписать его на корпоративном Root CA как SubCA / Intermediate CA.
Пример для запроса у Windows CA:
| |
Далее закинуть обратно на мастер ноду куба и проверить, что сертификат действительно CA:
| |
Должно быть CA:TRUE
Шаг 4. Загрузка подписанного сертификата в Vault
Мы получили файл signed.crt закидываем его внутрь пода Vault.
| |
Заходим в под и добавляем сертификат:
| |
Шаг 5. Назначение default issuer
| |
Видим наш запрос, копируем ID и вставляем вместо <ID_ISSUER>
| |
Проверяем запрос и добавленный сертификат:
| |
Шаг 6. Настройка URL-адресов для промежуточного CA
| |
Проверяем:
| |
На этом этапе:
| |
Шаг 7. Роль PKI для сертификатов Kubernetes
Создаём роль, от имени которой cert-manager будет подписывать сертификаты. Указываем вместо k8s.domain.local наш домен.
| |
Проверка:
| |
Тестово пробуем выдать сертификат:
| |
Шаг 8. Политика Vault для cert-manager
Внутри pod Vault
| |
Создаём policy
| |
Применяем:
| |
Проверяем:
| |
Шаг 9. Kubernetes Auth в Vault
Для Vault нужно включить auth/kubernetes и дать ему reviewer token, чтобы он мог валидировать service account tokens через Kubernetes TokenReview API.
Актуальная документация cert-manager отдельно описывает использование Kubernetes Service Account для аутентификации в Vault.
Включаем auth method
| |
Создаём reviewer service account
| |
Даём права на TokenReview
| |
Создаём secret для service account token
Создаём файл с токеном:
| |
Содержимое:
| |
Применяем:
| |
Шаг 9.5. Извлекаем reviewer JWT и CA кластера
Получаем токен на мастере кубернетес:
| |
Проверяем:
| |
Получаем CA Kubernetes
| |
Копируем CA в pod
| |
Выполняем vault write:
| |
Проверяем:
| |
Шаг 9.6. Создаём роль для cert-manager
| |
Проверка:
| |
Настройка Vault как SubCa завершена.
Теперь нужно установить cert-manager, если его нет и подключить его к Vault.
