Шифрование трафика | Tdb
Руководство администратора Шифрование трафика

Шифрование трафика

Tarantool DB позволяет шифровать трафик по IPROTO при запросах от клиента и при репликации.

В этом руководстве описано, как включить шифрование на стороне кластера Tarantool DB, а также создать шифрованные соединения из коннекторов на Go и Python.

Документацию по шифрованию трафика можно найти в документации Tarantool Enterprise.

Руководство включает следующие шаги:

Пререквизиты

Для выполнения примера требуются:

  • установленный Docker-образ Tarantool DB;

  • приложение Docker Compose;

  • утилита tt CLI;

  • Go версии 1.13 или выше;

  • python3;

  • файлы сертификатов. Чтобы сгенерировать их, выполните команду certs/gen.sh;

  • исходные файлы примера traffic_encryption.

    Примечание

    Есть два способа получить исходные файлы примера:

    • Архив с полной документацией Tarantool DB, полученный по почте или скачанный в личном кабинете tarantool.io. Пример архива: tarantooldb-documentation-2.0.0.tar.gz. Пример traffic_encryption расположен в таком архиве в директории ./doc/examples/traffic_encryption/.

    • Отдельный архив traffic_encryption.tar.gz, скачанный c сайта Tarantool.

Запуск стенда

Для успешного запуска должны быть свободны следующие порты:

  • 3301–3303

  • 3310, 3311

  • 8081

Порты 3310 и 3311 необходимы для корректного подключения между экземплярами через SSL в Tarantool Cluster Manager.

Перейдите в папку с примером traffic_encryption и запустите стенд:

cd ./doc/examples/traffic_encryption/
make start

Команда развернет стенд, состоящий из:

  • кластера Tarantool DB:

  • кластера etcd из 3 узлов;

  • клиентских приложений для проверки подключения.

После запуска должны работать все контейнеры, кроме init_host.

Также после запуска кластера становится доступен веб-интерфейс TCM. Для входа в TCM откройте в браузере адрес http://localhost:8081. Логин и пароль для входа:

  • Username: admin

  • Password: secret

Настройка SSL-шифрования

Для работы с SSL в Tarantool используются SSL-сертификаты. Экземпляр Tarantool DB здесь – это одновременно и сервер, и клиент по отношению к другим экземплярам. Чтобы любой экземпляр мог подключаться ко всем остальным экземплярам, для каждого экземпляра требуется как сертификат сервера, так и сертификат клиента. Это означает, что для экземпляра кластера всегда нужно передавать как серверные, так и клиентские аргументы.

В примере traffic_encryption сертификаты находятся в директории ./certs/ и должны быть доступны для каждого экземпляра. Сертификаты генерируются с помощью скрипта ./certs/gen.sh.

В примере заданы параметры SSL-шифрования для экземпляра с помощью переменных окружения:

- TT_CLI_SSLKEYFILE=/tmp/certs/client-key.pem
- TT_CLI_SSLCERTFILE=/tmp/certs/client-cert.pem

Здесь:

  • TT_CLI_SSLKEYFILE – путь к закрытому ключу клиента.

  • TT_CLI_SSLCERTFILE – путь к сертификату клиента;

Эти переменные окружения необходимы для корректной работы конфигурации при использовании Tarantool из клиентских приложений.

Используемые файлы

Для запуска и настройки кластера используются файлы из папки traffic_encryption:

  • certs/

    • gen.sh – скрипт генерации локального набора сертификатов для стенда;

  • cluster/ – директория c файлами для запуска кластера Tarantool DB:

    • migrations/scenario – директория, содержащая файлы с описанием миграций;

    • config.yml – конфигурация и топология кластера;

    • docker-compose.yml – описание узлов кластера Tarantool DB;

  • go/ – директория с файлами для создания подключения через Go-коннектор;

  • python/ – директория с файлами для создания подключения через Python-коннектор;

  • tools/ – директория с файлами для запуска кластера etcd и средств мониторинга:

    • docker-compose.yml – описание узлов кластера etcd и средств мониторинга;

    • tcm.yml – конфигурация для запуска Tarantool Cluster Manager.

Подключение через tt CLI

Попробуйте подключиться к экземпляру, используя команду 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 [::1]:62950->[::1]:3301: i/o timeout

Подключитесь к узлу снова, используя клиентские сертификаты:

tt connect admin:secret-cluster-cookie@localhost:3301 \
  --sslkeyfile ./certs/client-key.pem \
  --sslcertfile ./certs/client-cert.pem

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

    Connecting to the instance...
Enter PEM pass phrase:
    Connected to localhost:3301

localhost:3301> 

Для примера можно получить имя экземпляра:

box.info().name

Подключение через Go-коннектор

В этом разделе описано подключение к экземпляру Tarantool DB через Go-коннектор. Пример расположен в директории ./go/ примера traffic_encryption.

Для запуска выполните make go

Go-клиент подключится к узлу через коннектор и запросит текущую версию платформы Tarantool. Ответ может выглядеть так:

Tarantool 3.2.0 (Binary) 2404fdc5-4438-485a-b2e1-18fae889b95c

Код подключения выглядит так:

dialer := tarantool.OpenSslDialer{
	Address:     "tarantool-router-msk:3301",
	User:        "admin",
	Password:    "secret-cluster-cookie",
	SslKeyFile:  "./certs/client-key.pem",
	SslCertFile: "./certs/client-cert.pem",
	SslCaFile:   "./certs/ca-cert.pem",
	SslPassword: "54321",
}

opts := tarantool.Opts{}

conn, err := tarantool.Connect(ctx, dialer, opts)
if err != nil {
	fmt.Println(err)
	return
}

Опции здесь аналогичны опциям, которые передавались для tt.

Подключение через Python-коннектор

В разделе описано подключение к экземпляру Tarantool DB через Python-коннектор. Пример расположен в директории ./python/ примера traffic_encryption.

Для запуска примера выполните make python.

Результат может выглядеть так:

- '3.2.0-0-g19607a903'

Код подключения выглядит так:

con = tarantool.Connection(
    'tarantool-router-msk',
    3301,
    user="admin",
    password="secret-cluster-cookie",
    transport='ssl',
    ssl_key_file='certs/client-key.pem',
    ssl_cert_file='certs/client-cert.pem',
    ssl_ca_file='certs/ca-cert.pem',
    ssl_password='54321',
    connection_timeout=0.5,
    socket_timeout=0.5,
)

Подключение через коннектор net.box

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 -> Direct.

Остановка стенда

Остановить стенд можно так:

make stop
Нашли ответ на свой вопрос?
Обратная связь