HashiCorp Consul - это сетевое решение, которое позволяет командам управлять безопасным сетевым подключением между службами, а также в локальных и мультиоблачных средах и средах выполнения. Consul предлагает обнаружение услуг, сервисную сетку, управление трафиком и автоматизированные обновления устройства сетевой инфраструктуры. Вы можете использовать эти функции по отдельности или вместе в одном развертывании Consul.

CONSUL - часть 1: Установка

CONSUL - часть 1: Генерация ключа  шифрования сплетен

CONSUL - часть 1: Создание центра сертификации

CONSUL - часть 1: Автоматическое присоединение к центру обработки данных

CONSUL - часть 1: Настройка Consul (Server) узлов

Установка Consul

      Чтобы обеспечить высокодоступную архитектуру с одним центром обработки данных, рекомендуется развертывать агенты сервера Consul более чем на одном хосте, как показано в эталонной архитектуре Consul

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

consul --version
Consul v1.16.0
Revision 192df66a

...

          Активировать автозаполнение

consul -autocomplete-install

Генерация ключа шифрования сплетен

   Включение шифрования сплетен требует только установки ключа шифрования при запуске агента Consul. Ключ может быть установлен через encrypt параметр.  Ключ должен иметь размер 32 байта в кодировке Base64. Для удобства Consul предоставляет consul keygen команду для создания криптографически подходящего ключа:

consul keygen

 Команда keygen генерирует ключ шифрования, который можно использовать для шифрования трафика агента Consul. Команда keygen использует криптографически стойкий генератор псевдослучайных чисел для генерации ключа.

Создание центра сертификации

   Начните с создания ЦС в вашем экземпляре администратора с помощью Consul CLI

consul tls ca create -domain example.org
==> Saved example.org-agent-ca.pem
==> Saved example.org-agent-ca-key.pem

    Cоздайте набор сертификатов для ваших серверов Consul. Вы должны выбрать имя для своего центра обработки данных и домена, чтобы сертификаты назывались правильно.Используйте следующую команду, чтобы создать сертификат для каждого сервера. Имя файла увеличивается автоматически

consul tls cert create -server -dc dc1 -domain example.org
==> WARNING: Server Certificates grants authority to become a
server and access all state in the cluster including root keys
and all ACL tokens. Do not distribute them to production hosts
that are not server nodes. Store them as securely as CA keys.
==> Using example.org-agent-ca.pem and example.org-agent-ca-key.pem
==> Saved dc1-server-example.org-0.pem
==> Saved dc1-server-example.org-0-key.pem

         Параметры команды:
-additional-dnsname=<string>  - Укажите дополнительное DNS-имя для альтернативных имен субъектов. localhost всегда включен. Этот флаг может быть указан несколько раз.
-additional-ipaddress=<string> - Укажите дополнительный IP-адрес для альтернативных имен субъектов. 127.0.0.1 всегда включен. Этот флаг может быть указан несколько раз.
-ca=<string> - Укажите путь к ок. По умолчанию #DOMAIN#-agent-ca.pem
-cli - Генерация сертификата CLI.
-client - Генерация клиентского сертификата
-days=<int> - Укажите количество дней, в течение которых сертификат действителен с этого момента. По умолчанию 1 год
-dc=<string> - Предоставить дата-центр. Имеет значение только для -server сертификатов. По умолчанию dc1
-domain=<string> - Укажите домен. Имеет значение только для -server сертификатов
-key=<string> - Укажите путь к ключу. По умолчанию #DOMAIN#-agent-ca-key.pem
-node=<string> - При создании сертификата сервера и его установке добавляется дополнительное DNS-имя формы  <node>.server.<datacenter>.<domain>
-server - Создать сертификат сервера

Агенты клиента Consul можно настроить двумя способами: с помощью автоматического шифрования или ручной настройки

АВТОШИФРОВАНИЕ

Рекомендуемый подход — использовать механизм автоматического шифрования, предоставляемый Consul, который автоматически генерирует клиентские сертификаты, используя ранее созданный сертификат CA <domain>-agent-ca.pem для включения TLS. Включается параметром auto-encrypt.

РУЧНАЯ НАСТРОЙКА

     При ручной настройке создается пара сертификат/ключ для каждого клиентского агента Consul. Используйте следующую команду с -client флагом для создания клиентских сертификатов. Имя файла увеличивается автоматически.

consul tls cert create -client -dc <dc_name> -domain <domain_name>
==> Using ​<domain_name>-agent-ca.pem and ​<domain_name>-agent-ca-key.pem 
==> Saved ​<dc_name>-client-​<domain_name>-0.pem 
==> Saved ​<dc_name>-client-​<domain_name>-0-key.pem

Раздайте сертификаты агентам

  Вы должны раздать сертификат CA consul-agent-ca.pem каждому из агентов Consul, а также сертификат для конкретного агента и закрытый ключ:
        Если агент сервера, распространите файл CA, сертификат сервера и закрытый ключ сервера.
     Если клиентский агент использует автоматическое шифрование, распространяйте только файл CA.
  Если агент клиента использует ручную настройку, распространите файл CA, сертификат клиента и закрытый ключ клиента.

TLS-конфигурация

    Для защиты связи RPC для клиентов Consul предлагает два различных подхода: механизм автоматического шифрования и ручную настройку

tls.defaults.ca_file - Указывает путь к файлу общедоступного сертификата ЦС.
tls.defaults.cert_file - Указывает путь к файлу общедоступного сертификата агента.
tls.defaults.key_file - Указывает путь к файлу закрытого ключа сертификата агента.
tls.defaults.verify_incoming - Если установлено значение true, Consul требует, чтобы все входящие соединения использовали TLS.
tls.defaults.verify_outgoing - Если установлено значение true, Consul требует, чтобы все исходящие подключения от этого агента использовали TLS.
tls.internal_rpc.verify_server_hostname - Если установлено значение true, Consul проверяет для всех исходящих соединений TLS, что сертификат TLS, представленный серверами, соответствует server  имени хоста.
    Если вы используете собственный домен для DNS-запросов, domain также укажите это поле. Это должно совпадать с -domain флагами, которые использовались при создании учетных данных TLS

domain = "example.org"

Автоматическое присоединение к центру обработки данных

       Параметр retry_join позволяет настроить всех агентов Consul для автоматического формирования центра обработки данных с использованием общего сервера Consul, доступ к которому осуществляется через DNS-адрес или IP-адрес

retry_join = ["10.0.0.4", "10.0.0.5" ...]

Настройка Consul (Server) узлов

       Правим конфигурационный файл /etc/consul.d/consul.hcl

datacenter = "dc1"
domain = "example.org"
data_dir = "/opt/consul"
client_addr = "0.0.0.0" 
ui_config { enabled = true }
server = true 
bind_addr = "0.0.0.0"
encrypt = "key"
retry_join = ["10.0.0.4", "10.0.0.5", "10.0.0.6"]
ports = {
   https = 8501
},
tls {
   defaults {
      key_file = "/opt/consul/certs/dc1-server-example.org-0-key.pem"
      cert_file = "/opt/consul/certs/dc1-server-example.org-0.pem"
      ca_file = "/opt/consul/certs/example.org-agent-ca.pem"
      verify_incoming = true
      verify_outgoing = true
   }
   internal_rpc { verify_server_hostname = true }
}
auto_encrypt { allow_tls = true }
disable_update_check = true

datacenter — Центр обработки данных, в котором работает агент. 
data_dir — Каталог данных для агента для хранения состояния.
encrypt — Указывает ключ шифрования сплетен для использования в сетевом трафике Consul.
server — Этот флаг используется для контроля того, находится ли агент в режиме сервера или клиента.
ports — Включаем HTTPS API (по умолчанию выключено)
bootstrap_expect — Этот флаг указывает количество ожидаемых серверов в центре обработки данных. Либо это значение не следует указывать, либо оно должно быть одинаковым для всех серверов в центре обработки данных.
bind_addr — Адрес, к которому следует привязать внутреннюю связь кластера. По умолчанию это «0.0.0.0», что означает, что Consul будет привязываться ко всем адресам на локальной машине.
client_addr — Адрес, к которому Consul будет привязывать клиентские интерфейсы, включая серверы HTTP и DNS. По умолчанию. По умолчанию это "127.0.0.1", разрешая только петлевые соединения.
raft_multiplier — Целочисленный множитель, используемый серверами Consul для масштабирования ключевых параметров времени Raft. Установка значения 1 настроит Raft в режим максимальной производительности, эквивалентный времени Consul по умолчанию до 0,7, и рекомендуется для производственных серверов Consul.
ui — Включает встроенный веб-интерфейс.
disable_update_check — Отключает автоматическую проверку наличия бюллетеней безопасности и выпусков новых версий. 

       Проверяем корректность конфигурационного файла

$ consul validate /etc/consul.d/consul.hcl
Configuration is valid!

      Перед запуском Consul вы должны убедиться, что следующие порты привязки доступны
      Настроим firewall:

$ vi /usr/lib/firewalld/services/consul.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>consul</short>
  <description>Consul service  -  https://www.consul.io/docs/install/ports </description>
  <port protocol="tcp" port="8300"/>
  <port protocol="tcp" port="8301"/>
  <port protocol="udp" port="8301"/>
  <port protocol="tcp" port="8302"/>
  <port protocol="udp" port="8302"/>
  <port protocol="tcp" port="8500"/>
  <port protocol="tcp" port="8501"/>
  <port protocol="tcp" port="8502"/>
  <port protocol="tcp" port="8503"/>
  <port protocol="tcp" port="8600"/>
  <port protocol="udp" port="8600"/>
</service>
systemctl restart firewalld
$  firewall-cmd --add-service=consul --permanent
$ firewall-cmd --reload

Информация о порте:
8600 (Интерфейс DNS) - Используется для разрешения запросов DNS.
8500 (HTTP API) - Используется клиентами для взаимодействия с HTTP API.
8501 (HTTPS API) - (необязательно) По умолчанию отключен, используется клиентами для взаимодействия с HTTPS API
8301 (Serf LAN) - Используется для обработки сплетен в локальной сети. Требуется для всех агентов.
8302 (Serf WAN) - Используется серверами для передачи сплетен по глобальной сети другим серверам.
8300 (Сервер RPC) - Используется серверами для обработки входящих запросов от других агентов.

          Запускаем службу с добавлением в автозапуск.

$ systemctl enable consul --now

          Проверяем корректность работы узла

$ consul members
Node       Address            Status  Type     Build   Protocol DC   Partition Segment
consul1  10.0.0.4:8301  alive     server  1.16.0   2                dc1   default    <all>

consul operator raft list-peers

Node       ID        Address           State     Voter  RaftProtocol
consul1  <id>   10.0.0.1:8300 leader   true     3

          Повторяем процедуру для последующих узлов и кластер готов к использованию