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"