Аудит Strapi за 3 дня
Аудит Strapi у нас занимает три рабочих дня и идёт по чек-листу из 20 пунктов: версии, права в API, токены и секреты, бэкапы, медиа, сервер, скорость и плагины. На выходе документ с приоритетами: что чинить сегодня, что в этом месяце, что можно отложить, и оценка часов по каждому пункту. Ниже весь чек-лист с тем, как проверяем и что обычно находим.
Когда нужен аудит
- проект достался от другого подрядчика, и никто не знает, что внутри;
- сайт на Strapi 4, нужно понять объём обновления до пятой версии;
- в мае 2026 года Strapi раскрыл пять уязвимостей, и хочется знать, задевают ли они ваш сайт;
- в логах ошибки, админка тормозит, медиа грузится через раз;
- перед тем как взять проект на поддержку: аудит у нас её первый шаг.
Чек-лист из 20 пунктов
Версии и зависимости
| № | Что проверяем | Как | Что обычно находим |
|---|---|---|---|
| 1 | Версия Strapi | package.json и lock-файл, сравниваем с актуальной 5.56 и со списком закрытых уязвимостей | Strapi 4 без патчей или Strapi 5 ниже 5.37.0, где открыта критическая утечка данных CVE-2026-27886 |
| 2 | Версия Node.js | На сервере и в Dockerfile | Node 18 или 20. Strapi 5 поддерживает только LTS 22, 24 и 26 |
| 3 | Уязвимые пакеты | `npm audit` на копии, отдельно production-зависимости | Десятки предупреждений, из них важны те, что в рантайме, а не в сборке |
| 4 | База данных | Версия и драйвер | MySQL 5 (Strapi 5 требует 8.0+), PostgreSQL старше 14, SQLite на проде |
Права и доступы
| № | Что проверяем | Как | Что обычно находим |
|---|---|---|---|
| 5 | Роль Public | Settings > Users & Permissions > Roles > Public, каждое действие по каждому типу | Открытые `find` на коллекциях, которые фронту не нужны, `create` без капчи, доступ к пользователям |
| 6 | API-токены | Settings > API Tokens: тип, срок, когда использовался | Токены Full access без срока, созданные прежним подрядчиком "на время" |
| 7 | Администраторы | Список пользователей админки и их роли | Учётки уволенных сотрудников и прежних подрядчиков с ролью Super Admin |
| 8 | Регистрация и JWT | `config/plugins`: `jwtManagement`, `jwt.expiresIn`, `register.allowedFields`, `ratelimit` | JWT на год при `legacy-support`, выключенный `ratelimit`, открытая регистрация, которой никто не пользуется |
| 9 | Админка | `config/admin`: `auth.sessions`, `rateLimit`, `forgotPassword`, `serveAdminPanel`, доступ по IP | Админка открыта всему интернету, лимит попыток входа выключен |
| 10 | Доступы людей | Сервер, хостер, DNS, репозиторий, S3, почта: у кого есть ключи и пароли | SSH-ключи прежних подрядчиков в authorized_keys, общий пароль от панели хостера |
Секреты и конфигурация
| № | Что проверяем | Как | Что обычно находим |
|---|---|---|---|
| 11 | Ключи Strapi | `APP_KEYS`, `ADMIN_JWT_SECRET`, `JWT_SECRET`, `API_TOKEN_SALT`, `TRANSFER_TOKEN_SALT`, `ENCRYPTION_KEY` | Значения из примера `.env.example`, одинаковые ключи на тесте и проде |
| 12 | Секреты во фронте | Переменные с префиксом `NEXT_PUBLIC_`, `VITE_`, собранный бандл, история git | API-токен с полным доступом в клиентском коде, `.env` в репозитории |
| 13 | CORS и заголовки | `config/middlewares`: `strapi::cors` (`origin`), `strapi::security` | `origin: '*'` или список с тестовыми доменами |
| 14 | Docker и окружение | Dockerfile, docker-compose, `NODE_ENV`, открытые порты | Порт 1337 и порт базы открыты наружу, контейнер от root, `NODE_ENV=development` на проде |
Данные, медиа и сервер
| № | Что проверяем | Как | Что обычно находим |
|---|---|---|---|
| 15 | Бэкапы | Есть ли, где лежат, разворачиваем из последнего на чистой машине | Бэкап только базы без медиа, бэкап на том же диске, бэкап, из которого сайт не поднимается |
| 16 | Медиа | Где хранится `public/uploads`, провайдер загрузки, лимиты размера | Файлы внутри контейнера без тома, пропадут при пересборке; посторонние файлы в папке загрузок |
| 17 | Nginx и HTTPS | Конфиг, сертификат и его продление, `client_max_body_size`, редиректы | Сертификат продлевается вручную, лимит 1 МБ по умолчанию и ошибка 413 при загрузке картинок |
| 18 | Логи и мониторинг | Куда пишутся логи, ротация, есть ли уведомления | Логи никто не читает, диск забит логами за два года |
Скорость и код
| № | Что проверяем | Как | Что обычно находим |
|---|---|---|---|
| 19 | Скорость ответов | Время ответа основных эндпоинтов, размер ответа, запросы с `populate` | `populate=*` или плагин deep populate на главной, ответ на мегабайты, страница собирается секунды |
| 20 | Плагины | Список, автор, дата обновления, наличие версии для Strapi 5, `postinstall`-скрипты | Заброшенные плагины, которые блокируют обновление; пакеты неизвестных авторов |
Про двадцатый пункт отдельно. В апреле 2026 года исследователи SafeDep нашли 36 вредоносных npm-пакетов, которые выдавали себя за плагины Strapi. При установке они запускали postinstall-скрипт, забирали .env и ключи, лезли в Redis и Postgres и открывали удалённый доступ к серверу. Поэтому смотрим не только на то, нужен ли плагин, но и кто его автор и что он делает при установке.
Что получаете на выходе
Документ, в котором каждый пункт чек-листа отмечен одним из трёх статусов:
| Статус | Что значит | Пример |
|---|---|---|
| Критично | Чинить сегодня или завтра, риск потери данных или взлома | Открытый доступ к пользователям у роли Public, токен Full access во фронте, нет бэкапов |
| Важно | Чинить в этом месяце | Node 20, сертификат продлевается вручную, медиа внутри контейнера |
| Можно отложить | Не горит, но стоит в план | Медленный populate на второстепенных страницах, заброшенный плагин, который пока работает |
По каждому пункту: что нашли, чем это грозит простыми словами, как исправить и сколько часов займёт. Если проект на Strapi 4, отдельным разделом идёт оценка обновления до пятой версии: какие плагины придётся заменить, сколько своего кода переписывать, в какую вилку сроков попадает проект. Сам порядок обновления описан на странице обновление Strapi 4 до 5.
Документ написан так, чтобы его понял владелец сайта, а не только разработчик. Его можно отдать своему подрядчику или нам, как решите.
Как проходят три дня
- В первый день получаем доступы на чтение, разворачиваем копию проекта с боевой базой, снимаем версии и конфигурацию. Боевой сервер ничем не нагружаем.
- Во второй проходим права, токены, секреты, плагины и зависимости на копии, смотрим сервер, Nginx, бэкапы и логи. Пробуем восстановить сайт из последнего бэкапа.
- В третий замеряем скорость API, собираем отчёт, созваниваемся и проходим по критичным пунктам.
Если в первый же день находим открытую дыру, через которую прямо сейчас утекают данные, не ждём третьего дня: сообщаем сразу и предлагаем, как закрыть. Если видим следы взлома, переходим к плану из статьи если сайт на Strapi взломали.
Что не входит
Аудит это проверка и отчёт, исправлений в него не входит. Починка критичных пунктов идёт отдельно по часам или в первый месяц поддержки. Нагрузочное тестирование и пентест с попытками взлома тоже отдельная работа, для большинства сайтов на Strapi они не нужны.
Если проект принимаете от другого подрядчика, список того, что у него забрать до аудита, есть на странице передача проекта. Как устроен правильный docker-compose для Strapi 5, с которым мы сравниваем ваш: strapi.tech.
Пришлите адрес сайта и админки и скажите, кто сейчас ведёт проект. Через день ответим, когда можем начать аудит и что понадобится из доступов.
Частые вопросы
Сколько стоит аудит Strapi?
Аудит занимает три рабочих дня, сумму называем после первого просмотра проекта, обычно в тот же или на следующий день. Она зависит от того, сколько окружений (только прод или ещё тестовый сервер), есть ли мобильное приложение и интеграции, которые ходят в API. Если после аудита остаётесь у нас на поддержке, первый месяц работ строится по его отчёту.
Нужен ли доступ к боевому серверу?
Нужен доступ на чтение: посмотреть конфигурацию Nginx, контейнеры, переменные окружения, логи и бэкапы. Ничего на боевом сервере во время аудита не меняем. Проверки, которые что-то нагружают или ломают, делаем на копии.
Можно провести аудит без репозитория?
Частично. Код Strapi можно достать с сервера, если он там собирается, а по базе видно типы контента и права. Но без репозитория не проверить историю: были ли секреты в коммитах, какие правки делал прежний подрядчик. Отсутствие репозитория само по себе попадёт в отчёт как критичный пункт.
Чем аудит отличается от npm audit?
npm audit показывает известные уязвимости в пакетах, это один пункт из двадцати. Он не видит, что у роли Public открыт доступ к пользователям, что API-токен с полным доступом лежит во фронте, что бэкапы не восстанавливаются, а медиа хранятся внутри контейнера. Самое опасное на реальных проектах обычно в настройках, а не в пакетах.
Проверяете ли вы проект на уже случившийся взлом?
Да, это входит: смотрим папку загрузок на посторонние файлы, cron и запущенные процессы, список администраторов и API-токенов, логи Nginx на подозрительные запросы. Если находим следы взлома, аудит останавливается и переходим к плану действий при взломе.