Проверка целостности приложения при его запуске | Tdb
Руководство администратора Проверка целостности приложения при его запуске

Проверка целостности приложения при его запуске

В этом руководстве показано, как упаковать и запустить приложение Tarantool DB с проверкой целостности (integrity check) с помощью утилиты tt CLI.

При создании архива приложения tt CLI генерирует дополнительные файлы с хешами всех компонентов приложения с помощью опции --integrity_check. В дальнейшем при запуске Tarantool DB будет отслеживать целостность всех компонентов приложения во время работы.

Содержание:

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

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

  • архив для развёртывания Tarantool DB. Архив можно скачать в личном кабинете tarantool.io, в разделе tarantooldb/release/for_deploy/;

  • утилита tt CLI версии 2.11.1 или выше;

  • OpenSSL для создания ключевой пары;

  • Docker и Docker Compose (для варианта с централизованным хранилищем конфигурации на основе Tarantool).

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

  • 3301–3305 – порты кластера Tarantool DB;

  • 2379, 2389, 2399 – порты etcd для клиентских подключений (для варианта с централизованным хранилищем конфигурации).

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

В примере integrity_check используются следующие файлы:

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

  • instances.yml – список узлов кластера для запуска в текущем окружении;

  • tt.yml – конфигурация утилиты tt CLI;

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

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

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

Создание ключевой пары

Для упаковки приложения с опцией --with-integrity_check сначала необходимо создать ключевую пару:

cd ./doc/examples/integrity_check
openssl genrsa -traditional -out private.pem 2048
openssl rsa -in private.pem -pubout > public.pem

Упаковка приложения

Загрузите архив для развёртывания Tarantool DB и распакуйте его в папку примера ./doc/examples/integrity_check:

tar -xzvf tarantooldb-<VERSION>.<OS>.<ARCH>.tar.gz

Здесь:

  • VERSION – версия продукта;

  • OS – поддерживаемая операционная система;

  • ARCH – архитектура процессора.

Пример: tarantooldb-2.2.3.linux.x86_64.tar.gz.

При распаковке будет создана директория tarantooldb.

Скопируйте в эту директорию файлы instances.yml, config.yml и tt.yml из директории примера:

cp *.yml tarantooldb/

Запустите кластер, чтобы проверить работу приложения:

cd tarantooldb
./tt start tarantooldb

Проверить состояние узлов можно, используя команду tt status:

./tt status tarantooldb

Ответ выглядит так:

INSTANCE                      STATUS      PID
tarantooldb:storage-001-a     RUNNING     98110
tarantooldb:storage-001-b     RUNNING     98111
tarantooldb:storage-002-a     RUNNING     98112
tarantooldb:storage-002-b     RUNNING     98113
tarantooldb:router-001-a      RUNNING     98114

Остановите кластер перед упаковкой:

./tt stop -y tarantooldb

После упакуйте приложение в архив с генерацией хеш-сумм компонентов с указанием приватного ключа. Для упаковки используется команда tt pack:

./tt pack tgz --with-integrity-check ../private.pem

Полный список параметров для команды tt pack приведен в документации tt CLI в разделе Упаковка приложения. Подробнее о запуске с проверкой целостности можно также узнать в документации tt CLI в соответствующем разделе.

Установка приложения

Распакуйте архив в текущую директорию. При распаковке будет создана папка tarantooldb, переименуйте её в tarantooldb_ic и переместите в корневую директорию примера:

tar -xzvf tarantooldb*gz
mv tarantooldb ../tarantooldb_ic

Запуск в режиме проверки целостности

Перейдите в папку распакованного приложения ./doc/examples/integrity_check/tarantooldb_ic. Для запуска кластера в режиме проверки целостности укажите в команде tt start опцию --integrity-check и публичный ключ. Дополнительно задана опция --integrity-check-period со значением 10. Опция означает, что проверка целостности файлов приложения будет происходить раз в 10 секунд.

cd ../tarantooldb_ic
./tt --integrity-check ../public.pem start --integrity-check-period 10

Проверить состояние узлов можно, используя команду ./tt status:

./tt status

Ответ выглядит так:

INSTANCE                      STATUS      PID
tarantooldb_ic:storage-001-a  RUNNING     98110
tarantooldb_ic:storage-001-b  RUNNING     98111
tarantooldb_ic:storage-002-a  RUNNING     98112
tarantooldb_ic:storage-002-b  RUNNING     98113
tarantooldb_ic:router-001-a   RUNNING     98114

Выполните начальную загрузку модуля шардирования vshard:

./tt replicaset vshard bootstrap tarantooldb_ic:router-001-a

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

./tt connect tarantooldb_ic:storage-001-a

Выполните команду box.info():

box.info()

Ответ будет содержать информацию об экземпляре.

Для отключения от экземпляра нажмите CTRL+D.

Проверка работы контроля целостности

Теперь проверьте, что контроль целостности работает корректно. Для этого нужно изменить конфигурационный файл при запущенном кластере. Внесите любое изменение в файл config.yml. Например, добавьте комментарий:

