Bootstrap

многоуровневая защита

многоуровневая защита

Защита 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 останется.


Что потребуется

  1. Сервер с Debian 12 (Bookworm) и root-доступом по SSH
  2. Знать свой SSH-порт (не потеряйте доступ — его указываем до запуска скрипта)
  3. Два аккаунта 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

Скрипт выводит каждый шаг с цветными статусами. Сначала попросит подтверждение, затем последовательно:

  1. Устанавливает пакеты: fail2ban, auditd, iptables-persistent, python3-venv, etckeeper, lynis, sqlite3
  2. Инициализирует etckeeper — git-трекинг /etc
  3. Применяет правила iptables (DROP + ваши порты)
  4. Настраивает sysctl — харденинг ядра
  5. Создаёт swap 2 ГБ (если нет)
  6. Настраивает fail2ban с постоянным баном и DeltaChat-action
  7. Настраивает auditd
  8. Настраивает Docker (если установлен)
  9. Настраивает logrotate и journald
  10. Создаёт Python venv /opt/deltabot и устанавливает библиотеку deltachat
  11. Копирует скрипты бота, создаёт .env для него
  12. Настраивает PAM hook для SSH-логинов
  13. Регистрирует systemd OnFailure для ключевых сервисов
  14. Устанавливает cron-задания
  15. Настраивает DeltaChat-аккаунт бота
  16. Запрашивает обмен ключами — выводит 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
sshSSH-активность за 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.

Свежие статьи