Linux

Настройка SSH-сервера на Linux: полное руководство по безопасности

В этом руководстве вы научитесь безопасно настроить SSH-сервер на Linux: от базовой установки до продвинутых мер защиты. Вы получите контроль над удалённым доступом к серверу.

Обновлено 16 февраля 2026 г.
20-30 мин
Средняя
FixPedia Team
Применимо к:Ubuntu 22.04/24.04Debian 11/12CentOS Stream 8/9/Rocky Linux 8/9OpenSSH 7.6+

Введение / Зачем это нужно

SSH (Secure Shell) — это стандарт для безопасного удалённого управления серверами и передачи данных. По умолчанию после установки SSH-сервер (демон sshd) работает с настройками, которые небезопасны для публичного доступа: открыт порт 22, разрешён вход суперпользователя root по паролю, нет защиты от перебора.

Это руководство поможет вам трансформировать уязвимый SSH-сервер в защищённый шлюз. Вы научитесь:

  • Устанавливать и запускать службу.
  • Менять стандартный порт.
  • Ограничивать круг пользователей.
  • Критически важно: отключать аутентификацию по паролю в пользу SSH-ключей.
  • Блокировать прямой вход root.
  • Добавлять защиту от брутфорса с помощью Fail2ban.
  • Правильно настраивать фаервол.

После выполнения этих шагов риск несанкционированного доступа к вашему серверу снизится на порядок.

Требования / Подготовка

Перед началом убедитесь, что у вас есть:

  1. Доступ к серверу с правами sudo. Вы должны быть able выполнять команды от имени суперпользователя.
  2. Установленный OpenSSH-клиент на вашей локальной машине (ssh).
  3. Резервная копия текущего конфигурационного файла. Создайте её вручную:
    sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%F)
    
  4. Альтернативный способ доступа к серверу (консоль через панель управления хостинг-провайдера, IPMI/KVM), на случай если вы заблокируете себя.
  5. Ваш 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-сессию до проверки!

  1. Проверьте синтаксис конфигурации SSH:
    sudo sshd -t
    

    Если вывод пустой — синтаксис корректен.
  2. Перезагрузите службу SSH:
    sudo systemctl reload ssh  # или sshd
    
  3. Из НОВОГО терминала (не закрывайте старый!) попробуйте подключиться к серверу:
    # Укажите ваш порт (-p) и имя пользователя
    ssh -p 2222 your_username@ваш_сервер_IP
    

    Подключение должно пройти только с использованием SSH-ключа. Ввод пароля должен завершаться ошибкой Permission denied (publickey).
  4. Если подключение прошло успешно — теперь можно разорвать старую сессию (если она была по паролю) и работать только через новую, защищённую.
  5. Проверьте, что старый порт 22 больше не слушается (если вы его убрали из конфига):
    sudo ss -tlnp | grep :22
    

    Команда ничего не должна вывести.

Проверка результата

  1. Подключение работает только с SSH-ключом.
  2. Попытка входа root завершается ошибкой.
  3. Подключение на старом порту 22 (если он удалён из конфига) не устанавливается.
  4. Fail2ban активен: попробуйте сделать 6 неудачных попыток входа (например, 6 раз ввести неправильный пароль, если по какой-то причине PasswordAuthentication временно включён). Затем проверьте список забаненных IP:
    sudo fail2ban-client status sshd
    
  5. Фаервол открывает только нужный порт (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). Через неё:
    1. Проверьте, забанен ли ваш IP: sudo fail2ban-client status sshd.
    2. Если да — разбаньте его: sudo fail2ban-client set sshd unbanip ваш_IP.
    3. Проверьте конфиг /etc/ssh/sshd_config на ошибки (sudo sshd -t).
    4. Перезапустите SSH: sudo systemctl restart sshd.
    5. Проверьте фаервол.

❌ На 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 2222
    
    (Пакет policycoreutils-python-utils может потребоваться).
  • Решение (для AppArmor): Обычно не требуется, но если есть проблемы, проверьте профиль /etc/apparmor.d/usr.sbin.sshd.

Часто задаваемые вопросы

Почему после настройки SSH я не могу подключиться к серверу?
Можно ли настроить SSH без перезагрузки сервера?
Как восстановить доступ, если закрыл себя из-за неправильной настройки?
Обязательно ли отключать аутентификацию по паролю?

Полезное

Установите OpenSSH-сервер
Проверьте статус и запуск службы
Настройте базовую безопасность в sshd_config
Настройте фаервол и SELinux/AppArmor

Эта статья помогла вам решить проблему?