- Опубликовано: 21 июн 2026
- 4
Первые 10 минут с новым сервером: что сделать сразу, чтобы потом не было мучительно больно
Окей, ситуация знакомая. Ты только что нажал заветную кнопку «Create» у своего облачного провайдера, тебе прилетел свеженький IP-адрес, рутовый пароль в письме, и вот он — твой новый VPS, чистенький, как первый снег. Сервер дышит, пингуется, манит.
И тут есть два пути.
Путь первый: ты заходишь, ставишь свой проект, всё работает, ты счастлив, идёшь спать. А через недельку обнаруживаешь, что твой сервер уже месяц как чужой, грузит процессор на 100%, рассылает спам и состоит в каком-то ботнете, о котором ты узнаёшь из гневного письма от хостера.
Путь второй: ты тратишь десять минут в самом начале, и потом живёшь долго и счастливо.
Давай по второму пути, ладно? Погнали.
Минута 0: заходим и не паникуем
Первым делом — заходим по SSH. Скорее всего, у тебя есть рутовый пароль из письма:
ssh root@ВАШ_IP
Тебя спросят, доверяешь ли ты этому хосту (отпечаток ключа) — говоришь yes, вводишь пароль, и ты внутри. Поздравляю, ты теперь бог этой маленькой вселенной. С богами, как известно, обращаются осторожно, поэтому первое, что мы сделаем, — перестанем быть рутом постоянно. Но не прямо сейчас. Сейчас обновляемся.
Минута 1: обновляем всё, что движется
Образ, из которого подняли твой сервер, почти наверняка собран не вчера. А значит, в нём уже есть пакеты с известными дырами, которые добрые люди давно нашли и которыми не очень добрые люди давно пользуются.
apt update && apt upgrade -y
(Если у тебя не Debian/Ubuntu, а какая-нибудь Alma/Rocky/CentOS — там будет dnf upgrade -y, и ты, скорее всего, и сам это знаешь.)
Пока оно качается и ставится — налей чаю. Это самая скучная минута, дальше будет веселее.
Минута 2: заводим себе человеческого юзера
Сидеть под рутом — это как ходить по дому с включённой бензопилой. Вроде удобно, всё рубится с полтычка, но одно неловкое движение — и ты уже без ноги (читай: без файловой системы, потому что rm -rf с правами рута не задаёт лишних вопросов).
Заводим нормального пользователя:
adduser anton
Подставь своё имя, конечно, если ты не Антон. Тебя попросят пароль и кучу необязательных вопросов про «полное имя» и «номер комнаты» — на всё это можно жать Enter, никому твоя комната не интересна.
Теперь дадим этому юзеру право становиться рутом по требованию (через sudo), чтобы он мог делать важные дела, но не ходил с бензопилой постоянно:
usermod -aG sudo anton
На RPM-системах группа называется wheel, а не sudo — имей в виду.
Минута 3-4: SSH-ключи, или как перестать вводить пароли
Пароли — это прошлый век. Их подбирают, их брутфорсят, их крадут. SSH-ключ подобрать практически нереально (если, конечно, ты не выложишь приватную часть на гитхаб, но ты же так не сделаешь, правда?).
Если у тебя ещё нет ключа — на своём компьютере (не на сервере!) делаешь:
ssh-keygen -t ed25519 -C "anton@ноутбук"
ed25519 — это современный, быстрый и компактный тип ключа. Бери его, не прогадаешь. Жмёшь Enter на все вопросы (можно задать пароль на ключ — это плюс к безопасности, но дело вкуса).
Теперь закидываем публичную часть ключа на сервер. Самый простой способ — ssh-copy-id:
ssh-copy-id anton@ВАШ_IP
Эта команда сама создаст нужные папки, проставит правильные права и положит твой публичный ключ куда надо. Если ssh-copy-id у тебя нет (привет, пользователи Windows), ключ можно скопировать руками — содержимое файла ~/.ssh/id_ed25519.pub нужно добавить строкой в ~/.ssh/authorized_keys на сервере, под нужным юзером.
Проверяем, что заходит по ключу:
ssh anton@ВАШ_IP
Если пароль не спросили и ты внутри — кайф, всё работает. Не закрывай это окно. Серьёзно. Сейчас мы будем менять настройки SSH, и если что-то пойдёт не так, эта живая сессия — твоя страховка от того, чтобы навсегда запереться снаружи собственного сервера.
Минута 5-6: закручиваем гайки в SSH
Открываем конфиг (через sudo, потому что мы теперь приличные люди):
sudo nano /etc/ssh/sshd_config
Находим и приводим к такому виду несколько строк (они могут быть закомментированы решёткой — раскомментируй):
PermitRootLogin no
PasswordAuthentication no
Что мы сделали:
PermitRootLogin no— теперь напрямую рутом зайти нельзя. Все боты мира, которые круглосуточно долбятся вrootс паролем123456, идут лесом.PasswordAuthentication no— заходить можно только по ключу. Никаких паролей. Брутфорс окончательно теряет смысл.
Сохраняем (в nano это Ctrl+O, потом Enter, потом Ctrl+X) и перезапускаем SSH:
sudo systemctl restart ssh
⚠️ Момент истины. Помнишь то окно, которое я просил не закрывать? Открой новое окно терминала и попробуй зайти заново:
ssh anton@ВАШ_IP. Если зашёл — отлично, всё работает, старое окно можно отпускать. Если не зашёл — у тебя всё ещё есть живая сессия в старом окне, в которой можно спокойно откатить настройки и разобраться, что пошло не так. Вот почему мы не закрывали то окно. Я же говорил.
Кстати, про смену стандартного порта 22 на какой-нибудь 2222 — споры не утихают. Это не «безопасность», это «гигиена логов»: боты перестанут засорять тебе журнал бесконечными попытками входа. Реальной защиты это не даёт (порт сканируется за секунды), но логи чище. Хочешь — меняй (Port 2222 в том же конфиге), не хочешь — забей, это не обязательно.
Минута 7: ставим файрвол и закрываем лишнее
По умолчанию у сервера могут быть открыты порты, о которых ты даже не подозреваешь. Давай решать, кого пускать, а кого нет. На Ubuntu/Debian проще всего через ufw (Uncomplicated Firewall — он и правда uncomplicated):
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw enable
Что тут происходит по-человечески: всё входящее по умолчанию запрещаем, всё исходящее разрешаем, и аккуратно проделываем дырочку для SSH, чтобы самим не остаться снаружи (опять же — не запри себя!).
Если меняли порт SSH на 2222 — тогда вместо allow OpenSSH пиши sudo ufw allow 2222/tcp, иначе будет грустно.
Поднимаешь веб-сервер? Добавь, что нужно:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Проверить, что в итоге открыто:
sudo ufw status
Минута 8: fail2ban — вышибала на входе
Даже с ключами и файрволом в логи будут ломиться боты. fail2ban — это такой автоматический вышибала: следит за логами, видит, что с какого-то IP третий раз подряд лезут с кривыми кредами, и просто банит этот IP на время. Тихо, без скандалов.
sudo apt install fail2ban -y
Приятная новость: для SSH он начинает работать практически из коробки, дефолтных настроек на старте хватает. Хочешь потюнить — копируешь /etc/fail2ban/jail.conf в /etc/fail2ban/jail.local и крутишь там (править .conf напрямую не надо, его перезапишет обновление). Но для «первых десяти минут» достаточно просто поставить — он уже работает.
Минута 9: автоматические обновления безопасности
Ты же не будешь каждый день заходить и делать apt upgrade вручную, давай честно. А дырки в софте находят постоянно. Решение — пусть сервер сам подтягивает обновления безопасности, пока ты спишь:
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades
В появившемся диалоге выбираешь «Yes». Всё, теперь критические патчи прилетают автоматом, и ты не превращаешься в лёгкую мишень из-за того, что забыл обновиться.
Маленькая оговорка: на боевых проде-серверах автообновления иногда отключают и катят патчи по расписанию вручную — чтобы какое-нибудь обновление внезапно не уронило сервис посреди ночи. Но для личного сервера, пет-проекта или чего-то некритичного — автообновления безопасности это чистое добро.
Минута 10: мелочи, которые потом сэкономят тебе нервы
Осталась минута, добьём по-быстрому пару приятных штук.
Часовой пояс. Чтобы логи были в твоём времени, а не в UTC, и ты не считал в уме каждый раз:
sudo timedatectl set-timezone Europe/Moscow
(Подставь свой, список — timedatectl list-timezones.)
Адекватное имя хоста — чтобы в терминале было видно, на каком сервере ты находишься, и ты не задеплоил случайно в прод вместо стейджинга:
sudo hostnamectl set-hostname my-cool-server
Swap-файл, если у сервера мало RAM (привет, дешёвые VPS на 1 ГБ). Когда память кончается, swap не даёт всему упасть с гордым Out of memory:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Последняя строка добавляет swap в /etc/fstab, чтобы он включался сам после перезагрузки, а не только сейчас.
Всё, время вышло. Что в итоге?
За десять минут ты:
- обновил систему и включил автообновления безопасности;
- завёл человеческого юзера и слез с рута;
- настроил вход по SSH-ключу и выключил пароли с рутовым логином;
- поднял файрвол и пускаешь только то, что нужно;
- посадил на входе fail2ban;
- навёл порядок со временем, именем и памятью.
Теперь твой сервер не «свежий лужок для любого ботнета», а вполне себе укреплённая позиция. Это, конечно, не полноценный энтерпрайз-хардненинг с аудитами и центром управления полётами — но это та самая база, без которой всё остальное бессмысленно. Восемьдесят процентов проблем отсекаются вот этими простыми шагами.
А главное — ты сделал это сразу, на чистом сервере, пока на нём ничего нет и не страшно что-нибудь сломать. Потому что делать это потом, на работающем проде, с пользователями и данными — вот это и есть то самое «мучительно больно» из заголовка.
Десять минут сейчас. Или бессонная ночь и письмо от хостера потом. Выбор, как говорится, очевиден.
Ну что, погнали деплоить? 🚀
Была статья полезной: