Создание централизованного хранилища на Hashicorp Vault
Концепция
— в качестве 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-токен, и создаётся политика на чтение секретов из определённого пути. В дальнейшем систему политик и хранилищ можно развивать.
Логинимся рутом (понадобится рутовый секрет)
vault login
Создаём конфиг политики и записываем его
/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’)