В этой статье разберём:
- почему SSH-конфигурация на VPS критична для безопасности;
- какие параметры
sshd_configза что отвечают; - как выглядит практический безопасный конфиг для типичного VPS;
- как применить его так, чтобы не отрезать себе доступ.
Все примеры ориентированы на Linux-VPS вроде Ubuntu/Debian с OpenSSH.
- Зачем вообще настраивать sshd_config
SSH-сервер (sshd) — главный вход на VPS. Если его оставить как есть:
- почти всегда включён вход по паролю;
- разрешён прямой вход под
root; - многие дополнительные механизмы аутентификации не отключены.
В интернете такой сервер моментально начинают атаковать боты:
- брутфорс логин/пароль;
- попытки подобрать root/админа с простыми паролями;
- сканирование на открытые возможности (X11, agent-forwarding и т.п.).
Цель настроек sshd_config:
- Свести поверхность атаки к минимуму.
- Оставить только один понятный и контролируемый способ входа — по SSH-ключам.
- Ограничить последствия ошибок (root-вход, слабые права на файлах и т.д.).
- Теория в двух словах: ключи vs пароли
Парольная аутентификация
Плюсы:
- просто: ввёл пароль — вошёл.
Минусы:
- пароли можно подбирать;
- пользователи ставят слабые пароли;
- пароли часто повторяются между сервисами;
- нужен fail2ban/фильтрация логов, но это уже «пластырь», а не решение.
Аутентификация по SSH-ключам
Схема:
- На клиенте создаётся пара ключей:
- приватный (
id_ed25519,id_rsa) — хранится у пользователя; - публичный (
id_ed25519.pub) — копируется на сервер.
- приватный (
- Сервер хранит публичный ключ в
~user/.ssh/authorized_keys. - При подключении сервер проверяет, владеет ли клиент приватным ключом, соответствующим публичному.
Плюсы:
- brute-force по паролю теряет смысл;
- невозможно «подобрать» ключ простым перебором логин/пароль;
- можно легко отозвать доступ, просто удалив строку из
authorized_keys.
Поэтому классическая безопасная схема для VPS:
- включены ключи (
PubkeyAuthentication yes); - выключены пароли (
PasswordAuthentication no); - ограничен или запрещён прямой root-доступ.
- Логика безопасного sshd_config
Грамотный конфиг решает четыре задачи:
- Сетевой доступ и протокол:
- какой порт;
- какие ключи хоста;
- какой протокол SSH.
- Политика логина:
- можно ли входить под root;
- сколько попыток логина;
- сколько времени даётся на аутентификацию.
- Методы аутентификации:
- ключи включить;
- пароли и «диалоговые» методы отключить.
- Остальные функции:
- X11-форвардинг;
- SFTP;
- переменные окружения (локали).
Дальше разберём всё на конкретном примере.
- Готовый пример безопасного конфига sshd_config
Ниже — пример рабочего конфига, который подходит для типичного VPS в интернете.
Файл: /etc/ssh/sshd_config
# 1. Базовые настройки протокола и порта
Port 22
Protocol 2
# Ключи хоста (идентичность сервера для клиентов)
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
# 2. Политика логина и безопасности
LoginGraceTime 30
PermitRootLogin no
StrictModes yes
MaxAuthTries 3
MaxSessions 10
# 3. Методы аутентификации
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
UsePAM yes
# 4. Прочие функции SSH
X11Forwarding no
PrintMotd no
AcceptEnv LANG LC_*
# 5. SFTP-подсистема
Subsystem sftp internal-sftp
Дальше — подробное объяснение по блокам.
- Подробный разбор параметров
5.1. Сеть и протокол
Port 22
На каком порту слушает SSH-сервер.
- 22 — стандартный порт.
- Поменять можно, но это не защита, а лишь снижение шума в логах.
Protocol 2
Версия протокола SSH.
- SSHv1 устарел и небезопасен.
- В современных OpenSSH фактически всегда используется только протокол 2; эта строка закрепляет это явно.
HostKey ...
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
Это ключи самого сервера (host keys).
- Нужны, чтобы клиент мог проверить, что он подключается к «тому самому» серверу.
- Типы:
rsa— старый, но массово поддерживаемый;ecdsa— эллиптические кривые;ed25519— современный, быстрый и безопасный.
- Клиент при подключении выбирает один из поддерживаемых типов.
5.2. Политика логина
LoginGraceTime 30
Время (в секундах), в течение которого после подключения клиент должен успешно аутентифицироваться.
- После 30 секунд без успешного логина соединение рвётся.
- Уменьшает количество «висящих» сессий от ботов.
PermitRootLogin no
Управляет логином под пользователем root.
Варианты:
yes— разрешён вход root по любому методу (пароль, ключи).prohibit-password— root только по ключам.no— вообще нельзя логиниться как root.
Для VPS из интернета безопаснее всего:
PermitRootLogin no
Рабочая схема:- логин под обычным пользователем;
- повышение привилегий через
sudo.
StrictModes yes
Проверяет права и владельцев файлов, связанных с аутентификацией.
- SSH проверяет:
- права на домашний каталог;
- права на
~/.ssh; - права и владельца
authorized_keys.
- При неправильных правах (слишком открыты, принадлежит не тому пользователю) ключи игнорируются.
Это защита от подмены ключей через ошибочные права.
MaxAuthTries 3
Максимальное количество попыток аутентификации за одно соединение.
- Если кто-то пытается перебрать логин/ключи/пароли, за одну сессию получится всего 3 попытки.
- Боты обычно полагаются на большое число попыток в одной сессии, это создаёт им дополнительные трудности.
MaxSessions 10
Сколько логических сессий можно открыть внутри одного TCP-подключения.
- Через один SSH-канал можно открыть несколько:
- интерактивная оболочка;
- выполнение команд;
- форвардинг портов.
- 10 — нормальный рабочий лимит, который предотвращает злоупотребления.
5.3. Методы аутентификации
PubkeyAuthentication yes
Разрешить вход по SSH-ключам.
- Это основной безопасный метод входа.
- Работает с файлами
~/.ssh/authorized_keysна сервере.
PasswordAuthentication no
Разрешать ли вход по паролю.
no— пароли полностью отключены.- Точка опоры для безопасности: брутфорс пароля становится бессмысленным.
KbdInteractiveAuthentication no
Keyboard-interactive аутентификация.
- Позволяет делать «диалоговые» схемы: запрос/ответ, дополнительные вопросы и т.п.
- Часто используется как «обход» отключённого
PasswordAuthentication, поэтому для жёсткой политики её тоже отключают.
ChallengeResponseAuthentication no
Старый параметр, связанный с challenge-response схемами (OTP и т.п.).
- Если не используются дополнительные сложные схемы аутентификации, безопаснее отключить, чтобы не было лишних путей входа.
UsePAM yes
Использовать PAM (Pluggable Authentication Modules).
- Позволяет применять системные политики:
- ограничения сессий;
- настройки окружения;
- общие правила входа.
- При входе по ключам через PAM обычно проходят только сессионные вещи (MOTD, лимиты и т.п.).
5.4. Остальные функции
X11Forwarding no
Пересылка графического интерфейса (X11) по SSH.
yesпозволяет запускать удалённые GUI-приложения, которые отображаются локально.- На VPS в интернете почти никогда не нужно и увеличивает поверхность атаки, поэтому разумно отключить.
PrintMotd no
Печатать ли MOTD (Message Of The Day) при входе.
- При
nosshd сам MOTD не печатает. - Часто MOTD всё равно выводится через PAM, так что эта опция в основном косметическая.
AcceptEnv LANG LC_*
Разрешает принимать от клиента некоторые переменные окружения.
- В данном случае — локаль (
LANG) и связанные переменные (LC_*). - Нужны для корректной работы с кодировкой и языком в терминале.
- Разрешать все переменные окружения небезопасно, но локали — стандартное и разумное исключение.
5.5. SFTP
Subsystem sftp internal-sftp
Определяет подсистему SFTP.
Варианты:
- Внешний бинарник:
Subsystem sftp /usr/lib/openssh/sftp-server - Встроенный сервер:
Subsystem sftp internal-sftp
internal-sftp:
- встроен в сам
sshd; - чуть проще и безопаснее (меньше внешних зависимостей);
- удобен для ограничений, chroot и т.п.
- Пошаговая настройка на VPS без риска потерять доступ
Важно: прежде чем ужесточать конфиг, нужно убедиться, что:
- есть рабочий SSH-ключ;
- этот ключ добавлен пользователю, под которым будете входить.
Типичный безопасный сценарий:
- Создать обычного пользователя (если его нет).
adduser myuser usermod -aG sudo myuser - Создать на локальной машине ключ (если нет):
ssh-keygen -t ed25519Публичный ключ — в~/.ssh/id_ed25519.pub. - Скопировать публичный ключ на сервер:
ssh-copy-id myuser@server_ipили вручную:- создать на сервере
~myuser/.ssh; - положить содержимое
id_ed25519.pubв~myuser/.ssh/authorized_keys; - выставить права:
chmod 700 ~myuser/.ssh chmod 600 ~myuser/.ssh/authorized_keys chown -R myuser:myuser ~myuser/.ssh
- создать на сервере
- Проверить вход под новым пользователем:
ssh myuser@server_ipУбедиться, что вход происходит по ключу (клиент не спрашивает пароль аккаунта). - Только после этого редактировать
/etc/ssh/sshd_config:- заменить содержимое на предложенный безопасный конфиг (с поправкой на нужный порт, если он иной);
- сохранить файл.
- Проверить синтаксис конфига:
sudo sshd -tЕсли ошибок нет, команда не выводит ничего. - Перезапустить SSH-демон:
sudo systemctl restart sshd # иногда ssh - Не закрывая старую SSH-сессию, открыть новую из другого терминала и убедиться, что вход работает.
Только после этого безопасно завершать старые сессии.
- Типичные ошибки и как их избежать
- Включили
PasswordAuthentication no, но не настроили ключи:- результат: сервер перестал пускать всех, кроме уже открытых сессий.
- профилактика: сначала проверить вход по ключу отдельным пользователем, только потом отключать пароли.
- Запретили
PermitRootLogin, но забыли про sudo:- пользователь не в группе
sudo, и root недоступен. - профилактика: сразу
usermod -aG sudo myuserи проверитьsudo whoami.
- пользователь не в группе
- Неправильные права на
~/.sshиauthorized_keys:- из-за
StrictModes yesSSH игнорирует ключи. - решение:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chown -R user:user ~/.ssh
- из-за
- Изменили порт SSH, но забыли открыть его в файрволе:
- сервер недоступен по новому порту.
- профилактика: при смене порта сначала добавить правило в UFW/iptables, затем перезапускать sshd.
Такой конфиг и подход закрывают основные уязвимости, характерные для VPS, доступного из интернета: отключают пароли, минимизируют роль root, ограничивают методы аутентификации и убирают лишние функции вроде X11-форвардинга.