Новый сервер с публичным IP-адресом начинают сканировать боты почти сразу после запуска: они перебирают пароли к SSH и ищут открытые службы. Хорошая новость в том, что базовая защита занимает около пятнадцати минут. Ниже — порядок действий для Ubuntu 22.04/24.04 и Debian 12, который стоит выполнить до того, как ставить на сервер свой проект.
Перед началом. IP-адрес, логин и пароль root появятся в карточке сервера в личном кабинете. Там же есть консоль в браузере: если вы случайно закроете себе доступ по SSH, через неё всё можно исправить.
Шаг 1. Создайте SSH-ключ на своём компьютере
Вход по ключу надёжнее любого пароля: подобрать его перебором практически невозможно. Если ключа у вас ещё нет, создайте его на своём компьютере — в Linux, macOS или PowerShell в Windows команда одинаковая:
ssh-keygen -t ed25519 -C "my-laptop"Программа предложит путь к файлу (подойдёт вариант по умолчанию) и пароль для самого ключа — его стоит задать, чтобы украденный файл был бесполезен. Появятся два файла: закрытый id_ed25519, который никогда никуда не передаётся, и открытый id_ed25519.pub, который кладут на серверы.
В Verdian Cloud открытый ключ можно добавить в профиле личного кабинета и выбрать при заказе сервера или при переустановке системы — тогда он сразу окажется на сервере. Если сервер уже создан, подключитесь по паролю и действуйте по шагам ниже.
Шаг 2. Обновите систему
Образ системы собирают заранее, поэтому к моменту запуска в нём почти наверняка есть устаревшие пакеты. Подключитесь к серверу и обновите их:
ssh root@IP-адрес-сервера
apt update && apt full-upgrade -yЕсли после обновления появился файл /var/run/reboot-required, значит обновилось ядро или важные библиотеки — перезагрузите сервер командой reboot и подключитесь снова.
Шаг 3. Заведите отдельного пользователя
Работать постоянно под root рискованно: любая опечатка выполняется с максимальными правами, а логин root известен всем ботам. Создайте обычного пользователя и разрешите ему sudo. В минимальных образах Debian пакета sudo может не быть, поэтому сначала установите его:
apt install -y sudo
adduser deploy
usermod -aG sudo deployИмя deploy — только пример, выберите своё. Теперь добавьте этому пользователю ваш открытый ключ. Если ключ уже лежит у root (например, вы выбрали его при заказе), просто скопируйте его:
rsync --archive --chown=deploy:deploy ~/.ssh /home/deployЕсли ключа на сервере ещё нет, отправьте его со своего компьютера:
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@IP-адрес-сервераВ Windows команды ssh-copy-id нет — откройте на сервере файл /home/deploy/.ssh/authorized_keys и вставьте в него содержимое id_ed25519.pub одной строкой. У каталога .ssh должны быть права 700, у файла — 600, а владелец обоих — deploy.
Важно. Не закрывайте текущую сессию. Откройте второе окно терминала и убедитесь, что вход ssh deploy@IP-адрес-сервера работает без пароля, а sudo -v принимает пароль пользователя. Только после этого переходите к следующему шагу.
Шаг 4. Запретите вход по паролю и под root
Ubuntu 22.04+ и Debian 12 читают дополнительные настройки SSH из каталога /etc/ssh/sshd_config.d/. Для каждого параметра действует первое найденное значение, а файлы читаются по алфавиту — поэтому назовём свой файл так, чтобы он шёл первым. Это важно: в облачных образах Ubuntu часто есть файл 50-cloud-init.conf, который включает вход по паролю.
sudo tee /etc/ssh/sshd_config.d/00-hardening.conf > /dev/null <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
EOFПроверьте синтаксис и посмотрите, какие значения сервер SSH применит на самом деле:
sudo sshd -t
sudo sshd -T | grep -Ei '^(permitrootlogin|passwordauthentication|kbdinteractiveauthentication)'Если ошибок нет и в выводе стоит no, перезапустите службу. Уже открытые сессии при этом не разорвутся:
sudo systemctl restart sshСнова проверьте вход во втором окне терминала. Попытка ssh root@IP-адрес-сервера теперь должна завершаться отказом.
Смена порта SSH с 22 на другой уменьшает количество мусорных записей в журналах, но защитой не является: сканеры находят нестандартные порты за минуты. Если всё же меняете порт, сначала откройте новый порт в файрволе.
Шаг 5. Включите файрвол
Принцип простой: закрыть всё входящее и открыть только то, чем вы действительно пользуетесь. В Ubuntu для этого есть ufw, в Debian его нужно установить:
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcpЕсли на сервере будет сайт, откройте HTTP и HTTPS:
sudo ufw allow 80,443/tcpВключите файрвол и проверьте правила:
sudo ufw enable
sudo ufw status verboseОдна частая ловушка: Docker публикует порты контейнеров (-p 8080:80) через собственные правила iptables, в обход ufw. Если сервис внутри контейнера не должен быть доступен из интернета, публикуйте его только на локальный адрес: -p 127.0.0.1:8080:80.
Шаг 6. Настройте автоматические обновления безопасности
Уязвимости в OpenSSH, OpenSSL и ядре находят регулярно, а заходить на сервер каждый день, чтобы поставить патчи, никто не будет. Пакет unattended-upgrades ставит обновления безопасности сам. В Ubuntu он обычно уже установлен, в Debian — добавьте:
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgradesНа вопрос об автоматической установке ответьте «Да». Журнал работы лежит в /var/log/unattended-upgrades/. Обновления, которым нужна перезагрузка, система сама не применит до конца — периодически проверяйте, нет ли файла /var/run/reboot-required.
Шаг 7. Поставьте fail2ban
Когда вход по паролю выключен, подобрать доступ к SSH уже нельзя, но боты продолжат стучаться и засорять журналы. fail2ban следит за неудачными попытками входа и временно блокирует адреса, с которых их слишком много.
sudo apt install -y fail2ban python3-systemdНастройки не правят в jail.conf — его перезапишет следующее обновление. Создайте свой файл jail.local:
sudo tee /etc/fail2ban/jail.local > /dev/null <<'EOF'
[sshd]
enabled = true
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
EOFПараметр backend = systemd заставляет fail2ban читать системный журнал напрямую. Без него в Debian 12 служба может не запуститься: там по умолчанию нет файла /var/log/auth.log. Запустите службу и проверьте, что правило для SSH работает:
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
sudo fail2ban-client status sshdЕсли вы сами заблокировали свой адрес, снимите блокировку через консоль в кабинете: sudo fail2ban-client set sshd unbanip ВАШ-IP.
Шаг 8. Мелочи, которые потом сэкономят время
Выставьте часовой пояс, чтобы время в журналах совпадало с вашим:
sudo timedatectl set-timezone Europe/MoscowНа небольших тарифах полезен файл подкачки — он не ускорит сервер, но спасёт от аварийного завершения процессов при кратком всплеске потребления памяти:
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstabЗащитите и личный кабинет
Сервер настолько же защищён, насколько защищён аккаунт, из которого им управляют: из кабинета можно переустановить систему, сменить пароль root или открыть консоль. Включите двухфакторную аутентификацию в профиле личного кабинета и сохраните резервные коды в надёжном месте.
Когда базовая настройка закончена, самое время сделать снимок чистой системы. Если в тариф подключены снапшоты, к этому состоянию можно будет вернуться за пару минут. Чем снапшот отличается от полноценной резервной копии — в статье «Снапшоты и бэкапы».
Чек-лист
- Система обновлена, при необходимости сервер перезагружен.
- Есть отдельный пользователь с
sudoи входом по SSH-ключу. - Вход под root и по паролю запрещён, проверено во втором окне терминала.
- Файрвол включён, открыты только нужные порты.
- Обновления безопасности ставятся автоматически.
- fail2ban следит за SSH.
- В личном кабинете включена двухфакторная аутентификация.
