Настройка SSH сервера в Linux

Проблема

SSH (Secure Shell) стандартный протокол удалённого управления серверами. Однако стандартная установка OpenSSH часто имеет настройки, которые не соответствуют современным требованиям безопасности: разрешён вход по паролю, активен доступ для root, используются устаревшие алгоритмы шифрования. Это делает сервер уязвимым для брутфорса, перехвата сессий и компрометации учётных данных. Вместо паролей следует использовать асимметричные ключи, а также грамотно ограничить доступ, чтобы обеспечить защиту без потери удобства. В этой статье мы настроим SSH-сервер (OpenSSH) на Debian/Ubuntu и RHEL-подобных системах, сфокусировавшись на безопасности и использовании ключей.

Решение

Используем OpenSSH наиболее распространённую реализацию, доступную в репозиториях всех дистрибутивов. Основные принципы безопасности:

  • Отключение аутентификации по паролю (оставляем только ключи).
  • Запрет прямого входа для root (используем sudo).
  • Смена стандартного порта (опционально, но снижает количество атакующих сканеров).
  • Ограничение доступа по IP или подсетям через AllowUsers / AllowGroups.
  • Использование современных алгоритмов шифрования (Ed25519, RSA с достаточной длиной) и отказ от слабых (CBC, MD5).

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

Пошаговая инструкция

Все действия выполняются на сервере под управлением Linux. Примеры команд даны для Ubuntu 22.04 LTS, различия для RHEL-подобных будут указаны.

1. Установка и первичная проверка

Debian / Ubuntu:

sudo apt update
sudo apt install openssh-server

RHEL / CentOS / Rocky Linux:

sudo dnf install openssh-server
sudo systemctl enable --now sshd

Проверяем статус:

sudo systemctl status sshd

2. Генерация SSH-ключей на клиенте

На клиентской машине (откуда будем подключаться) генерируем пару ключей. Рекомендуется использовать алгоритм Ed25519, так как он более безопасен и быстр, чем RSA. Подробности алгоритмов можно найти в документации OpenSSH.

ssh-keygen -t ed25519 -C "user@client-host"

При запросе можно оставить путь по умолчанию (~/.ssh/id_ed25519) и задать пароль (passphrase) для дополнительной защиты. Пароль запрашивается при каждом использовании ключа, но его можно добавить в агент.

Если необходимо использовать RSA (например, для совместимости со старыми системами), укажите длину ключа не менее 3072 бит:

ssh-keygen -t rsa -b 4096 -C "user@client-host"

3. Копирование публичного ключа на сервер

Самый простой способ — использовать утилиту ssh-copy-id. Если доступ по паролю ещё разрешён, выполните:

ssh-copy-id user@server_ip

Если парольный доступ уже отключён, ключ нужно добавить вручную:

cat ~/.ssh/id_ed25519.pub | ssh user@server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Убедитесь, что права на .ssh и authorized_keys установлены правильно:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

4. Базовая настройка безопасности сервера

Редактируем конфигурационный файл /etc/ssh/sshd_config. Перед изменением сделайте резервную копию:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

Отключение парольной аутентификации

PasswordAuthentication no

Запрет входа для root

PermitRootLogin no

Смена порта (опционально)

Port 2222

Если меняете порт, не забудьте открыть его в брандмауэре. Стандартный 22 можно оставить, но снизить число атак помогает смена.

Ограничение пользователей / групп

AllowUsers user1 user2
AllowGroups sshusers

Разрешает вход только указанным пользователям или членам группы. Группу можно создать:

sudo groupadd sshusers
sudo usermod -aG sshusers user1

Использование современных алгоритмов шифрования

HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key

KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com

Эти параметры отключают слабые алгоритмы. Рекомендации по их выбору можно найти в статье Mozilla Security.

Прочие полезные опции

  • PubkeyAuthentication yes  явно разрешает аутентификацию по ключам (обычно включено по умолчанию).
  • X11Forwarding no  отключает X11 forwarding, если не нужен.
  • MaxAuthTries 3  ограничивает количество попыток аутентификации.
  • ClientAliveInterval 300 и ClientAliveCountMax 2  разрывает неактивные сессии.

5. Применение конфигурации

После изменений проверьте синтаксис:

sudo sshd -t

Если ошибок нет, перезапустите службу:

sudo systemctl restart sshd

Убедитесь, что вы не потеряли доступ: откройте новое окно терминала и попробуйте подключиться по новому порту (если меняли) с использованием ключа:

ssh -p 2222 user@server_ip

Если вход выполнен успешно, можно закрыть старую сессию.

6. Настройка брандмауэра

ufw (Ubuntu):

sudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcp   # если хотите закрыть старый порт

firewalld (RHEL):

sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload

7. Использование агента SSH для удобства

Агент позволяет хранить расшифрованные ключи в памяти, чтобы не вводить пароль при каждом подключении. Запуск агента:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

Для автоматического запуска агента в графических средах обычно используется ssh-agent при входе. В консольных сессиях можно добавить в .bashrc:

if [ -z "$SSH_AUTH_SOCK" ]; then
    eval "$(ssh-agent -s)" > /dev/null
    ssh-add ~/.ssh/id_ed25519 2>/dev/null
fi

8. Дополнительный уровень: двухфакторная аутентификация

Для повышения безопасности можно добавить двухфакторную аутентификацию (2FA) через Google Authenticator или TOTP. Установите пакет libpam-google-authenticator и настройте PAM. Это выходит за рамки статьи, но стоит рассмотреть для особо важных серверов.

Устранение распространённых проблем

ПроблемаВероятная причинаРешение
Permission denied (publickey)Публичный ключ не добавлен в authorized_keys, неверные права на файлы.Проверить содержимое authorized_keys, права: ~/.ssh 700, authorized_keys 600. Убедиться, что в sshd_config разрешена PubkeyAuthentication.
Сервер не отвечает на новом портуБрандмауэр блокирует порт, SELinux (на RHEL) мешает.Проверить firewall-cmd или ufw. На RHEL: semanage port -a -t ssh_port_t -p tcp 2222.
ssh-add не может соединиться с агентомАгент не запущен.Выполнить eval "$(ssh-agent -s)" перед ssh-add.
Подключение прерывается через несколько минут бездействияНастройки ClientAliveInterval на сервере или межсетевой экран убивает сессию.Установить ClientAliveInterval 60 и ClientAliveCountMax 3 на сервере. На клиенте можно добавить ServerAliveInterval 60 в ~/.ssh/config.
Ошибка no matching key exchange methodКлиент и сервер не договорились об алгоритмах.Обновить OpenSSH на обеих сторонах. Временно можно добавить старый алгоритм в KexAlgorithms, но это снизит безопасность.

Итог

Мы настроили SSH-сервер с использованием ключей вместо паролей, отключили вход для root, ограничили доступ к серверу по пользователям и, при желании, сменили порт. Также применили современные алгоритмы шифрования и научились работать с агентом SSH. Эти меры существенно повышают безопасность удалённого доступа и являются стандартом де-факто в индустрии. Регулярно обновляйте OpenSSH и следите за журналами (/var/log/auth.log) для обнаружения подозрительной активности.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu