4.2. Использование SSL/TLS сертификатов

По-умолчанию обмен данными между узлами Cook, сервисами Consul и Gotween производится по незащищенному протоколу HTTP. В зависимости от настройки каждого из сервисов можно использовать защищенный протокол, как с односторонней проверкой (верифицируется только сервер, к которому подключается клиент), так и с двусторонней (two-way TLS), где и сервер и клиент верифицируют друг друга.

Для корректно настройки TLS нужно получить сертификаты для каждого узла либо из доверенного сертификационного сервера, либо выработать свой корневой сертификат и сгенерировать ключи узлам.

Пример генерации ключей, сертификатов и конфигурация узлов Cook и сервисов использующих их приведена ниже.

4.2.1. Генерация ключа и корневого сертификата

4.2.1.1. Ключ корневого сертификата /ca/cook_cluster_CA.key

openssl genrsa -des3 -out /ca/cook_cluster_CA.key 2048

4.2.1.2. Корневой сертификат /ca/cook_cluster_CA.crt

openssl req -x509 -new -subj '/C=RU/ST=/O=/localityName=/commonName=red-soft.ru' -nodes -key /ca/cook_cluster_CA.key -sha256 -days 1825 -out /ca/cook_cluster_CA.crt

4.2.2. Генерация ключа и сертификата узлов, подписанного корневым

Данная процедура повторяется для каждого узла Cook, Consul и Gobetween с указанием необходимых доменов.

4.2.2.1. Ключ узла /cert/node0.cook.key

openssl genrsa -out /cert/node0.cook.key 2048

4.2.2.2. CSR /cert/node0.cook.csr

openssl req -new -subj '/C=RU/ST=/O=/localityName=/commonName=node0.cook.red-soft.ru' -key /cert/node0.cook.key -out /cert/node0.cook.csr

4.2.2.3. EXT-файл /cert/node0.cook.ext

cat << EOF > /cert/node0.cook.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = node0.cook.red-soft.ru
EOF

4.2.2.4. Сертификат узла /cert/node0.cook.crt

openssl x509 -req -in /cert/node0.cook.csr -CA /ca/cook_cluster_CA.crt -CAkey /ca/cook_cluster_CA.key -CAcreateserial -out /cert/node0.cook.crt -days 825 -sha256 -extfile /cert/node0.cook.ext

4.2.3. Пример конфигурации, использующей SSL

4.2.3.1. cookd.yml

cluster_name: testcluster
node_name: node0.cook.red-soft.ru

cook:
    listen: 0.0.0.0:5030
    advertise: node0.cook.red-soft.ru:5030
    ssl: True
    cert: /cert/node0.cook.crt
    key: /cert/node0.cook.key
    cacert: /ca/cook_cluster_CA.crt
    verify: True

consul:
    url: https://server.dc1.consul.red-soft.ru:8501
    cacert: /ca/cook_cluster_CA.crt
    cert: /cert/node0.cook.crt
    key: /cert/node0.cook.key
    verify: True

rdb:
    listen: 0.0.0.0:3050
    advertise: node0.cook.red-soft.ru:3050
    pidfile: /opt/RedDatabase/rdb.pid
    home: /opt/RedDatabase
    password: masterkey
    replication_dir: /replication
    slave_log_directory: /slave_logs

init:
    rdb:
        databases:
            - database: /cook/database1.fdb
              alias: testdb1

4.2.4. Пример конфигурации Consul, использующей TLS

4.2.4.1. consul.json

{
  "log_level": "info",
  "node_name": "server",
  "domain": "consul.red-soft.ru",
  "tls": {
    "defaults": {
      "verify_incoming": true,
      "verify_outgoing": true,
      "ca_file":"/ca/cook_cluster_CA.crt",
      "cert_file":"/cert/server.dc1.consul.crt",
      "key_file":"/cert/server.dc1.consul.key"
    },
    "internal_rpc": {
      "verify_server_hostname": true
    }
  },
  "enable_agent_tls_for_checks": true,
  "ports": {
    "https": 8501
  }
}

4.2.5. Пример конфигурации Gobetween, использующей TLS

4.2.5.1. gobetween.toml

[servers.rdb]
bind = "0.0.0.0:3050"
protocol = "tcp"
balance = "iphash"
max_connections = 0

[servers.rdb.discovery]
kind = "consul"
interval = "10s"
consul_host = "server.dc1.consul.red-soft.ru:8501"
consul_service_name = "testcluster"
consul_service_tag = "master"
consul_service_passing_only = true
consul_datacenter = "dc1"

consul_tls_enabled = true
consul_tls_cert_path = "/cert/gobetween.crt"
consul_tls_key_path = "/cert/gobetween.key"
consul_tls_cacert_path = "/ca/cook_cluster_CA.crt"