Безопасность вашей виртуальной машины
Пятнадцать минут базовых настроек закрывают большинство типовых атак. Ниже — пошаговая памятка для обычного администратора: что сделать сразу после получения сервера и как поддерживать защиту дальше.
Сначала открываем новое
Новый доступ настраиваем и проверяем в отдельном окне — и только потом закрываем старый. Так вы не останетесь без связи с сервером.
Консоль — аварийный вход
Консоль (VNC) в панели управления не зависит от SSH и сетевых правил. Если что-то заблокировали — вход всегда есть через неё.
Ключи вместо паролей
Пароли подбирают автоматически и круглосуточно. Ключ подобрать практически нельзя, поэтому вход по паролю со временем стоит отключить.
Обновление пакетов ОС
Устаревшие пакеты — самая частая причина взлома: уязвимость уже известна, а исправление не установлено.
apt update && apt upgrade -y
Если обновилось ядро, перезагрузите сервер:
apt list --upgradable 2>/dev/null | grep -i linux-image reboot
Включите автоматические обновления безопасности — дальше система обновляется сама:
apt install -y unattended-upgrades dpkg-reconfigure --priority=low unattended-upgrades # ответьте «Yes» systemctl status unattended-upgrades --no-pager
Вход по SSH-ключам
Ключ создаётся на вашем компьютере, публичная часть копируется на сервер.
ssh-keygen -t ed25519 -C "мой ключ" # Enter, затем парольная фраза ssh-copy-id root@ВАШ_IP ssh root@ВАШ_IP # должно пустить уже по ключу
Когда вход по ключу проверен, отключите пароль на сервере:
sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config systemctl reload ssh
Проверка (в новом окне, не закрывая текущее):
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no root@ВАШ_IP # Ожидаемый ответ: Permission denied (publickey)
Ограничение SSH по IP-адресам (ufw)
Порт SSH будет виден только вашим адресам, для остальных он «не существует».
apt install -y ufw ufw default deny incoming ufw default allow outgoing ufw allow 80/tcp # если есть сайт или приложение ufw allow 443/tcp # SSH только для своих адресов ufw allow from 203.0.113.7 to any port 22 proto tcp ufw allow from 198.51.100.0/24 to any port 22 proto tcp # целая сеть ufw enable ufw status numbered
Добавить ещё один адрес:
ufw allow from 192.0.2.55 to any port 22 proto tcp
Удалить адрес — по номеру правила или точной копией правила:
ufw status numbered ufw delete 3 # либо ufw delete allow from 192.0.2.55 to any port 22 proto tcp
Если у вас Docker
Контейнеры публикуют порты в обход правил ufw. Это нормально для приложения,
но никогда не публикуйте наружу порты баз данных (5432, 3306, 6379, 27017) —
привязывайте их только к 127.0.0.1, чтобы база была доступна лишь внутри сервера.
Защита от перебора: fail2ban
apt install -y fail2ban
Создайте файл /etc/fail2ban/jail.local:
[DEFAULT] maxretry = 5 findtime = 10m bantime = 1h ignoreip = 127.0.0.1/8 ::1 203.0.113.7 198.51.100.0/24 [sshd] enabled = true port = ssh backend = systemd
Применить и проверить:
systemctl enable --now fail2ban fail2ban-client status fail2ban-client status sshd # сколько адресов забанено fail2ban-client set sshd unbanip 192.0.2.55 # разбанить адрес
Свой адрес обязательно внесите в ignoreip, иначе заблокируете себя на час.
Пароли: смена и ротация
Пароли, выданные при регистрации, смените сразу — они могли попасть в переписку.
passwd # свой пароль passwd root # пароль root chage -l root # когда менялся и не истёк ли срок chage -M 180 root # срок действия — 180 дней
Требования: не менее 16 символов, уникальный, хранится в менеджере паролей, а не в заметках и не в переписке. Плановая ротация: пароли панелей — раз в 3–6 месяцев, ключи SSH — раз в год или сразу, если ключ мог попасть не туда.
Нестандартный порт SSH
Порт не заменяет ключи и firewall, но убирает большую часть автоматического мусора.
Порядок важен: сначала разрешите новый порт в firewall, потом меняйте настройки SSH.
ufw allow from 203.0.113.7 to any port 3467 proto tcp cat > /etc/ssh/sshd_config.d/90-port.conf <<'EOF' Port 3467 EOF sshd -t && systemctl reload ssh ssh -p 3467 root@ВАШ_IP # проверяем вход в новом окне ufw delete allow 22/tcp # только после успешного входа
Что ещё стоит сделать
PermitRootLogin prohibit-passwordadduser admin && usermod -aG sudo admin127.0.0.1last -n 20, journalctl -u ssh -n 50Что должно быть отмечено
unattended-upgrades включёнавтообновления безопасностиPermission denied (publickey)ufw status verboseignoreipБыстрые решения
sshd -t → systemctl status sshfail2ban-client set sshd unbanip ВАШ_IPufw status — открыты ли 80/443 и порт приложения