Проверка целостности приложения при его запуске
{includetag(example-integrity-check)}
В этом руководстве показано, как упаковать и запустить приложение 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 ./docs/docs/ru/assets/examples/integrity_checkopenssl genrsa -traditional -out private.pem 2048openssl rsa -in private.pem -pubout > public.pem
Загрузите архив для развёртывания Tarantool DB и распакуйте его в папку примера ./docs/docs/ru/assets/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 PIDtarantooldb:storage-001-a RUNNING 98110tarantooldb:storage-001-b RUNNING 98111tarantooldb:storage-002-a RUNNING 98112tarantooldb:storage-002-b RUNNING 98113tarantooldb: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*gzmv tarantooldb ../tarantooldb_ic
Перейдите в папку распакованного приложения ./docs/docs/ru/assets/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 PIDtarantooldb_ic:storage-001-a RUNNING 98110tarantooldb_ic:storage-001-b RUNNING 98111tarantooldb_ic:storage-002-a RUNNING 98112tarantooldb_ic:storage-002-b RUNNING 98113tarantooldb_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 PIDtarantooldb_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 stopcd ..rm -rf tarantooldb_ic
Если конфигурация кластера хранится в централизованном хранилище (etcd или TBCS), выполните следующие шаги.
Сначала необходимо запустить кластер etcd. Для этого создайте внешнюю сеть Docker и перейдите в директорию с файлом docker-compose.yml:
docker network create tarantooldb_networkcd etcddocker compose up -d
Проверить состояние кластера etcd можно следующей командой:
docker compose ps
Ответ выглядит так:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTSetcd-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/tcpetcd-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/tcpetcd-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:2399prefix: /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*gzmv tarantooldb ../tarantooldb_iccd ../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: errormessage: ...'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 ../etcddocker compose downdocker network rm tarantooldb_network