Создание централизованного хранилища на Hashicorp Vault
2026-03-10 02:32 Diff

Теги: tls, системное администрирование, администратор linux, централизованное хранилище, hashicorp vault, ca-сертификат, rootca, filesystem

Концепция

— в качестве storage выбрано filesystem; — листенер с использованием TLS; — свой rootCA; — в качестве auth также TLS.

Ключи

Создаём rootCA

Создаём rootCA ключ с паролем. Пароль нужно сохранить отдельно:

openssl genrsa -des3 -out /etc/certs/rootCA.key 4096

Генерируемм CA-сертификат:

openssl req -x509 -new -nodes -key /etc/certs/rootCA.key -sha256 -days 1024 -out /etc/certs/rootCA.crt

Создаём подписанные ключи:

— для сертификатов обязательно указывать CN, иначе Vault будет выдавать ошибку; — скрипт get_cert.sh.

cd /etc/certs cname=$1 openssl genrsa -out $cname.key 4096 openssl req -new -sha256 -key $cname.key -subj "/C=RU/ST=Moscow/O=MyCompany, Inc./CN=$cname" -out $cname.csr openssl x509 -req -in $cname.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out $cname.crt -days 1000 -sha256

Примеры использования:

bash get_cert.sh vault bash get_cert.sh client1

Самоподписанные ключи

CERT_NAME=client3 openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out $CERT_NAME.crt -keyout $CERT_NAME.key

Установка хранилища, создание пользователя, настройка systemd-юнита

Подробности смотрите по этой ссылке.

Конфигурация хранилища:

— предварительно ключ для хранилища перекинул в /etc/vault.d; — /etc/vault.d/vault.hcl.

api_addr = "https://key-vault.sandbox.net:8200" listener "tcp" { address = "0.0.0.0:8200" tls_cert_file = "/etc/vault.d/vault.crt" tls_key_file = "/etc/vault.d/vault.key" } storage "file" { path = "/opt/vault" }

Запускаем через systemd

systemctl start vault systemctl status vault

Переменные окружения

/etc/profile.d/vault.sh

export VAULT_ADDR=https://key-vault.sandbox.net:8200 export VAULT_CACERT="/etc/certs/rootCA.crt"

Инициализация хранилища

vault operator init -key-shares=1 -key-threshold=1

При этом: — инит выдаст вам рутовый токен и unseal-токен, их необходимо также где-то сохранить; — после ребута unseal придётся делать вручную (ну, если не настроить автоматизации), а рутовый ключ необходим для прописи начальных конфигов.

Политики

Изначально предполагается, что основные секреты забиваются через root-токен, и создаётся политика на чтение секретов из определённого пути. В дальнейшем систему политик и хранилищ можно развивать.

Логинимся рутом (понадобится рутовый секрет)

Создаём конфиг политики и записываем его

/etc/vault.d/read-secret-policy.hcl

path "secret/accounts/*" { policy = "read" } vault policy write read-account /etc/vault.d/read-secret-policy.hcl

Записываем сертификат как учётку с заданной политикой

vault auth enable cert vault write auth/cert/certs/client1 display_name=client1 certificate=@/etc/certs/client1.crt policies=read-account

Создаём хранилище, под которое мы создали политику, и заводим секреты

vault secrets enable -path=secret/accounts kv vault write secret/accounts/client1 acc1=alsklaksa pass=aljasljslajsa

Коннектимся нужным ключом и читаем записанный ключ

$ vault login -method=cert -client-cert=/etc/certs/client1.crt -client-key=/etc/certs/client1.key $ vault read secret/accounts/client1 Key Value --- ----- refresh_interval 768h acc1 alsklaksa pass aljasljslajsa

Connect с удалённой машины

Копируем на удалённую машину rootCA.crt и клиентские сертификаты.

Установка виртуального окружения

scl enable rh-python36 bash python -m venv exit source venv/bin/activate pip install hvac

Коннект на Python

import hvac cert=‘/etc/certs/client3.crt’; key=‘/etc/certs/client3.key’; client=hvac.Client(cert=(cert,key), verify=‘/etc/certs/rootCA.crt’) client.auth_tls() client.is_authenticated() client.read(‘secret/accounts/client1’)