0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: tls, системное администрирование, администратор linux, централизованное хранилище, hashicorp vault, ca-сертификат, rootca, filesystem</p>
1
<p>Теги: tls, системное администрирование, администратор linux, централизованное хранилище, hashicorp vault, ca-сертификат, rootca, filesystem</p>
2
<h3>Концепция</h3>
2
<h3>Концепция</h3>
3
<p>- в качестве storage выбрано filesystem; - листенер с использованием TLS; - свой rootCA; - в качестве auth также TLS.</p>
3
<p>- в качестве storage выбрано filesystem; - листенер с использованием TLS; - свой rootCA; - в качестве auth также TLS.</p>
4
<h3>Ключи</h3>
4
<h3>Ключи</h3>
5
<h4>Создаём rootCA</h4>
5
<h4>Создаём rootCA</h4>
6
<p>Создаём rootCA ключ с паролем. Пароль нужно сохранить отдельно:</p>
6
<p>Создаём rootCA ключ с паролем. Пароль нужно сохранить отдельно:</p>
7
openssl genrsa -des3 -out /etc/certs/rootCA.key 4096<p>Генерируемм CA-сертификат:</p>
7
openssl genrsa -des3 -out /etc/certs/rootCA.key 4096<p>Генерируемм CA-сертификат:</p>
8
openssl req -x509 -new -nodes -key /etc/certs/rootCA.key -sha256 -days 1024 -out /etc/certs/rootCA.crt<h4>Создаём подписанные ключи:</h4>
8
openssl req -x509 -new -nodes -key /etc/certs/rootCA.key -sha256 -days 1024 -out /etc/certs/rootCA.crt<h4>Создаём подписанные ключи:</h4>
9
<p>- для сертификатов обязательно указывать CN, иначе Vault будет выдавать ошибку; - скрипт get_cert.sh.</p>
9
<p>- для сертификатов обязательно указывать CN, иначе Vault будет выдавать ошибку; - скрипт get_cert.sh.</p>
10
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<p>Примеры использования:</p>
10
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<p>Примеры использования:</p>
11
bash get_cert.sh vault bash get_cert.sh client1<h4>Самоподписанные ключи</h4>
11
bash get_cert.sh vault bash get_cert.sh client1<h4>Самоподписанные ключи</h4>
12
CERT_NAME=client3 openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out $CERT_NAME.crt -keyout $CERT_NAME.key<h3>Установка хранилища, создание пользователя, настройка systemd-юнита</h3>
12
CERT_NAME=client3 openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out $CERT_NAME.crt -keyout $CERT_NAME.key<h3>Установка хранилища, создание пользователя, настройка systemd-юнита</h3>
13
<p>Подробности смотрите по<a>этой ссылке</a>.</p>
13
<p>Подробности смотрите по<a>этой ссылке</a>.</p>
14
<h3>Конфигурация хранилища:</h3>
14
<h3>Конфигурация хранилища:</h3>
15
<p>- предварительно ключ для хранилища перекинул в /etc/vault.d; - /etc/vault.d/vault.hcl.</p>
15
<p>- предварительно ключ для хранилища перекинул в /etc/vault.d; - /etc/vault.d/vault.hcl.</p>
16
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" }<h3>Запускаем через systemd</h3>
16
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" }<h3>Запускаем через systemd</h3>
17
systemctl start vault systemctl status vault<h3>Переменные окружения</h3>
17
systemctl start vault systemctl status vault<h3>Переменные окружения</h3>
18
<p>/etc/profile.d/vault.sh</p>
18
<p>/etc/profile.d/vault.sh</p>
19
export VAULT_ADDR=https://key-vault.sandbox.net:8200 export VAULT_CACERT="/etc/certs/rootCA.crt"<h3>Инициализация хранилища</h3>
19
export VAULT_ADDR=https://key-vault.sandbox.net:8200 export VAULT_CACERT="/etc/certs/rootCA.crt"<h3>Инициализация хранилища</h3>
20
vault operator init -key-shares=1 -key-threshold=1<p>При этом: - инит выдаст вам рутовый токен и unseal-токен, их необходимо также где-то сохранить; - после ребута unseal придётся делать вручную (ну, если не настроить автоматизации), а рутовый ключ необходим для прописи начальных конфигов.</p>
20
vault operator init -key-shares=1 -key-threshold=1<p>При этом: - инит выдаст вам рутовый токен и unseal-токен, их необходимо также где-то сохранить; - после ребута unseal придётся делать вручную (ну, если не настроить автоматизации), а рутовый ключ необходим для прописи начальных конфигов.</p>
21
<h3>Политики</h3>
21
<h3>Политики</h3>
22
<p>Изначально предполагается, что основные секреты забиваются через root-токен, и создаётся политика на чтение секретов из определённого пути. В дальнейшем систему политик и хранилищ можно развивать.</p>
22
<p>Изначально предполагается, что основные секреты забиваются через root-токен, и создаётся политика на чтение секретов из определённого пути. В дальнейшем систему политик и хранилищ можно развивать.</p>
23
<h4>Логинимся рутом (понадобится рутовый секрет)</h4>
23
<h4>Логинимся рутом (понадобится рутовый секрет)</h4>
24
<h4>Создаём конфиг политики и записываем его</h4>
24
<h4>Создаём конфиг политики и записываем его</h4>
25
<p>/etc/vault.d/read-secret-policy.hcl</p>
25
<p>/etc/vault.d/read-secret-policy.hcl</p>
26
path "secret/accounts/*" { policy = "read" } vault policy write read-account /etc/vault.d/read-secret-policy.hcl<h4>Записываем сертификат как учётку с заданной политикой</h4>
26
path "secret/accounts/*" { policy = "read" } vault policy write read-account /etc/vault.d/read-secret-policy.hcl<h4>Записываем сертификат как учётку с заданной политикой</h4>
27
vault auth enable cert vault write auth/cert/certs/client1 display_name=client1 certificate=@/etc/certs/client1.crt policies=read-account<h4>Создаём хранилище, под которое мы создали политику, и заводим секреты</h4>
27
vault auth enable cert vault write auth/cert/certs/client1 display_name=client1 certificate=@/etc/certs/client1.crt policies=read-account<h4>Создаём хранилище, под которое мы создали политику, и заводим секреты</h4>
28
vault secrets enable -path=secret/accounts kv vault write secret/accounts/client1 acc1=alsklaksa pass=aljasljslajsa<h4>Коннектимся нужным ключом и читаем записанный ключ</h4>
28
vault secrets enable -path=secret/accounts kv vault write secret/accounts/client1 acc1=alsklaksa pass=aljasljslajsa<h4>Коннектимся нужным ключом и читаем записанный ключ</h4>
29
$ 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<h3>Connect с удалённой машины</h3>
29
$ 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<h3>Connect с удалённой машины</h3>
30
<p>Копируем на удалённую машину rootCA.crt и клиентские сертификаты.</p>
30
<p>Копируем на удалённую машину rootCA.crt и клиентские сертификаты.</p>
31
<h4>Установка виртуального окружения</h4>
31
<h4>Установка виртуального окружения</h4>
32
scl enable rh-python36 bash python -m venv exit source venv/bin/activate pip install hvac<h4>Коннект на Python</h4>
32
scl enable rh-python36 bash python -m venv exit source venv/bin/activate pip install hvac<h4>Коннект на Python</h4>
33
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’)
33
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’)