Шифрование трафика
В этом примере показано, как настроить шифрование трафика для распределённой системы, состоящей из следующих компонентов:
- клиентские приложения;
- узлы кластера Tarantool DB;
- веб-интерфейс Tarantool Cluster Manager (TCM);
- etcd (используется для хранения конфигурации кластера и TCM);
- Prometheus.
Шифруются следующие соединения:
- между узлами кластера Tarantool DB;
- между клиентами и узлами Tarantool DB;
- между TCM и узлами Tarantool DB;
- между TCM и etcd (backend store);
- между узлами Tarantool DB и etcd (хранилище конфигурации кластера);
- между пользователем и веб-интерфейсом TCM (HTTPS);
- между узлами Tarantool DB и Prometheus (экспорт метрик по HTTPS).
Руководство также демонстрирует, как подключиться к защищённому кластеру с помощью клиентских коннекторов на Go и Python.
Подробную информацию по настройке шифрования трафика можно найти в документации Tarantool.
Руководство включает следующие шаги:
- Пререквизиты
- Используемые файлы
- Запуск стенда
- Настройка SSL-шифрования
- Подключение через tt CLI
- Подключение через Go-коннектор
- Подключение через Python-коннектор
- Подключение через коннектор net.box
- Остановка стенда
Для выполнения примера требуются:
-
установленные Docker-образы Tarantool DB, Prometheus и Grafana;
-
приложение Docker Compose;
-
утилита tt CLI;
-
Go версии 1.13 или выше;
-
python3;
-
файлы сертификатов. Чтобы сгенерировать их, выполните команду
certs/gen.sh; -
исходные файлы примера
traffic_encryption.
Для запуска и настройки кластера используются файлы из папки traffic_encryption:
certs/gen.sh— скрипт генерации локального набора сертификатов;
cluster/— директория c файлами для запуска кластера Tarantool DB:migrations/scenario— директория, содержащая файлы с описанием миграций;config.yml— конфигурация и топология кластера;docker-compose.yml— описание узлов кластера Tarantool DB;
go/— директория с файлами для создания подключения через Go-коннектор;python/— директория с файлами для создания подключения через Python-коннектор;tools/— директория с файлами для запуска кластера etcd и средств мониторинга:grafana/— директория, содержащая настройки для ведения мониторинга;prometheus/— директория, содержащая настройки Prometheus для сбора и передачи метрик в Grafana;docker-compose.yml— описание узлов кластера etcd и средств мониторинга;tcm.yml— конфигурация для запуска Tarantool Cluster Manager.
Для успешного запуска должны быть свободны следующие порты:
- 2379
- 3000
- 3301--3303
- 8081
- 9090
Перейдите в папку с примером traffic_encryption и запустите стенд:
cd ./docs/docs/ru/assets/examples/traffic_encryption/make start
Команда развернет стенд, состоящий из:
- кластера Tarantool DB:
- 1 роутер;
- 1 набор реплик на 2 хранилища;
- 1 Tarantool Cluster Manager (TCM);
- кластера etcd из 3 узлов;
- клиентских приложений для проверки подключения;
- средств мониторинга — Prometheus, Grafana.
После запуска должны работать все контейнеры, кроме init_host.
Также после запуска кластера доступны следующие пользовательские интерфейсы:
- https://localhost:8081 — защищённый веб-интерфейс TCM;
- http://localhost:3000 — веб-интерфейс Grafana.
Для входа в TCM откройте в браузере адрес https://localhost:8081 (браузер может предупредить о самоподписанном сертификате).
Логин и пароль для входа:
- Username:
admin - Password:
secret
Для работы с SSL в Tarantool DB используются SSL-сертификаты. Экземпляры Tarantool DB используют сертификат сервера для взаимодействия друг с другом и клиентскими соединениями. При этом внешние компоненты, подключающиеся к Tarantool DB (например, утилита tt CLI или веб-интерфейс TCM), используют клиентские сертификаты, чтобы пройти аутентификацию.
Скрипт ./certs/gen.sh генерирует все необходимые сертификаты с использованием единого корневого центра сертификации (CA):
- для Tarantool DB — серверные и клиентские сертификаты, а также сертификат для HTTPS-сервера экспорта метрик;
- для etcd — серверные и клиентские сертификаты, а также сертификат для peer-взаимодействия узлов в кластере etcd;
- для TCM — серверный сертификат для HTTPS.
В разделах ниже описано, как настраивается шифрование для каждого из этих компонентов.
Параметры узлов etcd настраиваются в файле конфигурации tools/docker-compose.yml.
Здесь указаны корневой CA, а также ключи и сертификаты для серверных и peer-взаимодействий:
etcd1:<<: *etcd-basecommand: >etcd --name etcd1--data-dir /etcd-data--listen-client-urls https://0.0.0.0:2379--advertise-client-urls https://etcd1:2379--listen-peer-urls https://0.0.0.0:2380--initial-advertise-peer-urls https://etcd1:2380--initial-cluster etcd1=https://etcd1:2380,etcd2=https://etcd2:2380,etcd3=https://etcd3:2380--initial-cluster-token my-etcd-cluster--initial-cluster-state new--client-cert-auth--trusted-ca-file /certs/ca/root-ca.pem--cert-file /certs/etcd/server.pem--key-file /certs/etcd/server-key.pem--peer-client-cert-auth--peer-trusted-ca-file /certs/ca/root-ca.pem--peer-cert-file /certs/etcd/peer.pem--peer-key-file /certs/etcd/peer-key.pemports:- "2379:2379"
Параметры SSL для каждого экземпляра Tarantool DB задаются в файле конфигурации кластера cluster/config.yml:
transport: 'ssl'ssl_ca_file: '/certs/ca/root-ca.pem'ssl_cert_file: '/certs/tarantool/server.pem'ssl_key_file: '/certs/tarantool/server-key.pem'
Список разрешённых наборов шифров (cipher suites) для SSL-соединения можно задать с помощью параметра params.ssl_ciphers, перечислив их через двоеточие:
params:ssl_ciphers: 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256'
Подробная информация о поддерживаемых значениях параметра params.ssl_ciphers приведена в документации Tarantool.
Также в cluster/docker-compose.yml для каждого экземпляра через переменные окружения задаются параметры защищенного
подключения к etcd, в котором хранится конфигурация кластера:
TT_CONFIG_ETCD_ENDPOINTS: https://etcd1:2379,https://etcd2:2379,https://etcd3:2379TT_CONFIG_ETCD_PREFIX: /tdbTT_CONFIG_ETCD_HTTP_REQUEST_TIMEOUT: 3TT_CONFIG_ETCD_SSL_CA_FILE: /certs/ca/root-ca.pemTT_CONFIG_ETCD_SSL_SSL_CERT: /certs/etcd/client.pemTT_CONFIG_ETCD_SSL_SSL_KEY: /certs/etcd/client-key.pem
Если используется централизованное хранилище конфигурации на основе Tarantool (Tarantool-based configuration storage, далее — TBCS), защищенное подключение к нему настраивается через
поле params в переменной окружения TT_CONFIG_STORAGE_ENDPOINTS.
Подробная информация доступна в документации Tarantool.
Для экспорта метрик по SSL в формате Prometheus роль roles.metrics-export задается на всех экземплярах Tarantool DB:
roles_cfg:roles.metrics-export:http:- listen: 8081ssl_cert_file: /certs/tarantool/metrics.pemssl_key_file: /certs/tarantool/metrics-key.pemendpoints:- format: prometheuspath: /metrics
Настройки шифрования для TCM задаются в файле конфигурации tools/tcm.yml.
- HTTPS для веб-интерфейса:
http:host: 0.0.0.0port: 8081tls:enabled: truecert-file: /certs/tcm/server.pemkey-file: /certs/tcm/server-key.pem
Если требуется ограничить наборы используемых шифров, перечислите их в виде массива с помощью параметра http.tls.cipher-suites:
http:tls:cipher-suites:- TLS_AES_256_GCM_SHA384- TLS_AES_128_GCM_SHA256- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256- TLS_DHE_RSA_WITH_AES_256_GCM_SHA384- TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
Информацию о поддерживаемых значениях наборов шифров для веб-интерфейса можно найти в документации TCM.
- Подключение к etcd с данными TCM (backend store):
storage:provider: etcdetcd:prefix: /tcmendpoints:- https://etcd1:2379- https://etcd2:2379- https://etcd3:2379tls:enabled: truetrusted-ca-file: /certs/ca/root-ca.pemcert-file: /certs/etcd/client.pemkey-file: /certs/etcd/client-key.pem
Здесь также можно задать набор используемых шифров — он указывается в виде массива в параметре storage.etcd.tls.cipher-suites.
- Подключение к etcd с конфигурацией кластера:
storage-connection:provider: etcdetcd-connection:prefix: /tdbendpoints:- https://etcd1:2379- https://etcd2:2379- https://etcd3:2379tls:enabled: truetrusted-ca-file: /certs/ca/root-ca.pemcert-file: /certs/etcd/client.pemkey-file: /certs/etcd/client-key.pem
Здесь также можно задать набор используемых шифров — он указывается в виде массива в параметре initial-settings.clusters.<cluster>.storage-connection.etcd-connection.tls.cipher-suites.
- Подключение к узлам Tarantool:
tarantool-connection:username: "admin"password: "secret-cluster-cookie"ssl:enabled: trueca-file: /certs/ca/root-ca.pemcert-file: /certs/tarantool/client.pemkey-file: /certs/tarantool/client-key.pem
Список наборов шифров для подключения к узлам Tarantool можно задать с помощью параметра initial-settings.clusters.<cluster>.storage-connection.tarantool-connection.ssl.ciphers. Наборы шифров перечисляются через двоеточие аналогично параметру params.ssl_ciphers конфигурации кластера Tarantool DB.
Подробную информацию о настройке TCM можно найти в документации Tarantool.
Ключ и сертификат клиента для команды tt migrations можно задать в параметрах --tarantool-sslkeyfile и
--tarantool-sslcertfile.
Для команд tt replicaset и tt connect эти параметры имеют названия --sslkeyfile и --sslcertfile.
Попробуйте подключиться к экземпляру, используя команду tt connect:
tt connect admin:secret-cluster-cookie@localhost:3301
Ответ будет выглядеть так:
• Connecting to the instance...⨯ failed to run interactive console: failed to create new console: failed to connect: failed to get protocol: failed to read Tarantool greeting: read tcp 127.0.0.1:50634->127.0.0.1:3301: i/o timeout
Подключитесь к узлу снова, используя клиентские сертификаты:
tt connect admin:secret-cluster-cookie@localhost:3301 \--sslkeyfile ./certs/tarantool/client-key.pem \--sslcertfile ./certs/tarantool/client.pem
При успешном подключении ответ будет выглядеть так:
• Connecting to the instance...• Connected to localhost:3301localhost:3301>
Для примера можно получить имя экземпляра:
box.info.name
В этом разделе описано подключение к экземпляру Tarantool DB через Go-коннектор.
Пример расположен в директории ./go/ примера traffic_encryption.
Для запуска выполните команду make go.
Go-клиент подключится к узлу через коннектор и запросит текущую версию платформы Tarantool. Ответ может выглядеть так:
Tarantool 3.4.1 (Binary) 28274879-0539-4c12-a225-57ef4d1736cb
Код подключения выглядит так:
dialer := tarantool.OpenSslDialer{Address: "tarantool-router-msk:3301",User: "admin",Password: "secret-cluster-cookie",SslKeyFile: "./certs/tarantool/client-key.pem",SslCertFile: "./certs/tarantool/client.pem",SslCaFile: "./certs/ca/root-ca.pem",SslPassword: "54321",}opts := tarantool.Opts{}conn, err := tarantool.Connect(ctx, dialer, opts)if err != nil {fmt.Println(err)return}
Опции здесь аналогичны опциям, которые передавались для tt.
В разделе описано подключение к экземпляру Tarantool DB через Python-коннектор.
Пример расположен в директории ./python/ примера traffic_encryption.
Для запуска примера выполните команду make python.
Результат может выглядеть так:
- '3.4.1-0-g096322fad'
Код подключения выглядит так:
con = tarantool.Connection('tarantool-router-msk',3301,user="admin",password="secret-cluster-cookie",transport='ssl',ssl_key_file='certs/tarantool/client-key.pem',ssl_cert_file='certs/tarantool/client.pem',ssl_ca_file='certs/ca/root-ca.pem',ssl_password='54321',connection_timeout=0.5,socket_timeout=0.5,)
Tarantool позволяет создавать пользовательские соединения с помощью модуля net.box.
Чтобы показать, как работает этот модуль по SSL, вместе с миграциями определена
функция get_name_by_uri. Функция создаёт соединение с экземпляром кластера и
получает его имя:
box.schema.func.call('get_name_by_uri', 'admin:secret-cluster-cookie@tarantool-storage-1-spb:3301')
Функция возвращает имя экземпляра: storage-1-spb.
Отправлять команды можно также через веб-интерфейс TCM.
Для этого откройте в TCM вкладку Stateboard и выберите в наборе реплик router-msk узел router-msk.
В открывшемся окне перейдите на вкладку Terminal (TT Connect).
Остановить стенд можно так:
make stop