Ниже чеклист в порядке приоритета. Делается за вечер, требует только консоли.
Секреты и .env:
Самая частая дыра вообще. Сценария два: .env закоммичен в git, или nginx раздает его как статику. Проверьте прямо сейчас:
Код: Выделить всё
git log --all --full-history -- .env
curl -i https://ваш-домен/.envКод: Выделить всё
location ~ /\. { deny all; }Код: Выделить всё
gitleaks detect --source . -vВторое по важности. Отключаем вход по паролю и рута, оставляем только ключи. В /etc/ssh/sshd_config:
Код: Выделить всё
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication noКод: Выделить всё
ufw default deny incoming
ufw allow 22/tcp
ufw allow 80,443/tcp
ufw enablefail2ban ставится за минуту и банит перебор не только SSH, но и форм логина, если настроить jail на логи nginx.
Заголовки и TLS:
TLS в 2026 бесплатный и автоматический, certbot или встроенный ACME в Caddy/Traefik. Из-за периодических проблем с доступностью у части СНГ-хостеров держите в уме запасной вариант, ZeroSSL работает через тот же ACME-протокол, переключение это одна строка конфига. Минимальный набор заголовков в nginx:
Код: Выделить всё
add_header Strict-Transport-Security "max-age=31536000" always;
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options DENY always;
add_header Referrer-Policy strict-origin-when-cross-origin always;Rate limiting:
Без него любая форма логина, отправка SMS или вызов платного API превращается в дыру для кошелька. В nginx это пять строк:
Код: Выделить всё
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
location /api/login {
limit_req zone=login burst=3 nodelay;
}Обновления:
Unattended-upgrades на Debian/Ubuntu ставит security-патчи сам:
Код: Выделить всё
apt install unattended-upgrades
dpkg-reconfigure -plow unattended-upgradesБэкапы:
Правило простое: бэкап, который не лежит на другой машине, не существует. Снапшоты хостера это удобно, но при блокировке аккаунта (а истории про внезапные баны на дешевых хостингах регулярны) вы теряете и прод, и снапшоты разом. Restic плюс любой S3-совместимый сторадж решает вопрос:
Код: Выделить всё
restic -r s3:s3.storage.selcloud.ru/my-backup backup /var/lib/app
restic -r s3:s3.storage.selcloud.ru/my-backup forget --keep-daily 7 --keep-weekly 4 --pruneМониторинг:
Для пет-проекта не нужен Prometheus с Grafana. Нужно знать две вещи: жив ли сайт и не кончается ли диск. Внешний аптайм-чекер: UptimeRobot бесплатно или self-hosted Uptime Kuma на той же машине знакомого (мониторить сервер с него самого бессмысленно). Алерты в телеграм через бота, заводится за 15 минут. На диск хватает крон-скрипта с df и curl в Telegram API. Отдельно полезен logwatch или хотя бы привычка раз в неделю смотреть journalctl и access-логи глазами, аномалии видно сразу.
Supply chain:
Самый недооцененный пункт. Атаки через npm-пакеты в 2024-2025 шли волнами, и зависимость с постинсталл-скриптом выполняет произвольный код на вашей машине и в CI. Минимум:
Код: Выделить всё
npm audit --omit=dev
pip-audit
composer auditВыводы:
Весь список выше закрывается за один-два вечера и почти бесплатно, 100-200 рублей в месяц на внешние бэкапы. Это не делает проект неуязвимым, но выводит его из категории легкой добычи для автоматических сканеров, а именно они, а не целевые атаки, кладут пет-проекты. Порядок важен: сначала секреты и SSH, потом все остальное. И повторю про бэкапы: проверяйте восстановление, а не факт наличия файлов в бакете.