TGViewer
Сочный DevOps Сочный DevOps @andtree_sec · 420 subscribers
Post #163 148
Автоматическое получение SSL-сертификатов через Vault Agent и AppRole

Есть набор машин, где крутятся те или иные приложения, которым нужны SSL сертификаты. Предположим, что есть некая автоматизация, которая кладет нужные нам wildcard серты в волт. В свою очередь мы хотим автоматически и конечно же безопасно получать их оттуда.

Для этого можно использовать vault agent, он умеет ходить в волт под approle и забирать оттуда данные секретов, согласно политики и сохранять их в файлы.

vault agent это часть бинаря vault. Создадим systemd сервис:
# /etc/systemd/system/vault_agent.service
[Unit]
Description=HashiCorp Vault Agent
After=network.target
Requires=network.target

[Service]
WorkingDirectory=/opt/vault_agent
ExecStart=/usr/bin/vault agent -config=/opt/vault_agent/agent_config.hcl
Restart=on-failure
RestartSec=5
User=vault
Group=vault
Environment=VAULT_ADDR=https://<vault_domain>
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target


В рабочей директории /opt/vault_agent положим конфиг агента agent_config.hcl:
pid_file = "./pidfile"

vault {
address = "https://<vault_domain>"
tls_skip_verify = true
renew_token = true
}

auto_auth {
method "approle" {
mount_path = "auth/approle"
config = {
role_id_file_path = "/opt/vault_agent/.role_id"
secret_id_file_path = "/opt/vault_agent/.secret_id"
remove_secret_id_file_after_reading = false
}
}
sink "file" {
config = {
path = "/opt/vault_agent/.vault_token"
}
}
}

template {
source = "/opt/vault_agent/templates/<domain>.crt.tmpl"
destination = "/etc/nginx/ssl/<domain>.crt"
command = "nginx -s reload"
}
template {
source = "/opt/vault_agent/templates/<domain>.key.tmpl"
destination = "/etc/nginx/ssl/<domain>.key"
command = "nginx -s reload"
}


Тут мы авторизовываемся в волт под нашей approle, используя ее role_id и secret_id. Их нужно указать в виде путей до файлов.
remove_secret_id_file_after_reading - параметр отвечающий за то, удалять ли файл secret_id после прочтения. По умолчанию - true, т.е. файл будет удален. На практике не совсем удобно, так как в случае перезагрузки агента, новый файл на место старого никто не положит. Следовательно нужен post-script, который бы это сделал. Мы развертываем ansible-ом и для нас это не удобно.

sink - то, куда агент положит полученный из волта токен.
template - секция с описанием настроек шаблонов. В source указываем путь до самого шаблона, например:
{{- with secret "mount/secret" -}}
{{ .Data.data.crt }}
{{- end -}}

Пути в шаблоне для kv2.
destination - то, куда волт сохранит полученное значение из секрета.
command - команда, которая будет выполнена, если секрет изменился.

Из важного, агент отправляет много запросов в волт, не делайте токенам слишком маленький TTL или token_num_uses, это приведет к 403 ошибкам в логах, хотя парочка запросов все же успеют "пролезть" и секрет вы получите.

#vault
  • 🔥 1
More from @andtree_sec
  1. Sep 7, 2026Давненько не было сообщений. Скорее всего в будущем они уйдут в telegraf, который я еще не…
  2. Jul 6, 2026Последнее время на работе часто приходится работать с apache flink и даже что-то писать на…
  3. Jun 4, 2026Немножко про молекула тесты... У нас принято использовать в переменных lookup плагин для д…
  4. May 20, 2026Очередной небольшой проект. Веб-приложение, которое агрегирует через стандартный механиз g…
  5. May 15, 2026Включаем профилирование в ansible Профилирование, это вывод даты, времени запуска и итогов…
  6. Apr 17, 2026Так выглядит общий dashbord работы с инцидентами.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →