sudo, добавляют ей ключ и проверяют вход в новой сессии. Только после этого отключают парольную аутентификацию, прямой вход root, ограничивают список допущенных к SSH учётных записей и запрещают ненужные перенаправления. До применения запретительных параметров сохраняют текущую сессию, проверяют конфигурацию и готовят независимый аварийный канал доступа.Подготовьте аварийный доступ и отдельную учётную запись
Не закрывайте текущую SSH-сессию
PasswordAuthentication no, PermitRootLogin no, AllowUsers или ограничения по адресу, пока не выполнен вход по ключу в отдельном новом терминале. Ошибка в конфигурации, правах на файл ключей или списке разрешённых пользователей может заблокировать удалённый доступ.Подготовьте персональную непривилегированную учётную запись, которая уже может выполнить нужные административные действия через sudo. Запрет прямого root-входа не отменяет защиту привилегированных учётных записей: пользователь с широким sudo фактически остаётся высокопривилегированным. Создание пользователей, групп и точная настройка sudo рассмотрены в статье «Учётные записи, sudo и парольная политика в Linux».
- Оставьте текущую работающую SSH-сессию открытой до конца изменения.
- Проверьте независимый канал восстановления: локальную консоль, консоль виртуальной машины, KVM-over-IP или BMC. Для физического сервера доступ к BMC требует отдельной защиты; см. «Защита BMC: безопасная настройка iDRAC, iLO и отдельной сети управления».
- Зафиксируйте, каким пользователем, с какого адреса и каким ключом будет выполняться новый вход.
- Сохраните копию текущей конфигурации SSH вне редактируемого файла.
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.before-hardeningПути и команды зависят от системы
/etc/ssh/sshd_config и, в новых сборках, директиву Include для файлов в каталогах наподобие /etc/ssh/sshd_config.d/. Имя systemd-службы, команда reload/restart и место журналов зависят от дистрибутива, пакета и версии OpenSSH: часто это ssh либо sshd, а события доступны через journalctl или журнал аутентификации. Перед изменением проверьте документацию своего дистрибутива и вывод systemctl. Все имена директив ниже относятся к серверу OpenSSH; доступность отдельных параметров и их значения по умолчанию зависят от версии OpenSSH и криптографической политики ОС.Создайте Ed25519-ключ с парольной фразой
Для нового ключа SSH обычно выбирают Ed25519: современный OpenSSH поддерживает этот тип, а ключ получается компактным. Однако старый OpenSSH, режим FIPS или криптографическая политика ОС могут запретить Ed25519. В таком случае не включайте устаревшие алгоритмы ради совместимости без оценки: уточните допустимый тип по политике платформы и документации установленной версии.
Генерация и установка ключа
Закрытый ключ остаётся на рабочем компьютере администратора. На сервер передают только открытый ключ.
- 1Создайте ключ на клиентском компьютереВыполните
ssh-keygen -t ed25519 -a 64 -f ~/.ssh/id_ed25519_server_admin -C "admin@example". Укажите длинную парольную фразу на запросEnter passphrase; пустая фраза не защищает закрытый ключ при его копировании. Параметр-a 64задаёт число раундов KDF для защиты ключевого файла в современном формате OpenSSH. Ожидаемый результат — два файла: закрытыйid_ed25519_server_adminи открытыйid_ed25519_server_admin.pub. - 2Проверьте отпечаток открытого ключаВыполните
ssh-keygen -lf ~/.ssh/id_ed25519_server_admin.pub. Сохраните отображённый отпечаток: он позволяет сверить, какой именно открытый ключ добавлен на сервер. - 3Добавьте открытый ключ пользователю на сервереПока парольный вход ещё разрешён, выполните
ssh-copy-id -i ~/.ssh/id_ed25519_server_admin.pub admin@server.example. Утилита добавит содержимое файла.pubв authorized_keys пользователяadmin. Еслиssh-copy-idнедоступна, войдите подadmin, создайте~/.sshи добавьте одну строку из.pubв~/.ssh/authorized_keysвручную. - 4Проверьте права на сервереПод пользователем
adminвыполнитеchmod go-w ~ && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys. При включённомStrictModessshd проверяет владельца и режимы домашнего каталога,~/.sshи файлов авторизации; каталог и файлы не должны быть доступны на запись посторонним. В типичной конфигурации владельцем является сам пользователь либо root там, где это допускает OpenSSH.
ssh-keygen -t ed25519 -a 64 -f ~/.ssh/id_ed25519_server_admin -C "admin@example"
ssh-keygen -lf ~/.ssh/id_ed25519_server_admin.pub
ssh-copy-id -i ~/.ssh/id_ed25519_server_admin.pub admin@server.exampleНе передавайте закрытый ключ на сервер, в чат или в репозиторий. Открытый ключ не является секретом и должен появиться на сервере одной строкой в authorized_keys нужного пользователя.
Проверьте вход по ключу в новой сессии
ssh -i ~/.ssh/id_ed25519_server_admin -o IdentitiesOnly=yes -o PreferredAuthentications=publickey -o PasswordAuthentication=no admin@server.exampleОжидаемый результат: вход выполнен без запроса пароля учётной записи сервера. Возможен запрос парольной фразы от локального закрытого ключа.sudo -v && sudo -lЕсли ключ не работает
authorized_keys, права и журналы аутентификации. Подробная диагностика Permission denied (publickey), прав закрытого ключа, authorized_keys и ошибок host key приведена в статье «SSH не подключается: Permission denied, host key changed и другие ошибки».Какие директивы отвечают за вход в SSH
| Директива | Что регулирует | Практический смысл |
|---|---|---|
PermitRootLogin | Возможность аутентификации именно учётной записи root | no запрещает root-вход всеми методами; prohibit-password запрещает root пароль и keyboard-interactive, но может оставить root-вход по ключу или другим разрешённым методом. |
PasswordAuthentication | Парольный метод SSH | no отключает парольный вход, но не обязательно отключает keyboard-interactive/PAM. |
KbdInteractiveAuthentication | Keyboard-interactive-аутентификацию, часто связанную с PAM | Может использоваться для MFA или, в зависимости от PAM, для пароля. Это отдельный метод от PasswordAuthentication. |
PubkeyAuthentication | Аутентификацию по открытому ключу | yes раз решает вход по ключу, но не означает, что остальные методы запрещены. |
AuthenticationMethods | Комбинации методов, которые необходимо пройти | Позволяет потребовать, например, ключ и keyboard-interactive/PAM для MFA. Сам по себе не настраивает PAM-провайдера. |
Для полного запрета root-входа выбирайте PermitRootLogin no. Значение PermitRootLogin prohibit-password подходит только тогда, когда организация сознательно разрешает root-аутентификацию по ключу или другому непарольному методу; это не запрет root-входа. Не заменяйте одну директиву другой: PasswordAuthentication no не запрещает root по ключу, а PubkeyAuthentication yes не отключает пароль.
Внесите минимальные ограничения в sshd_config
Размещайте локальные изменения в отдельном drop-in-файле, если его подключает конфигурация вашего пакета, либо меняйте основной sshd_config. Порядок файлов и правило «первое полученное значение» для части параметров могут влиять на результат, поэтому не создавайте дублирующие противоречивые настройки.
# Шаблон: адаптируйте пользователей, группы и совместимость.
# Применяйте только после успешного входа admin по ключу.
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
# Требовать именно аутентификацию по открытому ключу.
# Для MFA замените значение комбинацией из соответствующего раздела ниже.
AuthenticationMethods publickey
# Пример allowlist: оставьте только реально нужные записи.
AllowUsers admin deploy
# Альтернатива для ролевой модели: AllowGroups ssh-admins
# Запрет встроенных перенаправлений, если они не требуются.
AllowTcpForwarding no
AllowAgentForwarding no
X11Forwarding no
PermitTunnel no
GatewayPorts no
# Пределы соединения и аутентификации.
LoginGraceTime 60
MaxAuthTries 4
MaxSessions 5
ClientAliveInterval 300
ClientAliveCountMax 2
# Только в версиях OpenSSH с поддержкой ChannelTimeout:
# ChannelTimeout session=15mШаблон не универсален
Ciphers, MACs и KexAlgorithms: доступный и допустимый набор определяется версией OpenSSH и системной криптополитикой. Не копируйте случайные списки алгоритмов. Изменение аутентификации, forwarding и тайм-аутов может нарушить автоматизацию, SFTP, туннели, графические приложения, bastion-схемы и мониторинг.Ограничьте список пользователей и групп
AllowUsers и AllowGroups создают allowlist: войти смогут только перечисленные пользователи или члены указанных групп при соблюдении остальных условий. DenyUsers и DenyGroups запрещают отдельные учётные записи или группы. OpenSSH обрабатывает эти классы в порядке DenyUsers, AllowUsers, DenyGroups, AllowGroups; запрет имеет приоритет над разрешением своего типа. Имена допускают шаблоны, а в поддерживаемых версиях — форму USER@HOST для ограничения по источнику.
# Разрешить вход только двум локальным учётным записям
AllowUsers admin deploy
# Или разрешить членов административной группы
# AllowGroups ssh-admins
# Явно запретить скомпрометированную или более не используемую учётную запись
DenyUsers former-adminНе смешивайте без необходимости AllowUsers и AllowGroups: итог зависит от членства в группах и перечня разрешений. После добавления AllowUsers служебная учётная запись для резервного копирования, автоматизации или SFTP может перестать входить. Такие директивы уменьшают круг SSH-пользователей, но не заменяют удаление ненужных аккаунтов, корректный sudo и сетевую политику.
Ограничьте доступ SSH по исходному адресу
Для точечного ограничения конкретного пользователя можно использовать адресную часть шаблона AllowUsers, например AllowUsers admin@192.0.2.0/24, если такой CIDR-синтаксис поддерживает установленная версия OpenSSH. Проверьте его на своей версии через тест эффективной конфигурации до reload. Вариант с шаблоном адреса также возможен, но менее точен. Это ограничение действует на уровне sshd после установления TCP-соединения и не заменяет firewall.
# Пример: учётная запись admin может войти только из административной подсети.
# Проверьте поддержку CIDR в документации и через sshd -T -C.
AllowUsers admin@192.0.2.0/24 deployУчтите NAT, VPN и IPv6
Отключите forwarding и настройте лимиты
AllowTcpForwarding no запрещает встроенный проброс портов SSH, AllowAgentForwarding no — перенаправление агента SSH, X11Forwarding no — X11-forwarding, а PermitTunnel no — SSH-туннельные интерфейсы. GatewayPorts no ограничивает сокеты удалённого перенаправления адресами loopback; при уже заданном AllowTcpForwarding no это дополнительное ограничение не задействуется. Перед отключением проверьте, не использует ли эти возможности администратор, CI/CD, резервное копирование, SFTP-сценарий через bastion или прикладной туннель.
Forwarding — не граница безопасности для shell-пользователя
| Параметр | Что ограничивает | Типичное значение и риск |
|---|---|---|
LoginGraceTime | Время на завершение аутентификации после подключения | Значение задаётся как интервал времени; 0 отключает лимит. В upstream OpenSSH типичный default — 120. Слишком короткое значение мешает медленным MFA-сценариям. |
MaxAuthTries | Число неудачных попыток аутентифик ации на соединение | Целое число; upstream default обычно 6. Меньшее значение снижает число переборов в одном соединении, но SSH-агент с большим числом ключей может исчерпать лимит. |
MaxSessions | Количество каналов-сеансов в одном SSH-соединении | Целое число; upstream default обычно 10. Слишком малое значение может нарушить multiplexing, параллельные команды или SFTP-сценарии. |
ClientAliveInterval и ClientAliveCountMax | Обнаружение неотвечающего SSH-клиента | Интервал зада ётся в секундах; upstream default ClientAliveInterval — 0, ClientAliveCountMax — 3. Это не тайм-аут бездействия пользователя: сервер отправляет проверочные сообщения и отключает клиента только после заданного числа отсутствующих ответов. |
ChannelTimeout | Неактивность отдельных SSH-каналов по типу | Поддерживается не всеми версиями; upstream default — отсутствие тайм-аутов. Например, session=15m закрывает неактивные session-каналы, а не обязательно всё соединение. Это ближе к тайм-ауту неактивности, но не универсальная замена политики idle timeout. |
Защита SSH от перебора не сводится к MaxAuthTries: параметр ограничивает попытки в одном соединении, а не поток новых подключений. Для реагирования на повторяющиеся неудачные входы можно применять Fail2ban с осторожно подобранными порогами; см. «Fail2ban: защита SSH и веб-сервера от перебора паролей».
При необходимости потребуйте ключ и MFA
Многофакторная аутентификация для SSH — опциональный слой. Она требует настроенного и проверенного PAM-провайдера или другого поддерживаемого механизма: сама директива sshd не создаёт второй фактор. Не включайте требование MFA, пока не проверена аварийная процедура при недоступности устройства, TOTP или внешнего провайдера.
# Пример только для системы, где MFA через PAM уже настроена и проверена.
PubkeyAuthentication yes
KbdInteractiveAuthentication yes
PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive:pamAuthenticationMethods publickey,keyboard-interactive:pam задаёт последовательность: сначала ключ, затем keyboard-interactive через PAM. Запись через запятую означает обязательную комбинацию методов; несколько альтернативных комбинаций указывают через пробел. Если оставить KbdInteractiveAuthentication no, требуемая комбинация не сработает. Конкретная интеграция, например PAM-модуль с TOTP, зависит от дистрибутива и выбранного провайдера.
Проверьте конфигурацию и примените её без потери доступа
Безопасное применение sshd_config
Выполняйте шаги из старой рабочей сессии. Новую тестовую сессию открывайте отдельно.
- 1Проверьте синтаксис до reloadВыполните
sudo sshd -t. При нестандартном пути к файлу используйтеsudo sshd -t -f /путь/к/sshd_config. Успешная проверка обычно не выводит ничего и возвращает код 0. При ошибке не перезапускайте службу: исправьте указанную строку либо восстановите резервную копию. - 2Посмотрите эффективную конфигурациюВыполните
sudo sshd -T | grep -E 'permitrootlogin|passwordauthentication|kbdinteractiveauthentication|pubkeyauthentication|authenticationmethods|allowusers|allowgroups|denyusers|denygroups|allowtcpforwarding|allowagentforwarding|x11forwarding|permittunnel|gatewayports|logingracetime|maxauthtries|maxsessions|clientalive|channeltimeout'. Команда показывает выбранные эффективные значения после обработки конфигурации. - 3Проверьте правила Match в контексте клиентаЕсли используются
Match User,Match AddressилиMatch Host, добавьте конт екст:sudo sshd -T -C user=admin,addr=192.0.2.10,host=client.example. Подставьте реальные имя пользователя, адрес и hostname. Для правил, зависящих от локального адреса или порта, в поддерживаемой версии могут требоваться такжеladdrиlport. - 4Примените конфигурациюПосле успешного
sshd -tвыполните документированную для системы команду reload, напримерsudo systemctl reload sshdилиsudo systemctl reload ssh. Reload предпочтительнее restart, когда он поддерживается: он обычно не обрывает действующие сессии. Если unit или reload отсутствуют, используйте документацию дистрибутива. - 5Откройте новую проверочную сессиюНе закрывая старую сессию, снова подключитесь командой с
-i,IdentitiesOnly=yesиPasswordAuthentication=no. Проверьте вход,sudo, разрешённые сценарии SFTP или bastion, если они нужны. Дополнительно убедитесь, что root и парольный вход действительно отклоняются. - 6Откатите изменение при проблемеЧерез сохранённую сессию или независимую консоль верните резервный файл либо удалите проблемный drop-in, затем выполните
sshd -tи reload повторно. Не рассчитывайте на уже существующую SSH-сессию как на доказательство корректности нового входа: она может продолжать работать после изменения правил.
sudo sshd -t
sudo sshd -T | grep -E 'permitrootlogin|passwordauthentication|kbdinteractiveauthentication|pubkeyauthentication|authenticationmethods|allowusers|allowgroups|denyusers|denygroups|allowtcpforwarding|allowagentforwarding|x11forwarding|permittunnel|gatewayports|logingracetime|maxauthtries|maxsessions|clientalive|channeltimeout'
sudo sshd -T -C user=admin,addr=192.0.2.10,host=client.example
sudo systemctl reload sshdПосле reload посмотрите журнал службы и попытайтесь подключиться с ожидаемого адреса. В системах с systemd обычно помогает journalctl -u sshd или journalctl -u ssh; в Debian- и Ubuntu-подобных конфигурациях записи аутентификации нередко также попадают в /var/log/auth.log, в RHEL-подобных — в /var/log/secure. Это типичные пути, а не гарантия: конкретное журналирование определяет дистрибутив и его настройка.
Что не заменяет настройка SSH
- Смена порта SSH может уменьшить шум массового сканирования и записи в журнале, но не защищает от целевой атаки и не заменяет ключи, обновления или ограничение источников. При смене порта обновите клиентские конфигурации и сетевые правила, сохранив аварийный путь.
- Отключение root-входа не ограничивает пользователя, которому разрешён полный
sudo, и не исправляет слишком широкие правилаsudoers. - AllowUsers и AllowGroups не удаляют учётные записи, не отзывают их ключи автоматически и не заменяют firewall.
- Запрет forwarding не изолирует shell-пользователя от сети и не является полноценным средством предотвращения туннелей.
- Локальное удаление строки из authorized_keys прекращает доступ по этому ключу только на данном хосте. При множестве серверов, SSH-сертификатах или подозрении на компрометацию нужен управляемый отзыв и ротация; см. «Управление секретами сервера: хранение, выдача, ротация и отзыв доступов».
Проверьте хост-ключ сервера и сопровождение ключей
Клиентский файл known_hosts и проверка отпечатка ключа хоста защищают от подключения к неожиданному серверу; это другая задача, чем аутентификация пользователя по ключу. При первом подключении сверяйте отпечаток ключа хоста по доверенному каналу. Не удаляйте запись known_hosts при сообщении об изменении ключа без проверки причины: это может скрыть подмену узла.
Даже для одного сервера нужен как минимум инвентарь ключей: кому принадлежит ключ, для чего он используется и при каком событии его нужно отозвать. Периодически проверяйте актуальность записей и удаляйте ненужные ключи из authorized_keys. При масштабной выдаче доступов полезны централизованное управление ключами и сертификаты SSH, но построение SSH CA, массовая ротация и централизованный отзыв относятся к отдельной процедуре управления секретами.
Термины в статье
- Allowlist
- Allowlist — перечень разрешающих записей или правил: система допускает только те субъекты, объекты, действия или значения, которые им соответствуют.
- Ed25519
- Ed25519 — алгоритм цифровой подписи на эллиптической кривой edwards25519, использующий 32-байтный открытый ключ и 64-байтную подпись; он не предназначен для шифрования.
- OpenSSH
- OpenSSH — свободный набор клиентских и серверных средств SSH для защищённого удалённого доступа, передачи файлов и туннелирования TCP-соединений.
- PAM
- PAM — модульная подсистема Unix-подобных ОС, через которую совместимые службы применяют правила аутентификации, проверки учётной записи, смены паролей и управления сеансами.
- SSH-агент
- SSH-агент — фоновый процесс, хранящий закрытые SSH-ключи в памяти и выполняющий операции подписи по запросу клиента без повторного ввода ключевой фразы.
- sshd_config
- sshd_config — конфигурационный файл или набор настроек SSH-сервера OpenSSH, определяющий параметры прослушивания, аутентификации, доступа и криптографических алгоритмов.
- Аутентификация по открытому ключу
- Аутентификация по открытому ключу — способ входа в SSH, при котором сервер проверяет подпись клиента по заранее разрешённому открытому ключу, а не по паролю.
- Закрытый ключ
- Закрытый ключ — секретная часть асимметричной ключевой пары для создания подписей, расшифрования данных или подтверждения владения ключом при аутентификации.
- Ключ SSH
- Ключ SSH — криптографический ключевой материал для протокола SSH, применяемый для подтверждения личности или проверки подлинности удалённого узла.
- Многофакторная аутентификация
- Многофакторная аутентификация — метод проверки личности, требующий подтверждений из двух или более независимых факторов: знания, владения или биометрии.
- Открытый ключ
- Открытый ключ — несекретный ключ асимметричной пары, используемый в зависимости от алгоритма для проверки подписей, шифрования, аутентификации или согласования общего секрета.
- Парольная аутентификация
- Парольная аутен тификация — способ проверки личности, при котором пользователь подтверждает владение секретным паролем, передавая его или производное от него значение.
- Парольная фраза
- Парольная фраза — разновидность пароля из нескольких слов или длинной запоминаемой строки, используемая для аутентификации или защиты криптографических ключей.
- Перенаправление агента SSH
- Перенаправление агента SSH — механизм SSH, предоставляющий удалённому хосту доступ к локальному агенту для подписи операций без копирования закрытого ключа на этот хост.
- Проброс портов SSH
- Проброс портов SSH — передача TCP-подключений к заданному узлу и порту через зашифрованный SSH-сеанс в локальном, удалённом или динамическом режиме.
- Тайм-аут неактивности
- Тайм-аут неактивности — ограничение времени простоя сеанса, после которого система завершает или блокирует соединение при отсутствии заданной активности пользователя.
- Учётная запись root
- Учётная запись root — привилегированная локальная учётная запись Unix-подобочной ОС с идентификатором UID 0, обладающая практически неограниченными системными правами.
- Файл authorized_keys
- Файл authorized_keys — файл SSH на сервере со списком открытых ключей, которым разрешена аутентификация для конкретной учётной записи пользователя.
