Безопасность пет-проекта за один вечер: чеклист, который реально закрывает 90% дыр

Рейтинг: 20.7% · 1 голосов
Технические статьи, разборы и лонгриды от сообщества Cyberlake.
Ответить
Аватара пользователя
vernonn
Сообщения: 2
Зарегистрирован: 28 май 2026, 10:21

Безопасность пет-проекта за один вечер: чеклист, который реально закрывает 90% дыр

Сообщение vernonn »

За последние пару лет я поднимал и чинил десятка два мелких продов: пет-проекты, MVP для знакомых, форумы, телеграм-боты с базой. Картина везде одинаковая. Человек арендует VDS за 400 рублей на Timeweb или Aeza, ставит Docker, выкатывает приложение и идет пилить фичи. Через месяц-другой в логах появляются перебор паролей по SSH, сканы /wp-admin и /.env, а иногда и майнер в кроне. Не потому что проект кому-то интересен, а потому что ботнеты сканируют весь диапазон IPv4 круглосуточно. Свежий сервер с открытым 22 портом получает первые попытки входа минут через десять после создания, проверено неоднократно.

Ниже чеклист в порядке приоритета. Делается за вечер, требует только консоли.

Секреты и .env:

Самая частая дыра вообще. Сценария два: .env закоммичен в git, или nginx раздает его как статику. Проверьте прямо сейчас:

Код: Выделить всё

git log --all --full-history -- .env
curl -i https://ваш-домен/.env
Если первый вывод непустой, секреты уже скомпрометированы, даже если файл потом удалили, история git помнит все. Ротируйте ключи (БД, API-токены, JWT-секрет), а не просто чистите историю через git filter-repo. В .gitignore добавьте .env первой строкой, в репозиторий кладите .env.example с пустыми значениями. В nginx запретите отдачу скрытых файлов:

Код: Выделить всё

location ~ /\. { deny all; }
Для проверки утечек в истории есть gitleaks, гоняется одной командой и находит то, о чем вы забыли год назад:

Код: Выделить всё

gitleaks detect --source . -v
SSH и фаервол:

Второе по важности. Отключаем вход по паролю и рута, оставляем только ключи. В /etc/ssh/sshd_config:

Код: Выделить всё

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
Перенос порта с 22 на нестандартный не защита, но срезает 95% мусора в логах, дышать становится легче. Дальше фаервол. На Ubuntu/Debian достаточно ufw:

Код: Выделить всё

ufw default deny incoming
ufw allow 22/tcp
ufw allow 80,443/tcp
ufw enable
Важный нюанс с Docker: он пишет правила напрямую в iptables в обход ufw. Если вы сделали docker run -p 5432:5432, ваш Postgres торчит в интернет, что бы ufw ни думал. Либо биндите на локалхост (-p 127.0.0.1:5432:5432), либо используйте внутренние сети Docker без публикации портов вообще. На эти грабли наступал лично, нашел свою базу через Shodan.

fail2ban ставится за минуту и банит перебор не только 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;
CSP сложнее, его честно настроить за вечер не выйдет, но даже базовый default-src 'self' с поэтапным добавлением исключений лучше, чем ничего. Проверяйте себя через securityheaders.com, наглядно и бесплатно.

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;
}
Отдельно лимитируйте эндпоинты, которые шлют письма и SMS. Знаю проект, которому за ночь накрутили 40 тысяч рублей на SMS-шлюзе, потому что эндпоинт регистрации не имел лимита. На уровне приложения дублируйте, в Laravel есть throttle из коробки, в Django это django-ratelimit, в Go стандартный golang.org/x/time/rate.

Обновления:

Unattended-upgrades на Debian/Ubuntu ставит security-патчи сам:

Код: Выделить всё

apt install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
Это закрывает уровень ОС. Уровень приложения, см. supply chain ниже. Докер-образы пересобирайте хотя бы раз в месяц, образ двухлетней давности тащит дырявый openssl, даже если ваш код идеален.

Бэкапы:

Правило простое: бэкап, который не лежит на другой машине, не существует. Снапшоты хостера это удобно, но при блокировке аккаунта (а истории про внезапные баны на дешевых хостингах регулярны) вы теряете и прод, и снапшоты разом. 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
Хранилище в Selectel или VK Cloud обойдется в 100-200 рублей в месяц за десятки гигабайт. База дампится отдельно через pg_dump до бэкапа файлов. И главное, раз в квартал делайте тестовое восстановление на чистую машину. Непроверенный бэкап это лотерея, я видел полгода битых дампов, которые никто не открывал.

Мониторинг:

Для пет-проекта не нужен 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
Лочьте версии (package-lock.json, poetry.lock коммитятся обязательно), в CI ставьте npm ci, а не npm install. Для npm имеет смысл выключить скрипты установки по умолчанию: npm config set ignore-scripts true, включая обратно точечно там, где без них не собирается. Dependabot или Renovate бесплатны для публичных и приватных реп на GitHub, заводят PR на обновления сами, вам остается читать ченджлоги.

Выводы:

Весь список выше закрывается за один-два вечера и почти бесплатно, 100-200 рублей в месяц на внешние бэкапы. Это не делает проект неуязвимым, но выводит его из категории легкой добычи для автоматических сканеров, а именно они, а не целевые атаки, кладут пет-проекты. Порядок важен: сначала секреты и SSH, потом все остальное. И повторю про бэкапы: проверяйте восстановление, а не факт наличия файлов в бакете.
👍 ❤️2 🔥2 😄 🤔
✔ Лучший ответ сформирован автоматически — sleepyraccoon
vernonn писал(а):Перенос порта с 22 на нестандартный не защита, но срезает 95% мусора в логах Вечный холивар, но я против. Нестандартный порт выше 1024 на линуксе может забиндить непривилегированный процесс, то есть если у тебя на машине уязвимое приложение, оно теоретически может подменить sshd после его падения. Плюс каждый новый человек/скрипт/ansible спотыкается об кастомный порт. Лучше уж po…
Перейти к ответу →
Аватара пользователя
go21
Сообщения: 10
Зарегистрирован: 17 май 2026, 23:11

