Инфраструктура и деплой
Приложение может быть безупречным, а сервер всё равно открыт настежь. Эти проверки о том, как и где оно работает.
Чек-лист
- Открывай только те порты, которые задумал. Файрвол хоста, разрешающий 22, 80 и 443, сам по себе недостаточен: Docker публикует порты контейнеров, записывая правила iptables, которые обходят ufw, поэтому
-p 9000:9000может быть доступен из интернета, даже когда файрвол "разрешает только 443". Привязывай порты контейнеров к127.0.0.1, если они не должны быть публичными, и сканируй свой публичный IP, чтобы убедиться, что реально открыто. - Держи админ-панели вне публичного интернета. Панели вроде Portainer, инструменты администрирования баз данных и UI метрик никогда не должны быть доступны из интернета. Свежая админ-панель без настроенного аккаунта - это полный захват: любой, кто достучится до неё в окне настройки, владеет сервером. Политики перезапуска могут снова открыть это окно.
- Привязывай серверы приложения к loopback и ставь перед ними reverse proxy. Приложение слушает
127.0.0.1; nginx или граница завершают TLS и пересылают запросы. - Делай origin недоступным, кроме как через границу. Если используешь Cloudflare или подобное, обеспечь это через authenticated origin pulls (mTLS) или allowlist IP, чтобы атакующие не могли обойти WAF, зайдя на IP origin.
- Задавай заголовки безопасности.
Strict-Transport-Security,X-Content-Type-Options: nosniff,X-Frame-Options: DENY(илиframe-ancestors 'none'), строгийContent-Security-Policy(в идеалеscript-src 'self'безunsafe-inlineиunsafe-eval),Referrer-Policyи закрытыйPermissions-Policy. - Не раскрывай версию и стек. Убирай баннеры
ServerиX-Powered-By. - Закрой доступ к dotfiles и build-выходу.
/.env,/.git/, конфиг-файлы и source maps не должны быть доступны из веба. Убедись, что каждый из них возвращает 403 или 404. - Показывай общие ошибки. Никаких стектрейсов и внутренних путей для пользователей; детали логируй на сервере.
- Держи рантайм обновлённым и запускай приложение от имени непривилегированного пользователя с минимальными правами, в контейнере или песочнице, где это практично.
Как тестировать
- Снаружи своей сети просканируй публичные IP на открытые порты.
- Запроси
/.env,/.git/configи.map-файл на своём домене. - Прочитай заголовки ответа главной страницы и проверь каждый пункт выше.