«Самурай точит меч до боя, а не во время него. Инженер настраивает защиту до атаки, а не после взлома.»
Первые 60 секунд после запуска VPS
В первую минуту твой сервер уже засветился в глобальных сканерах. Боты, роботы, ии и десятки других автоматизированных систем заметили новый IP-адрес в сети.
Через 5 минут начинаются первые попытки подключения. Порт 22 (стандартный SSH) стучится кто-то с IP из Китая, Бразилии, России — неважно откуда, это скрипт-кидди или ботнет, который просто перебирает пароли: root/123456, admin/admin, root/password.
Через час на твоём сервере уже будет 50-100 попыток входа. Если у тебя слабый пароль или ты оставил дефолтные настройки — игра окончена. Ты даже не узнаешь об этом, пока не увидишь странный трафик или счёт за ресурсы, съеденные майнером криптовалюты.
Почему так происходит?
90% взломов — это:
- Забытый пароль
root/root - SSH на дефолтном порту 22 с парольной аутентификацией
- Отсутствие брандмауэра (все порты открыты)
- Неустановленные обновления безопасности
- Никто не смотрит логи — взлом обнаруживается через месяц
Это не сложная математика. Это простая халатность.
«Как из косодомика безопасности VPS построить крепость в сети»
Мы не будем углубляться в параноидальные настройки или строить собственный Пантеон в цифровом мире. Мы просто последовательно закроем каждую дверь, поменяем замки и поставим простую, но надёжную сигнализацию, которая сообщит, если кто-то попытается пролезть в окно.
Базовая гигиена
Шаг 1.1: Обновление системы
sudo apt update
sudo apt upgrade
sudo apt install unattended-upgrades
После этих команд система будет сама устанавливать актуальные патчи безопасности каждую ночь.
Шаг 1.2: Создание непривилегированного пользователя
Аккаунт root — это доступ ко всему серверу. Если кто-то зайдёт в эту дверь, твой сервер станет уютной коммуналкой. Root — это режим бога. Богом быть опасно.
sudo adduser YOURUSER
Система попросит пароль — используй сложный набор (20+ символов, буквы + цифры + спецсимволы). Сохрани в менеджер паролей (или запиши на салфетке 😄).
Теперь дай пользователю YOURUSER права запускать команды с правами администратора:
echo "YOURUSER ALL=(ALL:ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/YOURUSER
sudo chmod 440 /etc/sudoers.d/YOURUSER
Проверь, что всё работает:
su - YOURUSER
sudo whoami
# Вывод: root — значит, права есть
Шаг 1.3: SSH-ключи вместо паролей
Пароль — это 16 символов, которые можно подобрать за несколько часов. SSH-ключ — это 4096-битный криптографический файл, который физически невозможно угадать. Пароль можно перехватить, подсмотреть, забыть. Ключ не передаётся по сети — он остаётся на твоём хосте.
На твоём компьютере в консольном приложении (Windows PowerShell, Mac/Linux терминал):
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/vps_key
Система спросит passphrase (пароль для самого ключа) — лучше задай. Даже если кто-то украдёт файл ключа с твоего компьютера, без фразы он бесполезен.
Скопируй публичный ключ на VPS:
ssh-copy-id -i ~/.ssh/vps_key.pub YOURUSER@YOUR_SERVER_IP
Система попросит пароль YOURUSER — это последний раз, когда ты его используешь. После этого:
ssh -i ~/.ssh/vps_key YOURUSER@YOUR_SERVER_IP
Вход без пароля готов.
Шаг 1.4: Запрет root-входа и парольной аутентификации
Root — это первая цель любого злоумышленника. Парольная аутентификация — это медленный, но рабочий способ подбора. С паролем атака может достичь успеха за 10 часов. А с ключами , технически возможно, но на практике потребуется больше времени, чем существует вселенная.
sudo nano /etc/ssh/sshd_config
Найди и отредактируй эти строки:
# Запрет входа под root
PermitRootLimit no
# Запрет парольной аутентификации
PasswordAuthentication no
# Разреши только публичные ключи
PubkeyAuthentication yes
# Смени порт SSH (не обязательно, но снижает шум от ботов)
Port 56200
Примени изменения:
sudo systemctl restart ssh
⚠️ Внимание: Перед перезагрузкой SSH оставь текущую сессию открытой и попробуй новый вход из другого окна терминала:
ssh -i ~/.ssh/vps_key YOURUSER@YOUR_SERVER_IP -p 56200
Если вход прошёл — всё ок, можешь закрывать старую сессию. Если нет — срочно вернись к файлу и внеси правки. Иначе заблокируешь себя из собственного сервера.
Периметр защиты
Если на сервере 65536 портов, и открыты все подряд, это как иметь дом со 100 дверями, и ты охраняешь только одну. Брандмауэр — это правило: открыты ровно те порты, которые нужны.
Шаг 2.1: Включение UFW (файрвол)
UFW (Uncomplicated Firewall) — это простой, но мощный инструмент. Он работает по принципу «запрети всё, разреши только нужное». По умолчанию всё закрыто.
sudo apt install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
Это значит: всё входящее — заблокировано, всё исходящее — разрешено. Теперь открываем только то, что нужно:
# SSH (с новым портом)
sudo ufw allow 56200/tcp
# HTTP и HTTPS для сайта
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Включи UFW
sudo ufw enable
Проверь:
sudo ufw status
# Status: active
# To Action From
# -- ------ ----
# 56200/tcp ALLOW Anywhere
# 80/tcp ALLOW Anywhere
# 443/tcp ALLOW Anywhere
Шаг 2.2: Fail2Ban — автоматический отпор при брутфорсе
Если кто-то пытается подобрать пароль 100 раз в минуту, это подозрительно. Fail2Ban видит эту активность, вносит IP в чёрный список и блокирует все его запросы на 24 часа.
sudo apt install fail2ban
# Создай конфиг
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# Отредактируй
sudo nano /etc/fail2ban/jail.local
Найди раздел [sshd] и убедись, что там:
[sshd]
enabled = true
port = 56200
maxretry = 3
findtime = 600
bantime = 86400
Это значит: если 3 неправильных попытки входа за 10 минут — блокируем IP на 24 часа.
Примени:
sudo systemctl restart fail2ban
Проверь, что всё работает:
sudo fail2ban-client status sshd
Защита на уровне приложения
Даже если злоумышленник пробьёт периметр, сайт должен быть крепче. Здесь мы шифруем трафик, укрепляем систему и отключаем всё, что не используется.
Шаг 3.1: HTTPS обязателен
Без HTTPS весь трафик идёт открытым текстом. Пароли, данные пользователей, куки сессий — всё видно, как на ладони. С HTTPS шифрованием и перехватить данные практически невозможно.
Используй Let's Encrypt (бесплатно):
sudo apt install certbot python3-certbot-nginx
# Автоматическое получение сертификата
sudo certbot certonly --nginx -d YOUR_DOMAIN.ru -d www.YOUR_DOMAIN.ru
# Проверь, что сертификат получен
sudo certbot certificates
Теперь в конфиге Nginx:
server {
listen 443 ssl http2;
server_name YOUR_DOMAIN.ru www.YOUR_DOMAIN.ru;
ssl_certificate /etc/letsencrypt/live/YOUR_DOMAIN.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/YOUR_DOMAIN.ru/privkey.pem;
# Безопасные параметры SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
}
# Редирект с HTTP на HTTPS
server {
listen 80;
server_name YOUR_DOMAIN.ru www.YOUR_DOMAIN.ru;
return 301 https://$server_name$request_uri;
}
Перезагрузи Nginx:
sudo systemctl reload nginx
Проверь в браузере — зелёный замок рядом с адресом.
Шаг 3.2: Усиление ядра Linux
Операционная система по умолчанию настроена на удобство, а не на безопасность. Отключим сетевые возможности, которые используются только в старых атаках.
sudo nano /etc/sysctl.d/99-hardening.conf
Добавь:
# Защита от IP spoofing
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# SYN-flood защита
net.ipv4.tcp_syncookies = 1
# Игнорируем ICMP ping (не нужен для работы, но используется в сканировании)
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Запрет использования дефолтных маршрутов
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# Ограничение видимости адресов памяти (защита от kernel exploit)
kernel.kptr_restrict = 2
Примени:
sudo sysctl -p /etc/sysctl.d/99-hardening.conf
Шаг 3.3: Отключение неиспользуемых сервисов
Каждый запущенный сервис — это потенциальная точка входа. Если тебе не нужен SNMP, Telnet или старый FTP — отключи их.
# Посмотри, какие сервисы запущены
sudo systemctl list-units --type service --state running
# Отключи ненужные (пример)
sudo systemctl disable avahi-daemon
sudo systemctl disable cups
sudo systemctl disable rsync
Наблюдение и мониторинг
Даже лучшая защита может дать трещину. Ты должен знать об этом, когда это произойдёт.
Шаг 4.1: Логи и их анализ
Логи — это чёрный ящик твоего сервера. Когда что-то идёт не так, логи первое, куда смотрит инженер.
Убедись, что логи пишутся:
# SSH логи
sudo tail -f /var/log/auth.log
# Системные логи
sudo journalctl -u sshd -n 20
# Nginx логи
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
Если видишь странные IP, порты или повторяющиеся попытки входа — это признак атаки. Fail2Ban должен их заблокировать.
Шаг 4.2: Базовый мониторинг
sudo apt install htop iotop nethogs
# htop — живая статистика CPU, памяти, процессов
htop
# iotop — мониторинг дискового пространства
sudo iotop
# nethogs — какой процесс использует интернет
sudo nethogs
Если видишь процесс, который ест 100% CPU и ты его не запускал — это может быть как ошибка в приложении, так и вредитель.
Шаг 4.3: Telegram-уведомление при входе на сервер
Ты спишь, а кто-то другой логинится на твой сервер. Уведомление в Telegram даст тебе 30 секунд, чтобы убить сессию.
Создай скрипт:
sudo nano /usr/local/bin/ssh-alert.sh
#!/bin/bash
TELEGRAM_TOKEN="YOUR_BOT_TOKEN"
CHAT_ID="YOUR_CHAT_ID"
USER="$PAM_USER"
IP="$PAM_RHOST"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="🔓 SSH login: $USER@$IP on $DATE"
Сделай исполняемым:
sudo chmod +x /usr/local/bin/ssh-alert.sh
Добавь в PAM конфиг:
sudo nano /etc/pam.d/sshd
В конец файла добавь:
session optional pam_exec.so /usr/local/bin/ssh-alert.sh
Теперь при каждом входе придёт уведомление в Telegram.
Резервные копии
Даже при идеальной защите есть вероятность потери данных. Hardware failure, криптовирус, ошибка админа — бэкапы спасают всё.
Шаг 5.1: Локальный бэкап с BorgBackup
sudo apt install borgbackup
# Инициализация репозитория
borg init --encryption=repokey /mnt/backup/repo
# Создание бэкапа
sudo borg create /mnt/backup/repo::$(date +%Y%m%d-%H%M%S) /var/www /etc /home
# Автоматический бэкап каждый день в 3 утра
sudo crontab -e
Добавь:
0 3 * * * /usr/bin/borg create /mnt/backup/repo::$(date +\%Y\%m\%d-\%H\%M\%S) /var/www /etc /home
Регулярная проверка
Безопасность — это не «настроил и забыл». Это процесс.
Каждый месяц:
-
Проверь обновления:
sudo apt update && sudo apt upgrade -
Посмотри на логи:
sudo fail2ban-client status sshd sudo journalctl -u sshd -n 100 | grep "Failed password" -
Проверь открытые порты:
sudo ss -tulpn | grep LISTEN -
Проверь SSL сертификат:
sudo certbot renew --dry-run -
Тест на известные уязвимости:
sudo apt install lynis sudo lynis audit system