Используемые термины: Hashicorp Vault, Hashicorp Consul.
Мы рассмотрим настройку отказоустойчивой системы Hashicorp Vault, состоящей из 2 серверов самого Vault и 3-х серверов Consul. Кластер управления паролями будет работать в режиме hot – standby. Предполагается, что у нас уже есть серверы с настроенными Consul, иначе, рекомендуется прочитать инструкцию Установка и настройка кластера Consul Hashicorp на CentOS. Установку Vault мы выполним в процессе настройки кластера.
Первым делом добавим наши серверы Vault к кластеру Consul. Для этого на каждый узел нам нужно установить последний и сконфигурировать его. Рассмотрим подробнее и разобьем процесс на установку и настройку агента консул. Данные действия необходимо выполнить на обоих серверах Vault.
Предварительно, установим пакеты:
yum install wget unzip
На сервере Consul смотрим версию установленного программного продукта:
В моем случае, это был Consul v1.9.5. На клиентские ноды будем устанавливать туже версию продукта:
export VER=”1.9.5″
После чего скачиваем бинарник нужной нам версии:
wget https://releases.hashicorp.com/consul/${VER}/consul_${VER}_linux_amd64.zip
И распаковываем его:
unzip consul_${VER}_linux_amd64.zip
Скопируем распакованный бинарник в каталог /usr/bin:
mv consul /usr/bin/
Проверяем, что команды консул выполняются:
Мы должны увидеть версию программы:
Consul v1.9.5…
Создаем учетную запись, от которой будет работать консул агент:
useradd -r -c ‘Consul Agent’ consul
* в данном примере мы создадим системную учетную запись consul.
Создаем каталоги для приложения консул:
mkdir -p /var/consul/data /etc/consul
И выставим на него соответствующие права:
chown consul:consul /var/consul/data /etc/consul
chmod 775 /var/consul/data /etc/consul
* в данном примере мы указали, что владельцем данных каталогов будет созданная учетная запись consul. Права будут полные у владельца, остальные смогут читать данные.
Создаем конфигурационные файлы для консула на каждом из будущих серверов vault:
vi /etc/consul/config.json
а) для сервера 1:
{ “server”: false, “datacenter”: “dc1”, “node_name”: “vault01”, “data_dir”: “/var/consul/data”, “bind_addr”: “192.168.0.100”, “client_addr”: “127.0.0.1”, “retry_join”: [“192.168.0.15”, “192.168.0.20”, “192.168.0.25”], “encrypt”: “zpjf5a4reDbJFpT6FeaF0LGxD0zBRPSRbIoUkLBt0ps=”, “log_level”: “DEBUG”, “enable_syslog”: true}
б) для сервера 2:
{ “server”: false, “datacenter”: “dc1”, “node_name”: “vault02”, “data_dir”: “/var/consul/data”, “bind_addr”: “192.168.0.101”, “client_addr”: “127.0.0.1”, “retry_join”: [“192.168.0.15”, “192.168.0.20”, “192.168.0.25”], “encrypt”: “zpjf5a4reDbJFpT6FeaF0LGxD0zBRPSRbIoUkLBt0ps=”, “log_level”: “DEBUG”, “enable_syslog”: true}
* обратите внимание, что конфигурационный файлы отличаются IP-адресом привязки сервиса (bind_addr) и именем ноды (node_name).
Проверяем корректность настройки:
consul validate /etc/consul/config.json
Мы должны увидеть:
Configuration is valid!
Продолжаем. Создаем юнит в systemd:
vi /etc/systemd/system/consul.service
[Unit]Description=Consul client agentRequires=network-online.targetAfter=network-online.target
[Service]User=consulGroup=consulPIDFile=/var/run/consul/consul.pidRuntimeDirectory=consulExecStart=/usr/bin/consul agent -config-file=/etc/consul/config.json -pid-file=/var/run/consul/consul.pidExecReload=/bin/kill -HUP $MAINPIDKillMode=processKillSignal=SIGTERMRestart=on-failureRestartSec=42s
[Install]WantedBy=multi-user.target
Перечитываем конфигурацию systemd:
systemctl daemon-reload
Разрешаем автозапуск сервиса, стартуем его и проверяем статус:
systemctl enable consul
systemctl start consul
systemctl status consul
На любом из узлов кластера выполним:
consul members
Мы должны увидеть 5 нод — 3 для кластера консул и 2 для vault.
Мы выполним настройку из репозитория. Но сначала нам нужно открыть в брандмауэре порт 8200:
firewall-cmd –permanent –add-port=8200/tcp
firewall-cmd –reload
Теперь скачиваем файл с настройкой репозитория:
wget https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo -O /etc/yum.repos.d/hashicorp.repo
Устанавливаем волт:
yum install vault
Открываем конфигурационный файл установленного софта:
vi /etc/vault.d/vault.hcl
Комментируем настройки для storage file и снимаем комментарии с настроек storage consul:
##storage “file” {## path = “/opt/vault/data”##}
storage “consul” { address = “127.0.0.1:8500” path = “vault”## token = “59ac7fa8-dca6-e066-ff33-0bf9bb6f466a”}
* данной настройкой мы говорим vault хранить данные в консуле. Также наш волт зарегистрирует сервис в consul.** обратите внимание на закомментированную строку token — она нужна, если наш consul настроен для аутентификации (acl enable). 59ac7fa8-dca6-e066-ff33-0bf9bb6f466a — токен, который используется для получения авторизации.
Комментируем настройки TLS:
# HTTPS listener##listener “tcp” {## address = “0.0.0.0:8200”## tls_cert_file = “/opt/vault/tls/tls.crt”## tls_key_file = “/opt/vault/tls/tls.key”##}
Снимаем комментарии для настройки HTTP listener и добавляем опцию cluster_address:
# HTTP listenerlistener “tcp” { address = “127.0.0.1:8200” cluster_address = “127.0.0.1:8201” tls_disable = 1}
А также добавляем строки с опциями api_addr и cluster_addr.
а) для сервера vault 1:
api_addr = “http://192.168.0.100:8200”cluster_addr = “http://192.168.0.100:8201”
б) для сервера vault 2:
api_addr = “http://192.168.0.101:8200”cluster_addr = “http://192.168.0.101:8201”
Разрешаем автостарт сервиса vault и запускаем его:
systemctl enable vault –now
Проверить статус можно командой:
systemctl status vault
Переходим на веб-интерфейс консула. Мы должны увидеть, что у нас зарегистрировался новый сервис Vault с двумя экземплярами, но он должен быть в состоянии Fail:
Если посмотреть подробную информацию, ошибка в том, что наши серверы Vault запечатаны. Так и должно быть. Выполняем инициализацию на любом из серверов vault.
Для получения возможности управлять сервисом, задаем переменную среды VAULT_ADDR:
export VAULT_ADDR=http://127.0.0.1:8200
Проверяем, что мы можем подключиться к волту:
vault status
Мы должны увидеть что-то на подобие:
Key Value— —–Seal Type shamirInitialized falseSealed trueTotal Shares 0Threshold 0Unseal Progress 0/0Unseal Nonce n/aVersion 1.8.2Storage Type consulHA Enabled true
Теперь можно инициализировать сервис:
vault operator init
В результате выполнения команды мы получим 5 ключей для распечатывания сервиса и токен для авторизации под рутом — что-то на подобие:
Unseal Key 1: /1Z92ccahn8WacFp7Ve1ZBP+9MwfVTttxhlHORaFqtxvUnseal Key 2: 4nqI081IYLzpb3xCujGz6/JevySqYmxEK6XUvJv9zOTlUnseal Key 3: A5Lt1Fxzn6gLWc+4RFVvQ4gV6gQZa2YnFz6HrMlbFXwNUnseal Key 4: v1Zt7nqP29AO3Whpq8nB/TeUWAtWXdHp/DwPft44IAUIUnseal Key 5: j0OPqlTd6AkYTRxZ7mnazWnvK82qHs50+n5HZVHRqz01
Initial Root Token: s.pcpkuP35fZeC3pHHl0JAp7Lm…
Сохраняем данные значения, они нужны для работы с системой управления паролями.
Распечатываем первый vault тремя любыми ключами, введя 3 раза команду:
vault operator unseal
Переходим на веб-интерфейс Consul — мы должны увидеть, что одна из нод сервиса vault прошла все проверки:
Продолжаем. На второй ноде vaul также вводим команды для распечатывания:
После третьего ввода корректного ключа, проверяем, что на портале консула у нас нет ошибок.
Теперь пробуем обратиться к DNS консула, чтобы получить IP рабочего сервера:
nslookup -port=8600 vault.service.dc1.consul. 192.168.0.15
* где dc1 — имя датацентра в конфигурации консула (datacenter), consul — имя домена в конфигурации консула (domain); 192.168.0.15 — IP-адрес любого из серверов кластера Consul.
Мы должны получить ответ на подобие:
Name: vault.service.dc1.consulAddress: 192.168.0.100Name: vault.service.dc1.consulAddress: 192.168.0.101
Кластер возвращает нужные нам значения.
Активную vault-ноду можно опросить запросом:
nslookup -port=8600 active.vault.service.dc1.consul. 192.168.0.15
Теперь пробуем остановить сервис vault на одной из нод кластера:
systemctl stop vault
И сделать DNS запрос:
Теперь мы в ответ получим только одну запись:
Name: vault.service.dc1.consulAddress: 192.168.0.100
Продолжая использовать данный сайт вы принимаете политику конфиденциальности и cookies