многоуровневая защита
Защита VPS на Debian: пошаговое развёртывание с алертами в DeltaChat
В этой статье разворачиваем комплексную защиту VPS-сервера на Debian 12 с нуля. По итогу сервер будет присылать уведомления на телефон — о каждом SSH-входе, заблокированном атакующем, падении сервиса, заполнении диска. А ещё сможет отвечать на команды прямо в мессенджере: статус сервера, активные баны, нагрузка, обновления.
Всё разворачивается одним скриптом примерно за 10–15 минут.
Что в итоге будет работать
- Файрвол (iptables): политика DROP по умолчанию, открыты только нужные порты
- fail2ban: автоматический постоянный бан после 5 неудачных попыток SSH
- auditd: аудит изменений
/etc/shadow, sudoers, запуска подозрительных программ - logrotate + journald: логи не растут бесконтрольно (лимит 500 МБ, хранение 1 месяц)
- DeltaChat-бот: зашифрованные алерты на телефон + управление сервером из чата
- PAM hook: уведомление при каждом SSH-входе
- systemd OnFailure: алерт при падении ssh, fail2ban, auditd или docker
- cron: мониторинг диска каждые 30 мин, RAM каждые 5 мин, ежедневный дайджест в 09:00
- etckeeper: git-история всех изменений в
/etc - swap: 2 ГБ с низким swappiness=20
Почему DeltaChat, а не Telegram
DeltaChat работает поверх обычного email с end-to-end шифрованием (Autocrypt). Никаких сторонних серверов, webhook'ов или токенов — сервер отправляет письма сам себе через IMAP/SMTP, телефон их получает как зашифрованные сообщения. Даже если сервис DeltaChat когда-нибудь исчезнет, email останется.
Что потребуется
- Сервер с Debian 12 (Bookworm) и root-доступом по SSH
- Знать свой SSH-порт (не потеряйте доступ — его указываем до запуска скрипта)
- Два аккаунта DeltaChat: бот (отправитель) и ваш (получатель)
Шаг 0. Создаём аккаунты DeltaChat
Устанавливаем DeltaChat на телефон: delta.chat/ru/download
Аккаунт бота (будет отправлять алерты с сервера):
- В приложении: «Начать» → «Создать новый профиль»
- Записываем email и пароль — это
DELTA_EMAILиDELTA_PASSWORD
Ваш аккаунт (будете получать алерты и отправлять команды):
- Создаём второй профиль аналогично — это
DELTA_RECIPIENT - Или используйте уже существующий аккаунт DeltaChat
Проще всего регистрироваться на nine.testrun.org — официальный chatmail-сервер DeltaChat, без верификации, за несколько секунд.
> Оба аккаунта должны быть разными. Бот не может писать сам себе.
Развёртывание
Шаг 1. Клонируем репозиторий на сервер
Подключаемся к серверу по SSH и клонируем репозиторий в /root/deltabot:
☯
Terminal:
⌕
≡
✕
cd /root git clone -b main https://gitlab.com/dixsu/vps/secure_deltabot.git deltabot cd deltabot
Репозиторий содержит установщик, скрипты алертов, конфиги fail2ban, auditd и вспомогательные утилиты.
Шаг 2. Заполняем конфигурацию
Копируем шаблон и открываем редактор:
☯
Terminal:
⌕
≡
✕
cp .env.example .env nano .env
Заполняем обязательные поля:
☯
Terminal:
⌕
≡
✕
# Как сервер будет представляться в алертах SERVER_NAME=my-vps SERVER_IP=1.2.3.4 # Ваш реальный SSH-порт — ОБЯЗАТЕЛЬНО укажите правильный! # Если укажете не тот — потеряете доступ после применения iptables SSH_PORT=22 # Дополнительные открытые TCP-порты (например nginx) OPEN_PORTS="80 443" # DeltaChat: аккаунт бота (отправитель) DELTA_EMAIL=botaccount@nine.testrun.org DELTA_PASSWORD=пароль_бота # DeltaChat: ваш аккаунт (получатель алертов и команд) DELTA_RECIPIENT=youraccount@nine.testrun.org # Какие события генерируют алерты ALERT_SSH_LOGIN=yes # успешный SSH-вход ALERT_SSH_FAILED=yes # неудачная попытка ALERT_FAIL2BAN_BAN=yes # бан IP ALERT_FAIL2BAN_UNBAN=no # разбан (обычно шумно, лучше выключить) ALERT_SERVICE_FAILURE=yes # падение сервиса ALERT_DAILY_DIGEST=yes # ежедневный дайджест в 09:00 ALERT_DISK_THRESHOLD=80 # алерт при заполнении диска более 80% # Если Docker установлен — скрипт его тоже настроит HARDEN_DOCKER=yes
Шаг 3. Запускаем установщик
☯
Terminal:
⌕
≡
✕
chmod +x install.sh ./install.sh
Скрипт выводит каждый шаг с цветными статусами. Сначала попросит подтверждение, затем последовательно:
- Устанавливает пакеты: fail2ban, auditd, iptables-persistent, python3-venv, etckeeper, lynis, sqlite3
- Инициализирует etckeeper — git-трекинг
/etc - Применяет правила iptables (DROP + ваши порты)
- Настраивает sysctl — харденинг ядра
- Создаёт swap 2 ГБ (если нет)
- Настраивает fail2ban с постоянным баном и DeltaChat-action
- Настраивает auditd
- Настраивает Docker (если установлен)
- Настраивает logrotate и journald
- Создаёт Python venv
/opt/deltabotи устанавливает библиотеку deltachat - Копирует скрипты бота, создаёт
.envдля него - Настраивает PAM hook для SSH-логинов
- Регистрирует systemd OnFailure для ключевых сервисов
- Устанавливает cron-задания
- Настраивает DeltaChat-аккаунт бота
- Запрашивает обмен ключами — выводит invite-ссылку
Шаг 4. Обмен ключами с ботом
Это единственный интерактивный шаг — нужно сделать один раз.
Установщик выведет ссылку вида:
☯
Terminal:
⌕
≡
✕
OPENPGP4FPR:ABCD1234EFGH5678...
На телефоне открываем DeltaChat с аккаунта DELTA_RECIPIENT:
- Нажимаем значок QR → «Вставить ссылку»
- Вставляем ссылку и подтверждаем
Через несколько секунд бот обменяется ключами и установщик завершится, прислав тестовое сообщение «Установка завершена».
Если обмен ключами не прошёл
Бывает, что установщик не дождался ответа (истёк таймаут) или браузер на телефоне открыл ссылку не в DeltaChat. Для этого есть скрипт инициализации bot_init.sh.
Повторить только обмен ключами
☯
Terminal:
⌕
≡
✕
cd /root/deltabot ./bot_init.sh --keys
Скрипт запустит слушателя (если не запущен), выведет новую ссылку и будет ждать 3 минуты. Открываем ссылку в DeltaChat на телефоне — всё как в шаге 4.
Проверить текущее состояние
☯
Terminal:
⌕
≡
✕
./bot_init.sh --status
Выведет: запущен ли слушатель, настроен ли аккаунт, PID процесса.
Если нужно начать с нуля
☯
Terminal:
⌕
≡
✕
./bot_init.sh --reset # удаляет account.db ./bot_init.sh # полная инициализация заново
Управление ботом после установки
Слушатель команд (bot_listener.py) работает как systemd-сервис deltabot-listener и запускается автоматически при перезагрузке. Все операции с ним через bot_init.sh:
☯
Terminal:
⌕
≡
✕
# Запустить слушателя ./bot_init.sh --start # Остановить ./bot_init.sh --stop # Статус (запущен ли, PID, настроен ли аккаунт) ./bot_init.sh --status # Отправить тестовый алерт ./bot_init.sh --test # Повторный обмен ключами (если сменили аккаунт или потеряли доступ) ./bot_init.sh --keys # Полный сброс аккаунта (если нужно переконфигурировать с нуля) ./bot_init.sh --reset ./bot_init.sh
Стандартные systemd-команды тоже работают:
☯
Terminal:
⌕
≡
✕
systemctl status deltabot-listener journalctl -u deltabot-listener -f # лог в реальном времени systemctl restart deltabot-listener
Команды в DeltaChat
После установки пишем команды боту прямо в чате — он отвечает туда же:
| Команда | Что возвращает |
статус | Аптайм, нагрузка, RAM, диск, состояние сервисов, число банов |
баны | Все активные IP в fail2ban |
ssh | SSH-активность за 24 часа: неудачные и успешные входы |
диск | Использование диска по всем разделам |
нагрузка | CPU, RAM, swap, топ-10 процессов |
аудит | Сводка auditd за сегодня |
обновления | Доступные обновления пакетов apt |
правила | Текущие правила iptables INPUT |
бан 1.2.3.4 | Заблокировать IP через fail2ban |
разбан 1.2.3.4 | Разблокировать IP |
помощь | Полный список команд в чате |
Бот отвечает только аккаунту DELTA_RECIPIENT. Все сообщения шифруются Autocrypt.
Что приходит без запроса
| Событие | Условие |
| SSH вход | Каждый успешный вход (PAM hook) |
| IP заблокирован | 5+ неудачных попыток SSH за 10 минут |
| Сервис упал | Падение ssh, fail2ban, auditd или docker |
| Диск заполнен | Более 80% (каждые 30 мин, повтор не чаще раза в 4 ч) |
| RAM критически мала | Менее 200 МБ свободно |
| Ежедневный дайджест | Каждый день в 09:00 |
Все пороги и переключатели — в /root/deltabot/.env. После изменения .env перезапуск не нужен — скрипты читают файл при каждом запуске.
Полезные команды для диагностики
☯
Terminal:
⌕
≡
✕
# Статус всех ключевых сервисов systemctl status fail2ban auditd deltabot-listener netfilter-persistent # Активные баны fail2ban-client status sshd # Логи fail2ban в реальном времени tail -f /var/log/fail2ban.log # Аудит: что запускалось сегодня из /tmp ausearch -k program_exec --start today | grep exe= # Аудит: изменения /etc/shadow ausearch -k shadow_changes --start today # Текущие правила iptables iptables -L INPUT -n -v --line-numbers # История изменений /etc cd /etc && git log --oneline -10 # Ручная отправка алерта /root/deltabot/send_alert.py "Тема" "Текст"
Исходный код
Репозиторий: gitlab.com/dixsu/vps/secure_deltabot, ветка main
Версия для Alpine Linux — в отдельной статье, ветка alpine.