Защита self-hosted сервисов сверх безопасности сервера
Когда хост укреплён, атакуемая поверхность — приложение: минимальные привилегии, работа с секретами, доступность БД, бэкапы и настройки, важные для каждого сервиса.
Безопасность self-hosted сервиса — это не одна настройка, а набор привычек: не выставлять приложение в интернет напрямую, давать минимальные права, правильно обращаться с секретами и регулярно обновляться. Это руководство перечисляет конкретные меры, которые стоит внедрить на любом VPS с вашими сервисами.
Никогда не выставляйте приложение напрямую
Закрывайте всё, кроме обратного прокси. Сервисы слушают 127.0.0.1, а в интернет смотрит только Caddy или Nginx с TLS. Так вы получаете одну точку входа, а не пять открытых портов, каждый из которых — потенциальная дыра. Никогда не слушайте на 0.0.0.0 то, что не предназначено для публичного доступа.
Минимальные права для всего
- ▹Каждый сервис — от отдельного системного пользователя, не от root.
- ▹Контейнеры — с ограничением ресурсов и non-root пользователем внутри.
- ▹Права на файлы и каталоги — по необходимости, а не chmod 777.
- ▹Никаких прав root у приложений, которым они не нужны.
Секреты
Пароли, ключи и токены не должны лежать в репозитории или в файлах, доступных всем. Используйте переменные окружения с ограниченным доступом или менеджер секретов. Если секрет попал в публичный репозиторий — считайте его скомпрометированным и немедленно замените.
Note · Файл .env на сервере должен быть доступен только пользователю сервиса. Открытый .env с паролем базы данных — самая частая находка при аудите.
Базы данных никогда не должны быть в интернете
База данных слушает 127.0.0.1 и доступна только через обратный прокси или туннель. Никогда не открывайте порт PostgreSQL или MySQL наружу, даже если у вас сложный пароль: у базы данных не должно быть публичного интерфейса вообще.
Настройки сервисов, которые имеют значение
| Сервис | Что настроить |
|---|---|
| SSH | Только ключи, пароли выключить |
| Caddy / Nginx | TLS, заголовки безопасности, лимиты запросов |
| PostgreSQL / MySQL | Слушать только localhost, минимум привилегий |
| Docker | non-root, drop capabilities, лимиты памяти |
| WordPress и подобные | Убрать публичные служебные файлы, обновлять плагины |
| Tor-релей | Консервативные лимиты |
Бэкапы — это мера безопасности
Бэкап — ваша защита от шифровальщика, от ошибки обновления и от потери сервера. Храните копии вне машины, шифруйте и регулярно проверяйте, что с них можно восстановиться. Бэкап, который ни разу не восстановили, — это не бэкап.
Держите всё обновлённым
Регулярно обновляйте систему и приложения. Большинство взломов — это не изобретательные атаки, а известные уязвимости, для которых вышел патч. Автоматические обновления безопасности, включённые с первого дня, закрывают эту проблему лучше всего.
FAQ
QНужно ли ставить firewall?
AОбязательно, иначе всё слушающее видно интернету.
QКонтейнеры безопаснее обычных приложений?
AНе автоматически. Контейнер без non-root и ограничений — это те же риски.
QКак часто обновляться?
AАвтоматические обновления безопасности — каждый день, остальное — регулярно.
QЧто важнее всего?
AНе открывать лишних портов и регулярно обновляться. Это закрывает большинство рисков.