Настройка кластера Hashicorp Vault + Consul на Linux CentOS 7

Обновлено Обновлено: Опубликовано Опубликовано:

Используемые термины: Hashicorp VaultHashicorp Consul.

Мы рассмотрим настройку отказоустойчивой системы Hashicorp Vault, состоящей из 2 серверов самого Vault и 3-х серверов Consul. Кластер управления паролями будет работать в режиме hot - standby. Предполагается, что у нас уже есть серверы с настроенными Consul, иначе, рекомендуется прочитать инструкцию Установка и настройка кластера Consul Hashicorp на CentOS. Установку Vault мы выполним в процессе настройки кластера.

Установка и настройка агентов Consul на ноды Vault

Первым делом добавим наши серверы Vault к кластеру Consul. Для этого на каждый узел нам нужно установить последний и сконфигурировать его. Рассмотрим подробнее и разобьем процесс на установку и настройку агента консул. Данные действия необходимо выполнить на обоих серверах Vault.

Установка Consul

Предварительно, установим пакеты:

yum install wget unzip

На сервере Consul смотрим версию установленного программного продукта:

consul -v

В моем случае, это был 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 -v

Мы должны увидеть версию программы:

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 agent
Requires=network-online.target
After=network-online.target

[Service]
User=consul
Group=consul
PIDFile=/var/run/consul/consul.pid
RuntimeDirectory=consul
ExecStart=/usr/bin/consul agent \
    -config-file=/etc/consul/config.json \
    -pid-file=/var/run/consul/consul.pid
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
KillSignal=SIGTERM
Restart=on-failure
RestartSec=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.

Установка и настройка 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 listener
listener "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 и проверка работы кластера

Переходим на веб-интерфейс консула. Мы должны увидеть, что у нас зарегистрировался новый сервис Vault с двумя экземплярами, но он должен быть в состоянии Fail:

Ошибка в работе Vault, так как он не распечатан

Если посмотреть подробную информацию, ошибка в том, что наши серверы Vault запечатаны. Так и должно быть. Выполняем инициализацию на любом из серверов vault.

Для получения возможности управлять сервисом, задаем переменную среды VAULT_ADDR:

export VAULT_ADDR=http://127.0.0.1:8200

Проверяем, что мы можем подключиться к волту:

vault status

Мы должны увидеть что-то на подобие:

Key                Value
---                -----
Seal Type          shamir
Initialized        false
Sealed             true
Total Shares       0
Threshold          0
Unseal Progress    0/0
Unseal Nonce       n/a
Version            1.8.2
Storage Type       consul
HA Enabled         true

Теперь можно инициализировать сервис:

vault operator init

В результате выполнения команды мы получим 5 ключей для распечатывания сервиса и токен для авторизации под рутом — что-то на подобие:

Unseal Key 1: /1Z92ccahn8WacFp7Ve1ZBP+9MwfVTttxhlHORaFqtxv
Unseal Key 2: 4nqI081IYLzpb3xCujGz6/JevySqYmxEK6XUvJv9zOTl
Unseal Key 3: A5Lt1Fxzn6gLWc+4RFVvQ4gV6gQZa2YnFz6HrMlbFXwN
Unseal Key 4: v1Zt7nqP29AO3Whpq8nB/TeUWAtWXdHp/DwPft44IAUI
Unseal Key 5: j0OPqlTd6AkYTRxZ7mnazWnvK82qHs50+n5HZVHRqz01

Initial Root Token: s.pcpkuP35fZeC3pHHl0JAp7Lm
...

Сохраняем данные значения, они нужны для работы с системой управления паролями.

Распечатываем первый vault тремя любыми ключами, введя 3 раза команду:

vault operator unseal

Переходим на веб-интерфейс Consul — мы должны увидеть, что одна из нод сервиса vault прошла все проверки:

Один из Vault распечатан

Продолжаем. На второй ноде vaul также вводим команды для распечатывания:

export VAULT_ADDR=http://127.0.0.1:8200

vault operator unseal

После третьего ввода корректного ключа, проверяем, что на портале консула у нас нет ошибок.

Теперь пробуем обратиться к 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.consul
Address: 192.168.0.100
Name:    vault.service.dc1.consul
Address: 192.168.0.101

Кластер возвращает нужные нам значения.

Активную vault-ноду можно опросить запросом:

nslookup -port=8600 active.vault.service.dc1.consul. 192.168.0.15

Теперь пробуем остановить сервис vault на одной из нод кластера:

systemctl stop vault

И сделать DNS запрос:

nslookup -port=8600 vault.service.dc1.consul. 192.168.0.15

Теперь мы в ответ получим только одну запись:

Name:    vault.service.dc1.consul
Address: 192.168.0.100

# Серверы # CentOS # Безопасность # DevOps
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет