Введение / Зачем это нужно
SSH (Secure Shell) — это стандарт для безопасного удалённого управления серверами и передачи данных. По умолчанию после установки SSH-сервер (демон sshd) работает с настройками, которые небезопасны для публичного доступа: открыт порт 22, разрешён вход суперпользователя root по паролю, нет защиты от перебора.
Это руководство поможет вам трансформировать уязвимый SSH-сервер в защищённый шлюз. Вы научитесь:
- Устанавливать и запускать службу.
- Менять стандартный порт.
- Ограничивать круг пользователей.
- Критически важно: отключать аутентификацию по паролю в пользу SSH-ключей.
- Блокировать прямой вход
root. - Добавлять защиту от брутфорса с помощью Fail2ban.
- Правильно настраивать фаервол.
После выполнения этих шагов риск несанкционированного доступа к вашему серверу снизится на порядок.
Требования / Подготовка
Перед началом убедитесь, что у вас есть:
- Доступ к серверу с правами sudo. Вы должны быть able выполнять команды от имени суперпользователя.
- Установленный OpenSSH-клиент на вашей локальной машине (
ssh). - Резервная копия текущего конфигурационного файла. Создайте её вручную:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%F) - Альтернативный способ доступа к серверу (консоль через панель управления хостинг-провайдера, IPMI/KVM), на случай если вы заблокируете себя.
- Ваш SSH-публичный ключ уже добавлен в
~/.ssh/authorized_keysна целевом сервере. Если нет — добавьте его до отключения аутентификации по паролю.
Шаг 1: Установка и проверка службы OpenSSH-сервера
Если SSH-сервер ещё не установлен, начните отсюда.
Для Ubuntu/Debian:
sudo apt update
sudo apt install -y openssh-server
Для CentOS/RHEL/Rocky/AlmaLinux:
sudo dnf install -y openssh-server
# Или для старых версий:
# sudo yum install -y openssh-server
После установки служба обычно запускается автоматически. Проверим статус:
sudo systemctl status ssh
# На CentOS/RHEL имя службы может быть `sshd`
sudo systemctl status sshd
Вы должны видеть active (running). Если нет, запустите и включите автозагрузку:
sudo systemctl start ssh
sudo systemctl enable ssh
# Или для sshd:
# sudo systemctl start sshd
# sudo systemctl enable sshd
Убедитесь, что демон слушает порт 22 (по умолчанию):
sudo ss -tlnp | grep :22
В выводе должна быть строка с LISTEN и процессом sshd.
Шаг 2: Резервное копирование и редактирование основной конфигурации
Все основные настройки хранятся в /etc/ssh/sshd_config. Никогда не редактируйте этот файл без предварительного бэкапа.
Откройте файл в текстовом редакторе (например, sudo nano /etc/ssh/sshd_config или sudo vim /etc/ssh/sshd_config) и внесите следующие изменения. Раскомментируйте (удалите # в начале строки) нужные параметры и установите значения.
Ключевые директивы для безопасности:
# 1. Меняем стандартный порт (например, на 2222). Это усложнит автоматические сканирования.
Port 2222
# 2. Запрещаем вход суперпользователю root.
PermitRootLogin no
# 3. Ограничиваем круг пользователей, которые могут подключаться.
# Перечислите через пробел логины, которые имеют доступ.
AllowUsers your_username another_user
# 4. Включаем аутентификацию по SSH-ключам и ОТКЛЮЧАЕМ по паролю.
PubkeyAuthentication yes
PasswordAuthentication no
# 5. Отключаем пустые пароли (если по какой-то причине PasswordAuthentication=yes).
PermitEmptyPasswords no
# 6. Ограничиваем количество одновременных сессий (опционально, но полезно).
MaxSessions 2
MaxAuthTries 3
# 7. Настройка таймаутов (закрывает неактивные соединения).
ClientAliveInterval 300
ClientAliveCountMax 2
Важно: Если вы меняете порт (Port), не удаляйте строку с портом 22, если планируете временно оставить старый порт для отладки. Лучше закомментируйте её (#Port 22), чтобы старый порт не слушался. После успешного теста подключения на новом порту строку с Port 22 можно удалить.
Шаг 3: Настройка фаервола (Firewall)
Изменение порта бесполезно, если фаервол не открыт новый порт. Настройте его в зависимости от вашего дистрибутива.
Для Ubuntu/Debian (UFW):
# Разрешаем новый порт (в нашем примере 2222/tcp)
sudo ufw allow 2222/tcp
# Удаляем старое правило для порта 22, если оно было
sudo ufw delete deny 22/tcp 2>/dev/null || true
sudo ufw status verbose
Для CentOS/RHEL/Rocky (firewalld):
# Добавляем сервис/порт в публичную зону
sudo firewall-cmd --permanent --add-port=2222/tcp
# Удаляем старый порт, если нужно
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
Проверьте, что порт действительно открыт извне (с другой машины):
nc -zv ваш_сервер_IP 2222
# Или
nmap -p 2222 ваш_сервер_IP
Шаг 4: Установка и настройка Fail2ban для защиты от брутфорса
Fail2ban сканирует логи служб (включая SSH) и блокирует IP-адреса, которые делают слишком много неудачных попыток входа.
Установка:
# Ubuntu/Debian
sudo apt install -y fail2ban
# CentOS/RHEL/Rocky (EPEL репозиторий может потребоваться)
sudo dnf install -y fail2ban
Базовая конфигурация:
Fail2ban работает с «тюрьмами» (jails). Создадим локальный конфиг, который не будет перезаписан при обновлении:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Отредактируйте /etc/fail2ban/jail.local:
[DEFAULT]
# Время бана (секунды). 1h = 3600
bantime = 3600
# Количество попыток до бана
maxretry = 5
# Используемый бэкенд (автоопределение)
backend = systemd
# Настройка конкретно для SSH (на вашем порту!)
[sshd]
enabled = true
port = 2222 # Укажите ваш порт! Если оставите `ssh`, fail2ban определит порт из sshd_config.
filter = sshd
logpath = /var/log/auth.log # Для Ubuntu/Debian
# Для CentOS/RHEL: logpath = /var/log/secure
Для CentOS/RHEL также укажите logpath = /var/log/secure.
Запустите и включите Fail2ban:
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
Проверьте статус «тюрьмы»:
sudo fail2ban-client status sshd
В выводе будет текущее количество забаненных IP.
Шаг 5: Применение изменений и тестовое подключение
Критически важный этап. Не разрывайте текущую активную SSH-сессию до проверки!
- Проверьте синтаксис конфигурации SSH:
sudo sshd -t
Если вывод пустой — синтаксис корректен. - Перезагрузите службу SSH:
sudo systemctl reload ssh # или sshd - Из НОВОГО терминала (не закрывайте старый!) попробуйте подключиться к серверу:
# Укажите ваш порт (-p) и имя пользователя ssh -p 2222 your_username@ваш_сервер_IP
Подключение должно пройти только с использованием SSH-ключа. Ввод пароля должен завершаться ошибкойPermission denied (publickey). - Если подключение прошло успешно — теперь можно разорвать старую сессию (если она была по паролю) и работать только через новую, защищённую.
- Проверьте, что старый порт 22 больше не слушается (если вы его убрали из конфига):
sudo ss -tlnp | grep :22
Команда ничего не должна вывести.
Проверка результата
- Подключение работает только с SSH-ключом.
- Попытка входа
rootзавершается ошибкой. - Подключение на старом порту 22 (если он удалён из конфига) не устанавливается.
- Fail2ban активен: попробуйте сделать 6 неудачных попыток входа (например, 6 раз ввести неправильный пароль, если по какой-то причине
PasswordAuthenticationвременно включён). Затем проверьте список забаненных IP:sudo fail2ban-client status sshd - Фаервол открывает только нужный порт (2222) и закрывает 22.
Возможные проблемы
❌ Ошибка Connection refused или No route to host
- Причина: Фаервол не пропускает новый порт или служба SSH не запущена.
- Решение: Проверьте статус службы (
systemctl status ssh) и правила фаервола (sudo ufw statusилиsudo firewall-cmd --list-all). Убедитесь, что вы открыли порт на внешнем интерфейсе.
❌ Ошибка Permission denied (publickey,password) при тестовом подключении
- Причина 1: Ваш публичный ключ (
~/.ssh/id_rsa.pub) не добавлен в~/.ssh/authorized_keysна сервере. - Решение: Добавьте ключ с помощью
ssh-copy-id -p 2222 your_username@serverили вручную. - Причина 2: Неправильные права на файлы/директории на сервере.
- Решение: На сервере выполните:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys - Причина 3: Вы включили
PasswordAuthentication no, но пытаетесь подключиться по паролю. - Решение: Подключайтесь с ключом. Если ключ потерян — вам понадобится доступ через консоль для его восстановления.
❌ Я заблокировал себя (Fail2ban или неправильный порт)
- Решение: Вам обязательно нужен альтернативный доступ (консоль хостинга, KVM). Через неё:
- Проверьте, забанен ли ваш IP:
sudo fail2ban-client status sshd. - Если да — разбаньте его:
sudo fail2ban-client set sshd unbanip ваш_IP. - Проверьте конфиг
/etc/ssh/sshd_configна ошибки (sudo sshd -t). - Перезапустите SSH:
sudo systemctl restart sshd. - Проверьте фаервол.
- Проверьте, забанен ли ваш IP:
❌ На CentOS/RHEL не работает Fail2ban или блокирует всё
- Причина: Неправильный
logpath. В CentOS логи SSH пишутся в/var/log/secure, а не в/var/log/auth.log. - Решение: В
/etc/fail2ban/jail.localдля[sshd]укажитеlogpath = /var/log/secure.
❌ После смены порта sshd не стартует
- Причина: Порт уже занят другим процессом или указан некорректно (например, буквенный символ).
- Решение: Убедитесь, что порт свободен:
sudo ss -tlnp. Проверьте синтаксисsshd_config(sudo sshd -t). Убедитесь, что порт числовой и в диапазоне 1-65535.
❌ SELinux/AppArmor блокирует SSH на нестандартном порту
- Причина: SELinux по умолчанию разрешает
sshdслушать только порт 22. - Решение (для SELinux):
(Пакетsudo semanage port -a -t ssh_port_t -p tcp 2222policycoreutils-python-utilsможет потребоваться). - Решение (для AppArmor): Обычно не требуется, но если есть проблемы, проверьте профиль
/etc/apparmor.d/usr.sbin.sshd.