Есть набор машин, где крутятся те или иные приложения, которым нужны 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