Документация / Руководство по установке / Эксплуатация
Резервное копирование и восстановление
Всё ценное в SecurityFlow лежит в двух базах PostgreSQL, на томе файлов Core и в секретах. Кластер Kubernetes данных не хранит: очереди, живые логи сканов и тома Docker одноразовые. На странице - что копировать, как, как проверить копию и восстановить платформу.
Что копировать
| Данные | Где | Чем копировать | Без этого |
|---|---|---|---|
| База Core: продукты, ассеты, находки, аудиты, правила, настройки, пользователи, зашифрованные секреты интеграций | PostgreSQL, база из DB_NAME Core |
pg_dump или pgBackRest |
потеря платформы |
| База Radar: джобы и их настройки, пайплайны, логи завершённых джоб, статистика, хеш токена Radar, зашифрованные пароли реестров | PostgreSQL, база из DB_NAME Radar |
pg_dump или pgBackRest |
потеря настроек джоб и истории сканов |
| Файлы Core (media): аватары и изображения в уязвимостях | RWX-том, NFS-экспорт служебной ВМ; в поде - /usr/src/app/media |
tar |
не показываются изображения; сканы, импорт и разбор работают |
Пара JWT_PRIVATE_KEY и JWT_PUBLIC_KEY |
секрет Core | экспорт секрета | секреты интеграций в базе Core не расшифровать |
DJANGO_SECRET_KEY, LICENSE_SERVER_PUBLIC_KEY |
секрет Core | экспорт секрета | без открытого ключа сервера лицензий Core не проверит лицензию |
DOCKER_ENCRYPTION_TOKEN |
секрет Radar | экспорт секрета | пароли реестров в базе Radar не расшифровать |
ACCESS_TOKEN - токен Radar |
секрет Radar | экспорт секрета | воркеры и Core не пройдут проверку токена |
| Пароли баз, брокеров и Redis | секреты | экспорт секрета | пересоздание учётных записей |
Не копируйте:
| Данные | Почему |
|---|---|
| Очереди RabbitMQ | одноразовые; при потере - повторный запуск сканов и импорта |
| Redis | только живые логи идущих сканов |
| Тома Docker в подах воркера | рабочие копии кода и отчёты текущих сканов, пересоздаются |
| Образы | восстанавливаются повторной загрузкой в реестр площадки |
| Статика Core | собирается заново Job подготовки базы |
Персональные данные
Копии баз содержат учётные записи пользователей и сведения об уязвимостях продуктов. Храните копии зашифрованными, доступ к ним - как к самим секретам.
Согласованность
Базы Core и Radar связаны: аудит в Core ссылается на пайплайны Radar, токен Radar лежит в обеих базах и в секрете Radar. Файлы Core связаны с записями в базе Core. Поэтому:
- снимайте копии обеих баз и файлов Core в одно время;
- храните вместе с ними секреты, действовавшие на этот момент;
- восстанавливайте всё из одного набора.
RPO и RTO
RPO - сколько данных допустимо потерять, RTO - за сколько платформа должна вернуться в работу. Значения задаёт заказчик, от них зависит схема копирования.
| Требование | Как обеспечить |
|---|---|
| RPO от суток | ежесуточный pg_dump обеих баз и tar файлов Core |
| RPO в минутах | pgBackRest: полные и инкрементальные копии плюс непрерывный архив WAL, восстановление на момент времени |
| RPO близко к нулю при отказе узла БД | синхронная реплика в Patroni в дополнение к архиву WAL |
| RTO | замерьте время тестового восстановления на копии рабочего объёма; если оно больше RTO - переходите на pgBackRest и держите копии ближе к кластеру |
Резервная копия
Базы
Подключайтесь к PostgreSQL напрямую или через общий адрес HAProxy, не через PgBouncer. Формат -Fc - сжатый, с выборочным восстановлением.
DATE=$(date +%F)
pg_dump -h <адрес PostgreSQL> -p 5432 -U <пользователь Core> -d <база Core> -Fc -f core-$DATE.dump
pg_dump -h <адрес PostgreSQL> -p 5432 -U <пользователь Radar> -d <база Radar> -Fc -f radar-$DATE.dump
pg_dumpall -h <адрес PostgreSQL> -U <администратор PostgreSQL> --globals-only -f globals-$DATE.sql
Копию можно снимать на работающей платформе: pg_dump даёт согласованный снимок каждой базы.
Файлы Core
tar -czf media-$DATE.tar.gz -C <каталог NFS-экспорта media> .
Секреты
kubectl -n securityflow-core get secret sf-core-env -o yaml > core-secrets-$DATE.yaml
kubectl -n securityflow-radar get secret <секрет Radar> -o yaml > radar-secrets-$DATE.yaml
Файлы секретов содержат ключи в открытом виде, base64 - не шифрование. Шифруйте их сразу после выгрузки и храните отдельно от копий баз, но с той же меткой даты.
Контрольные суммы
sha256sum core-$DATE.dump radar-$DATE.dump globals-$DATE.sql media-$DATE.tar.gz > SHA256SUMS-$DATE
Проверка копии
| Что | Команда | Ожидаемый результат |
|---|---|---|
| Целостность файлов | sha256sum -c SHA256SUMS-$DATE |
все OK |
| Дамп базы читается | pg_restore --list core-$DATE.dump > /dev/null && echo OK |
OK; то же для Radar |
| Архив файлов читается | tar -tzf media-$DATE.tar.gz > /dev/null && echo OK |
OK |
| Восстановление работает | тестовое восстановление в отдельные базы | см. Приёмка после восстановления |
Чтение дампа не гарантирует, что из него поднимется платформа. Регулярно восстанавливайте копию на отдельном стенде.
Восстановление
Восстанавливайте на те же версии образов, на которых снята копия. Если нужна более новая версия - сначала восстановите, затем обновите по разделу Обновление.
1. Остановить процессы
Остановите все процессы Core и Radar. Брокеры и Redis можно не останавливать.
kubectl -n securityflow-radar scale deployment <компонент> --replicas=0
kubectl -n securityflow-core scale deployment <компонент> --replicas=0
2. Вернуть секреты
Если секреты менялись или кластер пересоздан, восстановите секреты из копии того же дня. Пара JWT, DOCKER_ENCRYPTION_TOKEN и ACCESS_TOKEN должны быть те, что действовали при снятии копии.
kubectl apply -f core-secrets-$DATE.yaml
kubectl apply -f radar-secrets-$DATE.yaml
3. Восстановить базы
psql -h <адрес PostgreSQL> -U <администратор PostgreSQL> -d postgres \
-c 'DROP DATABASE "<база Core>";' \
-c 'CREATE DATABASE "<база Core>" OWNER "<пользователь Core>";'
pg_restore -h <адрес PostgreSQL> -U <пользователь Core> -d <база Core> --no-owner core-$DATE.dump
То же для базы Radar с её пользователем. Если пользователей в PostgreSQL нет, сначала выполните globals-$DATE.sql.
4. Вернуть файлы Core
tar -xzf media-$DATE.tar.gz -C <каталог NFS-экспорта media>
5. Запустить
Запустите Core, затем Radar - порядок в разделе Запуск, остановка и масштабирование. При старте Radar back останавливает пайплайны, которые в копии числились идущими или ожидающими.
Приёмка после восстановления
| Проверка | Ожидаемый результат |
|---|---|
| Вход в Core | пользователи входят прежними паролями или через SSO |
| "Глобальные настройки" → "Лицензия" | лицензия на месте |
| Продукты, находки, аудиты | данные на дату копии |
| Изображения в уязвимостях и аватары | показываются |
| Core: "Radar" → "Настройки" → "Статус подключения" | "Подключено", "Аутентифицировано": токен Radar расшифрован |
| Интеграции: Jira, системы контроля версий, уведомления | проверки интеграций, например "Проверить соединение" у уведомлений, проходят: секреты расшифрованы |
| Radar: "Джобы" | образы и настройки джоб на месте |
| Radar: "Уч. Данные Docker" | записи на месте, джобы с ними скачивают образы |
| Тестовый аудит | пайплайн "Завершен", аудит в Core |
Если проверки интеграций не проходят, а данные на месте - вероятно, пара JWT не та, что при снятии копии.
Регламент
Предложение для старта. Частоту и сроки хранения уточните по согласованным RPO и RTO.
| Что | Когда |
|---|---|
| Копия баз и файлов Core | ежесуточно; при RPO меньше суток - pgBackRest с архивом WAL |
| Копия перед обновлением | перед каждым обновлением, обязательно |
| Выгрузка секретов | после установки и после каждой смены секретов |
Проверка копии: контрольные суммы, pg_restore --list |
после каждой копии |
| Тестовое восстановление | раз в квартал и после смены схемы копирования |
| Хранение | не меньше двух полных копий; конкретный срок - по требованиям заказчика |
pgBackRest для кластера PostgreSQL
Если PostgreSQL работает кластером на трёх ВМ с Patroni, базы можно копировать pgBackRest. Это даёт RPO в минутах и восстановление на момент времени. Рекомендуемые параметры:
- две полные копии, инкрементальные между ними и непрерывный архив WAL;
- репозиторий копий - на служебной ВМ;
- перед каждым обновлением - полная копия или именованная точка восстановления и проверка, что архив WAL идёт;
- размер репозитория: ⌈3 × PGDATA ÷ 100⌉ × 100 ГБ - см. Расчёт ресурсов.
Файлы Core копируйте ночным tar в область резервных копий на той же ВМ, вместе с копированием баз. Секреты команда SecurityFlow передаёт владельцу площадки при установке; храните их по своим правилам для ключевой информации.
Сервер лицензий обслуживает команда SecurityFlow. Копировать его на площадке не нужно.