Централизованный выпуск SSL сертификатов для смохостинга

В общем, сам спросил, сам и отвечаю, при помощи GPT и какой-то матери:

  1. Поднял менеджер секретов. После изучения решил остановиться на OpenBao - не очень дружественный, но зато очень функциональный и легкий + форк hashicorp vault, а это значит, что совместим с промышленным эталоном (Кстати, это единственный менеджер секретов, который умеет OIDC в бесплатной версии)
  2. В kv хранилище волта добавил ключ для cloudflare, чтобы проходить acme проверку по DNS (требуется для wildcard сертификатов)
  3. Поднял vault-agent, который из волта получает cloudflare_api_token складывает его в /secrets/cloudlare_token
  4. Собрал контейнер с openbao и lego, написал немного скриптов на баше, которые
    4.1. Получают wildcard сертификаты letsencrypt и загружают их в волт в kv хранилище по пути kv/certs/<domain> (в openbao есть pki хранилище, но, насколько я понял, оно не очень походит для LE)
    4.2. Запускают крон, который раз в сутки проверяет дату действия сертификатов и обновляет при необходимости
    4.3. При обновлении сертификатов вызывает webhook в semaphore UI
  5. Поскольку openbao требует тоже сертификаты (в production режиме), то собрал отдельный контейнер openbao-docker
    5.1. На основе openbao + docker-cli + пользователь и права для доступа к docker.sock
    5.2. Рядом с openbao поднял vault-agent, который подписывается на сертификаты в openbao и стягивает их в файлы, если сертификат обновлен, то вызывает docker exec openbao kill -HUP 1 что приводит к перечитыванию сертификатов самими openbao
  6. В нужных сервисах поднимаю vault-agent для получения сертификатов и прописывания их в нужные места
  7. Завел репу ansible_cert_deploy и прописал ее в Semaphore UI, завел таску и триггер ее из пункта 4.3.
  8. Пока еще не начал писать плейбуки, но идея в том, чтобы через ansible деплоить сертификаты туда, где не поддерживается vault-agent, например Mikrotik (но в последних версиях, насколько я знаю, уже есть полноценная поддержка certbot)

В итоге вместо кучи tls сертификатов с ограничением по количеству вызовов API LetsEncrypt в неделю у меня один сервис получает сертификаты для домена и всех его поддоменов и все остальные сервисы могут получить доступ к нему + автоатически подтягивать новый сервтификат при перевыпуске, тот же traefik вместо выпуска сертификата для каждого сервиса использует один из предварительно подготовленых, а поскольку у меня 4 инстанса с traefik, то они используют общий сертификат из волта, а не выпускают каждый для себя.

Ну и немного скринов:
Как выглядит сертификат в openbao

docker-compose сервиса, который получает и загружает сертификаты в openbao

Кусок конфига, который сохраняет файлы сертификата и обновляет openbao при изменении сертификата

“суперсложный” скрипт, который получает или обновляет сертификаты

Самое сложное тут было завернуть все в docker-entrypoint.sh так, чтобы

  1. Переменные окружения со списком доменов были доступны во всех скриптах
  2. Все работало в рамках одного основного процесса
  3. Крон выводил stdout скрипта в консоль докера, а не пытался отправить sendmail
5 лайков