4.5 KiB
4.5 KiB
Production security review
Проверка выполнена 7 сентября 2026 года и актуализирована для открытой альфы. Она охватывает код и Compose-конфигурацию; firewall, SSH, DNS и фактические права файлов проверяются отдельно на целевом сервере.
Закрытые пункты
| Область | Реализация |
|---|---|
| Внешняя поверхность | наружу публикуются только Caddy 80/443; PostgreSQL, API, web и MinIO находятся во внутренних сетях |
| Admin web/API | /admin/* и /api/v1/admin/* требуют Caddy Basic Auth; API дополнительно требует длинный bearer token |
| Сравнение токена | constant-time hmac.compare_digest |
| CORS | production принимает только явно заданные HTTPS origins, wildcard запрещён конфигурацией |
| Чувствительные ответы | административные ответы и создание заявки получают Cache-Control: no-store |
| Browser headers | HSTS, nosniff, restrictive referrer/permissions, anti-framing CSP/X-Frame-Options и COOP |
| Скриншоты | MIME/расширение/фактический формат, лимит размера и пикселей, повторное кодирование без EXIF, одноразовый upload token |
| MinIO | Console не опубликована; root credentials отделены от application credentials и не передаются API |
| Секреты | production fail-fast отклоняет короткие/демонстрационные значения; .env.production исключён из Git и должен иметь mode 0600 |
| Контейнеры | API и web запускаются непривилегированными пользователями; для всех сервисов включён no-new-privileges |
| Логи | query string, IP, Authorization и payload не журналируются; известные формы секретов редактируются |
| Персональные данные | действует документированная retention-очистка, причём backup выполняется раньше удаления |
Остаточные риски открытой альфы
- Basic Auth и bearer token общие для всех модераторов: персональная атрибуция и отзыв одной учётной записи отсутствуют.
- Нет MFA и отдельного identity provider; admin credentials следует передавать только ограниченному числу операторов и ротировать при любом подозрении.
- Application user MinIO имеет встроенную политику
readwrite; сейчас в инстансе используется один прикладной bucket. Перед появлением других bucket нужна отдельная bucket-scoped policy. - Пользователь
rf4spotter, запускающий Docker/systemd, фактически обладает высокими правами через Docker socket. SSH к нему должен быть ограничен ключами и firewall/VPN. - Защита от volumetric DDoS и внешний WAF не входят в single-server Compose.
Проверка на сервере
- Убедиться, что
ss -lntupне показывает наружу порты4321,8000,9000,9001,5432. - Проверить
stat -c '%a %U:%G' .env.production: ожидается600 rf4spotter:rf4spotter. - Без Basic Auth запрос к
/admin/moderationи/api/v1/admin/catch-reportsдолжен вернуть401от Caddy. - С Basic Auth, но без bearer token административный API должен вернуть
401от FastAPI. - Проверить security headers через
curl -I https://rf4spotter.ru/. - Убедиться, что
https://files.rf4spotter.ru/не открывает Console, list buckets или анонимную запись. - После проверки удалить команды с секретами из shell history либо вводить их через защищённый password manager.