echo "# test comment" >> config.yml

После изменения файла кластер в течение 10 секунд обнаружит нарушение целостности и перейдёт в нерабочее состояние. Проверить это можно командой ./tt status:

./tt status

Ответ будет выглядеть так:

INSTANCE                      STATUS      PID
tarantooldb_ic:storage-001-a  NOT RUNNING -
tarantooldb_ic:storage-001-b  NOT RUNNING -
tarantooldb_ic:storage-002-a  NOT RUNNING -
tarantooldb_ic:storage-002-b  NOT RUNNING -
tarantooldb_ic:router-001-a   NOT RUNNING -

В логах экземпляров можно увидеть ошибку integrity check failed. Посмотреть логи можно с помощью команды ниже:

cat var/log/router-001-a/tt.log | grep "integrity check failed"

Пример ошибки в логе:

(ERROR): periodic integrity check failed: "hash mismatch for <name_file> ..."

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

Перед выполнением следующего раздела примера остановите кластер и удалите папку tarantooldb_ic из корневой директории примера:

./tt stop
cd ..
rm -rf tarantooldb_ic

Контроль целостности при использовании централизованного хранилища конфигурации

Если конфигурация кластера хранится в централизованном хранилище (etcd или TBCS), выполните следующие шаги.

Запуск кластера etcd

Сначала необходимо запустить кластер etcd. Для этого создайте внешнюю сеть Docker и перейдите в директорию с файлом docker-compose.yml:

docker network create tarantooldb_network
cd etcd
docker compose up -d

Примечание

В некоторых системах команда может выглядеть как docker-compose up -d (через дефис).

Проверить состояние кластера etcd можно следующей командой:

docker compose ps

Ответ выглядит так:

NAME             IMAGE                         COMMAND                  SERVICE   CREATED         STATUS         PORTS
etcd-etcd1-1     quay.io/coreos/etcd:v3.5.25   "etcd --name etcd1 …"    etcd1     5 seconds ago   Up 4 seconds   0.0.0.0:2379->2379/tcp
etcd-etcd2-1     quay.io/coreos/etcd:v3.5.25   "etcd --name etcd2 …"    etcd2     5 seconds ago   Up 4 seconds   0.0.0.0:2389->2379/tcp
etcd-etcd3-1     quay.io/coreos/etcd:v3.5.25   "etcd --name etcd3 …"    etcd3     5 seconds ago   Up 4 seconds   0.0.0.0:2399->2379/tcp

Настройка конфигурации

Замените файл конфигурации кластера tarantooldb/config.yml на конфигурацию для работы с etcd:

cp -f config.yml ../tarantooldb/config.yml

Пример содержимого файла config.yml для работы с etcd:

config:
  etcd:
    endpoints:
      - http://127.0.0.1:2379
      - http://127.0.0.1:2389
      - http://127.0.0.1:2399
    prefix: /tdb-ic

Загрузите конфигурацию кластера в централизованное хранилище, указав в команде опцию --with-integrity-check. В команде загружается файл config.yml из корня примера, который содержит топологию кластера.

cd ../tarantooldb
./tt cluster publish "http://localhost:2379/tdb-ic" ../config.yml --with-integrity-check ../private.pem

Далее упакуйте приложение в архив:

./tt pack tgz --with-integrity-check ../private.pem

Распакуйте приложение в целевую папку и запустите его с опцией --integrity-check:

tar -xzvf tarantooldb*gz
mv tarantooldb ../tarantooldb_ic
cd ../tarantooldb_ic
./tt --integrity-check ../public.pem start --integrity-check-period 10

Проверить состояние узлов можно, используя команду ./tt status:

./tt status

Проверка работы контроля целостности

При использовании централизованного хранилища конфигурации проверка целостности работает для конфигурации, загруженной в etcd или TBCS.

Для проверки сначала внесите произвольное изменение в файл конфигурации:

echo "# test comment" >> ../config.yml

Затем загрузите измененную конфигурацию в etcd без опции --with-integrity-check:

./tt cluster publish "http://localhost:2379/tdb-ic" ../config.yml

Подключитесь к экземпляру кластера и проверьте его статус:

./tt connect tarantooldb_ic:storage-001-a

Выполните команду box.info(), чтобы проверить наличие предупреждений:

box.info()

Ответ будет содержать ошибку о нарушении целостности:

- type: error
  message: ...'integrity check failed: invalid hash or signature by key "/tdb-ic/config/all"'

Для восстановления целостности необходимо загрузить исходную конфигурацию без опции --with-integrity-check, либо измененную с указанием опции --with-integrity-check:

./tt cluster publish "http://localhost:2379/tdb-ic" ../config.yml --with-integrity-check ../private.pem

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

Остановить стенд можно с помощью команды ./tt stop:

./tt stop -y

Для остановки кластера etcd перейдите в директорию etcd и выполните команду ниже:

cd ../etcd
docker compose down
docker network rm tarantooldb_network

Примечание

В некоторых системах команда может выглядеть как docker-compose down (через дефис).

Found what you were looking for?
Feedback