Установка в режиме высокой доступности (HA)
StarVault поддерживает мультисерверный режим для обеспечения высокой доступности. Этот режим защищает от сбоев благодаря работе нескольких серверов StarVault. Режим высокой доступности включается автоматически при использовании хранилища данных, которое его поддерживает.
Вы можете определить, поддерживает ли хранилище данных режим высокой доступности ("HA"), запустив сервер и увидев, выводится ли рядом с информацией о хранилище данных сообщение "(HA available)". Если это так, то StarVault будет автоматически использовать режим HA. Эта информация также доступна на странице Конфигурация.
Чтобы достичь высокой доступности, один из узлов StarVault получает блокировку в системе хранения данных. Этот узел затем принимает роль активного узла, в то время как остальные узлы переходят в режим ожидания. Если резервные узлы получают запросы, они будут перенаправлять их или переадресовывать клиентов в соответствии с настройками и текущим состоянием кластера.
1. Использование бэкенда хранилища Raft
|
Развертывание StarVault в режиме высокой доступности с интегрированным хранилищем Raft требует не менее трёх серверов StarVault. В ином случае не набирается кворум и распечатывание хранилища невозможно. |
|
В случае потери кворума обратитесь к инструкции Восстановление при потере кворума. |
1.1. Требования к установке
-
На сервер установлена поддерживаемая операционная система. С перечнем поддерживаемых операционных систем ознакомьтесь в справочнике Операционные системы
-
На сервер скопирован пакет с дистрибутивом StarVault;
-
Наличие сертификатов для каждого узла в кластере Raft, а также сертификата корневого центра сертификации.
1.2. Предварительная подготовка инфраструктуры
В данном сценарии будет описан процесс построения кластера StarVault, состоящий из следующих компонентов:
-
3 узлов StarVault: 1 активный, 2 резервных.
|
Данная архитектура не является рекомендованной для применения в продуктивной среде и предназначена для демонстрации и тестирования. Рекомендуемая архитектура описана в разделе Интегрированное хранилище Raft устройства StartVault. |
Данная инструкция предполагает взаимодействие между серверами с использованием FQDN. Для этого необходимо настроить DNS-сервер с соответствующими A-записями. В целях демонстрации далее будут использоваться следующие сопоставления FQDN и IP-адресов узлов:
| ID узла | FQDN | IP-адрес |
|---|---|---|
raft-node-1 |
raft-node-1.vlab.local |
10.252.11.10 |
raft-node-2 |
raft-node-2.vlab.local |
10.252.11.11 |
raft-node-3 |
raft-node-3.vlab.local |
10.252.11.12 |
1.3. Подготовка необходимых сертификатов
Для настройки TLS необходимо наличие набора сертификатов и ключей, расположенных в каталоге /opt/starvault/tls:
-
Сертификат корневого центра сертификации, подписавшего сертификат StarVault TLS. В данном сценарии он будет иметь имя starvault-ca.pem.
-
Сертификаты узлов Raft. В данном сценарии в кластер будет добавлено три узла, для которых будут созданы следующие сертификаты:
-
node-1-cert.pem
-
node-2-cert.pem
-
node-3-cert.pem
-
-
Закрытые ключи сертификатов узлов:
-
node-1-key.pem
-
node-2-key.pem
-
node-3-key.pem
-
В этом сценарии создадим корневой сертификат, а также набор самоподписанных сертификатов для каждого узла.
|
Хотя самоподписанные сертификаты можно использовать для экспериментов с развертыванием и запуском StarVault, мы настоятельно рекомендуем заменить их сертификатами, созданными и подписанными соответствующим центром сертификации. |
-
На первом узле перейдите в каталог /opt/starvault/tls/ (если каталог не существует - создайте его):
mkdir -p /opt/starvault/tls cd /opt/starvault/tls/ -
Сгенерируйте ключ для корневого сертификата:
openssl genrsa 2048 > starvault-ca-key.pem -
Выпустите корневой сертификат:
openssl req -new -x509 -nodes -days 3650 -key starvault-ca-key.pem -out starvault-ca.pem Country Name (2 letter code) [XX]:RU State or Province Name (full name) []: Locality Name (eg, city) [Default City]:Moscow Organization Name (eg, company) [Default Company Ltd]:Orionsoft Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server hostname) []:vlab.localАтрибуты сертификата указаны для примера.
-
Создайте конфигурационные файлы, содержащие subjectAltName (SAN), для выпуска сертификатов узлов. Например, для узла raft-node-1 файл будет выглядеть следующим образом:
cat << EOF > node-1.cnf [v3_ca] subjectAltName = @alt_names [alt_names] DNS.1 = raft-node-1.vlab.local (1) IP.1 = 10.252.11.10 (2) IP.2 = 127.0.0.1 EOF1 FQDN соответствующего узла 2 IP-адрес соответствующего узла SAN должен содержать корректный FQDN и IP-адрес соответствующего узла.
Конфигурационный файл должен быть создан для каждого узла, который планируется добавить в кластер.
-
Для каждого узла сформируйте файл запроса:
openssl req -newkey rsa:2048 -nodes -keyout node-1-key.pem -out node-1-csr.pem -subj "/CN=raft-node-1.vlab.local" openssl req -newkey rsa:2048 -nodes -keyout node-2-key.pem -out node-2-csr.pem -subj "/CN=raft-node-2.vlab.local" openssl req -newkey rsa:2048 -nodes -keyout node-3-key.pem -out node-3-csr.pem -subj "/CN=raft-node-3.vlab.local" -
Выпустите сертификаты на основании запросов:
openssl x509 -req -set_serial 01 -days 3650 -in node-1-csr.pem -out node-1-cert.pem -CA starvault-ca.pem -CAkey starvault-ca-key.pem -extensions v3_ca -extfile ./node-1.cnf openssl x509 -req -set_serial 01 -days 3650 -in node-2-csr.pem -out node-2-cert.pem -CA starvault-ca.pem -CAkey starvault-ca-key.pem -extensions v3_ca -extfile ./node-2.cnf openssl x509 -req -set_serial 01 -days 3650 -in node-3-csr.pem -out node-3-cert.pem -CA starvault-ca.pem -CAkey starvault-ca-key.pem -extensions v3_ca -extfile ./node-3.cnf -
После выпуска сертификатов можно поступить двумя способами, в зависимости от того, каким образом планируется присоединять узлы к кластеру:
-
Для автоматического подключения узлов скопируйте на каждый узел:
-
Файл сертификата этого узла.
-
Файл ключа этого узла.
-
Файл корневого сертификата.
Например:
scp ./node-2-key.pem ./node-2-cert.pem ./starvault-ca.pem raft-node-2.vlab.local:/opt/starvault/tls scp ./node-3-key.pem ./node-3-cert.pem ./starvault-ca.pem raft-node-3.vlab.local:/opt/starvault/tlsЕсли каталог /opt/starvault/tls на целевых узлах отсутствует - создайте его.
-
-
Для ручного подключения узлов скопируйте сертификаты и ключи узлов, а также корневой сертификат на устройство, с которого будете подключаться к WEB-UI StarVault для добавления узлов.
-
1.4. Развертывание кластера с Raft
Способ 1. С автоматическим добавлением узлов в кластер
-
Подключитесь к первому серверу, на котором будет выполняться инициализация кластера StarVault.
-
Добавьте разрешающие правила на сетевом экране для TCP-портов 8200 и 8201, например для firewalld:
firewall-cmd --add-port=8200/tcp --permanent firewall-cmd --add-port=8201/tcp --permanent firewall-cmd --reloadВ примере используются порты 8200 и 8201, но вы можете использовать любые другие порты, указав их в конфигурационном файле /etc/starvault.d/starvault.hcl
-
Создайте файл /etc/starvault.d/starvault.hcl для настройки использования raft (если каталог /etc/starvault.d/ не существует, создайте его) со следующей содержимым:
Замените значения соответствующих параметров на свои.
ui = true cluster_addr = "https://10.252.11.10:8201" (1) api_addr = "https://10.252.11.10:8200" (2) disable_mlock = true (3) listener "tcp" { address = "0.0.0.0:8200" tls_ca_cert_file = "/opt/starvault/tls/starvault-ca.pem" (4) tls_cert_file = "/opt/starvault/tls/node-1-cert.pem" (5) tls_key_file = "/opt/starvault/tls/node-1-key.pem" (6) } storage "raft" { (7) path = "/opt/starvault/data" (8) node_id = "raft-node-1" (9) retry_join { leader_tls_servername = "raft-node-1.vlab.local" (10) leader_api_addr = "https://10.252.11.10:8200" (11) leader_ca_cert_file = "/opt/starvault/tls/starvault-ca.pem" leader_client_cert_file = "/opt/starvault/tls/node-1-cert.pem" leader_client_key_file = "/opt/starvault/tls/node-1-key.pem" } retry_join { leader_tls_servername = "raft-node-2.vlab.local" (10) leader_api_addr = "https://10.252.11.11:8200" (11) leader_ca_cert_file = "/opt/starvault/tls/starvault-ca.pem" leader_client_cert_file = "/opt/starvault/tls/node-1-cert.pem" leader_client_key_file = "/opt/starvault/tls/node-1-key.pem" } retry_join { leader_tls_servername = "raft-node-3.vlab.local" (10) leader_api_addr = "https://10.252.11.12:8200" (11) leader_ca_cert_file = "/opt/starvault/tls/starvault-ca.pem" leader_client_cert_file = "/opt/starvault/tls/node-1-cert.pem" leader_client_key_file = "/opt/starvault/tls/node-1-key.pem" } }1 Указывает адрес и порт, который необходимо анонсировать другим узлам в кластере для пересылки запросов. Является обязательным параметром для интегрированного хранилища. 2 Указывает адрес и порт, который необходимо анонсировать другим узлам в кластере для перенаправления клиентов. 3 Запрещает серверу выполнять системный вызов mlock.mlockпредотвращает переключение памяти на диск. Настоятельно рекомендуется отключатьmlockпри использовании интегрированного хранилища.4 Корневой сертификат 5 Сертификат первого узла 6 Ключ первого узла 7 Указывает использовать в качестве бэкенда хранилища Raft. 8 Указывает путь к каталогу, где будут храниться данные 9 Определяет уникальное имя данного узла 10 Имя сервера, которое должно совпадать с тем, что прописано в сертификате данного сервера. 11 IP-адрес соответствующего сервера Обратите внимание, что в блоках
retry_joinв качестве ключа и сертификата клиента необходимо указывать файлы текущего узла (т.е. node-1-cert.pem и node-1-key.pem) -
Перейдите в каталог, в котором расположен пакет для установки.
-
Выполните установку StarVault на первом узле:
-
Убедитесь, что сервис starvault активен:
systemctl status starvault ● starvault.service - "Starvault - A tool for managing secrets" Loaded: loaded (/usr/lib/systemd/system/starvault.service; enabled; preset: disabled) Active: active (running) since Tue 2024-05-07 08:57:59 EDT; 14min agoЕсли сервис starvault не запущен из-за ошибки, узнайте причину с помощью следующей команды:
journalctl -xeu starvault.service-
При наличии ошибки:
Error initializing storage of type raft: failed to create fsm: failed to open bolt file: open /opt/starvault/data/vault.db: no such file or directoryВручную создайте каталог /opt/starvault/data и выдайте корректные права на /opt/starvault
mkdir /opt/starvault/data chown starvault:starvault /opt/starvault -RЗапустите сервис:
systemctl start starvault -
При наличии ошибки:
Error initializing storage of type raft: failed to create fsm: failed to open bolt file: open /opt/starvault/data/vault.db: permission deniedВыдайте корректные права на /opt/starvault
chown starvault:starvault /opt/starvault -RЗапустите сервис:
systemctl start starvault
-
-
Повторите описанные шаги для остальных серверов.
В файле /etc/starvault.d/starvault.hcl необходимо ввести корректные для соответствующего сервера значения параметров. Например, для raft-node-2 в этой инструкции файл будет иметь следующее содержимое:
ui = true cluster_addr = "https://10.252.11.11:8201" (1) api_addr = "https://10.252.11.11:8200" (1) disable_mlock = true listener "tcp" { address = "0.0.0.0:8200" tls_ca_cert_file = "/opt/starvault/tls/starvault-ca.pem" tls_cert_file = "/opt/starvault/tls/node-2-cert.pem" (1) tls_key_file = "/opt/starvault/tls/node-2-key.pem" (1) } storage "raft" { path = "/opt/starvault/data" node_id = "raft-node-2" (1) retry_join { leader_tls_servername = "raft-node-1.vlab.local" leader_api_addr = "https://10.252.11.10:8200" leader_ca_cert_file = "/opt/starvault/tls/starvault-ca.pem" leader_client_cert_file = "/opt/starvault/tls/node-2-cert.pem" (1) leader_client_key_file = "/opt/starvault/tls/node-2-key.pem" (1) } retry_join { leader_tls_servername = "raft-node-2.vlab.local" leader_api_addr = "https://10.252.11.11:8200" leader_ca_cert_file = "/opt/starvault/tls/starvault-ca.pem" leader_client_cert_file = "/opt/starvault/tls/node-2-cert.pem" (1) leader_client_key_file = "/opt/starvault/tls/node-2-key.pem" (1) } retry_join { leader_tls_servername = "raft-node-3.vlab.local" leader_api_addr = "https://10.252.11.12:8200" leader_ca_cert_file = "/opt/starvault/tls/starvault-ca.pem" leader_client_cert_file = "/opt/starvault/tls/node-2-cert.pem" (1) leader_client_key_file = "/opt/starvault/tls/node-2-key.pem" (1) } }1 Значения изменены на актуальные для raft-node-2. -
Выполните инициализацию:
Инициализация - это процесс настройки StarVault. Она происходит только один раз, когда сервер запускается с новым бэкендом, который никогда ранее не использовался с StarVault.
-
В браузере перейдите по адресу любого из серверов на порт 8200. Например, https://raft-node-1.vlab.local:8200.
-
Выберите Create a new Raft cluster и нажмите Next.
-
В поле Key shares введите количество долей ключа на которое будет разделён ключ распечатки
-
В поле Key threshold введите количество долей, которого будет достаточно для расшифровывания корневого ключа
-
Нажмите Initialize для инициализации StarVault.
-
-
После того, как инициализация будет выполнена, на экране будут выведены все части ключа и корневой токен. Сохраните эти данные и нажмите Continue to Unseal для перехода к распечатыванию хранилища.
Части ключа и начальный корневой токен крайне важны. Это единственный раз, когда все эти данные известны StarVault, а также единственный раз, когда они должны быть так близко друг к другу.
Для быстрого сохранения вы можете загрузить токен и доли ключа в формате json, нажав Download keys.
-
Поочередно введите доли ключа распечатки в поле Unseal Key Portion в необходимом количестве. После ввода каждой доли нажимайте Unseal
-
После ввода необходимого количества долей, хранилище будет распечатано, на что указывает статус:
-
На экране логина убедитесь, что выбран метод аутентификации Token и введите корневой токен, полученный после инициализации. Нажмите Sign In для входа.
-
При успешном входе вы увидите Secrets Engines.
На данном этапе инициализирован и распечатан кластер Raft, но он не является высокодоступным. Для обеспечения высокой доступности StarVault необходимо подключить к кластеру оставшиеся узлы. Для этого:
-
В браузере перейдите по адресу сервера, который необходимо подключить в кластер, на порт 8200. Например, https://raft-node-2.vlab.local:8200.
-
Введите необходимое количество долей ключа распечатки
-
На экране логина убедитесь, что выбран метод аутентификации Token и введите корневой токен, полученный после инициализации. Нажмите Sign In для входа.
По окончании добавления серверов, в веб-интерфейсе проверьте список узлов в кластере:
-
Перейдите в .
-
Убедитесь, что в списке присутствуют все необходимые узлы.
Также убедитесь в корректном статусе режима HA:
-
Подключитесь к любому узлу по SSH.
-
Отключите проверку сертификата:
export STARVAULT_SKIP_VERIFY="true"Отмены проверки сертификата можно избежать, добавив корневой сертификат в список доверенных.
-
Проверьте статус:
starvault status Key Value --- ----- Seal Type shamir Initialized true Sealed false Total Shares 6 Threshold 4 Version 1.14.8 Build Date 2024-03-26T14:34:36Z Storage Type raft (1) Cluster Name starvault-cluster-a3fcc270 Cluster ID f682968d-5e6c-9ad4-8303-5aecb259ca0b HA Enabled true (2) HA Cluster https://10.252.11.10:8201 HA Mode active (3) Active Node Address https://10.252.11.10:8200 Raft Committed Index 40 Raft Applied Index 401 Используемый тип бэкенда хранилища (в примере Raft) 2 Статус режима HA. True, значит режим включен. 3 Статус текущего узла в HA-кластере. Activeуказывает на то, что данный узел является лидером,Standby- узел является резервным.
Способ 2. С ручным добавлением узлов в кластер
-
Подключитесь к первому серверу, на котором будет выполняться инициализация кластера StarVault.
-
Добавьте разрешающие правила на сетевом экране для TCP-портов 8200 и 8201, например для firewalld:
firewall-cmd --add-port=8200/tcp --permanent firewall-cmd --add-port=8201/tcp --permanent firewall-cmd --reloadВ примере используются порты 8200 и 8201, но вы можете использовать любые другие порты, указав их в конфигурационном файле /etc/starvault.d/starvault.hcl
-
Создайте файл /etc/starvault.d/starvault.hcl для настройки использования raft (если каталог /etc/starvault.d/ не существует, создайте его) со следующей содержимым:
Замените значения соответствующих параметров на свои.
ui = true cluster_addr = "https://10.252.11.10:8201" (1) api_addr = "https://10.252.11.10:8200" (2) disable_mlock = true (3) listener "tcp" { address = "0.0.0.0:8200" tls_ca_cert_file = "/opt/starvault/tls/starvault-ca.pem" (4) tls_cert_file = "/opt/starvault/tls/node-1-cert.pem" (5) tls_key_file = "/opt/starvault/tls/node-1-key.pem" (6) } storage "raft" { (7) path = "/opt/starvault/data" (8) node_id = "raft-node-1" (9) }1 Указывает адрес и порт, который необходимо анонсировать другим узлам в кластере для пересылки запросов. Является обязательным параметром для интегрированного хранилища. 2 Указывает адрес и порт, который необходимо анонсировать другим узлам в кластере для перенаправления клиентов. 3 Запрещает серверу выполнять системный вызов mlock.mlockпредотвращает переключение памяти на диск. Настоятельно рекомендуется отключатьmlockпри использовании интегрированного хранилища.4 Корневой сертификат 5 Сертификат первого узла. 6 Ключ первого узла. 7 Указывает использовать в качестве бэкенда хранилища Raft. 8 Указывает путь к каталогу, где будут храниться данные. 9 Определяет уникальное имя данного узла. -
Перейдите в каталог, в котором расположен пакет для установки.
-
Выполните установку StarVault на первом узле:
-
Убедитесь, что сервис starvault активен:
systemctl status starvault ● starvault.service - "Starvault - A tool for managing secrets" Loaded: loaded (/usr/lib/systemd/system/starvault.service; enabled; preset: disabled) Active: active (running) since Tue 2024-05-07 08:57:59 EDT; 14min agoЕсли сервис starvault не запущен из-за ошибки, узнайте причину с помощью следующей команды:
journalctl -xeu starvault.service-
При наличии ошибки:
Error initializing storage of type raft: failed to create fsm: failed to open bolt file: open /opt/starvault/data/vault.db: no such file or directoryВручную создайте каталог /opt/starvault/data и выдайте корректные права на /opt/starvault
mkdir /opt/starvault/data chown starvault:starvault /opt/starvault -RЗапустите сервис:
systemctl start starvault -
При наличии ошибки:
Error initializing storage of type raft: failed to create fsm: failed to open bolt file: open /opt/starvault/data/vault.db: permission deniedВыдайте корректные права на /opt/starvault
chown starvault:starvault /opt/starvault -RЗапустите сервис:
systemctl start starvault
-
-
Повторите описанные шаги для остальных серверов.
В файле /etc/starvault.d/starvault.hcl необходимо ввести корректные для соответствующего сервера значения параметров. Например, для raft-node-2 в этой инструкции файл будет иметь следующее содержимое:
ui = true cluster_addr = "https://10.252.11.11:8201" (1) api_addr = "https://10.252.11.11:8200" (1) disable_mlock = true listener "tcp" { address = "0.0.0.0:8200" tls_ca_cert_file = "/opt/starvault/tls/starvault-ca.pem" tls_cert_file = "/opt/starvault/tls/node-2-cert.pem" (1) tls_key_file = "/opt/starvault/tls/node-2-key.pem" (1) } storage "raft" { path = "/opt/starvault/data" node_id = "raft-node-2" (1) }1 Значения изменены на актуальные для raft-node-2. -
Выполните инициализацию:
Инициализация - это процесс настройки StarVault. Она происходит только один раз, когда сервер запускается с новым бэкендом, который никогда ранее не использовался с StarVault.
-
В браузере перейдите по адресу первого сервера на порт 8200. Например, https://raft-node-1.vlab.local:8200.
-
Выберите Create a new Raft cluster и нажмите Next.
-
В поле Key shares введите количество долей ключа на которое будет разделён ключ распечатки
-
В поле Key threshold введите количество долей, которого будет достаточно для расшифровывания корневого ключа
-
Нажмите Initialize для инициализации StarVault.
-
-
После того, как инициализация будет выполнена, на экране будут выведены все части ключа и корневой токен. Сохраните эти данные и нажмите Continue to Unseal для перехода к распечатыванию хранилища.
Части ключа и начальный корневой токен крайне важны. Это единственный раз, когда все эти данные известны StarVault, а также единственный раз, когда они должны быть так близко друг к другу. Для быстрого сохранения вы можете загрузить токен и доли ключа в формате json, нажав Download keys.
-
Поочередно введите доли ключа распечатки в поле Unseal Key Portion в необходимом количестве. После ввода каждой доли нажимайте Unseal
-
После ввода необходимого количества долей, хранилище будет распечатано, на что указывает статус:
-
На экране логина убедитесь, что выбран метод аутентификации Token и введите корневой токен, полученный после инициализации. Нажмите Sign In для входа.
-
При успешном входе вы увидите Secrets Engines.
-
Присоедините остальные узлы к кластеру:
-
В браузере перейдите по адресу сервера, который необходимо подключить в кластер, на порт 8200. Например, https://raft-node-2.vlab.local:8200.
-
Выберите Join an exiting Raft cluster и нажмите Next.
-
Введите ip-адрес или FQDN для подключению к лидеру (это первый узел, на котором выполнялась инициализация кластера), загрузите корневой сертификат, а также сертификат и ключ лидера (первого узла).
-
Нажмите Join
-
Введите необходимое количество долей ключа распечатки
-
На экране логина убедитесь, что выбран метод аутентификации Token и введите корневой токен, полученный после инициализации. Нажмите Sign In для входа.
-
По окончании добавления серверов, в веб-интерфейсе проверьте список узлов в кластере:
-
Перейдите в .
-
Убедитесь, что в списке присутствуют все необходимые узлы.
Также убедитесь в корректном статусе режима HA:
-
Подключитесь к любому узлу по SSH.
-
Отключите проверку сертификата:
export STARVAULT_SKIP_VERIFY="true"Отмены проверки сертификата можно избежать, добавив корневой сертификат в список доверенных.
-
Проверьте статус:
starvault status Key Value --- ----- Seal Type shamir Initialized true Sealed false Total Shares 6 Threshold 4 Version 1.14.8 Build Date 2024-03-26T14:34:36Z Storage Type raft (1) Cluster Name starvault-cluster-a3fcc270 Cluster ID f682968d-5e6c-9ad4-8303-5aecb259ca0b HA Enabled true (2) HA Cluster https://10.252.11.10:8201 HA Mode active (3) Active Node Address https://10.252.11.10:8200 Raft Committed Index 40 Raft Applied Index 401 Используемый тип бэкенда хранилища (в примере Raft) 2 Статус режима HA. True, значит режим включен. 3 Статус текущего узла в HA-кластере. Activeуказывает на то, что данный узел является лидером,Standby- узел является резервным.