Свежий сервер открыт в интернет с root по паролю - и его сразу начинают перебирать. Закрываем базовые дыры за десять минут: пользователь с sudo, вход по ключу, sshd, ufw, автообновления.
Свежий HIP-сервер с Ubuntu 24.04 поднимается с публичным IP и входом под root по паролю. Автоматические сканеры начинают стучаться в него в первые минуты после появления IP в сети - на нашем тестовом сервере счётчик неудачных попыток входа за несколько часов перевалил за 17 000. Эта первичная настройка закрывает базовые дыры примерно за десять минут: отдельный пользователь без root, вход только по ключу, отключённый пароль, файрвол и автоматические обновления безопасности. Все команды ниже выполнены на чистой Ubuntu 24.04.
Коротко. Заходим под root, заводим обычного пользователя с sudo, кладём ему свой SSH-ключ. Во втором терминале проверяем, что вход по ключу работает. Отключаем в sshd вход под root и по паролю, включаем ufw (сначала разрешив SSH) и unattended-upgrades. После этого sshd вообще не принимает парольную аутентификацию, и перебор пароля по SSH теряет смысл.
deploy с правами sudo - под ним вы работаете вместо root.sshd запрещён вход под root и вход по паролю.ufw: наружу открыт только порт 22.IP-адрес и пароль root - на странице сервера в панели, в блоке How to connect. Там же кнопка веб-консоли: она понадобится, если вы случайно закроете себе SSH. Если сервера ещё нет, создайте его по инструкции «Как создать сервер в панели HIP».
Подключаемся с вашего компьютера (Windows - PuTTY или встроенный ssh, macOS и Linux - ssh в терминале):
ssh root@ВАШ-IP
Работать постоянно под root опасно: любая ошибка в команде выполняется с максимальными правами, а вход root по SSH - главная цель переборщиков. Заводим обычного пользователя и выдаём ему право повышать привилегии через sudo (по своему паролю).
adduser deploy
usermod -aG sudo deploy
id deploy
Вывод id deploy должен показать группу sudo:
uid=1001(deploy) gid=1001(deploy) groups=1001(deploy),27(sudo)
adduser создаёт пользователя, домашний каталог и спрашивает пароль. Пароль нужен: под ним sudo будет переспрашивать подтверждение. В Ubuntu право на sudo даёт именно членство в одноимённой группе.
Ключ - пара файлов на вашем компьютере: закрытый остаётся у вас, открытый кладётся на сервер. Кто предъявил закрытый ключ, того сервер и пускает - пароль не нужен, а перебрать ключ нельзя. Если ключа ещё нет, создайте его на своём компьютере командой ssh-keygen -t ed25519; на сервер копируется файл .pub.
install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
nano /home/deploy/.ssh/authorized_keys # вставьте одну строку из вашего .pub
chmod 600 /home/deploy/.ssh/authorized_keys
chown deploy:deploy /home/deploy/.ssh/authorized_keys
Рекомендуемые права - 700 на каталог .ssh и 600 на файл authorized_keys. Важно другое: каталог, файл и домашний каталог не должны быть доступны на запись посторонним - при небезопасном владельце или правах sshd с StrictModes может отказаться использовать ключ, и причина видна в логах sshd/journal.
Этот шаг пропускать нельзя. Прежде чем что-то запрещать в sshd, откройте ещё одно окно терминала и убедитесь, что под новым пользователем вы заходите по ключу и sudo работает. Первое окно не закрывайте - если во втором что-то пойдёт не так, останется рабочая сессия, чтобы откатить изменения.
ssh deploy@ВАШ-IP
deploy@server:~$ sudo whoami
root
sshd - служба SSH на сервере. Её настройки не правят в основном файле, а кладут отдельным файлом в каталог /etc/ssh/sshd_config.d/ - так изменения переживут обновление пакета.
nano /etc/ssh/sshd_config.d/99-hardening.conf
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
X11Forwarding no
MaxAuthTries 3
Проверяем синтаксис и применяем, не разрывая открытые сессии:
sshd -t && echo OK
systemctl reload ssh
PermitRootLogin no - под root по SSH больше не зайти. PasswordAuthentication no - только ключ. sshd -t обязателен до перезагрузки службы: с битым конфигом sshd не поднимется, и вы останетесь снаружи.
Ловушка Ubuntu cloud-образа. После этого проверьтеsshd -T | grep -i passwordauthentication- и, скорее всего, увидитеyes. На облачных образах Ubuntu файл50-cloud-init.confв том же каталоге уже задаётPasswordAuthentication yes, аsshdдля таких параметров берёт первое найденное значение. Ваш файл99-*читается позже и игнорируется. Решение - назвать файл так, чтобы он читался первым:
grep -R -n -i passwordauthentication /etc/ssh/sshd_config.d/
mv /etc/ssh/sshd_config.d/99-hardening.conf /etc/ssh/sshd_config.d/00-hardening.conf
sshd -t && systemctl reload ssh
sshd -T | grep -Ei 'permitrootlogin|passwordauthentication|kbdinteractiveauthentication|maxauthtries'
В выводе теперь должно быть permitrootlogin no, passwordauthentication no, kbdinteractiveauthentication no и maxauthtries 3.
Конфигурация применена - но текущую root-сессию пока не закрывайте. Откройте НОВОЕ SSH-соединение под deploy, убедитесь, что вход работает уже с применённым конфигом, и выполните sudo -v. Только когда это сработало, закрывайте старую root-сессию.
ssh deploy@ВАШ-IP
sudo -v
ufw - простая обёртка над штатным файрволом Linux. Правило для SSH добавляем первым: если включить ufw с политикой «запретить входящие» и забыть про порт 22, текущая сессия оборвётся.
ufw allow OpenSSH
ufw --force enable
ufw status verbose
ufw app info OpenSSH
Профиль OpenSSH - это 22/tcp. Если вы перенесли SSH на другой порт, разрешайте этот порт явно (ufw allow 2222/tcp), а не профиль.
Профили веб-сервера (Nginx Full и подобные) добавляйте позже, когда поставите сам веб-сервер.
Непропатченные известные уязвимости - один из основных рисков для публичного сервера. unattended-upgrades раз в сутки сам ставит обновления из security-репозитория.
На Ubuntu 24.04 unattended-upgrades обычно уже установлен и включён - проверьте, прежде чем что-то менять:
systemctl status unattended-upgrades.service
apt-config dump | grep -Ei 'Periodic::(Update-Package-Lists|Unattended-Upgrade)'
Активная служба и две строки со значением "1" означают, что всё включено. Если выключено:
apt-get install -y unattended-upgrades
dpkg-reconfigure -f noninteractive unattended-upgrades
cat /etc/apt/apt.conf.d/20auto-upgrades
В файле 20auto-upgrades две строки со значением "1" - обновление списка пакетов и установка обновлений включены. Перезагрузку после обновления ядра сервер по умолчанию не делает; при желании включается параметром Unattended-Upgrade::Automatic-Reboot.
Вход под root по SSH должен отклоняться, а под новым пользователем по ключу - работать:
ssh root@ВАШ-IP
root@ВАШ-IP: Permission denied (publickey).
ssh deploy@ВАШ-IP
deploy@server:~$
fail2ban - банит IP после серии неудачных попыток. После выключенного пароля не критично, но снижает шум в логах.SSH - не единственный вход. В панели на странице сервера есть веб-консоль (serial console): она работает мимо sshd и файрвола, через неё вы попадёте на сервер под root по паролю и почините конфиг. Поэтому пароль root в панели стоит сохранить, даже когда вход по паролю в SSH выключен.
С трёх вещей: отдельный пользователь с sudo, вход по SSH-ключу, отключение входа по паролю и под root в sshd. Дальше - файрвол ufw и автообновления. Это и есть базовая первичная настройка сервера; всё остальное зависит от задачи.
Удалённый вход по SSH сразу в привилегированную учётную запись не нужен для обычной работы. Отдельный пользователь плюс sudo оставляет повышение прав отдельным шагом и ограничивает то, что выполняется сразу с UID 0.
Потому что /etc/ssh/sshd_config.d/50-cloud-init.conf задаёт PasswordAuthentication yes и читается раньше вашего файла, а sshd берёт первое совпадение. Назовите свой файл 00-hardening.conf или отредактируйте 50-cloud-init.conf.
Зайдите через веб-консоль в панели под root, добавьте в authorized_keys новый открытый ключ, при необходимости временно верните PasswordAuthentication yes.
Нужен. Сервисы имеют привычку появляться: поставили базу данных - и она уже слушает 0.0.0.0. С ufw такой порт не откроется наружу без вашего явного правила.
sudo.sshd выключить.00-hardening.conf, иначе его перебьёт 50-cloud-init.conf.ufw - до включения файрвола.unattended-upgrades - чтобы известные дыры закрывались без вас.