Создание централизованного хранилища на Hashicorp Vault | OTUS

Создание централизованного хранилища на Hashicorp Vault

Linux_Deep_28.6_site-5020-7605d0.png

Концепция

— в качестве 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)

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
1 комментарий
0

При коннекте с удаленной машины мне пришлось и адрес хранилища указать:

client=hvac.Client(url='https://YOUR_HOST:8200', cert=(cert,key), verify='/etc/certs/rootCA.crt')

Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто