Настройка кластера Hashicorp Vault + Consul

Thank you for reading this post, don't forget to subscribe!

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

Уста­нов­ка и настрой­ка кла­сте­ра Consul Hashicorp

Уста­нов­ку 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 /var/run/consul

И выста­вим на него соот­вет­ству­ю­щие права:

chown consul:consul /var/consul/data /etc/consul /var/run/consul

chmod 775 /var/consul/data /etc/consul /var/run/consul

* в дан­ном при­ме­ре мы ука­за­ли, что вла­дель­цем дан­ных ката­ло­гов будет создан­ная учет­ная запись consul. Пра­ва будут пол­ные у вла­дель­ца, осталь­ные смо­гут читать данные.

Созда­ем кон­фи­гу­ра­ци­он­ные фай­лы для кон­су­ла на каж­дом из буду­щих сер­ве­ров vault:

vi /etc/consul/config.json

а) для сер­ве­ра 1:

б) для сер­ве­ра 2:


* обра­ти­те вни­ма­ние, что кон­фи­гу­ра­ци­он­ный фай­лы отли­ча­ют­ся IP-адре­сом при­вяз­ки сер­ви­са (bind_addr) и име­нем ноды (node_name).

Про­ве­ря­ем кор­рект­ность настройки:

consul validate /etc/consul/config.json

Мы долж­ны увидеть:

Configuration is valid!

Про­дол­жа­ем. Созда­ем юнит в systemd:

vi /etc/systemd/system/consul.service

Пере­чи­ты­ва­ем кон­фи­гу­ра­цию 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:

* дан­ной настрой­кой мы гово­рим vault хра­нить дан­ные в кон­су­ле. Так­же наш волт заре­ги­стри­ру­ет сер­вис в consul.

Ком­мен­ти­ру­ем настрой­ки TLS:

Сни­ма­ем ком­мен­та­рии для настрой­ки HTTP listener и добав­ля­ем опцию cluster_address:


А так­же добав­ля­ем стро­ки с опци­я­ми api_addr и cluster_addr.

а) для сер­ве­ра vault 1:

б) для сер­ве­ра vault 2:


Раз­ре­ша­ем авто­старт сер­ви­са vault и запус­ка­ем его:

systemctl enable vault --now

Про­ве­рить ста­тус мож­но командой:

systemctl status vault

Распечатывание Vault и проверка работы кластера

Пере­хо­дим на веб-интер­фейс кон­су­ла. Мы долж­ны уви­деть, что у нас заре­ги­стри­ро­вал­ся новый сер­вис Vault с дву­мя экзем­пля­ра­ми, но он дол­жен быть в состо­я­нии Fail. Если посмот­реть подроб­ную инфор­ма­цию, ошиб­ка в том, что наши сер­ве­ры Vault запе­ча­та­ны. Так и долж­но быть. Выпол­ня­ем ини­ци­а­ли­за­цию на любом из сер­ве­ров vault.

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

export VAULT_ADDR=http://127.0.0.1:8200

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

vault status

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

vault operator init

В резуль­та­те выпол­не­ния коман­ды мы полу­чим 5 клю­чей для рас­пе­ча­ты­ва­ния сер­ви­са и токен для авто­ри­за­ции под рутом. Сохра­ня­ем дан­ные зна­че­ния, они нуж­ны для рабо­ты с систе­мой управ­ле­ния паролями.

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

vault operator unseal

Пере­хо­дим на веб-интер­фейс Consul — мы долж­ны уви­деть, что одна из нод сер­ви­са 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.

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


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

Теперь про­бу­ем оста­но­вить сер­вис 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