Re: Безопасность пет-проекта за один вечер: чеклист, который реально закрывает 90% дыр

Сообщение go21 »

Хороший список, добавлю про Docker и ufw. Есть костыль получше чем биндинг на локалхост, проект ufw-docker, он патчит правила так что ufw начинает реально фильтровать докеровский трафик. Не панацея, но если контейнеров много и часть должна быть снаружи, удобнее чем держать в голове все -p. Ну и docker compose с внутренними сетями без ports вообще лучший вариант, наружу только реверс-прокси.
👍 ❤️1 🔥2 😄 🤔
Аватара пользователя
sleepyraccoon
Сообщения: 35
Зарегистрирован: 13 май 2026, 11:17

Re: Безопасность пет-проекта за один вечер: чеклист, который реально закрывает 90% дыр

Сообщение sleepyraccoon »

✔ Лучший ответ — сформирован автоматически
vernonn писал(а):Перенос порта с 22 на нестандартный не защита, но срезает 95% мусора в логах
Вечный холивар, но я против. Нестандартный порт выше 1024 на линуксе может забиндить непривилегированный процесс, то есть если у тебя на машине уязвимое приложение, оно теоретически может подменить sshd после его падения. Плюс каждый новый человек/скрипт/ansible спотыкается об кастомный порт. Лучше уж port knocking или просто ssh за wireguard, благо wg-quick поднимается за 10 минут.
👍 ❤️1 🔥 😄 🤔1
Аватара пользователя
stachhunt
Сообщения: 12
Зарегистрирован: 12 май 2026, 20:25

Re: Безопасность пет-проекта за один вечер: чеклист, который реально закрывает 90% дыр

Сообщение stachhunt »

По бэкапам подпишусь под каждым словом. У меня в 2024 хостер (не буду называть, мелкая контора) просто исчез вместе с панелью и снапшотами, домен сайта хостера и тот протух. Хорошо что был restic в Backblaze B2. Кстати про B2: из РФ оплата боль, так что Selectel/VK действительно практичнее, хотя B2 дешевле раза в два. Еще добавил бы restic check --read-data-subset=10% в крон, ловит тихое гниение репозитория без полной вычитки.
👍 ❤️ 🔥 😄 🤔1
Аватара пользователя
ollies
Сообщения: 33
Зарегистрирован: 11 май 2026, 16:28

Re: Безопасность пет-проекта за один вечер: чеклист, который реально закрывает 90% дыр

Сообщение ollies »

А что насчет 2FA на SSH? Видел туториалы про google-authenticator-libpam, стоит заморачиваться для одиночного VDS или ключей достаточно?
👍1 ❤️ 🔥 😄 🤔2
Аватара пользователя
DockerAdmin
Сообщения: 2
Зарегистрирован: 04 июн 2026, 06:17

Re: Безопасность пет-проекта за один вечер: чеклист, который реально закрывает 90% дыр

Сообщение DockerAdmin »

ollies писал(а):стоит заморачиваться для одиночного VDS или ключей достаточно?
Ключа ed25519 с паролем на самом ключе за глаза. TOTP поверх ключей дает почти ноль против реальных угроз для пет-проекта (перебор и так отрезан), зато добавляет шанс залочить самого себя при потере телефона. 2FA на SSH имеет смысл когда на сервер ходит несколько человек и ты не контролируешь, как они хранят ключи. Лучше потрать эти полчаса на fail2ban jail для нджинксовых логов, профита больше.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
esp32_dev
Сообщения: 24
Зарегистрирован: 11 май 2026, 13:41

Re: Безопасность пет-проекта за один вечер: чеклист, который реально закрывает 90% дыр

Сообщение esp32_dev »

@ollies, Про supply chain мало кто пишет применительно к мелким проектам, спасибо. Но ignore-scripts true это так себе совет в общем виде, у меня после него отвалилась сборка esbuild и sharp, оба ставят бинарники постинсталлом. Пришлось вайтлистить. Так что да, работает, но готовьтесь разбираться, почему билд внезапно красный. Для питона кстати все проще, там постинсталл-скриптов нет, зато есть тайпсквоттинг, проверяйте имена пакетов глазами перед pip install.
👍 ❤️1 🔥 😄 🤔
Аватара пользователя
juniorstack
Сообщения: 62
Зарегистрирован: 12 май 2026, 12:04

Re: Безопасность пет-проекта за один вечер: чеклист, который реально закрывает 90% дыр

Сообщение juniorstack »

vernonn писал(а):Знаю проект, которому за ночь накрутили 40 тысяч рублей на SMS-шлюзе
Могу перебить: 180к за выходные, эндпоинт восстановления пароля без лимита и без капчи, узнали в понедельник от шлюза. С тех пор у меня правило: любой эндпоинт, который стоит денег за вызов, получает rate limit И дневной потолок в самом приложении, после которого отправка просто выключается с алертом. Лимит per-IP не спасает от ботнета с тысячи адресов, а потолок спасает.
👍1 ❤️ 🔥 😄1 🤔
Ответить
Поделиться темой: ✈ Telegram VK

Вернуться в «Статьи и лонгриды»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость